Imported Debian patch 0.8.0.4-1.1 debian/0.8.0.4-1.1
authorWookey <wookey@debian.org>
Fri, 30 May 2014 16:41:37 +0000 (16:41 +0000)
committerJean-Philippe Orsini <jeanfi@gmail.com>
Sun, 1 Jun 2014 07:39:52 +0000 (09:39 +0200)
127 files changed:
Makefile.am
Makefile.in
NEWS
NEWS.html [deleted file]
README.html
configure
configure.ac
debian/changelog
debian/control
debian/copyright
debian/patches/json-c-FTBFS-fix.patch [new file with mode: 0644]
debian/patches/series [new file with mode: 0644]
doc/faq.html
icons/ubuntu-mono-dark/status/22/psensor_hot.svg
icons/ubuntu-mono-dark/status/22/psensor_normal.svg
icons/ubuntu-mono-light/status/22/psensor_hot.svg
icons/ubuntu-mono-light/status/22/psensor_normal.svg
po/LINGUAS
po/de.gmo
po/de.po
po/es.gmo
po/es.po
po/fr.gmo
po/fr.po
po/hu.gmo
po/hu.po
po/it.gmo
po/it.po
po/lv.gmo
po/lv.po
po/nl.gmo [deleted file]
po/nl.po [deleted file]
po/psensor.pot
po/pt_BR.gmo
po/pt_BR.po
po/ru.gmo
po/ru.po
po/sl.gmo
po/sl.po
po/sr.gmo
po/sr.po
po/tr.gmo
po/tr.po
po/uk.gmo
po/uk.po
po/zh_CN.gmo
po/zh_CN.po
psensor.desktop
src/cfg.c
src/cfg.h
src/glade/psensor.glade
src/graph.c
src/graph.h
src/lib/amd.c
src/lib/amd.h
src/lib/bool.h
src/lib/color.c
src/lib/color.h
src/lib/cpu.c
src/lib/cpu.h
src/lib/hdd.h
src/lib/hdd_atasmart.c
src/lib/hdd_hddtemp.c
src/lib/lmsensor.c
src/lib/lmsensor.h
src/lib/log.c
src/lib/log.h
src/lib/measure.c
src/lib/measure.h
src/lib/nvidia.c
src/lib/nvidia.h
src/lib/pio.c
src/lib/pio.h
src/lib/psensor.c
src/lib/psensor.h
src/lib/psensor_json.c
src/lib/psensor_json.h
src/lib/ptime.c
src/lib/ptime.h
src/lib/slog.c
src/lib/slog.h
src/lib/url.c
src/lib/url.h
src/main.c
src/notify_cmd.c
src/notify_cmd.h
src/psensor.1
src/psensor.schemas
src/rsensor.c
src/rsensor.h
src/server/psensor-server.1
src/server/server.c
src/server/server.h
src/server/sysinfo.c
src/server/sysinfo.h
src/ui.c
src/ui.h
src/ui_appindicator.c
src/ui_appindicator.h
src/ui_color.c
src/ui_color.h
src/ui_graph.c
src/ui_graph.h
src/ui_notify.c
src/ui_notify.h
src/ui_pref.c
src/ui_pref.h
src/ui_sensorlist.c
src/ui_sensorlist.h
src/ui_sensorpref.c
src/ui_sensorpref.h
src/ui_status.c
src/ui_status.h
src/ui_unity.c
src/ui_unity.h
www/Makefile.am
www/Makefile.in
www/details.html
www/excanvas.js [new file with mode: 0644]
www/index.html
www/jqplot.css
www/jqplot.dateAxisRenderer.js
www/jqplot.js
www/jquery.js
www/monitor.html [new file with mode: 0644]
www/psensor.js
www/style.css

index c4e3e53..40db776 100644 (file)
@@ -19,7 +19,6 @@ dist_doc_DATA = AUTHORS \
        COPYING \
        INSTALL \
        NEWS \
        COPYING \
        INSTALL \
        NEWS \
-       NEWS.html \
        README \
        README.html
 
        README \
        README.html
 
@@ -33,6 +32,3 @@ EXTRA_DIST = $(desktop_DATA) $(autostart_DATA)
 
 README.html: README www/style.css
        asciidoc --theme style -a themedir=`pwd`/www -n -a toc README
 
 README.html: README www/style.css
        asciidoc --theme style -a themedir=`pwd`/www -n -a toc README
-
-NEWS.html: NEWS www/style.css
-       asciidoc --theme style -a themedir=`pwd`/www NEWS
index 9101fde..7d43679 100644 (file)
@@ -334,7 +334,6 @@ dist_doc_DATA = AUTHORS \
        COPYING \
        INSTALL \
        NEWS \
        COPYING \
        INSTALL \
        NEWS \
-       NEWS.html \
        README \
        README.html
 
        README \
        README.html
 
@@ -916,9 +915,6 @@ uninstall-am: uninstall-autostartDATA uninstall-desktopDATA \
 README.html: README www/style.css
        asciidoc --theme style -a themedir=`pwd`/www -n -a toc README
 
 README.html: README www/style.css
        asciidoc --theme style -a themedir=`pwd`/www -n -a toc README
 
-NEWS.html: NEWS www/style.css
-       asciidoc --theme style -a themedir=`pwd`/www NEWS
-
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
 .NOEXPORT:
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
 .NOEXPORT:
diff --git a/NEWS b/NEWS
index 75ffc7f..a77ea41 100644 (file)
--- a/NEWS
+++ b/NEWS
-Psensor NEWS
-============
-
-v0.8.0.6
---------
-
-* Updated jquery and jqplot to last version.
-* Removed excanvas for copyright reason (apache license not compatible
-  with GPLv2 license).
-* Use non-minimized version of .js and .css to avoid lintian errors
-  (source-is-missing).
-
-v0.8.0.5
---------
-
-* Added NEWS.html.
-* Converted NEWS file to asciidoc.
-* +psensor-server+:
-  - removed web fonts causing lintian warnings.
-  - redesigned web pages.
-* Merged German translation from LP (Dennis Baudys).
-* Merged Latvian translation from LP (tuxmaniack).
-* Merged Russian translation from LP (Dmitry).
-* Merged Turkish translation from LP (İbrahim Çelik).
-* Added Dutch translation from LP (Pjotr12345).
-* Fixed some french translations.
-* AppIndicator icons: removed shadow, added padding. (LP: #1290072).
-* Fixed compilation issue with gtk3.10 and deprecation of
-  GtkActionEntry. Menu is defined in glade file instead of
-  hardcoded. (LP: #1304108).
-
-v0.8.0.4
---------
-       
-* Added calling script when an alarm is raised.
-* Reordering of the list of sensors.
-* Added keywords in .desktop file.
-* Added LFS support.
-* Fixed compilation issue for x32 architecture on 64bits systems.
-* Merged German translation from LP (Dennis Baudys).
-* Merged Spanish translation from LP (Javier).
-* Merged French translation from LP (londumas).
-* Merged Brazilian translation from LP (Celio Alves).
-
-v0.8.0.3
---------
-
-* Switched to GtkColorChooserDialog instead of the
+* v0.8.0.4
+
+** Added calling script when an alarm is raised.
+** Reordering of the list of sensors.
+** Added keywords in .desktop file.
+** Added LFS support.
+** Fixed compilation issue for x32 architecture on 64bits systems.
+** Merged German translation from LP (Dennis Baudys).
+** Merged Spanish translation from LP (Javier).
+** Merged French translation from LP (londumas).
+** Merged Brazilian translation from LP (Celio Alves).
+
+* v0.8.0.3
+
+** Switched to GtkColorChooserDialog instead of the
    deprecated widget GtkColorSelectionDialog. (LP: #1184442)
    deprecated widget GtkColorSelectionDialog. (LP: #1184442)
-* +psensor-server+: fixed compilation without gtop2 lib.
+** psensor-server: fixed compilation without gtop2 lib.
 
 
-v0.8.0.2
---------
+* v0.8.0.2
 
 
-* GConf2/GTK/XEXT/X11 lib optional to allow psensor-server
+** GConf2/GTK/XEXT/X11 lib optional to allow psensor-server
    compilation without them.
    compilation without them.
-* Added support of libjson-c.
-* merged German translation from LP (Dennis Baudys).
-* merged Latvian translation from LP (tuxmaniack).
-
-v0.8.0.1
---------
-
-* added AMD GPU usage sensor (Contribution from MestreLion).
-* added support of sensors log interval.
-* +psensor-server+: protocole changes, API version incremented.
-* fixed cpu load when fahrenheit is enabled.
-* list of sensors can be reordered using the sensor preferences
+** Added support of libjson-c.
+** merged German translation from LP (Dennis Baudys).
+** merged Latvian translation from LP (tuxmaniack).
+
+* v0.8.0.1
+
+** added AMD GPU usage sensor (Contribution from MestreLion).
+** added support of sensors log interval.
+** psensor-server: protocole changes, API version incremented.
+** fixed cpu load when fahrenheit is enabled.
+** list of sensors can be reordered using the sensor preferences
    dialog.
    dialog.
-* merged Spanish translation from LP (Javier) and Tomeu R. .
-* merged French translation from LP (Hélion du Mas des Bourboux).
-* merged Italian translation from LP (Diego Pierotto).
-* merged Brazillian Portugues translation from LP (MestreLion).
-* fixed the quit menu of the application indicator which was
+** merged Spanish translation from LP (Javier) and Tomeu R. .
+** merged French translation from LP (Hélion du Mas des Bourboux).
+** merged Italian translation from LP (Diego Pierotto).
+** merged Brazillian Portugues translation from LP (MestreLion).
+** fixed the quit menu of the application indicator which was
    not translatable.
 
    not translatable.
 
-v07.0.5
---------
+* v07.0.5
 
 
-* fixed cpu load when fahrenheit is enabled.
+** fixed cpu load when fahrenheit is enabled.
 
 
-v0.7.0.4
---------
+* v0.7.0.4
 
 
-* added Spanish translation from LP (Javier and Eduardo Alberto
+** added Spanish translation from LP (Javier and Eduardo Alberto
    Calvo).
    Calvo).
-* merged German translation from LP (Dennis Baudys).
-* merged French translation from LP (Alain-OIivier Breysse).
-* merged Hungarian from translation LP (Bence Lukács).
-* merged Latvian translation from LP (tuxmaniack).
-* merged Portuguese translation from LP (Daniel Serafim).
-* merged Russian translation from LP (Ilya Volchanetskiy).
-* merged Ukrainian translation from LP (Ilya Volchanetskiy).
-* merged Chinese translation from LP (Wang Dianjin).
-* psensor: fixed 'appindicator enabled' option not working correctly
+** merged German translation from LP (Dennis Baudys).
+** merged French translation from LP (Alain-OIivier Breysse).
+** merged Hungarian from translation LP (Bence Lukács).
+** merged Latvian translation from LP (tuxmaniack).
+** merged Portuguese translation from LP (Daniel Serafim).
+** merged Russian translation from LP (Ilya Volchanetskiy).
+** merged Ukrainian translation from LP (Ilya Volchanetskiy).
+** merged Chinese translation from LP (Wang Dianjin).
+** psensor: fixed 'appindicator enabled' option not working correctly
    for cpu usage. The option was inversed each time it is displayed in
    the preference dialog.
    for cpu usage. The option was inversed each time it is displayed in
    the preference dialog.
-* psensor: added an option to enable logging of sensors
+** psensor: added an option to enable logging of sensors
    ($HOME/.psensor/sensors.log).
    ($HOME/.psensor/sensors.log).
-* +psensor-server+: added sensors logging (--sensor-log-file).
-* psensor: display the name of chip in sensor preferences.
-* psensor: moved the sensor id into a expendable frame of the sensor
+** psensor-server: added sensors logging (--sensor-log-file).
+** psensor: display the name of chip in sensor preferences.
+** psensor: moved the sensor id into a expendable frame of the sensor
    preferences.
    preferences.
-* test target is now running cppcheck if available.
-* fixed cppcheck reported errors (realloc and not freed var).
-* fixed cppcheck (old values not used).
-* added faq (requires asciidoc to build the html version).
-* check target is now running cppcheck if installed.
-* display a message if no graphs are enabled (Closes #689355).
-* psensor: when 'hide window on startup' is set, it will
+** test target is now running cppcheck if available.
+** fixed cppcheck reported errors (realloc and not freed var).
+** fixed cppcheck (old values not used).
+** added faq (requires asciidoc to build the html version).
+** check target is now running cppcheck if installed.
+** display a message if no graphs are enabled (Closes #689355).
+** psensor: when 'hide window on startup' is set, it will
    hide the window only if psensor can register to application
    indicator or systray. Waiting 30s before trying to do it
    in order to have better chance that systray is running during
    session startup.
    hide the window only if psensor can register to application
    indicator or systray. Waiting 30s before trying to do it
    in order to have better chance that systray is running during
    session startup.
-* fixed displaying of the fahrenheit temperature in the main
+** fixed displaying of the fahrenheit temperature in the main
    window.
    window.
-* fixed compilation error in amd.c (hdll not used).
+** fixed compilation error in amd.c (hdll not used).
 
 
-v0.7.0.3
---------
+* v0.7.0.3
 
 
-* psensor: removed gettext_domain in psensor.schemas causing
+** psensor: removed gettext_domain in psensor.schemas causing
    warnings.
    warnings.
-* merged italian and russian translation from LP.
+** merged italian and russian translation from LP.
 
 
-v0.7.0.2
---------
+* v0.7.0.2
 
 
-* psensor: added latvian translation file.
-* psensor: added gconf schema. (LP: #1026807)
-* psensor: hide sensors in the application indicator.
-* psensor: removed hicolor/48x48/psensor_hot.png. (LP: #1029065)
-* merge chinese translation from LP.
+** psensor: added latvian translation file.
+** psensor: added gconf schema. (LP: #1026807)
+** psensor: hide sensors in the application indicator.
+** psensor: removed hicolor/48x48/psensor_hot.png. (LP: #1029065)
+** merge chinese translation from LP.
 
 
-v0.7.0.1
---------
+* v0.7.0.1
 
 
-* psensor: minimum GTK version is now 3.0, GTK v2.x is no more
+** psensor: minimum GTK version is now 3.0, GTK v2.x is no more
    supported.
    supported.
-* psensor: fixed sensor type displayed in sensor preferences
+** psensor: fixed sensor type displayed in sensor preferences
    dialog. (Closes LP: #968912)
    dialog. (Closes LP: #968912)
-* psensor: not calling g_thread_init when compiled with glib >= 2.31.
-* psensor: added basic instruction in the README for compiling psensor
+** psensor: not calling g_thread_init when compiled with glib >= 2.31.
+** psensor: added basic instruction in the README for compiling psensor
             with the ATI/AMD GPU support.
             with the ATI/AMD GPU support.
-* psensor: fixed compilation error on 64bits with ATI/AMD GPU support.
-* psensor: added capability to use libatasmart for sata disk monitoring.
-* psensor: added option --use-libatasmart.
-* changed copyright dates to 2012.
-* psensor: fixed systray and application indicator visible at the
+** psensor: fixed compilation error on 64bits with ATI/AMD GPU support.
+** psensor: added capability to use libatasmart for sata disk monitoring.
+** psensor: added option --use-libatasmart.
+** changed copyright dates to 2012.
+** psensor: fixed systray and application indicator visible at the
    same time. (Closes LP: #971098)
    same time. (Closes LP: #971098)
-* psensor: fixed wrong background color, get the background color of
+** psensor: fixed wrong background color, get the background color of
    the window and not the canvas widget. (Closes LP: #973122)
    the window and not the canvas widget. (Closes LP: #973122)
-* psensor: used the foreground color defined by the theme for the
+** psensor: used the foreground color defined by the theme for the
    font of the graph legend.
    font of the graph legend.
-* psensor: used tab layout for psensor preferences.
-* psensor: temperature unit choice (celcius/fahrenheit).
-* +psensor-server+: fixed --wdir option.
-* +psensor-server+: added log level to -d option.
-* +psensor-server+: added --log-file option.
-* +psensor-server+: logged measures when log level is 3.
-* psensor: fixed many memory leaks in cfg.c (gconf2 keys).
-* psensor: fixed memory leak (sensor name when specified by the
+** psensor: used tab layout for psensor preferences.
+** psensor: temperature unit choice (celcius/fahrenheit).
+** psensor-server: fixed --wdir option.
+** psensor-server: added log level to -d option.
+** psensor-server: added --log-file option.
+** psensor-server: logged measures when log level is 3.
+** psensor: fixed many memory leaks in cfg.c (gconf2 keys).
+** psensor: fixed memory leak (sensor name when specified by the
    configuration).
    configuration).
-* psensor: implemented the psensor uniquess, non-primary psensor
+** psensor: implemented the psensor uniquess, non-primary psensor
    instances show the window of the primary psensor instance and
    exits.
    instances show the window of the primary psensor instance and
    exits.
-* many code quality improvements.
-* psensor: added --new-instance option to allow the creation of
+** many code quality improvements.
+** psensor: added --new-instance option to allow the creation of
    multiple instances of Psensor.
    multiple instances of Psensor.
-* psensor: added the degree sign before the temperature symbols
+** psensor: added the degree sign before the temperature symbols
             (Closes LP: #1021900).
             (Closes LP: #1021900).
-* psensor: alarm limit edition using the temperature unit set in the
+** psensor: alarm limit edition using the temperature unit set in the
    global pref.
    global pref.
-* psensor: improved notification (added psensor icon and value of the
+** psensor: improved notification (added psensor icon and value of the
    sensor).
    sensor).
-* full french and hungarian translation.
-* merged some chinese translation provided by LP.
-* added translation files for Brazilian Portuguese, and Italian.
-* partial translations for Russian, Serbian, Ukrainian, Slovenian and
+** full french and hungarian translation.
+** merged some chinese translation provided by LP.
+** added translation files for Brazilian Portuguese, and Italian.
+** partial translations for Russian, Serbian, Ukrainian, Slovenian and
    German.
    German.
-* psensor: fixed i18n support for the application indicator menu.
-* psensor: fixed i18n support for the application menu.
-* psensor: added low thresold support for alerts.
-* psensor: added fan alert support.
-* psensor: fixed hide window on startup for gnome-shell (Closes:
+** psensor: fixed i18n support for the application indicator menu.
+** psensor: fixed i18n support for the application menu.
+** psensor: added low thresold support for alerts.
+** psensor: added fan alert support.
+** psensor: fixed hide window on startup for gnome-shell (Closes:
    #676361).
 
    #676361).
 
-v0.6.2.19
----------
+* v0.6.2.19
 
 
-* psensor: fixed size of the icon hicolor/48x48/psensor_hot.png.
+** psensor: fixed size of the icon hicolor/48x48/psensor_hot.png.
    (LP: #1029065)
 
    (LP: #1029065)
 
-v0.6.2.18
----------
+* v0.6.2.18
 
 
-* added degree sign for celcius (Closes LP: #1021900).
-* added russian, brazilian, hungarian, serbian, slovenian,
+** added degree sign for celcius (Closes LP: #1021900).
+** added russian, brazilian, hungarian, serbian, slovenian,
    italian, ukrainian and german translation files.
    italian, ukrainian and german translation files.
-* merged translations from LP.
-* psensor: fixed hide window on startup for gnome-shell (Closes:
+** merged translations from LP.
+** psensor: fixed hide window on startup for gnome-shell (Closes:
    #676361).
 
    #676361).
 
-v0.6.2.17
----------
+* v0.6.2.17
 
 
-* psensor: fixed sensor type displayed in sensor preferences
+** psensor: fixed sensor type displayed in sensor preferences
    dialog. (Closes LP: #968912)
    dialog. (Closes LP: #968912)
-* psensor: fixed compilation error on 64bits with ATI/AMD GPU support.
-* psensor: not calling g_thread_init when compiled with glib >= 2.31.
-* changed copyright dates to 2012.
+** psensor: fixed compilation error on 64bits with ATI/AMD GPU support.
+** psensor: not calling g_thread_init when compiled with glib >= 2.31.
+** changed copyright dates to 2012.
 
 
-v0.6.2.16
----------
+* v0.6.2.16
 
 
-* psensor: removed -pedantic and ignores deprecation warnings
+** psensor: removed -pedantic and ignores deprecation warnings
    to fix compilation against the glib version of Ubuntu Precise.
    It fixes Ubuntu bug #905893.
 
    to fix compilation against the glib version of Ubuntu Precise.
    It fixes Ubuntu bug #905893.
 
-v0.6.2.15
----------
+* v0.6.2.15
 
 
-* +psensor-server+: uses glibtop instead of 'sysinfo' which is not
+** psensor-server: uses glibtop instead of 'sysinfo' which is not
    available on kfreebsd. It fixes Debian bug #650533.
 
    available on kfreebsd. It fixes Debian bug #650533.
 
-v0.6.2.14
----------
+* v0.6.2.14
 
 
-* psensor: support of gtk>=2.18
-* psensor: inner space of the graph using the theme background color
-* +psensor-server+: fixed compilation with microhttpd >=0x90200 and
+** psensor: support of gtk>=2.18
+** psensor: inner space of the graph using the theme background color
+** psensor-server: fixed compilation with microhttpd >=0x90200 and
    64bits.
    64bits.
-* added some information in the README (mostly about compilation on
+** added some information in the README (mostly about compilation on
    CentOS).
    CentOS).
-* +psensor-server+: support of symbolic links to webfiles.
+** psensor-server: support of symbolic links to webfiles.
 
 
-v0.6.2.13
----------
+* v0.6.2.13
 
 
-* psensor can now be compiled and run with gtk3.
-* psensor: added gtk3 support build detection.
-* psensor: added libappindicator3-01 (gtk3 compliant version)
+** psensor can now be compiled and run with gtk3.
+** psensor: added gtk3 support build detection.
+** psensor: added libappindicator3-01 (gtk3 compliant version)
    detection.
    detection.
-* psensor: use 'draw' signal instead of 'expose-event' when compiled
+** psensor: use 'draw' signal instead of 'expose-event' when compiled
    with gtk3. 
    with gtk3. 
-* psensor: fixed typo in french translation file.
-* +psensor-server+: fixed compilation with microhttpd >= 0.9.2 (version
+** psensor: fixed typo in french translation file.
+** psensor-server: fixed compilation with microhttpd >= 0.9.2 (version
    used by Fedora15) which introduced incompatible API changes.
    used by Fedora15) which introduced incompatible API changes.
-* psensor: fixed compilation with libnotify 0.5.2 (submitted by Lubos
+** psensor: fixed compilation with libnotify 0.5.2 (submitted by Lubos
    Stanek).
    Stanek).
-* psensor: added missing CPPFLAGS for Gtop (submitted by Lubos Stanek).
-* psensor: fixed compilation with AMD/ATI GPU monitoring support
+** psensor: added missing CPPFLAGS for Gtop (submitted by Lubos Stanek).
+** psensor: fixed compilation with AMD/ATI GPU monitoring support
    (submitted by Lubos Stanek).
    (submitted by Lubos Stanek).
-* psensor: default log level set to LOG_WARN.
-* few code refactoring and cleanup.
-* psensor: added support of status tray icon for DE not supporting
+** psensor: default log level set to LOG_WARN.
+** few code refactoring and cleanup.
+** psensor: added support of status tray icon for DE not supporting
    Ubuntu Application Indicator.
 
    Ubuntu Application Indicator.
 
-v0.6.2.12
----------
+* v0.6.2.12
 
 
-* psensor: added -d option to enable debug log (written to $HOME/.psensor/log).
-* psensor: log sensor values in debug mode.
-* psensor: added option to restore window position and size.
+** psensor: added -d option to enable debug log (written to $HOME/.psensor/log).
+** psensor: log sensor values in debug mode.
+** psensor: added option to restore window position and size.
 
 
-v0.6.2.11
----------
+* v0.6.2.11
 
 
-* psensor-server/web interface: use jqplot default css.
-* psensor-server/web interface: added excanvas for ie < 9 support.
-* psensor-server/web interface: automatic update of the monitoring page.
-* psensor-server/web interface: improved styling and navigation.
-* psensor-server/web interface: added graph for cpu usage.
-* psensor-server/web interface: fixed IE8 bug (page title change not
+** psensor-server/web interface: use jqplot default css.
+** psensor-server/web interface: added excanvas for ie < 9 support.
+** psensor-server/web interface: automatic update of the monitoring page.
+** psensor-server/web interface: improved styling and navigation.
+** psensor-server/web interface: added graph for cpu usage.
+** psensor-server/web interface: fixed IE8 bug (page title change not
    allowed).
    allowed).
-* psensor-server/web interface: dynamic refresh of the graph.
-* psensor: added appindicator monochrome icons from Christoph Buchner
+** psensor-server/web interface: dynamic refresh of the graph.
+** psensor: added appindicator monochrome icons from Christoph Buchner
    (bilderbuchi).
    (bilderbuchi).
-* psensor: added log file (~/.psensor/log).
-* psensor: added X-GNOME-Autostart-Delay in .desktop file to
+** psensor: added log file (~/.psensor/log).
+** psensor: added X-GNOME-Autostart-Delay in .desktop file to
    workaround LP: #859724.
 
    workaround LP: #859724.
 
-v0.6.2.10
----------
+* v0.6.2.10
 
 
-* +psensor-server+: added network, cpu load and memory information in
+** psensor-server: added network, cpu load and memory information in
    JSON web interface.
    JSON web interface.
-* +psensor-server+: added monitor.html and details.html using jquery
+** psensor-server: added monitor.html and details.html using jquery
    and retrieving monitoring data from the JSON web interface.
    and retrieving monitoring data from the JSON web interface.
-* added experimental support for ATI/AMD gpus and fans.
-* psensor: added support of CPU usage monitoring.
-* +psensor-server+: display graph of sensors (web server).
-* psensor: bug fixed compilation with -Wall.
-* psensor: bug fixed unallocated memory read during termination.
-* psensor: fixed memleak when window not drawable.
-* psensor: release GConfClient when quitting.
-
-v0.6.2.9
---------
-
-* psensor: fixed UI freeze on Ubuntu Lucid when 'sensor preferences'.
+** added experimental support for ATI/AMD gpus and fans.
+** psensor: added support of CPU usage monitoring.
+** psensor-server: display graph of sensors (web server).
+** psensor: bug fixed compilation with -Wall.
+** psensor: bug fixed unallocated memory read during termination.
+** psensor: fixed memleak when window not drawable.
+** psensor: release GConfClient when quitting.
+
+* v0.6.2.9
+
+** psensor: fixed UI freeze on Ubuntu Lucid when 'sensor preferences'.
    is selected with application indicator.
    is selected with application indicator.
-* added missing src/description.txt file into source archive.
-* psensor: appindicator displays unit of sensor values.
-* psensor: added preference for hiding main window on startup.
-* psensor: added 'about' dialog.
-* psensor: merged Chinese Simplified translation from royclarck 
-* psensor: autostarted by default
-* nvidia: code cleanup
-* nvidia: fixed init, error var not initialized
-* nvidia: fixed nvidia_psensor_list_add, incorrect memory free
-* psensor: when appindicator is not supported by wm:
+** added missing src/description.txt file into source archive.
+** psensor: appindicator displays unit of sensor values.
+** psensor: added preference for hiding main window on startup.
+** psensor: added 'about' dialog.
+** psensor: merged Chinese Simplified translation from royclarck 
+** psensor: autostarted by default
+** nvidia: code cleanup
+** nvidia: fixed init, error var not initialized
+** nvidia: fixed nvidia_psensor_list_add, incorrect memory free
+** psensor: when appindicator is not support by wm:
    - psensor quit on window close
    - show psensor even if hide on startup is enabled
 
    - psensor quit on window close
    - show psensor even if hide on startup is enabled
 
-v0.6.2.8
---------
+* v0.6.2.8
 
 
-* psensor: escaped - in manpage.
-* +psensor-server+: escaped - in manpage.
-* psensor: added support of libnotify 0.7.
-* psensor: added turkish support.
-* psensor: fixed multi-languages support used by glade.
-* switched from wpitchoune@gmail.com to jeanfi@gmail.com (my usual
+** psensor: escaped - in manpage.
+** psensor-server: escaped - in manpage.
+** psensor: added support of libnotify 0.7.
+** psensor: added turkish support.
+** psensor: fixed multi-languages support used by glade.
+** switched from wpitchoune@gmail.com to jeanfi@gmail.com (my usual
    email).
    email).
-* merged french translation from v0.6.1.8.
-* added missing french translation.
-* added different sizes of psensor.png .
-* psensor: added menu.
-* psensor: added enable/disable unity launcher counter.
-* psensor: unity launcher counter displays the higher temperature.
-* avoid fetching hddtemp daemon when no hdd in the sensors list.
-* psensor: closing the window hides psensor instead of quitting when
+** merged french translation from v0.6.1.8.
+** added missing french translation.
+** added different sizes of psensor.png .
+** psensor: added menu.
+** psensor: added enable/disable unity launcher counter.
+** psensor: unity launcher counter displays the higher temperature.
+** avoid fetching hddtemp daemon when no hdd in the sensors list.
+** psensor: closing the window hides psensor instead of quitting when
    application indicator support is enabled. 
    application indicator support is enabled. 
-* psensor: dialog window for editing all sensors preferences.
-* psensor: added support of GTK3.0 (GTK2.0 still supported).
-* psensor: fixed crash when glade files cannot be read.
-* psensor: display sensors information in the application indicator.
-
-v0.6.2.7
---------
-
-* psensor: src/glade/psensor-pref.glade, added button separator.
-* psensor: src/glade/sensor-edit.glade, fixed horiz/vert padding.
-* psensor: src/lib/measure.c, initialize time.
-* psensor: fixed freeze when click on preferences appindicator with
+** psensor: dialog window for editing all sensors preferences.
+** psensor: added support of GTK3.0 (GTK2.0 still supported).
+** psensor: fixed crash when glade files cannot be read.
+** psensor: display sensors information in the application indicator.
+
+* v0.6.2.7
+
+** psensor: src/glade/psensor-pref.glade, added button separator.
+** psensor: src/glade/sensor-edit.glade, fixed horiz/vert padding.
+** psensor: src/lib/measure.c, initialize time.
+** psensor: fixed freeze when click on preferences appindicator with
    natty.
 
    natty.
 
-v0.6.2.6
---------
+* v0.6.2.6
 
 
-* psensor: fixed min temp/fan of the graph
-* psensor: very minor optimization (graph.c)
+** psensor: fixed min temp/fan of the graph
+** psensor: very minor optimization (graph.c)
 
 
-v0.6.2.5
---------
+* v0.6.2.5
 
 
-* psensor: dialog box for editing psensor preferences is using Glade
-* psensor: dialog box for editing sensor preferences is using Glade
-* psensor: added support of negative temperatures (lm-sensors)
+** psensor: dialog box for editing psensor preferences is using Glade
+** psensor: dialog box for editing sensor preferences is using Glade
+** psensor: added support of negative temperatures (lm-sensors)
 
 
-v0.6.2.4
---------
+* v0.6.2.4
 
 
-* psensor, graph: fixed padding bugs 
-* psensor, graph: drawing code refactored
-* psensor: the value of the first detected sensor is displayed in the
+** psensor, graph: fixed padding bugs 
+** psensor, graph: drawing code refactored
+** psensor: the value of the first detected sensor is displayed in the
    unity launcher entry of psensor (requires unity >=3.4.2).
 
    unity launcher entry of psensor (requires unity >=3.4.2).
 
-v0.6.2.3
---------
+* v0.6.2.3
 
 
-* +psensor-server+: new global variable 'psensor_version' for lua template
-* +psensor-server+: /index.html replaced by /index.lua
-* avoid useless lib linkage by using --as-needed
+** psensor-server: new global variable 'psensor_version' for lua template
+** psensor-server: /index.html replaced by /index.lua
+** avoid useless lib linkage by using --as-needed
 
 
-v0.6.2.2
---------
+* v0.6.2.2
 
 
-* +psensor-server+: web server support binary files
-* +psensor-server+: added favicon.ico
-* +psensor-server+: moved index.lua to monitor.lua
-* +psensor-server+: added index.html (welcome page)
+** psensor-server: web server support binary files
+** psensor-server: added favicon.ico
+** psensor-server: moved index.lua to monitor.lua
+** psensor-server: added index.html (welcome page)
 
 
-v0.6.2.1
---------
+* v0.6.2.1
 
 
-* added uptime/memory information (psensor-server web)
-* added debug mode for psensor-server (--debug)
-* when used in debug mode, psensor-server can be stopped remotely
+** added uptime/memory information (psensor-server web)
+** added debug mode for psensor-server (--debug)
+** when used in debug mode, psensor-server can be stopped remotely
    using http://hostname:port/api/1.0/server/stop
    using http://hostname:port/api/1.0/server/stop
-* fixed memory leak (label of lmsensor)
-* some code cleanup/refactoring
+** fixed memory leak (label of lmsensor)
+** some code cleanup/refactoring
 
 
-v0.6.1.10
---------
+* v0.6.1.10
 
 
-* psensor: support of appindicator < 0.2.9
-* psensor: closing the window hides psensor instead of quitting when
+** psensor: support of appindicator < 0.2.9
+** psensor: closing the window hides psensor instead of quitting when
    application indicator support is enabled. 
 
    application indicator support is enabled. 
 
-v0.6.1.9
---------
+* v0.6.1.9
 
 
-* avoid fetching hddtemp daemon when no hdd in the sensors list
+** avoid fetching hddtemp daemon when no hdd in the sensors list
 
 
-v0.6.1.8
---------
+* v0.6.1.8
 
 
-* psensor: added turkish language
-* psensor: fixed freeze when click on preferences appindicator with
+** psensor: added turkish language
+** psensor: fixed freeze when click on preferences appindicator with
    natty.
    natty.
-* fixed typo (${X11_LIBS}) in configure.ac
-* psensor: full french language support
+** fixed typo (${X11_LIBS}) in configure.ac
+** psensor: full french language support
 
 
-v0.6.1.7
---------
+* v0.6.1.7
 
 
-* psensor: add support of libnotify 0.7
+** psensor: add support of libnotify 0.7
 
 
-v0.6.1.6
---------
+* v0.6.1.6
 
 
-* psensor: escaped - in manpage
-* +psensor-server+: escaped - in manpage
+** psensor: escaped - in manpage
+** psensor-server: escaped - in manpage
 
 
-v0.6.1.5
---------
+* v0.6.1.5
 
 
-* added multi-language for hdd.c/nvidia.c/lmsensor.c
-* some code cleanup/refactoring
+** added multi-language for hdd.c/nvidia.c/lmsensor.c
+** some code cleanup/refactoring
 
 
-v0.6.1.4
---------
+* v0.6.1.4
 
 
-* fixed manpage formatting in 'REPORTING BUGS' section
-* improved manpages
-* removed few useless translations (fr/zh_CN)
-* improved error messages for remote sensors + multilanguages support
+** fixed manpage formatting in 'REPORTING BUGS' section
+** improved manpages
+** removed few useless translations (fr/zh_CN)
+** improved error messages for remote sensors + multilanguages support
 
 
-v0.6.1.3
---------
+* v0.6.1.3
 
 
-* fixed compilation error of psensor when libcurl is present but not
+** fixed compilation error of psensor when libcurl is present but not
    libjson0
    libjson0
-* suppress pointer to Textinfo manual (psensor/psensor-server).
-* added --name to help2man call (psensor/psensor-server manpages).
-* added more information in the psensor/psensor-server manpages.
-* added warning about psensor-server and security in README.
-
-v0.6.1.1
---------
-
-* application icon is loaded using GtkIconTheme
-* appindicator icon is now the psensor one
-* added appindicator icon for status 'attention'
-
-v0.6.1
-------
-
-* added style.css for psensor-server
-* use some styling in index.lua
-* fixed typo in README
-* fixed psensor-server short option -p
-* multi-language support for psensor-server
-* added some translation for French language0
-* fixed psensor-server bug: first sensor was not displayed
-
-v0.6.0.14
----------
-
-* psensor (gtk client):
-
-** added global preference: graph update interval
-** added global preference: graph monitoring duration
-** added global preference: sensor update interval
-** standard gnu command line interface for psensor
-** new psensor options: --help, --version, --url
-** added generation and installation of the psensor man
-** added remote monitoring it requires a new optionnal dependencies
+** suppress pointer to Textinfo manual (psensor/psensor-server).
+** added --name to help2man call (psensor/psensor-server manpages).
+** added more information in the psensor/psensor-server manpages.
+** added warning about psensor-server and security in README.
+
+* v0.6.1.1
+
+** application icon is loaded using GtkIconTheme
+** appindicator icon is now the psensor one
+** added appindicator icon for status 'attention'
+
+* v0.6.1
+
+** added style.css for psensor-server
+** use some styling in index.lua
+** fixed typo in README
+** fixed psensor-server short option -p
+** multi-language support for psensor-server
+** added some translation for French language0
+** fixed psensor-server bug: first sensor was not displayed
+
+* v0.6.0.14
+
+** psensor (gtk client):
+
+*** added global preference: graph update interval
+*** added global preference: graph monitoring duration
+*** added global preference: sensor update interval
+*** standard gnu command line interface for psensor
+*** new psensor options: --help, --version, --url
+*** added generation and installation of the psensor man
+*** added remote monitoring it requires a new optionnal dependencies
     (libjson0 and libcurl)
     (libjson0 and libcurl)
-** added internationnalization support for the UI
-** added Simplified Chinese Language (from DaBao <linux.dabao@gmail.com>)
+*** added internationnalization support for the UI
+*** added Simplified Chinese Language (from DaBao <linux.dabao@gmail.com>)
 
 
-* +psensor-server+:
+** psensor-server:
 
 
-** psensor-server is now a minimal webserver based on microhttpd.
+*** psensor-server is now a minimal webserver based on microhttpd.
     Lua5.1 is used to generate HTML pages to display temperatures and
     gtop2 information
     Lua5.1 is used to generate HTML pages to display temperatures and
     gtop2 information
-** temperature information can be retrieved using a webservice based
+*** temperature information can be retrieved using a webservice based
     on json
     on json
-** added cpu information (requires optional libgtop-2.0)
-** psensor-server 
-** psensor-server options: --port, --help, --version
-** added generation and installation of the psensor-server man
-
-* common news for psensor and psensor-server:
-
-** moved to autoconf/automake
-** gnu standard: use NEWS instead of CHANGES file
-** moved LICENSE to COPYING
-
-v0.5.1
-------
-
-* Makefile: avoid debug compilation by default
-* Makefile: fixed duplicate server.o in OBJS_SERVER
-* moved LICENSE to copyright
-* moved CHANGES to NEWS
-* Fixed creation of directories for the target 'install'
-
-v0.5.0
-------
-
-* Added double buffering of the graph to avoid flickering
-* Fixed README error gconf package name
-* Refactoring makefile
-* Added desktop notification support
-* Added application indicator support
-* Fixed MT issue (UI freeze, refresh_thread)
-* Added global preferences editor (right click on the graph)
-* Added sensor preferences editor (right click on the sensor table)
-* Displayed name of each sensor can be changed
-* Position of the sensor table can be changed
-* Window decoration can be hidden
-* Added 'keep window below' setting
-
-v0.4.5
-------
-
-* Makefile: fixed duplicate server.o in OBJS_SERVER
+*** added cpu information (requires optional libgtop-2.0)
+*** psensor-server 
+*** psensor-server options: --port, --help, --version
+*** added generation and installation of the psensor-server man
 
 
-v0.4.4
-------
+** common news for psensor and psensor-server:
 
 
+*** moved to autoconf/automake
+*** gnu standard: use NEWS instead of CHANGES file
+*** moved LICENSE to COPYING
+
+* v0.5.1
+
+** Makefile: avoid debug compilation by default
+** Makefile: fixed duplicate server.o in OBJS_SERVER
+** moved LICENSE to copyright
+** moved CHANGES to NEWS
+** Fixed creation of directories for the target 'install'
+
+* v0.5.0
+
+** Added double buffering of the graph to avoid flickering
+** Fixed README error gconf package name
+** Refactoring makefile
+** Added desktop notification support
+** Added application indicator support
+** Fixed MT issue (UI freeze, refresh_thread)
+** Added global preferences editor (right click on the graph)
+** Added sensor preferences editor (right click on the sensor table)
+** Displayed name of each sensor can be changed
+** Position of the sensor table can be changed
+** Window decoration can be hidden
+** Added 'keep window below' setting
+
+* v0.4.5
+
+** Makefile: fixed duplicate server.o in OBJS_SERVER
+
+v0.4.4
 Added README.debian
 
 v0.4.3
 Added README.debian
 
 v0.4.3
-------
-
-* Fixed foreground graph color first time psensor is started
-* Added support of gtk 2.12 (used by Debian 5.0.6 Lenny) by redefining
-* gtk_dialog_get_content_area which exist since 2.14
+Fixed foreground graph color first time psensor is started
+Added support of gtk 2.12 (used by Debian 5.0.6 Lenny) by redefining
+gtk_dialog_get_content_area which exist since 2.14
 
 v0.4.2
 
 v0.4.2
-------
-
-* Fixed potential MT issue (refresh_thread)
-* Added double buffering of the graph to avoid flickering
-* Fixed minor graph code bugs
+Fixed potential MT issue (refresh_thread)
+Added double buffering of the graph to avoid flickering
+Fixed minor graph code bugs
 
 v0.4.1
 
 v0.4.1
-------
-
-* Fixed README error gconf package name
-* Refactoring makefile
+Fixed README error gconf package name
+Refactoring makefile
 
 v0.4.0
 
 v0.4.0
-------
-
-* Added FAN support
-* Added HDD support (using hddtemp daemon)
-* Added popup menu for changing graph bg/fg colors and opacity
-* Graph background can be transparent, opacity can be changed
-* Fixed BR3: sensors with the same name but different chips share the same color configuration
-* Fixed BR4: wrong OBJS variable and gconf when calling pkg-config in Makefile.distrib for compiling with NVidia support
+Added FAN support
+Added HDD support (using hddtemp daemon)
+Added popup menu for changing graph bg/fg colors and opacity
+Graph background can be transparent, opacity can be changed
+Fixed BR3: sensors with the same name but different chips share the same color configuration
+Fixed BR4: wrong OBJS variable and gconf when calling pkg-config in Makefile.distrib for compiling with NVidia support
 Changed website URL
 Changed website URL
-Fixed BR5: Psensor crashes during startup with "You forgot to call g_type_init()"
+Fixed BR5: Psensor crashes during startup with "You forgot to call g_type_init()"
 
 v0.3.3
 
 v0.3.3
-------
-
-* Fixed potential MT issue  (refresh_thread)
-* Improved Makefile
+Fixed potential MT issue  (refresh_thread)
+Improved Makefile
 
 v0.3.2
 
 v0.3.2
-------
-
-* Fixed BR4: wrong OBJS variable and gconf when calling pkg-config in Makefile.distrib for compiling with NVidia support
-* Changed website URL
-* Fixed BR5: Psensor crashes during startup with "You forgot to call g_type_init()"
+Fixed BR4: wrong OBJS variable and gconf when calling pkg-config in Makefile.distrib for compiling with NVidia support
+Changed website URL
+Fixed BR5: Psensor crashes during startup with "You forgot to call g_type_init()"
 
 v0.3.1
 
 v0.3.1
-------
-
 Fixed BR3: sensors with the same name but different chips share the same color configuration
 
 v0.3.0
 Fixed BR3: sensors with the same name but different chips share the same color configuration
 
 v0.3.0
-------
-
-* Sensor graph colors can be changed: click on the colored sensor cell in the information table)
-* Background color of the graph can be changed: click on the graph
-* Configuration is stored using GConf
-* Fixed not initialized memory bug (min/max) in nvidia support
+Sensor graph colors can be changed: click on the colored sensor cell in the information table)
+Background color of the graph can be changed: click on the graph
+Configuration is stored using GConf
+Fixed not initialized memory bug (min/max) in nvidia support
 
 v0.2.7
 
 v0.2.7
-------
-
-* Updated the website URL
-* Added contact information in the README
-* Backported Makefile improvement from trunk
-* Removed pwiki styling of the README
-* Backport: Fixed not initialized memory bug (min/max) in nvidia support
+Updated the website URL
+Added contact information in the README
+Backported Makefile improvement from trunk
+Removed pwiki styling of the README
+Backport: Fixed not initialized memory bug (min/max) in nvidia support
 
 
 v0.2.6
 
 
 v0.2.6
-------
-
-* Changed default graph colors and background
-* Added vertical padding for the graph canvas
-* Disabled row selection of the sensor table
-* Fixed BR2: nvidia gpu is always using black color
+Changed default graph colors and background
+Added vertical padding for the graph canvas
+Disabled row selection of the sensor table
+Fixed BR2: nvidia gpu is always using black color
 
 v0.2.5
 
 v0.2.5
-------
-
 Added a basic server to retrieve remotely temperatures
 
 v0.2.4
 Added a basic server to retrieve remotely temperatures
 
 v0.2.4
-------
-
-* Added application icon
-* Added .desktop file
+Added application icon
+Added .desktop file
 
 v0.2.3
 
 v0.2.3
-------
-
-* Added max and min temperature information for each sensor
-* Fixed a missing #include in nvidia.c
-* Small UI improvements (scrollbar for the right panel + slider)
+Added max and min temperature information for each sensor
+Fixed a missing #include in nvidia.c
+Small UI improvements (scrollbar for the right panel + slider)
 
 v0.2.2
 
 v0.2.2
-------
-
-* Fixed compilation warning when NVidia support is disabled
-* Fixed BR1: crash when no temperature sensor is available
+Fixed compilation warning when NVidia support is disabled
+Fixed BR1: crash when no temperature sensor is available
 
 v0.2.1
 
 v0.2.1
---------
-
 Compilation dependance to Nvidia lib is optional
 
 v0.2.0
 Compilation dependance to Nvidia lib is optional
 
 v0.2.0
-------
-
 Added support of NVidia GPUs
 
 v0.1.1
 Added support of NVidia GPUs
 
 v0.1.1
-------
-
 Improved right panel (list of sensors) + ability to disable each sensor graph
 
 v0.1.0
 Improved right panel (list of sensors) + ability to disable each sensor graph
 
 v0.1.0
-------
-
 Initial release
 Initial release
+
+
diff --git a/NEWS.html b/NEWS.html
deleted file mode 100644 (file)
index ba5f0c6..0000000
--- a/NEWS.html
+++ /dev/null
@@ -1,2481 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"\r
-    "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">\r
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">\r
-<head>\r
-<meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />\r
-<meta name="generator" content="AsciiDoc 8.6.7" />\r
-<title>Psensor NEWS</title>\r
-<style type="text/css">\r
-\r
-body {\r
-    background: #e2e2e2;\r
-    color: #333333;\r
-    font-family: Ubuntu,Arial,sans-serif;\r
-    line-height: 1.6;\r
-    font-weight: lighter;\r
-    margin: 1em 2em 2em 2em;\r
-    padding: 0 0 0 0;\r
-}\r
-\r
-h1 {\r
-    font-size: 2.813em;\r
-    margin: 0 0 0.267em 0;\r
-    padding: 0 0 0 0;\r
-    font-weight: normal;\r
-}\r
-\r
-h2 {\r
-    font-size: 2em;\r
-    margin: 0 0 0.375em;\r
-    padding: 0 0 0 0;\r
-    font-weight: normal;\r
-}\r
-\r
-h3 {\r
-    font-size: 1.438em;\r
-    margin: 0 0 0.522em;\r
-    padding: 0 0 0 0;\r
-    font-weight: normal;\r
-}\r
-\r
-h4 {\r
-    font-size: 1.219em;\r
-    margin: 0 0 0.615em;\r
-    padding: 0 0 0 0;\r
-    font-weight: normal;\r
-}\r
-\r
-h5 {\r
-    font-size: 1em;\r
-    margin: 0 0 0.75em;\r
-    padding: 0 0 0 0;\r
-    font-weight: bold;\r
-}\r
-\r
-h6 {\r
-    font-weight: normal;\r
-    font-size: 0.813em;\r
-    letter-spacing: 0.1em;\r
-    margin: 0 0 0.923em;\r
-    text-transform: uppercase;\r
-    padding: 0 0 0 0;\r
-}\r
-\r
-li {\r
-    margin: 0 0 0 1em;\r
-    line-height: 1.6;\r
-}\r
-\r
-li p {\r
-    margin: 0 0 0 0;\r
-}\r
-\r
-ul {\r
-    margin: 0 0 0 0;\r
-    padding: 0 0 0 0;\r
-}\r
-\r
-a:link, a:visited {\r
-    color: #19B6EE;\r
-    text-decoration: none;\r
-}\r
-\r
-a:hover {\r
-    text-decoration: underline;\r
-}\r
-\r
-code, pre, tt {\r
-    font-family: "Ubuntu Mono","Courier New",Courier,monospace;\r
-    font-weight: normal;\r
-    color: #333333;\r
-}\r
-\r
-pre {\r
-    background: none repeat scroll 0 0 #e0e0e0;\r
-    border-radius: 4px;\r
-    padding: 0.5em 0.5em;\r
-    margin: 0 0 0 0;\r
-    white-space: pre-wrap;\r
-    word-wrap: break-word;\r
-}\r
-\r
-table {\r
-    width: 100%;\r
-    text-align: left;\r
-}\r
-\r
-#footer {\r
-    margin: 0 0 0 0;\r
-    font-size: 0.8em;\r
-    font-weight: lighter;\r
-    clear: both;\r
-    text-align: right;\r
-}\r
-\r
-#page {\r
-    margin: 0 0 0 0;\r
-    padding: 0 0 0 0;\r
-}\r
-\r
-#main {\r
-    background: #ffffff;\r
-\r
-   -moz-box-sizing: border-box;\r
-\r
-    padding: 2em 2em 2em 2em;\r
-\r
-    -moz-border-radius: 4px;\r
-    -webkit-border-radius: 4px;\r
-    border-radius: 4px;\r
-\r
-    -webkit-box-shadow: 0 2px 2px 0 #C2C2C2;\r
-    box-shadow: 0 2px 2px 0 #C2C2C2;\r
-}\r
-\r
-#menu {\r
-    background: #ffffff;\r
-   -moz-box-sizing: border-box;\r
-    padding: 2em 2em 2em 2em;\r
-\r
-    -moz-border-radius: 4px;\r
-    -webkit-border-radius: 4px;\r
-    border-radius: 4px;\r
-\r
-    -webkit-box-shadow: 0 2px 2px 0 #C2C2C2;\r
-    box-shadow: 0 2px 2px 0 #C2C2C2;\r
-}\r
-\r
-#menu-list, #menu-list > li > ul  {\r
-    list-style-type: none;\r
-}\r
-\r
-/* menu on left col, content on right col */\r
-\r
-#menu {\r
-    float: left;\r
-    width: 18%;\r
-}\r
-\r
-#main {\r
-    float: right;\r
-    width: 80%;\r
-}\r
-\r
-/* asciidoc */\r
-\r
-#toc, #content {\r
-    margin: 0em 0em 2em 0em;\r
-\r
-    background: #ffffff;\r
-   -moz-box-sizing: border-box;\r
-    padding: 2em 2em 2em 2em;\r
-\r
-    -moz-border-radius: 4px;\r
-    -webkit-border-radius: 4px;\r
-    border-radius: 4px;\r
-\r
-    -webkit-box-shadow: 0 2px 2px 0 #C2C2C2;\r
-    box-shadow: 0 2px 2px 0 #C2C2C2;\r
-}\r
-</style>\r
-<script type="text/javascript">\r
-/*<![CDATA[*/\r
-var asciidoc = {  // Namespace.\r
-\r
-/////////////////////////////////////////////////////////////////////\r
-// Table Of Contents generator\r
-/////////////////////////////////////////////////////////////////////\r
-\r
-/* Author: Mihai Bazon, September 2002\r
- * http://students.infoiasi.ro/~mishoo\r
- *\r
- * Table Of Content generator\r
- * Version: 0.4\r
- *\r
- * Feel free to use this script under the terms of the GNU General Public\r
- * License, as long as you do not remove or alter this notice.\r
- */\r
-\r
- /* modified by Troy D. Hanson, September 2006. License: GPL */\r
- /* modified by Stuart Rackham, 2006, 2009. License: GPL */\r
-\r
-// toclevels = 1..4.\r
-toc: function (toclevels) {\r
-\r
-  function getText(el) {\r
-    var text = "";\r
-    for (var i = el.firstChild; i != null; i = i.nextSibling) {\r
-      if (i.nodeType == 3 /* Node.TEXT_NODE */) // IE doesn't speak constants.\r
-        text += i.data;\r
-      else if (i.firstChild != null)\r
-        text += getText(i);\r
-    }\r
-    return text;\r
-  }\r
-\r
-  function TocEntry(el, text, toclevel) {\r
-    this.element = el;\r
-    this.text = text;\r
-    this.toclevel = toclevel;\r
-  }\r
-\r
-  function tocEntries(el, toclevels) {\r
-    var result = new Array;\r
-    var re = new RegExp('[hH]([1-'+(toclevels+1)+'])');\r
-    // Function that scans the DOM tree for header elements (the DOM2\r
-    // nodeIterator API would be a better technique but not supported by all\r
-    // browsers).\r
-    var iterate = function (el) {\r
-      for (var i = el.firstChild; i != null; i = i.nextSibling) {\r
-        if (i.nodeType == 1 /* Node.ELEMENT_NODE */) {\r
-          var mo = re.exec(i.tagName);\r
-          if (mo && (i.getAttribute("class") || i.getAttribute("className")) != "float") {\r
-            result[result.length] = new TocEntry(i, getText(i), mo[1]-1);\r
-          }\r
-          iterate(i);\r
-        }\r
-      }\r
-    }\r
-    iterate(el);\r
-    return result;\r
-  }\r
-\r
-  var toc = document.getElementById("toc");\r
-  if (!toc) {\r
-    return;\r
-  }\r
-\r
-  // Delete existing TOC entries in case we're reloading the TOC.\r
-  var tocEntriesToRemove = [];\r
-  var i;\r
-  for (i = 0; i < toc.childNodes.length; i++) {\r
-    var entry = toc.childNodes[i];\r
-    if (entry.nodeName.toLowerCase() == 'div'\r
-     && entry.getAttribute("class")\r
-     && entry.getAttribute("class").match(/^toclevel/))\r
-      tocEntriesToRemove.push(entry);\r
-  }\r
-  for (i = 0; i < tocEntriesToRemove.length; i++) {\r
-    toc.removeChild(tocEntriesToRemove[i]);\r
-  }\r
-\r
-  // Rebuild TOC entries.\r
-  var entries = tocEntries(document.getElementById("content"), toclevels);\r
-  for (var i = 0; i < entries.length; ++i) {\r
-    var entry = entries[i];\r
-    if (entry.element.id == "")\r
-      entry.element.id = "_toc_" + i;\r
-    var a = document.createElement("a");\r
-    a.href = "#" + entry.element.id;\r
-    a.appendChild(document.createTextNode(entry.text));\r
-    var div = document.createElement("div");\r
-    div.appendChild(a);\r
-    div.className = "toclevel" + entry.toclevel;\r
-    toc.appendChild(div);\r
-  }\r
-  if (entries.length == 0)\r
-    toc.parentNode.removeChild(toc);\r
-},\r
-\r
-\r
-/////////////////////////////////////////////////////////////////////\r
-// Footnotes generator\r
-/////////////////////////////////////////////////////////////////////\r
-\r
-/* Based on footnote generation code from:\r
- * http://www.brandspankingnew.net/archive/2005/07/format_footnote.html\r
- */\r
-\r
-footnotes: function () {\r
-  // Delete existing footnote entries in case we're reloading the footnodes.\r
-  var i;\r
-  var noteholder = document.getElementById("footnotes");\r
-  if (!noteholder) {\r
-    return;\r
-  }\r
-  var entriesToRemove = [];\r
-  for (i = 0; i < noteholder.childNodes.length; i++) {\r
-    var entry = noteholder.childNodes[i];\r
-    if (entry.nodeName.toLowerCase() == 'div' && entry.getAttribute("class") == "footnote")\r
-      entriesToRemove.push(entry);\r
-  }\r
-  for (i = 0; i < entriesToRemove.length; i++) {\r
-    noteholder.removeChild(entriesToRemove[i]);\r
-  }\r
-\r
-  // Rebuild footnote entries.\r
-  var cont = document.getElementById("content");\r
-  var spans = cont.getElementsByTagName("span");\r
-  var refs = {};\r
-  var n = 0;\r
-  for (i=0; i<spans.length; i++) {\r
-    if (spans[i].className == "footnote") {\r
-      n++;\r
-      var note = spans[i].getAttribute("data-note");\r
-      if (!note) {\r
-        // Use [\s\S] in place of . so multi-line matches work.\r
-        // Because JavaScript has no s (dotall) regex flag.\r
-        note = spans[i].innerHTML.match(/\s*\[([\s\S]*)]\s*/)[1];\r
-        spans[i].innerHTML =\r
-          "[<a id='_footnoteref_" + n + "' href='#_footnote_" + n +\r
-          "' title='View footnote' class='footnote'>" + n + "</a>]";\r
-        spans[i].setAttribute("data-note", note);\r
-      }\r
-      noteholder.innerHTML +=\r
-        "<div class='footnote' id='_footnote_" + n + "'>" +\r
-        "<a href='#_footnoteref_" + n + "' title='Return to text'>" +\r
-        n + "</a>. " + note + "</div>";\r
-      var id =spans[i].getAttribute("id");\r
-      if (id != null) refs["#"+id] = n;\r
-    }\r
-  }\r
-  if (n == 0)\r
-    noteholder.parentNode.removeChild(noteholder);\r
-  else {\r
-    // Process footnoterefs.\r
-    for (i=0; i<spans.length; i++) {\r
-      if (spans[i].className == "footnoteref") {\r
-        var href = spans[i].getElementsByTagName("a")[0].getAttribute("href");\r
-        href = href.match(/#.*/)[0];  // Because IE return full URL.\r
-        n = refs[href];\r
-        spans[i].innerHTML =\r
-          "[<a href='#_footnote_" + n +\r
-          "' title='View footnote' class='footnote'>" + n + "</a>]";\r
-      }\r
-    }\r
-  }\r
-},\r
-\r
-install: function(toclevels) {\r
-  var timerId;\r
-\r
-  function reinstall() {\r
-    asciidoc.footnotes();\r
-    if (toclevels) {\r
-      asciidoc.toc(toclevels);\r
-    }\r
-  }\r
-\r
-  function reinstallAndRemoveTimer() {\r
-    clearInterval(timerId);\r
-    reinstall();\r
-  }\r
-\r
-  timerId = setInterval(reinstall, 500);\r
-  if (document.addEventListener)\r
-    document.addEventListener("DOMContentLoaded", reinstallAndRemoveTimer, false);\r
-  else\r
-    window.onload = reinstallAndRemoveTimer;\r
-}\r
-\r
-}\r
-asciidoc.install();\r
-/*]]>*/\r
-</script>\r
-</head>\r
-<body class="article">\r
-<div id="header">\r
-<h1>Psensor NEWS</h1>\r
-</div>\r
-<div id="content">\r
-<div class="sect1">\r
-<h2 id="_v0_8_0_5">v0.8.0.5</h2>\r
-<div class="sectionbody">\r
-<div class="ulist"><ul>\r
-<li>\r
-<p>\r
-Added NEWS.html.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Converted NEWS file to asciidoc.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-<tt>psensor-server</tt>:\r
-</p>\r
-<div class="ulist"><ul>\r
-<li>\r
-<p>\r
-removed web fonts causing lintian warnings.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-redesigned web pages.\r
-</p>\r
-</li>\r
-</ul></div>\r
-</li>\r
-<li>\r
-<p>\r
-Merged German translation from LP (Dennis Baudys).\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Merged Latvian translation from LP (tuxmaniack).\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Merged Russian translation from LP (Dmitry).\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Merged Turkish translation from LP (İbrahim Çelik).\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Added Dutch translation from LP (Pjotr12345).\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Fixed some french translations.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-AppIndicator icons: removed shadow, added padding. (LP: #1290072).\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Fixed compilation issue with gtk3.10 and deprecation of\r
-  GtkActionEntry. Menu is defined in glade file instead of\r
-  hardcoded. (LP: #1304108).\r
-</p>\r
-</li>\r
-</ul></div>\r
-</div>\r
-</div>\r
-<div class="sect1">\r
-<h2 id="_v0_8_0_4">v0.8.0.4</h2>\r
-<div class="sectionbody">\r
-<div class="ulist"><ul>\r
-<li>\r
-<p>\r
-Added calling script when an alarm is raised.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Reordering of the list of sensors.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Added keywords in .desktop file.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Added LFS support.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Fixed compilation issue for x32 architecture on 64bits systems.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Merged German translation from LP (Dennis Baudys).\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Merged Spanish translation from LP (Javier).\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Merged French translation from LP (londumas).\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Merged Brazilian translation from LP (Celio Alves).\r
-</p>\r
-</li>\r
-</ul></div>\r
-</div>\r
-</div>\r
-<div class="sect1">\r
-<h2 id="_v0_8_0_3">v0.8.0.3</h2>\r
-<div class="sectionbody">\r
-<div class="ulist"><ul>\r
-<li>\r
-<p>\r
-Switched to GtkColorChooserDialog instead of the\r
-   deprecated widget GtkColorSelectionDialog. (LP: #1184442)\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-<tt>psensor-server</tt>: fixed compilation without gtop2 lib.\r
-</p>\r
-</li>\r
-</ul></div>\r
-</div>\r
-</div>\r
-<div class="sect1">\r
-<h2 id="_v0_8_0_2">v0.8.0.2</h2>\r
-<div class="sectionbody">\r
-<div class="ulist"><ul>\r
-<li>\r
-<p>\r
-GConf2/GTK/XEXT/X11 lib optional to allow psensor-server\r
-   compilation without them.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Added support of libjson-c.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-merged German translation from LP (Dennis Baudys).\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-merged Latvian translation from LP (tuxmaniack).\r
-</p>\r
-</li>\r
-</ul></div>\r
-</div>\r
-</div>\r
-<div class="sect1">\r
-<h2 id="_v0_8_0_1">v0.8.0.1</h2>\r
-<div class="sectionbody">\r
-<div class="ulist"><ul>\r
-<li>\r
-<p>\r
-added AMD GPU usage sensor (Contribution from MestreLion).\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-added support of sensors log interval.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-<tt>psensor-server</tt>: protocole changes, API version incremented.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-fixed cpu load when fahrenheit is enabled.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-list of sensors can be reordered using the sensor preferences\r
-   dialog.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-merged Spanish translation from LP (Javier) and Tomeu R. .\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-merged French translation from LP (Hélion du Mas des Bourboux).\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-merged Italian translation from LP (Diego Pierotto).\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-merged Brazillian Portugues translation from LP (MestreLion).\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-fixed the quit menu of the application indicator which was\r
-   not translatable.\r
-</p>\r
-</li>\r
-</ul></div>\r
-</div>\r
-</div>\r
-<div class="sect1">\r
-<h2 id="_v07_0_5">v07.0.5</h2>\r
-<div class="sectionbody">\r
-<div class="ulist"><ul>\r
-<li>\r
-<p>\r
-fixed cpu load when fahrenheit is enabled.\r
-</p>\r
-</li>\r
-</ul></div>\r
-</div>\r
-</div>\r
-<div class="sect1">\r
-<h2 id="_v0_7_0_4">v0.7.0.4</h2>\r
-<div class="sectionbody">\r
-<div class="ulist"><ul>\r
-<li>\r
-<p>\r
-added Spanish translation from LP (Javier and Eduardo Alberto\r
-   Calvo).\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-merged German translation from LP (Dennis Baudys).\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-merged French translation from LP (Alain-OIivier Breysse).\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-merged Hungarian from translation LP (Bence Lukács).\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-merged Latvian translation from LP (tuxmaniack).\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-merged Portuguese translation from LP (Daniel Serafim).\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-merged Russian translation from LP (Ilya Volchanetskiy).\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-merged Ukrainian translation from LP (Ilya Volchanetskiy).\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-merged Chinese translation from LP (Wang Dianjin).\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-psensor: fixed <em>appindicator enabled</em> option not working correctly\r
-   for cpu usage. The option was inversed each time it is displayed in\r
-   the preference dialog.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-psensor: added an option to enable logging of sensors\r
-   ($HOME/.psensor/sensors.log).\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-<tt>psensor-server</tt>: added sensors logging (--sensor-log-file).\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-psensor: display the name of chip in sensor preferences.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-psensor: moved the sensor id into a expendable frame of the sensor\r
-   preferences.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-test target is now running cppcheck if available.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-fixed cppcheck reported errors (realloc and not freed var).\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-fixed cppcheck (old values not used).\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-added faq (requires asciidoc to build the html version).\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-check target is now running cppcheck if installed.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-display a message if no graphs are enabled (Closes #689355).\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-psensor: when <em>hide window on startup</em> is set, it will\r
-   hide the window only if psensor can register to application\r
-   indicator or systray. Waiting 30s before trying to do it\r
-   in order to have better chance that systray is running during\r
-   session startup.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-fixed displaying of the fahrenheit temperature in the main\r
-   window.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-fixed compilation error in amd.c (hdll not used).\r
-</p>\r
-</li>\r
-</ul></div>\r
-</div>\r
-</div>\r
-<div class="sect1">\r
-<h2 id="_v0_7_0_3">v0.7.0.3</h2>\r
-<div class="sectionbody">\r
-<div class="ulist"><ul>\r
-<li>\r
-<p>\r
-psensor: removed gettext_domain in psensor.schemas causing\r
-   warnings.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-merged italian and russian translation from LP.\r
-</p>\r
-</li>\r
-</ul></div>\r
-</div>\r
-</div>\r
-<div class="sect1">\r
-<h2 id="_v0_7_0_2">v0.7.0.2</h2>\r
-<div class="sectionbody">\r
-<div class="ulist"><ul>\r
-<li>\r
-<p>\r
-psensor: added latvian translation file.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-psensor: added gconf schema. (LP: #1026807)\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-psensor: hide sensors in the application indicator.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-psensor: removed hicolor/48x48/psensor_hot.png. (LP: #1029065)\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-merge chinese translation from LP.\r
-</p>\r
-</li>\r
-</ul></div>\r
-</div>\r
-</div>\r
-<div class="sect1">\r
-<h2 id="_v0_7_0_1">v0.7.0.1</h2>\r
-<div class="sectionbody">\r
-<div class="ulist"><ul>\r
-<li>\r
-<p>\r
-psensor: minimum GTK version is now 3.0, GTK v2.x is no more\r
-   supported.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-psensor: fixed sensor type displayed in sensor preferences\r
-   dialog. (Closes LP: #968912)\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-psensor: not calling g_thread_init when compiled with glib &gt;= 2.31.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-psensor: added basic instruction in the README for compiling psensor\r
-            with the ATI/AMD GPU support.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-psensor: fixed compilation error on 64bits with ATI/AMD GPU support.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-psensor: added capability to use libatasmart for sata disk monitoring.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-psensor: added option --use-libatasmart.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-changed copyright dates to 2012.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-psensor: fixed systray and application indicator visible at the\r
-   same time. (Closes LP: #971098)\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-psensor: fixed wrong background color, get the background color of\r
-   the window and not the canvas widget. (Closes LP: #973122)\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-psensor: used the foreground color defined by the theme for the\r
-   font of the graph legend.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-psensor: used tab layout for psensor preferences.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-psensor: temperature unit choice (celcius/fahrenheit).\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-<tt>psensor-server</tt>: fixed --wdir option.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-<tt>psensor-server</tt>: added log level to -d option.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-<tt>psensor-server</tt>: added --log-file option.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-<tt>psensor-server</tt>: logged measures when log level is 3.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-psensor: fixed many memory leaks in cfg.c (gconf2 keys).\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-psensor: fixed memory leak (sensor name when specified by the\r
-   configuration).\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-psensor: implemented the psensor uniquess, non-primary psensor\r
-   instances show the window of the primary psensor instance and\r
-   exits.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-many code quality improvements.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-psensor: added --new-instance option to allow the creation of\r
-   multiple instances of Psensor.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-psensor: added the degree sign before the temperature symbols\r
-            (Closes LP: #1021900).\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-psensor: alarm limit edition using the temperature unit set in the\r
-   global pref.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-psensor: improved notification (added psensor icon and value of the\r
-   sensor).\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-full french and hungarian translation.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-merged some chinese translation provided by LP.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-added translation files for Brazilian Portuguese, and Italian.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-partial translations for Russian, Serbian, Ukrainian, Slovenian and\r
-   German.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-psensor: fixed i18n support for the application indicator menu.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-psensor: fixed i18n support for the application menu.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-psensor: added low thresold support for alerts.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-psensor: added fan alert support.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-psensor: fixed hide window on startup for gnome-shell (Closes:\r
-   #676361).\r
-</p>\r
-</li>\r
-</ul></div>\r
-</div>\r
-</div>\r
-<div class="sect1">\r
-<h2 id="_v0_6_2_19">v0.6.2.19</h2>\r
-<div class="sectionbody">\r
-<div class="ulist"><ul>\r
-<li>\r
-<p>\r
-psensor: fixed size of the icon hicolor/48x48/psensor_hot.png.\r
-   (LP: #1029065)\r
-</p>\r
-</li>\r
-</ul></div>\r
-</div>\r
-</div>\r
-<div class="sect1">\r
-<h2 id="_v0_6_2_18">v0.6.2.18</h2>\r
-<div class="sectionbody">\r
-<div class="ulist"><ul>\r
-<li>\r
-<p>\r
-added degree sign for celcius (Closes LP: #1021900).\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-added russian, brazilian, hungarian, serbian, slovenian,\r
-   italian, ukrainian and german translation files.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-merged translations from LP.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-psensor: fixed hide window on startup for gnome-shell (Closes:\r
-   #676361).\r
-</p>\r
-</li>\r
-</ul></div>\r
-</div>\r
-</div>\r
-<div class="sect1">\r
-<h2 id="_v0_6_2_17">v0.6.2.17</h2>\r
-<div class="sectionbody">\r
-<div class="ulist"><ul>\r
-<li>\r
-<p>\r
-psensor: fixed sensor type displayed in sensor preferences\r
-   dialog. (Closes LP: #968912)\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-psensor: fixed compilation error on 64bits with ATI/AMD GPU support.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-psensor: not calling g_thread_init when compiled with glib &gt;= 2.31.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-changed copyright dates to 2012.\r
-</p>\r
-</li>\r
-</ul></div>\r
-</div>\r
-</div>\r
-<div class="sect1">\r
-<h2 id="_v0_6_2_16">v0.6.2.16</h2>\r
-<div class="sectionbody">\r
-<div class="ulist"><ul>\r
-<li>\r
-<p>\r
-psensor: removed -pedantic and ignores deprecation warnings\r
-   to fix compilation against the glib version of Ubuntu Precise.\r
-   It fixes Ubuntu bug #905893.\r
-</p>\r
-</li>\r
-</ul></div>\r
-</div>\r
-</div>\r
-<div class="sect1">\r
-<h2 id="_v0_6_2_15">v0.6.2.15</h2>\r
-<div class="sectionbody">\r
-<div class="ulist"><ul>\r
-<li>\r
-<p>\r
-<tt>psensor-server</tt>: uses glibtop instead of <em>sysinfo</em> which is not\r
-   available on kfreebsd. It fixes Debian bug #650533.\r
-</p>\r
-</li>\r
-</ul></div>\r
-</div>\r
-</div>\r
-<div class="sect1">\r
-<h2 id="_v0_6_2_14">v0.6.2.14</h2>\r
-<div class="sectionbody">\r
-<div class="ulist"><ul>\r
-<li>\r
-<p>\r
-psensor: support of gtk&gt;=2.18\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-psensor: inner space of the graph using the theme background color\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-<tt>psensor-server</tt>: fixed compilation with microhttpd &gt;=0x90200 and\r
-   64bits.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-added some information in the README (mostly about compilation on\r
-   CentOS).\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-<tt>psensor-server</tt>: support of symbolic links to webfiles.\r
-</p>\r
-</li>\r
-</ul></div>\r
-</div>\r
-</div>\r
-<div class="sect1">\r
-<h2 id="_v0_6_2_13">v0.6.2.13</h2>\r
-<div class="sectionbody">\r
-<div class="ulist"><ul>\r
-<li>\r
-<p>\r
-psensor can now be compiled and run with gtk3.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-psensor: added gtk3 support build detection.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-psensor: added libappindicator3-01 (gtk3 compliant version)\r
-   detection.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-psensor: use <em>draw</em> signal instead of <em>expose-event</em> when compiled\r
-   with gtk3.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-psensor: fixed typo in french translation file.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-<tt>psensor-server</tt>: fixed compilation with microhttpd &gt;= 0.9.2 (version\r
-   used by Fedora15) which introduced incompatible API changes.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-psensor: fixed compilation with libnotify 0.5.2 (submitted by Lubos\r
-   Stanek).\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-psensor: added missing CPPFLAGS for Gtop (submitted by Lubos Stanek).\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-psensor: fixed compilation with AMD/ATI GPU monitoring support\r
-   (submitted by Lubos Stanek).\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-psensor: default log level set to LOG_WARN.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-few code refactoring and cleanup.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-psensor: added support of status tray icon for DE not supporting\r
-   Ubuntu Application Indicator.\r
-</p>\r
-</li>\r
-</ul></div>\r
-</div>\r
-</div>\r
-<div class="sect1">\r
-<h2 id="_v0_6_2_12">v0.6.2.12</h2>\r
-<div class="sectionbody">\r
-<div class="ulist"><ul>\r
-<li>\r
-<p>\r
-psensor: added -d option to enable debug log (written to $HOME/.psensor/log).\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-psensor: log sensor values in debug mode.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-psensor: added option to restore window position and size.\r
-</p>\r
-</li>\r
-</ul></div>\r
-</div>\r
-</div>\r
-<div class="sect1">\r
-<h2 id="_v0_6_2_11">v0.6.2.11</h2>\r
-<div class="sectionbody">\r
-<div class="ulist"><ul>\r
-<li>\r
-<p>\r
-psensor-server/web interface: use jqplot default css.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-psensor-server/web interface: added excanvas for ie &lt; 9 support.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-psensor-server/web interface: automatic update of the monitoring page.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-psensor-server/web interface: improved styling and navigation.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-psensor-server/web interface: added graph for cpu usage.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-psensor-server/web interface: fixed IE8 bug (page title change not\r
-   allowed).\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-psensor-server/web interface: dynamic refresh of the graph.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-psensor: added appindicator monochrome icons from Christoph Buchner\r
-   (bilderbuchi).\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-psensor: added log file (~/.psensor/log).\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-psensor: added X-GNOME-Autostart-Delay in .desktop file to\r
-   workaround LP: #859724.\r
-</p>\r
-</li>\r
-</ul></div>\r
-</div>\r
-</div>\r
-<div class="sect1">\r
-<h2 id="_v0_6_2_10">v0.6.2.10</h2>\r
-<div class="sectionbody">\r
-<div class="ulist"><ul>\r
-<li>\r
-<p>\r
-<tt>psensor-server</tt>: added network, cpu load and memory information in\r
-   JSON web interface.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-<tt>psensor-server</tt>: added monitor.html and details.html using jquery\r
-   and retrieving monitoring data from the JSON web interface.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-added experimental support for ATI/AMD gpus and fans.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-psensor: added support of CPU usage monitoring.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-<tt>psensor-server</tt>: display graph of sensors (web server).\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-psensor: bug fixed compilation with -Wall.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-psensor: bug fixed unallocated memory read during termination.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-psensor: fixed memleak when window not drawable.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-psensor: release GConfClient when quitting.\r
-</p>\r
-</li>\r
-</ul></div>\r
-</div>\r
-</div>\r
-<div class="sect1">\r
-<h2 id="_v0_6_2_9">v0.6.2.9</h2>\r
-<div class="sectionbody">\r
-<div class="ulist"><ul>\r
-<li>\r
-<p>\r
-psensor: fixed UI freeze on Ubuntu Lucid when <em>sensor preferences</em>.\r
-   is selected with application indicator.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-added missing src/description.txt file into source archive.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-psensor: appindicator displays unit of sensor values.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-psensor: added preference for hiding main window on startup.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-psensor: added <em>about</em> dialog.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-psensor: merged Chinese Simplified translation from royclarck\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-psensor: autostarted by default\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-nvidia: code cleanup\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-nvidia: fixed init, error var not initialized\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-nvidia: fixed nvidia_psensor_list_add, incorrect memory free\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-psensor: when appindicator is not supported by wm:\r
-</p>\r
-<div class="ulist"><ul>\r
-<li>\r
-<p>\r
-psensor quit on window close\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-show psensor even if hide on startup is enabled\r
-</p>\r
-</li>\r
-</ul></div>\r
-</li>\r
-</ul></div>\r
-</div>\r
-</div>\r
-<div class="sect1">\r
-<h2 id="_v0_6_2_8">v0.6.2.8</h2>\r
-<div class="sectionbody">\r
-<div class="ulist"><ul>\r
-<li>\r
-<p>\r
-psensor: escaped - in manpage.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-<tt>psensor-server</tt>: escaped - in manpage.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-psensor: added support of libnotify 0.7.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-psensor: added turkish support.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-psensor: fixed multi-languages support used by glade.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-switched from <a href="mailto:wpitchoune@gmail.com">wpitchoune@gmail.com</a> to <a href="mailto:jeanfi@gmail.com">jeanfi@gmail.com</a> (my usual\r
-   email).\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-merged french translation from v0.6.1.8.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-added missing french translation.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-added different sizes of psensor.png .\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-psensor: added menu.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-psensor: added enable/disable unity launcher counter.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-psensor: unity launcher counter displays the higher temperature.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-avoid fetching hddtemp daemon when no hdd in the sensors list.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-psensor: closing the window hides psensor instead of quitting when\r
-   application indicator support is enabled.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-psensor: dialog window for editing all sensors preferences.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-psensor: added support of GTK3.0 (GTK2.0 still supported).\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-psensor: fixed crash when glade files cannot be read.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-psensor: display sensors information in the application indicator.\r
-</p>\r
-</li>\r
-</ul></div>\r
-</div>\r
-</div>\r
-<div class="sect1">\r
-<h2 id="_v0_6_2_7">v0.6.2.7</h2>\r
-<div class="sectionbody">\r
-<div class="ulist"><ul>\r
-<li>\r
-<p>\r
-psensor: src/glade/psensor-pref.glade, added button separator.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-psensor: src/glade/sensor-edit.glade, fixed horiz/vert padding.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-psensor: src/lib/measure.c, initialize time.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-psensor: fixed freeze when click on preferences appindicator with\r
-   natty.\r
-</p>\r
-</li>\r
-</ul></div>\r
-</div>\r
-</div>\r
-<div class="sect1">\r
-<h2 id="_v0_6_2_6">v0.6.2.6</h2>\r
-<div class="sectionbody">\r
-<div class="ulist"><ul>\r
-<li>\r
-<p>\r
-psensor: fixed min temp/fan of the graph\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-psensor: very minor optimization (graph.c)\r
-</p>\r
-</li>\r
-</ul></div>\r
-</div>\r
-</div>\r
-<div class="sect1">\r
-<h2 id="_v0_6_2_5">v0.6.2.5</h2>\r
-<div class="sectionbody">\r
-<div class="ulist"><ul>\r
-<li>\r
-<p>\r
-psensor: dialog box for editing psensor preferences is using Glade\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-psensor: dialog box for editing sensor preferences is using Glade\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-psensor: added support of negative temperatures (lm-sensors)\r
-</p>\r
-</li>\r
-</ul></div>\r
-</div>\r
-</div>\r
-<div class="sect1">\r
-<h2 id="_v0_6_2_4">v0.6.2.4</h2>\r
-<div class="sectionbody">\r
-<div class="ulist"><ul>\r
-<li>\r
-<p>\r
-psensor, graph: fixed padding bugs\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-psensor, graph: drawing code refactored\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-psensor: the value of the first detected sensor is displayed in the\r
-   unity launcher entry of psensor (requires unity &gt;=3.4.2).\r
-</p>\r
-</li>\r
-</ul></div>\r
-</div>\r
-</div>\r
-<div class="sect1">\r
-<h2 id="_v0_6_2_3">v0.6.2.3</h2>\r
-<div class="sectionbody">\r
-<div class="ulist"><ul>\r
-<li>\r
-<p>\r
-<tt>psensor-server</tt>: new global variable <em>psensor_version</em> for lua template\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-<tt>psensor-server</tt>: /index.html replaced by /index.lua\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-avoid useless lib linkage by using --as-needed\r
-</p>\r
-</li>\r
-</ul></div>\r
-</div>\r
-</div>\r
-<div class="sect1">\r
-<h2 id="_v0_6_2_2">v0.6.2.2</h2>\r
-<div class="sectionbody">\r
-<div class="ulist"><ul>\r
-<li>\r
-<p>\r
-<tt>psensor-server</tt>: web server support binary files\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-<tt>psensor-server</tt>: added favicon.ico\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-<tt>psensor-server</tt>: moved index.lua to monitor.lua\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-<tt>psensor-server</tt>: added index.html (welcome page)\r
-</p>\r
-</li>\r
-</ul></div>\r
-</div>\r
-</div>\r
-<div class="sect1">\r
-<h2 id="_v0_6_2_1">v0.6.2.1</h2>\r
-<div class="sectionbody">\r
-<div class="ulist"><ul>\r
-<li>\r
-<p>\r
-added uptime/memory information (psensor-server web)\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-added debug mode for psensor-server (--debug)\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-when used in debug mode, psensor-server can be stopped remotely\r
-   using <a href="http://hostname:port/api/1.0/server/stop">http://hostname:port/api/1.0/server/stop</a>\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-fixed memory leak (label of lmsensor)\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-some code cleanup/refactoring\r
-</p>\r
-</li>\r
-</ul></div>\r
-</div>\r
-</div>\r
-<div class="sect1">\r
-<h2 id="_v0_6_1_10">v0.6.1.10</h2>\r
-<div class="sectionbody">\r
-<div class="ulist"><ul>\r
-<li>\r
-<p>\r
-psensor: support of appindicator &lt; 0.2.9\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-psensor: closing the window hides psensor instead of quitting when\r
-   application indicator support is enabled.\r
-</p>\r
-</li>\r
-</ul></div>\r
-</div>\r
-</div>\r
-<div class="sect1">\r
-<h2 id="_v0_6_1_9">v0.6.1.9</h2>\r
-<div class="sectionbody">\r
-<div class="ulist"><ul>\r
-<li>\r
-<p>\r
-avoid fetching hddtemp daemon when no hdd in the sensors list\r
-</p>\r
-</li>\r
-</ul></div>\r
-</div>\r
-</div>\r
-<div class="sect1">\r
-<h2 id="_v0_6_1_8">v0.6.1.8</h2>\r
-<div class="sectionbody">\r
-<div class="ulist"><ul>\r
-<li>\r
-<p>\r
-psensor: added turkish language\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-psensor: fixed freeze when click on preferences appindicator with\r
-   natty.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-psensor: full french language support\r
-</p>\r
-</li>\r
-</ul></div>\r
-</div>\r
-</div>\r
-<div class="sect1">\r
-<h2 id="_v0_6_1_7">v0.6.1.7</h2>\r
-<div class="sectionbody">\r
-<div class="ulist"><ul>\r
-<li>\r
-<p>\r
-psensor: add support of libnotify 0.7\r
-</p>\r
-</li>\r
-</ul></div>\r
-</div>\r
-</div>\r
-<div class="sect1">\r
-<h2 id="_v0_6_1_6">v0.6.1.6</h2>\r
-<div class="sectionbody">\r
-<div class="ulist"><ul>\r
-<li>\r
-<p>\r
-psensor: escaped - in manpage\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-<tt>psensor-server</tt>: escaped - in manpage\r
-</p>\r
-</li>\r
-</ul></div>\r
-</div>\r
-</div>\r
-<div class="sect1">\r
-<h2 id="_v0_6_1_5">v0.6.1.5</h2>\r
-<div class="sectionbody">\r
-<div class="ulist"><ul>\r
-<li>\r
-<p>\r
-added multi-language for hdd.c/nvidia.c/lmsensor.c\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-some code cleanup/refactoring\r
-</p>\r
-</li>\r
-</ul></div>\r
-</div>\r
-</div>\r
-<div class="sect1">\r
-<h2 id="_v0_6_1_4">v0.6.1.4</h2>\r
-<div class="sectionbody">\r
-<div class="ulist"><ul>\r
-<li>\r
-<p>\r
-fixed manpage formatting in <em>REPORTING BUGS</em> section\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-improved manpages\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-removed few useless translations (fr/zh_CN)\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-improved error messages for remote sensors + multilanguages support\r
-</p>\r
-</li>\r
-</ul></div>\r
-</div>\r
-</div>\r
-<div class="sect1">\r
-<h2 id="_v0_6_1_3">v0.6.1.3</h2>\r
-<div class="sectionbody">\r
-<div class="ulist"><ul>\r
-<li>\r
-<p>\r
-fixed compilation error of psensor when libcurl is present but not\r
-   libjson0\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-suppress pointer to Textinfo manual (psensor/psensor-server).\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-added --name to help2man call (psensor/psensor-server manpages).\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-added more information in the psensor/psensor-server manpages.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-added warning about psensor-server and security in README.\r
-</p>\r
-</li>\r
-</ul></div>\r
-</div>\r
-</div>\r
-<div class="sect1">\r
-<h2 id="_v0_6_1_1">v0.6.1.1</h2>\r
-<div class="sectionbody">\r
-<div class="ulist"><ul>\r
-<li>\r
-<p>\r
-application icon is loaded using GtkIconTheme\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-appindicator icon is now the psensor one\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-added appindicator icon for status <em>attention</em>\r
-</p>\r
-</li>\r
-</ul></div>\r
-</div>\r
-</div>\r
-<div class="sect1">\r
-<h2 id="_v0_6_1">v0.6.1</h2>\r
-<div class="sectionbody">\r
-<div class="ulist"><ul>\r
-<li>\r
-<p>\r
-added style.css for psensor-server\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-use some styling in index.lua\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-fixed typo in README\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-fixed psensor-server short option -p\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-multi-language support for psensor-server\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-added some translation for French language0\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-fixed psensor-server bug: first sensor was not displayed\r
-</p>\r
-</li>\r
-</ul></div>\r
-</div>\r
-</div>\r
-<div class="sect1">\r
-<h2 id="_v0_6_0_14">v0.6.0.14</h2>\r
-<div class="sectionbody">\r
-<div class="ulist"><ul>\r
-<li>\r
-<p>\r
-psensor (gtk client):\r
-</p>\r
-<div class="ulist"><ul>\r
-<li>\r
-<p>\r
-added global preference: graph update interval\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-added global preference: graph monitoring duration\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-added global preference: sensor update interval\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-standard gnu command line interface for psensor\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-new psensor options: --help, --version, --url\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-added generation and installation of the psensor man\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-added remote monitoring it requires a new optionnal dependencies\r
-    (libjson0 and libcurl)\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-added internationnalization support for the UI\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-added Simplified Chinese Language (from DaBao &lt;<a href="mailto:linux.dabao@gmail.com">linux.dabao@gmail.com</a>&gt;)\r
-</p>\r
-</li>\r
-</ul></div>\r
-</li>\r
-<li>\r
-<p>\r
-<tt>psensor-server</tt>:\r
-</p>\r
-<div class="ulist"><ul>\r
-<li>\r
-<p>\r
-psensor-server is now a minimal webserver based on microhttpd.\r
-    Lua5.1 is used to generate HTML pages to display temperatures and\r
-    gtop2 information\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-temperature information can be retrieved using a webservice based\r
-    on json\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-added cpu information (requires optional libgtop-2.0)\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-psensor-server\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-psensor-server options: --port, --help, --version\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-added generation and installation of the psensor-server man\r
-</p>\r
-</li>\r
-</ul></div>\r
-</li>\r
-<li>\r
-<p>\r
-common news for psensor and psensor-server:\r
-</p>\r
-<div class="ulist"><ul>\r
-<li>\r
-<p>\r
-moved to autoconf/automake\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-gnu standard: use NEWS instead of CHANGES file\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-moved LICENSE to COPYING\r
-</p>\r
-</li>\r
-</ul></div>\r
-</li>\r
-</ul></div>\r
-</div>\r
-</div>\r
-<div class="sect1">\r
-<h2 id="_v0_5_1">v0.5.1</h2>\r
-<div class="sectionbody">\r
-<div class="ulist"><ul>\r
-<li>\r
-<p>\r
-Makefile: avoid debug compilation by default\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Makefile: fixed duplicate server.o in OBJS_SERVER\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-moved LICENSE to copyright\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-moved CHANGES to NEWS\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Fixed creation of directories for the target <em>install</em>\r
-</p>\r
-</li>\r
-</ul></div>\r
-</div>\r
-</div>\r
-<div class="sect1">\r
-<h2 id="_v0_5_0">v0.5.0</h2>\r
-<div class="sectionbody">\r
-<div class="ulist"><ul>\r
-<li>\r
-<p>\r
-Added double buffering of the graph to avoid flickering\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Fixed README error gconf package name\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Refactoring makefile\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Added desktop notification support\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Added application indicator support\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Fixed MT issue (UI freeze, refresh_thread)\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Added global preferences editor (right click on the graph)\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Added sensor preferences editor (right click on the sensor table)\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Displayed name of each sensor can be changed\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Position of the sensor table can be changed\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Window decoration can be hidden\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Added <em>keep window below</em> setting\r
-</p>\r
-</li>\r
-</ul></div>\r
-</div>\r
-</div>\r
-<div class="sect1">\r
-<h2 id="_v0_4_5">v0.4.5</h2>\r
-<div class="sectionbody">\r
-<div class="ulist"><ul>\r
-<li>\r
-<p>\r
-Makefile: fixed duplicate server.o in OBJS_SERVER\r
-</p>\r
-</li>\r
-</ul></div>\r
-</div>\r
-</div>\r
-<div class="sect1">\r
-<h2 id="_v0_4_4">v0.4.4</h2>\r
-<div class="sectionbody">\r
-<div class="paragraph"><p>Added README.debian</p></div>\r
-</div>\r
-</div>\r
-<div class="sect1">\r
-<h2 id="_v0_4_3">v0.4.3</h2>\r
-<div class="sectionbody">\r
-<div class="ulist"><ul>\r
-<li>\r
-<p>\r
-Fixed foreground graph color first time psensor is started\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Added support of gtk 2.12 (used by Debian 5.0.6 Lenny) by redefining\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-gtk_dialog_get_content_area which exist since 2.14\r
-</p>\r
-</li>\r
-</ul></div>\r
-</div>\r
-</div>\r
-<div class="sect1">\r
-<h2 id="_v0_4_2">v0.4.2</h2>\r
-<div class="sectionbody">\r
-<div class="ulist"><ul>\r
-<li>\r
-<p>\r
-Fixed potential MT issue (refresh_thread)\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Added double buffering of the graph to avoid flickering\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Fixed minor graph code bugs\r
-</p>\r
-</li>\r
-</ul></div>\r
-</div>\r
-</div>\r
-<div class="sect1">\r
-<h2 id="_v0_4_1">v0.4.1</h2>\r
-<div class="sectionbody">\r
-<div class="ulist"><ul>\r
-<li>\r
-<p>\r
-Fixed README error gconf package name\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Refactoring makefile\r
-</p>\r
-</li>\r
-</ul></div>\r
-</div>\r
-</div>\r
-<div class="sect1">\r
-<h2 id="_v0_4_0">v0.4.0</h2>\r
-<div class="sectionbody">\r
-<div class="ulist"><ul>\r
-<li>\r
-<p>\r
-Added FAN support\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Added HDD support (using hddtemp daemon)\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Added popup menu for changing graph bg/fg colors and opacity\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Graph background can be transparent, opacity can be changed\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Fixed BR3: sensors with the same name but different chips share the same color configuration\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Fixed BR4: wrong OBJS variable and gconf when calling pkg-config in Makefile.distrib for compiling with NVidia support\r
-Changed website URL\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Fixed BR5: Psensor crashes during startup with "You forgot to call g_type_init()"\r
-</p>\r
-</li>\r
-</ul></div>\r
-</div>\r
-</div>\r
-<div class="sect1">\r
-<h2 id="_v0_3_3">v0.3.3</h2>\r
-<div class="sectionbody">\r
-<div class="ulist"><ul>\r
-<li>\r
-<p>\r
-Fixed potential MT issue  (refresh_thread)\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Improved Makefile\r
-</p>\r
-</li>\r
-</ul></div>\r
-</div>\r
-</div>\r
-<div class="sect1">\r
-<h2 id="_v0_3_2">v0.3.2</h2>\r
-<div class="sectionbody">\r
-<div class="ulist"><ul>\r
-<li>\r
-<p>\r
-Fixed BR4: wrong OBJS variable and gconf when calling pkg-config in Makefile.distrib for compiling with NVidia support\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Changed website URL\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Fixed BR5: Psensor crashes during startup with "You forgot to call g_type_init()"\r
-</p>\r
-</li>\r
-</ul></div>\r
-</div>\r
-</div>\r
-<div class="sect1">\r
-<h2 id="_v0_3_1">v0.3.1</h2>\r
-<div class="sectionbody">\r
-<div class="paragraph"><p>Fixed BR3: sensors with the same name but different chips share the same color configuration</p></div>\r
-</div>\r
-</div>\r
-<div class="sect1">\r
-<h2 id="_v0_3_0">v0.3.0</h2>\r
-<div class="sectionbody">\r
-<div class="ulist"><ul>\r
-<li>\r
-<p>\r
-Sensor graph colors can be changed: click on the colored sensor cell in the information table)\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Background color of the graph can be changed: click on the graph\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Configuration is stored using GConf\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Fixed not initialized memory bug (min/max) in nvidia support\r
-</p>\r
-</li>\r
-</ul></div>\r
-</div>\r
-</div>\r
-<div class="sect1">\r
-<h2 id="_v0_2_7">v0.2.7</h2>\r
-<div class="sectionbody">\r
-<div class="ulist"><ul>\r
-<li>\r
-<p>\r
-Updated the website URL\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Added contact information in the README\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Backported Makefile improvement from trunk\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Removed pwiki styling of the README\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Backport: Fixed not initialized memory bug (min/max) in nvidia support\r
-</p>\r
-</li>\r
-</ul></div>\r
-</div>\r
-</div>\r
-<div class="sect1">\r
-<h2 id="_v0_2_6">v0.2.6</h2>\r
-<div class="sectionbody">\r
-<div class="ulist"><ul>\r
-<li>\r
-<p>\r
-Changed default graph colors and background\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Added vertical padding for the graph canvas\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Disabled row selection of the sensor table\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Fixed BR2: nvidia gpu is always using black color\r
-</p>\r
-</li>\r
-</ul></div>\r
-</div>\r
-</div>\r
-<div class="sect1">\r
-<h2 id="_v0_2_5">v0.2.5</h2>\r
-<div class="sectionbody">\r
-<div class="paragraph"><p>Added a basic server to retrieve remotely temperatures</p></div>\r
-</div>\r
-</div>\r
-<div class="sect1">\r
-<h2 id="_v0_2_4">v0.2.4</h2>\r
-<div class="sectionbody">\r
-<div class="ulist"><ul>\r
-<li>\r
-<p>\r
-Added application icon\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Added .desktop file\r
-</p>\r
-</li>\r
-</ul></div>\r
-</div>\r
-</div>\r
-<div class="sect1">\r
-<h2 id="_v0_2_3">v0.2.3</h2>\r
-<div class="sectionbody">\r
-<div class="ulist"><ul>\r
-<li>\r
-<p>\r
-Added max and min temperature information for each sensor\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Fixed a missing #include in nvidia.c\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Small UI improvements (scrollbar for the right panel + slider)\r
-</p>\r
-</li>\r
-</ul></div>\r
-</div>\r
-</div>\r
-<div class="sect1">\r
-<h2 id="_v0_2_2">v0.2.2</h2>\r
-<div class="sectionbody">\r
-<div class="ulist"><ul>\r
-<li>\r
-<p>\r
-Fixed compilation warning when NVidia support is disabled\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Fixed BR1: crash when no temperature sensor is available\r
-</p>\r
-</li>\r
-</ul></div>\r
-</div>\r
-</div>\r
-<div class="sect1">\r
-<h2 id="_v0_2_1">v0.2.1</h2>\r
-<div class="sectionbody">\r
-<div class="paragraph"><p>Compilation dependance to Nvidia lib is optional</p></div>\r
-</div>\r
-</div>\r
-<div class="sect1">\r
-<h2 id="_v0_2_0">v0.2.0</h2>\r
-<div class="sectionbody">\r
-<div class="paragraph"><p>Added support of NVidia GPUs</p></div>\r
-</div>\r
-</div>\r
-<div class="sect1">\r
-<h2 id="_v0_1_1">v0.1.1</h2>\r
-<div class="sectionbody">\r
-<div class="paragraph"><p>Improved right panel (list of sensors) + ability to disable each sensor graph</p></div>\r
-</div>\r
-</div>\r
-<div class="sect1">\r
-<h2 id="_v0_1_0">v0.1.0</h2>\r
-<div class="sectionbody">\r
-<div class="paragraph"><p>Initial release</p></div>\r
-</div>\r
-</div>\r
-</div>\r
-<div id="footnotes"><hr /></div>\r
-<div id="footer">\r
-<div id="footer-text">\r
-Last updated 2014-04-10 08:44:57 CEST\r
-</div>\r
-</div>\r
-</body>\r
-</html>\r
index 7b1b294..ef7fb23 100644 (file)
 <meta name="generator" content="AsciiDoc 8.6.7" />\r
 <title>Psensor README</title>\r
 <style type="text/css">\r
 <meta name="generator" content="AsciiDoc 8.6.7" />\r
 <title>Psensor README</title>\r
 <style type="text/css">\r
-\r
 body {\r
 body {\r
-    background: #e2e2e2;\r
-    color: #333333;\r
-    font-family: Ubuntu,Arial,sans-serif;\r
-    line-height: 1.6;\r
-    font-weight: lighter;\r
-    margin: 1em 2em 2em 2em;\r
-    padding: 0 0 0 0;\r
-}\r
-\r
-h1 {\r
-    font-size: 2.813em;\r
-    margin: 0 0 0.267em 0;\r
-    padding: 0 0 0 0;\r
+    padding: 1em 1em 1em 1em;\r
+    font-family: "Ubuntu", sans-serif;\r
+    font-size: 100%;\r
+    font-style: normal;\r
     font-weight: normal;\r
     font-weight: normal;\r
+    color: #000;\r
+    background-color: #fff;\r
+    margin: 0 0 0 0;\r
 }\r
 \r
 }\r
 \r
-h2 {\r
-    font-size: 2em;\r
-    margin: 0 0 0.375em;\r
-    padding: 0 0 0 0;\r
-    font-weight: normal;\r
+a {\r
+    color: #1982D1;\r
+    font-style: normal;\r
+    text-decoration: none;\r
 }\r
 \r
 }\r
 \r
-h3 {\r
-    font-size: 1.438em;\r
-    margin: 0 0 0.522em;\r
-    padding: 0 0 0 0;\r
-    font-weight: normal;\r
+a:hover {\r
+    text-decoration: underline;\r
 }\r
 \r
 }\r
 \r
-h4 {\r
-    font-size: 1.219em;\r
-    margin: 0 0 0.615em;\r
+h1 {\r
+    font-size: 140%;\r
+    font-style: normal;\r
+    font-weight: bold;\r
+    text-transform: uppercase;\r
+    margin: 0 0 1em 0;\r
     padding: 0 0 0 0;\r
     padding: 0 0 0 0;\r
-    font-weight: normal;\r
 }\r
 \r
 }\r
 \r
-h5 {\r
-    font-size: 1em;\r
-    margin: 0 0 0.75em;\r
-    padding: 0 0 0 0;\r
-    font-weight: bold;\r
-}\r
 \r
 \r
-h6 {\r
-    font-weight: normal;\r
-    font-size: 0.813em;\r
-    letter-spacing: 0.1em;\r
-    margin: 0 0 0.923em;\r
+h2, #toctitle{\r
+    font-size: 110%;\r
+    font-style: normal;\r
+    font-weight: bold;\r
     text-transform: uppercase;\r
     text-transform: uppercase;\r
+    margin: 2em 0em 1em 0em;\r
     padding: 0 0 0 0;\r
 }\r
 \r
     padding: 0 0 0 0;\r
 }\r
 \r
-li {\r
-    margin: 0 0 0 1em;\r
-    line-height: 1.6;\r
+#footer {\r
+    padding-top: 2em;\r
+    color: #666;\r
+    clear: both;\r
+    text-align: right;\r
+    font-size: 75%;\r
 }\r
 \r
 }\r
 \r
-li p {\r
-    margin: 0 0 0 0;\r
+p {\r
+    font-size: 100%;\r
+    margin-bottom: 8px;\r
 }\r
 \r
 }\r
 \r
-ul {\r
-    margin: 0 0 0 0;\r
+table {\r
+    text-align: left;\r
     padding: 0 0 0 0;\r
     padding: 0 0 0 0;\r
+    min-width: 50%;\r
+    border-spacing: 0;\r
+    border: 0;\r
 }\r
 \r
 }\r
 \r
-a:link, a:visited {\r
-    color: #19B6EE;\r
-    text-decoration: none;\r
+thead {\r
+    background-color: #000;\r
+    color: #fff;\r
+    padding: 0 0 0 0;\r
 }\r
 \r
 }\r
 \r
-a:hover {\r
-    text-decoration: underline;\r
+tbody {\r
+    padding: 0 0 0 0;\r
 }\r
 \r
 }\r
 \r
-code, pre, tt {\r
-    font-family: "Ubuntu Mono","Courier New",Courier,monospace;\r
+th {\r
+    padding: 0.25em 0.5em 0.25em 0.5em;\r
+    font-style: normal;\r
     font-weight: normal;\r
     font-weight: normal;\r
-    color: #333333;\r
 }\r
 \r
 }\r
 \r
-pre {\r
-    background: none repeat scroll 0 0 #e0e0e0;\r
-    border-radius: 4px;\r
-    padding: 0.5em 0.5em;\r
-    margin: 0 0 0 0;\r
-    white-space: pre-wrap;\r
-    word-wrap: break-word;\r
+td {\r
+    padding: 0.25em 0.25em 0em 0.25em;\r
 }\r
 \r
 }\r
 \r
-table {\r
+#chart {\r
+    color: #000;\r
+    font-style: normal;\r
+    font-weight: normal;\r
     width: 100%;\r
     width: 100%;\r
-    text-align: left;\r
+    height: 300px;\r
 }\r
 \r
 }\r
 \r
-#footer {\r
-    margin: 0 0 0 0;\r
-    font-size: 0.8em;\r
-    font-weight: lighter;\r
-    clear: both;\r
-    text-align: right;\r
+ul#menu-list li {\r
+    list-style: none;\r
 }\r
 \r
 }\r
 \r
-#page {\r
-    margin: 0 0 0 0;\r
+#menu-list {\r
     padding: 0 0 0 0;\r
     padding: 0 0 0 0;\r
+    margin: 0 0 0 0;\r
 }\r
 \r
 }\r
 \r
-#main {\r
-    background: #ffffff;\r
-\r
-   -moz-box-sizing: border-box;\r
-\r
-    padding: 2em 2em 2em 2em;\r
-\r
-    -moz-border-radius: 4px;\r
-    -webkit-border-radius: 4px;\r
-    border-radius: 4px;\r
-\r
-    -webkit-box-shadow: 0 2px 2px 0 #C2C2C2;\r
-    box-shadow: 0 2px 2px 0 #C2C2C2;\r
-}\r
-\r
-#menu {\r
-    background: #ffffff;\r
-   -moz-box-sizing: border-box;\r
-    padding: 2em 2em 2em 2em;\r
-\r
-    -moz-border-radius: 4px;\r
-    -webkit-border-radius: 4px;\r
-    border-radius: 4px;\r
-\r
-    -webkit-box-shadow: 0 2px 2px 0 #C2C2C2;\r
-    box-shadow: 0 2px 2px 0 #C2C2C2;\r
-}\r
-\r
-#menu-list, #menu-list > li > ul  {\r
-    list-style-type: none;\r
-}\r
-\r
-/* menu on left col, content on right col */\r
-\r
 #menu {\r
     float: left;\r
 #menu {\r
     float: left;\r
-    width: 18%;\r
+    width: 20%;\r
+    padding: 0 0 0 0;\r
+    margin: 0 0 0 0;\r
 }\r
 \r
 #main {\r
     float: right;\r
     width: 80%;\r
 }\r
 \r
 #main {\r
     float: right;\r
     width: 80%;\r
+    padding: 0 0 0 0;\r
+    margin: 0 0em 0 0;\r
 }\r
 \r
 }\r
 \r
-/* asciidoc */\r
+em {\r
+    font-weight: bold;\r
+    font-style: normal;\r
+}\r
 \r
 \r
-#toc, #content {\r
-    margin: 0em 0em 2em 0em;\r
+#uptime {\r
+    font-weight: normal;\r
+}\r
 \r
 \r
-    background: #ffffff;\r
-   -moz-box-sizing: border-box;\r
-    padding: 2em 2em 2em 2em;\r
+#menu-list em {\r
+    text-transform: uppercase;\r
+}\r
 \r
 \r
-    -moz-border-radius: 4px;\r
-    -webkit-border-radius: 4px;\r
-    border-radius: 4px;\r
+#menu ul li {\r
+    padding-bottom: 1em;\r
+}\r
 \r
 \r
-    -webkit-box-shadow: 0 2px 2px 0 #C2C2C2;\r
-    box-shadow: 0 2px 2px 0 #C2C2C2;\r
+#menu-list ul li {\r
+    padding: 0 0 0 0em;\r
 }\r
 }\r
+\r
 </style>\r
 <script type="text/javascript">\r
 /*<![CDATA[*/\r
 </style>\r
 <script type="text/javascript">\r
 /*<![CDATA[*/\r
@@ -708,7 +670,7 @@ have extracted the ATI ADL SDK. Other steps are indentical.</p></div>
 <div id="footnotes"><hr /></div>\r
 <div id="footer">\r
 <div id="footer-text">\r
 <div id="footnotes"><hr /></div>\r
 <div id="footer">\r
 <div id="footer-text">\r
-Last updated 2014-04-10 01:57:33 CEST\r
+Last updated 2013-05-26 19:23:21 CEST\r
 </div>\r
 </div>\r
 </body>\r
 </div>\r
 </div>\r
 </body>\r
index b0f41cb..97948b7 100755 (executable)
--- a/configure
+++ b/configure
@@ -1,6 +1,6 @@
 #! /bin/sh
 # Guess values for system-dependent variables and create Makefiles.
 #! /bin/sh
 # Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.69 for psensor 0.8.0.6.
+# Generated by GNU Autoconf 2.69 for psensor 0.8.0.4.
 #
 # Report bugs to <jeanfi@gmail.com>.
 #
 #
 # Report bugs to <jeanfi@gmail.com>.
 #
@@ -580,8 +580,8 @@ MAKEFLAGS=
 # Identity of this package.
 PACKAGE_NAME='psensor'
 PACKAGE_TARNAME='psensor'
 # Identity of this package.
 PACKAGE_NAME='psensor'
 PACKAGE_TARNAME='psensor'
-PACKAGE_VERSION='0.8.0.6'
-PACKAGE_STRING='psensor 0.8.0.6'
+PACKAGE_VERSION='0.8.0.4'
+PACKAGE_STRING='psensor 0.8.0.4'
 PACKAGE_BUGREPORT='jeanfi@gmail.com'
 PACKAGE_URL='http://wpitchoune.net/psensor'
 
 PACKAGE_BUGREPORT='jeanfi@gmail.com'
 PACKAGE_URL='http://wpitchoune.net/psensor'
 
@@ -1401,7 +1401,7 @@ if test "$ac_init_help" = "long"; then
   # Omit some internal or obsolete options to make the list less imposing.
   # This message is too long to be a string in the A/UX 3.1 sh.
   cat <<_ACEOF
   # Omit some internal or obsolete options to make the list less imposing.
   # This message is too long to be a string in the A/UX 3.1 sh.
   cat <<_ACEOF
-\`configure' configures psensor 0.8.0.6 to adapt to many kinds of systems.
+\`configure' configures psensor 0.8.0.4 to adapt to many kinds of systems.
 
 Usage: $0 [OPTION]... [VAR=VALUE]...
 
 
 Usage: $0 [OPTION]... [VAR=VALUE]...
 
@@ -1475,7 +1475,7 @@ fi
 
 if test -n "$ac_init_help"; then
   case $ac_init_help in
 
 if test -n "$ac_init_help"; then
   case $ac_init_help in
-     short | recursive ) echo "Configuration of psensor 0.8.0.6:";;
+     short | recursive ) echo "Configuration of psensor 0.8.0.4:";;
    esac
   cat <<\_ACEOF
 
    esac
   cat <<\_ACEOF
 
@@ -1624,7 +1624,7 @@ fi
 test -n "$ac_init_help" && exit $ac_status
 if $ac_init_version; then
   cat <<\_ACEOF
 test -n "$ac_init_help" && exit $ac_status
 if $ac_init_version; then
   cat <<\_ACEOF
-psensor configure 0.8.0.6
+psensor configure 0.8.0.4
 generated by GNU Autoconf 2.69
 
 Copyright (C) 2012 Free Software Foundation, Inc.
 generated by GNU Autoconf 2.69
 
 Copyright (C) 2012 Free Software Foundation, Inc.
@@ -2047,7 +2047,7 @@ cat >config.log <<_ACEOF
 This file contains any messages produced by compilers while
 running configure, to aid debugging if configure makes a mistake.
 
 This file contains any messages produced by compilers while
 running configure, to aid debugging if configure makes a mistake.
 
-It was created by psensor $as_me 0.8.0.6, which was
+It was created by psensor $as_me 0.8.0.4, which was
 generated by GNU Autoconf 2.69.  Invocation command line was
 
   $ $0 $@
 generated by GNU Autoconf 2.69.  Invocation command line was
 
   $ $0 $@
@@ -2864,7 +2864,7 @@ fi
 
 # Define the identity of the package.
  PACKAGE='psensor'
 
 # Define the identity of the package.
  PACKAGE='psensor'
- VERSION='0.8.0.6'
+ VERSION='0.8.0.4'
 
 
 cat >>confdefs.h <<_ACEOF
 
 
 cat >>confdefs.h <<_ACEOF
@@ -9835,7 +9835,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
 # report actual input values of CONFIG_FILES etc. instead of their
 # values after options handling.
 ac_log="
 # report actual input values of CONFIG_FILES etc. instead of their
 # values after options handling.
 ac_log="
-This file was extended by psensor $as_me 0.8.0.6, which was
+This file was extended by psensor $as_me 0.8.0.4, which was
 generated by GNU Autoconf 2.69.  Invocation command line was
 
   CONFIG_FILES    = $CONFIG_FILES
 generated by GNU Autoconf 2.69.  Invocation command line was
 
   CONFIG_FILES    = $CONFIG_FILES
@@ -9902,7 +9902,7 @@ _ACEOF
 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
 ac_cs_version="\\
 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
 ac_cs_version="\\
-psensor config.status 0.8.0.6
+psensor config.status 0.8.0.4
 configured by $0, generated by GNU Autoconf 2.69,
   with options \\"\$ac_cs_config\\"
 
 configured by $0, generated by GNU Autoconf 2.69,
   with options \\"\$ac_cs_config\\"
 
index fc28ac0..4851a2b 100644 (file)
@@ -2,7 +2,7 @@
 # Process this file with autoconf to produce a configure script.
 
 AC_PREREQ([2.69])
 # Process this file with autoconf to produce a configure script.
 
 AC_PREREQ([2.69])
-AC_INIT([psensor], [0.8.0.6],[jeanfi@gmail.com],[psensor],[http://wpitchoune.net/psensor])
+AC_INIT([psensor], [0.8.0.4],[jeanfi@gmail.com],[psensor],[http://wpitchoune.net/psensor])
 
 AM_INIT_AUTOMAKE([-Wall -Werror gnu])
 
 
 AM_INIT_AUTOMAKE([-Wall -Werror gnu])
 
index 7374267..222370f 100644 (file)
@@ -1,19 +1,9 @@
-psensor (0.8.0.6-1) unstable; urgency=low
+psensor (0.8.0.4-1.1) unstable; urgency=low
 
 
-  * New upstream release.
-      + fixed AppIndicator icons. (LP: #1290072)
-      + removed webfont to fix lintian warning privacy-breach-generic.
-      + fixed lintian warning source-is-missing due to minimized .js.
-  * debian/control
-      + switched to Standards-Version 3.9.5.
-      + fixed indentation of build-depends section.
-      + changed vcs headers, packaging maintained in git now.
-  * debian/copyright
-      + psensor/packaging copyright end date set to 2014.
-      + jqplot (updated upstream) copyright end date set to 2013.
-      + excanvas.js (removed upstream) copyright removed.
+  * Non-maintainer upload.
+  * Update to build against current json-c (Closes: #746145) 
 
 
- -- Jean-Philippe Orsini <jeanfi@gmail.com>  Tue, 15 Apr 2014 03:40:40 -0400
+ -- Wookey <wookey@debian.org>  Fri, 30 May 2014 16:41:37 +0000
 
 psensor (0.8.0.4-1) unstable; urgency=low
 
 
 psensor (0.8.0.4-1) unstable; urgency=low
 
index f3724ce..09275b4 100644 (file)
@@ -6,7 +6,7 @@ Build-Depends: asciidoc,
                autoconf,
                automake,
                autopoint,
                autoconf,
                automake,
                autopoint,
-               autotools-dev,
+                  autotools-dev,
                cppcheck,
                debhelper (>= 9),
                gettext,
                cppcheck,
                debhelper (>= 9),
                gettext,
@@ -21,9 +21,9 @@ Build-Depends: asciidoc,
                libnotify-dev,
                libsensors4-dev,
                perl
                libnotify-dev,
                libsensors4-dev,
                perl
-Standards-Version: 3.9.5
-Vcs-Browser: http://wpitchoune.net/gitweb/?p=psensor-pkg-debian.git
-Vcs-Git: git://git.wpitchoune.net/psensor-pkg-debian.git
+Standards-Version: 3.9.4
+Vcs-Browser: http://wpitchoune.net/svnpub/packages/debian/psensor/trunk
+Vcs-Svn: http://wpitchoune.net/svnpub/packages/debian/psensor/trunk
 Homepage: http://wpitchoune.net/psensor
 
 Package: psensor
 Homepage: http://wpitchoune.net/psensor
 
 Package: psensor
index d0808ba..eadf39c 100644 (file)
@@ -6,7 +6,7 @@ It was downloaded from: http://wpitchoune.net/psensor
 Upstream Author: Jean-Philippe Orsini <jeanfi@gmail.com>
 
 Copyright:
 Upstream Author: Jean-Philippe Orsini <jeanfi@gmail.com>
 
 Copyright:
-    Copyright (C) 2010-2014 by Jean-Philippe Orsini <jeanfi@gmail.com>
+    Copyright (C) 2010-2013 by Jean-Philippe Orsini <jeanfi@gmail.com>
 
 License:
 
 
 License:
 
@@ -28,12 +28,12 @@ On Debian/Ubuntu systems, the complete text of the GNU General Public
 License can be found in `/usr/share/common-licenses/GPL-2'.
 
 Packaging:
 License can be found in `/usr/share/common-licenses/GPL-2'.
 
 Packaging:
-        Copyright (C) 2010-2014 by Jean-Philippe Orsini <jeanfi@gmail.com>
+        Copyright (C) 2010-2013 by Jean-Philippe Orsini <jeanfi@gmail.com>
         released under GNU General Public License version 2.
 
 
 The following files are distributed under their own terms:
 
         released under GNU General Public License version 2.
 
 
 The following files are distributed under their own terms:
 
-www/{jqplot.css,jqplot.dateAxisRenderer.js,jqplot.js}:
-   Copyright (c) 2009-2013 Chris Leonello
+www/{excanvas.js,jqplot.css,jqplot.dateAxisRenderer.js,jqplot.js}:
+   Copyright (c) 2009-2011 Chris Leonello
    Dual licensed under the MIT and GNU General Public License version 2
    Dual licensed under the MIT and GNU General Public License version 2
diff --git a/debian/patches/json-c-FTBFS-fix.patch b/debian/patches/json-c-FTBFS-fix.patch
new file mode 100644 (file)
index 0000000..d5f82cd
--- /dev/null
@@ -0,0 +1,26 @@
+Description: Update json usage for current API
+ The json-c interface was using a deprecated method.
+ This cherry-picked patch from upstream fixes it.
+ .
+ psensor (0.8.0.4-1.1) unstable; urgency=low
+ .
+Author: Wookey <wookey@debian.org>
+Bug-Debian: http://bugs.debian.org/746145
+Origin: upstream, http://wpitchoune.net/gitweb/?p=psensor.git;a=commitdiff;h=695aaee544240f86415140a77f5716f858bec91e
+Last-Update: 2014-05-31
+
+--- psensor-0.8.0.4.orig/src/lib/psensor_json.c
++++ psensor-0.8.0.4/src/lib/psensor_json.c
+@@ -140,9 +140,9 @@ struct psensor *psensor_new_from_json(js
+       struct psensor *s;
+       char *eid, *url;
+-      oid = json_object_object_get(o, "id");
+-      oname = json_object_object_get(o, "name");
+-      otype = json_object_object_get(o, "type");
++      json_object_object_get_ex(o, "id", &oid);
++      json_object_object_get_ex(o, "name", &oname);
++      json_object_object_get_ex(o, "type", &otype);
+       eid = url_encode(json_object_get_string(oid));
+       url = malloc(strlen(sensors_url) + 1 + strlen(eid) + 1);
diff --git a/debian/patches/series b/debian/patches/series
new file mode 100644 (file)
index 0000000..ed8e002
--- /dev/null
@@ -0,0 +1 @@
+json-c-FTBFS-fix.patch
index 3d6de15..8720436 100644 (file)
 <meta name="generator" content="AsciiDoc 8.6.7" />\r
 <title>Psensor Frequently Asked Questions</title>\r
 <style type="text/css">\r
 <meta name="generator" content="AsciiDoc 8.6.7" />\r
 <title>Psensor Frequently Asked Questions</title>\r
 <style type="text/css">\r
-\r
 body {\r
 body {\r
-    background: #e2e2e2;\r
-    color: #333333;\r
-    font-family: Ubuntu,Arial,sans-serif;\r
-    line-height: 1.6;\r
-    font-weight: lighter;\r
-    margin: 1em 2em 2em 2em;\r
-    padding: 0 0 0 0;\r
-}\r
-\r
-h1 {\r
-    font-size: 2.813em;\r
-    margin: 0 0 0.267em 0;\r
-    padding: 0 0 0 0;\r
+    padding: 1em 1em 1em 1em;\r
+    font-family: "Ubuntu", sans-serif;\r
+    font-size: 100%;\r
+    font-style: normal;\r
     font-weight: normal;\r
     font-weight: normal;\r
+    color: #000;\r
+    background-color: #fff;\r
+    margin: 0 0 0 0;\r
 }\r
 \r
 }\r
 \r
-h2 {\r
-    font-size: 2em;\r
-    margin: 0 0 0.375em;\r
-    padding: 0 0 0 0;\r
-    font-weight: normal;\r
+a {\r
+    color: #1982D1;\r
+    font-style: normal;\r
+    text-decoration: none;\r
 }\r
 \r
 }\r
 \r
-h3 {\r
-    font-size: 1.438em;\r
-    margin: 0 0 0.522em;\r
-    padding: 0 0 0 0;\r
-    font-weight: normal;\r
+a:hover {\r
+    text-decoration: underline;\r
 }\r
 \r
 }\r
 \r
-h4 {\r
-    font-size: 1.219em;\r
-    margin: 0 0 0.615em;\r
+h1 {\r
+    font-size: 140%;\r
+    font-style: normal;\r
+    font-weight: bold;\r
+    text-transform: uppercase;\r
+    margin: 0 0 1em 0;\r
     padding: 0 0 0 0;\r
     padding: 0 0 0 0;\r
-    font-weight: normal;\r
 }\r
 \r
 }\r
 \r
-h5 {\r
-    font-size: 1em;\r
-    margin: 0 0 0.75em;\r
-    padding: 0 0 0 0;\r
-    font-weight: bold;\r
-}\r
 \r
 \r
-h6 {\r
-    font-weight: normal;\r
-    font-size: 0.813em;\r
-    letter-spacing: 0.1em;\r
-    margin: 0 0 0.923em;\r
+h2, #toctitle{\r
+    font-size: 110%;\r
+    font-style: normal;\r
+    font-weight: bold;\r
     text-transform: uppercase;\r
     text-transform: uppercase;\r
+    margin: 2em 0em 1em 0em;\r
     padding: 0 0 0 0;\r
 }\r
 \r
     padding: 0 0 0 0;\r
 }\r
 \r
-li {\r
-    margin: 0 0 0 1em;\r
-    line-height: 1.6;\r
+#footer {\r
+    padding-top: 2em;\r
+    color: #666;\r
+    clear: both;\r
+    text-align: right;\r
+    font-size: 75%;\r
 }\r
 \r
 }\r
 \r
-li p {\r
-    margin: 0 0 0 0;\r
+p {\r
+    font-size: 100%;\r
+    margin-bottom: 8px;\r
 }\r
 \r
 }\r
 \r
-ul {\r
-    margin: 0 0 0 0;\r
+table {\r
+    text-align: left;\r
     padding: 0 0 0 0;\r
     padding: 0 0 0 0;\r
+    min-width: 50%;\r
+    border-spacing: 0;\r
+    border: 0;\r
 }\r
 \r
 }\r
 \r
-a:link, a:visited {\r
-    color: #19B6EE;\r
-    text-decoration: none;\r
+thead {\r
+    background-color: #000;\r
+    color: #fff;\r
+    padding: 0 0 0 0;\r
 }\r
 \r
 }\r
 \r
-a:hover {\r
-    text-decoration: underline;\r
+tbody {\r
+    padding: 0 0 0 0;\r
 }\r
 \r
 }\r
 \r
-code, pre, tt {\r
-    font-family: "Ubuntu Mono","Courier New",Courier,monospace;\r
+th {\r
+    padding: 0.25em 0.5em 0.25em 0.5em;\r
+    font-style: normal;\r
     font-weight: normal;\r
     font-weight: normal;\r
-    color: #333333;\r
 }\r
 \r
 }\r
 \r
-pre {\r
-    background: none repeat scroll 0 0 #e0e0e0;\r
-    border-radius: 4px;\r
-    padding: 0.5em 0.5em;\r
-    margin: 0 0 0 0;\r
-    white-space: pre-wrap;\r
-    word-wrap: break-word;\r
+td {\r
+    padding: 0.25em 0.25em 0em 0.25em;\r
 }\r
 \r
 }\r
 \r
-table {\r
+#chart {\r
+    color: #000;\r
+    font-style: normal;\r
+    font-weight: normal;\r
     width: 100%;\r
     width: 100%;\r
-    text-align: left;\r
+    height: 300px;\r
 }\r
 \r
 }\r
 \r
-#footer {\r
-    margin: 0 0 0 0;\r
-    font-size: 0.8em;\r
-    font-weight: lighter;\r
-    clear: both;\r
-    text-align: right;\r
+ul#menu-list li {\r
+    list-style: none;\r
 }\r
 \r
 }\r
 \r
-#page {\r
-    margin: 0 0 0 0;\r
+#menu-list {\r
     padding: 0 0 0 0;\r
     padding: 0 0 0 0;\r
+    margin: 0 0 0 0;\r
 }\r
 \r
 }\r
 \r
-#main {\r
-    background: #ffffff;\r
-\r
-   -moz-box-sizing: border-box;\r
-\r
-    padding: 2em 2em 2em 2em;\r
-\r
-    -moz-border-radius: 4px;\r
-    -webkit-border-radius: 4px;\r
-    border-radius: 4px;\r
-\r
-    -webkit-box-shadow: 0 2px 2px 0 #C2C2C2;\r
-    box-shadow: 0 2px 2px 0 #C2C2C2;\r
-}\r
-\r
-#menu {\r
-    background: #ffffff;\r
-   -moz-box-sizing: border-box;\r
-    padding: 2em 2em 2em 2em;\r
-\r
-    -moz-border-radius: 4px;\r
-    -webkit-border-radius: 4px;\r
-    border-radius: 4px;\r
-\r
-    -webkit-box-shadow: 0 2px 2px 0 #C2C2C2;\r
-    box-shadow: 0 2px 2px 0 #C2C2C2;\r
-}\r
-\r
-#menu-list, #menu-list > li > ul  {\r
-    list-style-type: none;\r
-}\r
-\r
-/* menu on left col, content on right col */\r
-\r
 #menu {\r
     float: left;\r
 #menu {\r
     float: left;\r
-    width: 18%;\r
+    width: 20%;\r
+    padding: 0 0 0 0;\r
+    margin: 0 0 0 0;\r
 }\r
 \r
 #main {\r
     float: right;\r
     width: 80%;\r
 }\r
 \r
 #main {\r
     float: right;\r
     width: 80%;\r
+    padding: 0 0 0 0;\r
+    margin: 0 0em 0 0;\r
 }\r
 \r
 }\r
 \r
-/* asciidoc */\r
+em {\r
+    font-weight: bold;\r
+    font-style: normal;\r
+}\r
 \r
 \r
-#toc, #content {\r
-    margin: 0em 0em 2em 0em;\r
+#uptime {\r
+    font-weight: normal;\r
+}\r
 \r
 \r
-    background: #ffffff;\r
-   -moz-box-sizing: border-box;\r
-    padding: 2em 2em 2em 2em;\r
+#menu-list em {\r
+    text-transform: uppercase;\r
+}\r
 \r
 \r
-    -moz-border-radius: 4px;\r
-    -webkit-border-radius: 4px;\r
-    border-radius: 4px;\r
+#menu ul li {\r
+    padding-bottom: 1em;\r
+}\r
 \r
 \r
-    -webkit-box-shadow: 0 2px 2px 0 #C2C2C2;\r
-    box-shadow: 0 2px 2px 0 #C2C2C2;\r
+#menu-list ul li {\r
+    padding: 0 0 0 0em;\r
 }\r
 }\r
+\r
 </style>\r
 <script type="text/javascript">\r
 /*<![CDATA[*/\r
 </style>\r
 <script type="text/javascript">\r
 /*<![CDATA[*/\r
@@ -696,7 +658,7 @@ more general, but can be configured to display sensors
 <div id="footnotes"><hr /></div>\r
 <div id="footer">\r
 <div id="footer-text">\r
 <div id="footnotes"><hr /></div>\r
 <div id="footer">\r
 <div id="footer-text">\r
-Last updated 2014-04-10 01:57:33 CEST\r
+Last updated 2013-05-12 17:54:35 CEST\r
 </div>\r
 </div>\r
 </body>\r
 </div>\r
 </div>\r
 </body>\r
index 6c3d71f..9fa2646 100644 (file)
@@ -7,12 +7,41 @@
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns:svg="http://www.w3.org/2000/svg"
    xmlns="http://www.w3.org/2000/svg"
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns:svg="http://www.w3.org/2000/svg"
    xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="16"
+   height="16"
+   id="svg3920"
    version="1.1"
    version="1.1"
-   width="22"
-   height="22"
-   id="svg3920">
+   inkscape:version="0.48.1 r9760"
+   sodipodi:docname="dark-psensor-hot-outline.svg">
   <defs
      id="defs3922" />
   <defs
      id="defs3922" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="22.4"
+     inkscape:cx="8.0517702"
+     inkscape:cy="10.150813"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     inkscape:window-width="1068"
+     inkscape:window-height="829"
+     inkscape:window-x="461"
+     inkscape:window-y="109"
+     inkscape:window-maximized="0"
+     showguides="true"
+     inkscape:guide-bbox="true">
+    <sodipodi:guide
+       orientation="1,0"
+       position="7.9910715,8.6160715"
+       id="guide4142" />
+  </sodipodi:namedview>
   <metadata
      id="metadata3925">
     <rdf:RDF>
   <metadata
      id="metadata3925">
     <rdf:RDF>
       </cc:Work>
     </rdf:RDF>
   </metadata>
       </cc:Work>
     </rdf:RDF>
   </metadata>
-  <path
-     d="M 10.067832,2 C 8.526949,2 7.2775,3.3065749 7.2775,4.9180249 l 0,7.8397861 C 6.539029,13.529111 6,14.52654 6,15.71094 6,18.066351 7.849024,20 10.10145,20 c 2.252426,0 4.101451,-1.933649 4.101451,-4.28906 0,-1.189463 -0.563315,-2.176763 -1.31112,-2.953129 -7.74e-4,-0.836771 -9.94e-4,-1.529771 0,-2.249995 a 1.0805074,1.1299329 0 0 0 0.06724,0 l 1.94987,0 a 1.0758978,1.1251123 0 1 0 0,-2.2500039 l -1.94987,0 a 1.0758978,1.1251123 0 0 0 -0.06724,0 c 3.69e-4,-0.3413246 3.5e-5,-0.7346246 0,-1.0897873 a 1.0805074,1.1299329 0 0 0 0.06724,0 l 1.94987,0 a 1.0758978,1.1251123 0 1 0 0,-2.2499999 l -1.94987,0 a 1.0758978,1.1251123 0 0 0 -0.06724,0 C 12.891788,3.2825 11.608714,2 10.067832,2 z m 0,2.2499999 c 0.292603,0 0.67237,0.3861 0.672369,0.668025 0.01189,3.1488749 -0.0041,5.0340358 0,8.1913521 l 0,0.597713 0.470658,0.31635 c 0.50849,0.371137 0.840461,0.997537 0.840461,1.6875 0,1.139511 -0.860244,2.03906 -1.94987,2.03906 -1.089626,0 -1.94987,-0.899549 -1.94987,-2.03906 0,-0.67568 0.340384,-1.275529 0.840461,-1.652289 l 0.43704,-0.351561 0,-0.5625 0,-8.2265651 c 0,-0.306 0.346146,-0.668025 0.638751,-0.668025 z"
-     id="path3008-6-89"
-     style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans" />
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(0,-1036.3622)">
+    <path
+       style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;opacity:0.3;color:#000000;fill:#000000;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans"
+       d="m 7.1245753,1038.3895 c -1.4323258,0 -2.5937498,1.1614 -2.5937498,2.5938 l 0,6.9687 c -0.686446,0.6856 -1.1875,1.5722 -1.1875,2.625 0,2.0937 1.718759,3.8125 3.8124998,3.8125 2.093741,0 3.8125007,-1.7188 3.8125007,-3.8125 0,-1.0573 -0.523629,-1.9349 -1.2187507,-2.625 -7.17e-4,-0.7438 -9.27e-4,-1.3598 0,-2 a 1.0043849,1.0043849 0 0 0 0.0625,0 l 1.8125007,0 a 1.0001,1.0001 0 1 0 0,-2 l -1.8125007,0 a 1.0001,1.0001 0 0 0 -0.0625,0 c 3.43e-4,-0.3034 3.3e-5,-0.653 0,-0.9687 a 1.0043849,1.0043849 0 0 0 0.0625,0 l 1.8125007,0 a 1.0001,1.0001 0 1 0 0,-2 l -1.8125007,0 a 1.0001,1.0001 0 0 0 -0.0625,0 c 7e-6,-1.4538 -1.192674,-2.5938 -2.625,-2.5938 z m 0,2 c 0.27199,0 0.625001,0.3432 0.625,0.5938 0.01108,2.799 -0.0038,4.4747 0,7.2812 l 0,0.5313 0.4375,0.2812 c 0.472666,0.3299 0.78125,0.8867 0.78125,1.5 0,1.0129 -0.799639,1.8125 -1.8125,1.8125 -1.0128608,0 -1.8124998,-0.7996 -1.8124998,-1.8125 0,-0.6006 0.316404,-1.1338 0.78125,-1.4687 l 0.4062498,-0.3125 0,-0.5 0,-7.3125 c 0,-0.272 0.32176,-0.5938 0.59375,-0.5938 z"
+       id="path3008-6-8-8-6-4-6"
+       inkscape:connector-curvature="0" />
+    <path
+       style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans"
+       d="m 7.1245753,1036.3895 c -1.4323258,0 -2.5937498,1.1614 -2.5937498,2.5938 l 0,6.9687 c -0.686446,0.6856 -1.1875,1.5722 -1.1875,2.625 0,2.0937 1.718759,3.8125 3.8124998,3.8125 2.093741,0 3.8125007,-1.7188 3.8125007,-3.8125 0,-1.0573 -0.523629,-1.9349 -1.2187507,-2.625 -7.17e-4,-0.7438 -9.27e-4,-1.3598 0,-2 a 1.0043849,1.0043849 0 0 0 0.0625,0 l 1.8125007,0 a 1.0001,1.0001 0 1 0 0,-2 l -1.8125007,0 a 1.0001,1.0001 0 0 0 -0.0625,0 c 3.43e-4,-0.3034 3.3e-5,-0.653 0,-0.9687 a 1.0043849,1.0043849 0 0 0 0.0625,0 l 1.8125007,0 a 1.0001,1.0001 0 1 0 0,-2 l -1.8125007,0 a 1.0001,1.0001 0 0 0 -0.0625,0 c 7e-6,-1.4538 -1.192674,-2.5938 -2.625,-2.5938 z m 0,2 c 0.27199,0 0.625001,0.3432 0.625,0.5938 0.01108,2.799 -0.0038,4.4747 0,7.2812 l 0,0.5313 0.4375,0.2812 c 0.472666,0.3299 0.78125,0.8867 0.78125,1.5 0,1.0129 -0.799639,1.8125 -1.8125,1.8125 -1.0128608,0 -1.8124998,-0.7996 -1.8124998,-1.8125 0,-0.6006 0.316404,-1.1338 0.78125,-1.4687 l 0.4062498,-0.3125 0,-0.5 0,-7.3125 c 0,-0.272 0.32176,-0.5938 0.59375,-0.5938 z"
+       id="path3008-6-8-8-7-4"
+       inkscape:connector-curvature="0" />
+  </g>
 </svg>
 </svg>
index f323be9..50a43bf 100644 (file)
@@ -7,12 +7,41 @@
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns:svg="http://www.w3.org/2000/svg"
    xmlns="http://www.w3.org/2000/svg"
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns:svg="http://www.w3.org/2000/svg"
    xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="16"
+   height="16"
+   id="svg3920"
    version="1.1"
    version="1.1"
-   width="22"
-   height="22"
-   id="svg3920">
+   inkscape:version="0.48.1 r9760"
+   sodipodi:docname="light-psensor.svg">
   <defs
      id="defs3922" />
   <defs
      id="defs3922" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="22.4"
+     inkscape:cx="8.0517702"
+     inkscape:cy="8.3650983"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     inkscape:window-width="1068"
+     inkscape:window-height="829"
+     inkscape:window-x="461"
+     inkscape:window-y="109"
+     inkscape:window-maximized="0"
+     showguides="true"
+     inkscape:guide-bbox="true">
+    <sodipodi:guide
+       orientation="1,0"
+       position="7.9910715,8.6160715"
+       id="guide4142" />
+  </sodipodi:namedview>
   <metadata
      id="metadata3925">
     <rdf:RDF>
   <metadata
      id="metadata3925">
     <rdf:RDF>
       </cc:Work>
     </rdf:RDF>
   </metadata>
       </cc:Work>
     </rdf:RDF>
   </metadata>
-  <path
-     d="M 10.067832,2 C 8.526949,2 7.2775,3.3065749 7.2775,4.9180249 l 0,7.8397861 C 6.539029,13.529111 6,14.52654 6,15.71094 6,18.066351 7.849024,20 10.10145,20 c 2.252426,0 4.101451,-1.933649 4.101451,-4.28906 0,-1.189463 -0.563315,-2.176763 -1.31112,-2.953129 -7.74e-4,-0.836771 -9.94e-4,-1.529771 0,-2.249995 a 1.0805074,1.1299329 0 0 0 0.06724,0 l 1.94987,0 a 1.0758978,1.1251123 0 1 0 0,-2.2500039 l -1.94987,0 a 1.0758978,1.1251123 0 0 0 -0.06724,0 c 3.69e-4,-0.3413246 3.5e-5,-0.7346246 0,-1.0897873 a 1.0805074,1.1299329 0 0 0 0.06724,0 l 1.94987,0 a 1.0758978,1.1251123 0 1 0 0,-2.2499999 l -1.94987,0 a 1.0758978,1.1251123 0 0 0 -0.06724,0 C 12.891788,3.2825 11.608714,2 10.067832,2 z m 0,2.2499999 c 0.292603,0 0.67237,0.3861 0.672369,0.668025 0.01189,3.1488749 -0.0041,5.0340358 0,8.1913521 l 0,0.597713 0.470658,0.31635 c 0.50849,0.371137 0.840461,0.997537 0.840461,1.6875 0,1.139511 -0.860244,2.03906 -1.94987,2.03906 -1.089626,0 -1.94987,-0.899549 -1.94987,-2.03906 0,-0.67568 0.340384,-1.275529 0.840461,-1.652289 l 0.43704,-0.351561 0,-0.5625 0,-8.2265651 c 0,-0.306 0.346146,-0.668025 0.638751,-0.668025 z"
-     id="path3008-6-89"
-     style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#dfdbd2;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans" />
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(0,-1036.3622)">
+    <path
+       inkscape:connector-curvature="0"
+       style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;opacity:0.3;color:#000000;fill:#000000;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans"
+       d="m 7.1156467,1038.3979 c -1.4323263,0 -2.5937503,1.1614 -2.5937503,2.5938 l 0,6.9687 c -0.686446,0.6856 -1.1875,1.5722 -1.1875,2.625 0,2.0937 1.718759,3.8125 3.8125003,3.8125 2.093741,0 3.8125003,-1.7188 3.8125003,-3.8125 0,-1.0573 -0.523629,-1.9349 -1.2187503,-2.625 -7.2e-4,-0.7438 -9.24e-4,-1.3598 0,-2 a 1.0043849,1.0043849 0 0 0 0.0625,0 l 1.8125003,0 a 1.0001,1.0001 0 1 0 0,-2 l -1.8125003,0 a 1.0001,1.0001 0 0 0 -0.0625,0 c 3.43e-4,-0.3034 3.2e-5,-0.653 0,-0.9687 a 1.0043849,1.0043849 0 0 0 0.0625,0 l 1.8125003,0 a 1.0001,1.0001 0 1 0 0,-2 l -1.8125003,0 a 1.0001,1.0001 0 0 0 -0.0625,0 c 6e-6,-1.4538 -1.192674,-2.5938 -2.625,-2.5938 z m 0,2 c 0.27199,0 0.625001,0.3432 0.625,0.5938 0.01105,2.799 -0.0038,4.4747 0,7.2812 l 0,0.5313 0.4375,0.2812 c 0.472666,0.3299 0.78125,0.8867 0.78125,1.5 0,1.0129 -0.799639,1.8125 -1.8125,1.8125 -1.012861,0 -1.8125003,-0.7996 -1.8125003,-1.8125 0,-0.6006 0.316404,-1.1338 0.78125,-1.4687 l 0.4062503,-0.3125 0,-0.5 0,-7.3125 c 0,-0.272 0.32176,-0.5938 0.59375,-0.5938 z"
+       id="path3008-6-89-2" />
+    <path
+       inkscape:connector-curvature="0"
+       style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#dfdbd2;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans"
+       d="m 7.1156467,1036.3979 c -1.4323263,0 -2.5937503,1.1614 -2.5937503,2.5938 l 0,6.9687 c -0.686446,0.6856 -1.1875,1.5722 -1.1875,2.625 0,2.0937 1.718759,3.8125 3.8125003,3.8125 2.093741,0 3.8125003,-1.7188 3.8125003,-3.8125 0,-1.0573 -0.523629,-1.9349 -1.2187503,-2.625 -7.2e-4,-0.7438 -9.24e-4,-1.3598 0,-2 a 1.0043849,1.0043849 0 0 0 0.0625,0 l 1.8125003,0 a 1.0001,1.0001 0 1 0 0,-2 l -1.8125003,0 a 1.0001,1.0001 0 0 0 -0.0625,0 c 3.43e-4,-0.3034 3.2e-5,-0.653 0,-0.9687 a 1.0043849,1.0043849 0 0 0 0.0625,0 l 1.8125003,0 a 1.0001,1.0001 0 1 0 0,-2 l -1.8125003,0 a 1.0001,1.0001 0 0 0 -0.0625,0 c 6e-6,-1.4538 -1.192674,-2.5938 -2.625,-2.5938 z m 0,2 c 0.27199,0 0.625001,0.3432 0.625,0.5938 0.01105,2.799 -0.0038,4.4747 0,7.2812 l 0,0.5313 0.4375,0.2812 c 0.472666,0.3299 0.78125,0.8867 0.78125,1.5 0,1.0129 -0.799639,1.8125 -1.8125,1.8125 -1.012861,0 -1.8125003,-0.7996 -1.8125003,-1.8125 0,-0.6006 0.316404,-1.1338 0.78125,-1.4687 l 0.4062503,-0.3125 0,-0.5 0,-7.3125 c 0,-0.272 0.32176,-0.5938 0.59375,-0.5938 z"
+       id="path3008-6-89" />
+  </g>
 </svg>
 </svg>
index 6c3d71f..102b9f3 100644 (file)
@@ -7,12 +7,34 @@
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns:svg="http://www.w3.org/2000/svg"
    xmlns="http://www.w3.org/2000/svg"
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns:svg="http://www.w3.org/2000/svg"
    xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="16"
+   height="16"
+   id="svg3920"
    version="1.1"
    version="1.1"
-   width="22"
-   height="22"
-   id="svg3920">
+   inkscape:version="0.48.1 r9760"
+   sodipodi:docname="New document 5">
   <defs
      id="defs3922" />
   <defs
      id="defs3922" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="11.2"
+     inkscape:cx="1.0112379"
+     inkscape:cy="11.731267"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     inkscape:window-width="1068"
+     inkscape:window-height="829"
+     inkscape:window-x="411"
+     inkscape:window-y="49"
+     inkscape:window-maximized="0" />
   <metadata
      id="metadata3925">
     <rdf:RDF>
   <metadata
      id="metadata3925">
     <rdf:RDF>
       </cc:Work>
     </rdf:RDF>
   </metadata>
       </cc:Work>
     </rdf:RDF>
   </metadata>
-  <path
-     d="M 10.067832,2 C 8.526949,2 7.2775,3.3065749 7.2775,4.9180249 l 0,7.8397861 C 6.539029,13.529111 6,14.52654 6,15.71094 6,18.066351 7.849024,20 10.10145,20 c 2.252426,0 4.101451,-1.933649 4.101451,-4.28906 0,-1.189463 -0.563315,-2.176763 -1.31112,-2.953129 -7.74e-4,-0.836771 -9.94e-4,-1.529771 0,-2.249995 a 1.0805074,1.1299329 0 0 0 0.06724,0 l 1.94987,0 a 1.0758978,1.1251123 0 1 0 0,-2.2500039 l -1.94987,0 a 1.0758978,1.1251123 0 0 0 -0.06724,0 c 3.69e-4,-0.3413246 3.5e-5,-0.7346246 0,-1.0897873 a 1.0805074,1.1299329 0 0 0 0.06724,0 l 1.94987,0 a 1.0758978,1.1251123 0 1 0 0,-2.2499999 l -1.94987,0 a 1.0758978,1.1251123 0 0 0 -0.06724,0 C 12.891788,3.2825 11.608714,2 10.067832,2 z m 0,2.2499999 c 0.292603,0 0.67237,0.3861 0.672369,0.668025 0.01189,3.1488749 -0.0041,5.0340358 0,8.1913521 l 0,0.597713 0.470658,0.31635 c 0.50849,0.371137 0.840461,0.997537 0.840461,1.6875 0,1.139511 -0.860244,2.03906 -1.94987,2.03906 -1.089626,0 -1.94987,-0.899549 -1.94987,-2.03906 0,-0.67568 0.340384,-1.275529 0.840461,-1.652289 l 0.43704,-0.351561 0,-0.5625 0,-8.2265651 c 0,-0.306 0.346146,-0.668025 0.638751,-0.668025 z"
-     id="path3008-6-89"
-     style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans" />
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(0,-1036.3622)">
+    <path
+       style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;opacity:0.3;color:#000000;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans"
+       d="m 7.2049299,1038.3979 c -1.432326,0 -2.59375,1.1614 -2.59375,2.5938 l 0,6.9687 c -0.686446,0.6856 -1.1875,1.5722 -1.1875,2.625 0,2.0937 1.718759,3.8125 3.8125,3.8125 2.0937367,0 3.8124941,-1.7188 3.8124941,-3.8125 0,-1.0573 -0.523629,-1.9349 -1.2187496,-2.625 -7.17e-4,-0.7438 -9.27e-4,-1.3598 0,-2 a 1.0043849,1.0043849 0 0 0 0.0625,0 l 1.8124996,0 a 1.0001,1.0001 0 1 0 0,-2 l -1.8124996,0 a 1.0001,1.0001 0 0 0 -0.0625,0 c 3.43e-4,-0.3034 3.3e-5,-0.653 0,-0.9687 a 1.0043849,1.0043849 0 0 0 0.0625,0 l 1.8124996,0 a 1.0001,1.0001 0 1 0 0,-2 l -1.8124996,0 a 1.0001,1.0001 0 0 0 -0.0625,0 c 7e-6,-1.4538 -1.1926713,-2.5938 -2.6249945,-2.5938 z m 0,2 c 0.27199,0 0.625,0.3432 0.624999,0.5938 0.01108,2.799 -0.0038,4.4747 0,7.2812 l 0,0.5313 0.437499,0.2812 c 0.472665,0.3299 0.7812483,0.8867 0.7812483,1.5 0,1.0129 -0.7996372,1.8125 -1.8124963,1.8125 -1.012861,0 -1.8125,-0.7996 -1.8125,-1.8125 0,-0.6006 0.316404,-1.1338 0.78125,-1.4687 l 0.40625,-0.3125 0,-0.5 0,-7.3125 c 0,-0.272 0.32176,-0.5938 0.59375,-0.5938 z"
+       id="path3008-6-8-8-6-4-4-8"
+       inkscape:connector-curvature="0" />
+    <path
+       style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans"
+       d="m 7.2049299,1036.3979 c -1.432326,0 -2.59375,1.1614 -2.59375,2.5938 l 0,6.9687 c -0.686446,0.6856 -1.1875,1.5722 -1.1875,2.625 0,2.0937 1.718759,3.8125 3.8125,3.8125 2.0937367,0 3.8124941,-1.7188 3.8124941,-3.8125 0,-1.0573 -0.523629,-1.9349 -1.2187496,-2.625 -7.17e-4,-0.7438 -9.27e-4,-1.3598 0,-2 a 1.0043849,1.0043849 0 0 0 0.0625,0 l 1.8124996,0 a 1.0001,1.0001 0 1 0 0,-2 l -1.8124996,0 a 1.0001,1.0001 0 0 0 -0.0625,0 c 3.43e-4,-0.3034 3.3e-5,-0.653 0,-0.9687 a 1.0043849,1.0043849 0 0 0 0.0625,0 l 1.8124996,0 a 1.0001,1.0001 0 1 0 0,-2 l -1.8124996,0 a 1.0001,1.0001 0 0 0 -0.0625,0 c 7e-6,-1.4538 -1.1926713,-2.5938 -2.6249945,-2.5938 z m 0,2 c 0.27199,0 0.625,0.3432 0.624999,0.5938 0.01108,2.799 -0.0038,4.4747 0,7.2812 l 0,0.5313 0.437499,0.2812 c 0.472665,0.3299 0.7812483,0.8867 0.7812483,1.5 0,1.0129 -0.7996372,1.8125 -1.8124963,1.8125 -1.012861,0 -1.8125,-0.7996 -1.8125,-1.8125 0,-0.6006 0.316404,-1.1338 0.78125,-1.4687 l 0.40625,-0.3125 0,-0.5 0,-7.3125 c 0,-0.272 0.32176,-0.5938 0.59375,-0.5938 z"
+       id="path3008-6-8-8-7-7-8"
+       inkscape:connector-curvature="0" />
+  </g>
 </svg>
 </svg>
index 6dc2a05..7c15ea2 100644 (file)
@@ -7,12 +7,34 @@
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns:svg="http://www.w3.org/2000/svg"
    xmlns="http://www.w3.org/2000/svg"
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns:svg="http://www.w3.org/2000/svg"
    xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="16"
+   height="16"
+   id="svg3920"
    version="1.1"
    version="1.1"
-   width="22"
-   height="22"
-   id="svg3920">
+   inkscape:version="0.48.1 r9760"
+   sodipodi:docname="light-psensor.svg">
   <defs
      id="defs3922" />
   <defs
      id="defs3922" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="22.4"
+     inkscape:cx="1.3932195"
+     inkscape:cy="7.3766084"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     inkscape:window-width="1068"
+     inkscape:window-height="829"
+     inkscape:window-x="495"
+     inkscape:window-y="94"
+     inkscape:window-maximized="0" />
   <metadata
      id="metadata3925">
     <rdf:RDF>
   <metadata
      id="metadata3925">
     <rdf:RDF>
       </cc:Work>
     </rdf:RDF>
   </metadata>
       </cc:Work>
     </rdf:RDF>
   </metadata>
-  <path
-     d="M 10.067832,2 C 8.526949,2 7.2775,3.3065749 7.2775,4.9180249 l 0,7.8397861 C 6.539029,13.529111 6,14.52654 6,15.71094 6,18.066351 7.849024,20 10.10145,20 c 2.252426,0 4.101451,-1.933649 4.101451,-4.28906 0,-1.189463 -0.563315,-2.176763 -1.31112,-2.953129 -7.74e-4,-0.836771 -9.94e-4,-1.529771 0,-2.249995 a 1.0805074,1.1299329 0 0 0 0.06724,0 l 1.94987,0 a 1.0758978,1.1251123 0 1 0 0,-2.2500039 l -1.94987,0 a 1.0758978,1.1251123 0 0 0 -0.06724,0 c 3.69e-4,-0.3413246 3.5e-5,-0.7346246 0,-1.0897873 a 1.0805074,1.1299329 0 0 0 0.06724,0 l 1.94987,0 a 1.0758978,1.1251123 0 1 0 0,-2.2499999 l -1.94987,0 a 1.0758978,1.1251123 0 0 0 -0.06724,0 C 12.891788,3.2825 11.608714,2 10.067832,2 z m 0,2.2499999 c 0.292603,0 0.67237,0.3861 0.672369,0.668025 0.01189,3.1488749 -0.0041,5.0340358 0,8.1913521 l 0,0.597713 0.470658,0.31635 c 0.50849,0.371137 0.840461,0.997537 0.840461,1.6875 0,1.139511 -0.860244,2.03906 -1.94987,2.03906 -1.089626,0 -1.94987,-0.899549 -1.94987,-2.03906 0,-0.67568 0.340384,-1.275529 0.840461,-1.652289 l 0.43704,-0.351561 0,-0.5625 0,-8.2265651 c 0,-0.306 0.346146,-0.668025 0.638751,-0.668025 z"
-     id="path3008-6-89"
-     style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#3c3c3c;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans" />
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(0,-1036.3622)">
+    <path
+       inkscape:connector-curvature="0"
+       style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;opacity:0.3;color:#000000;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans"
+       d="m 7.1156462,1038.3979 c -1.432326,0 -2.59375,1.1614 -2.59375,2.5938 l 0,6.9687 c -0.686446,0.6856 -1.1874999,1.5722 -1.1874999,2.625 0,2.0937 1.7187589,3.8125 3.8124999,3.8125 2.093741,0 3.8124988,-1.7188 3.8124988,-3.8125 0,-1.0573 -0.523629,-1.9349 -1.2187494,-2.625 -7.2e-4,-0.7438 -9.24e-4,-1.3598 0,-2 a 1.0043849,1.0043849 0 0 0 0.0625,0 l 1.8124994,0 a 1.0001,1.0001 0 1 0 0,-2 l -1.8124994,0 a 1.0001,1.0001 0 0 0 -0.0625,0 c 3.43e-4,-0.3034 3.2e-5,-0.653 0,-0.9687 a 1.0043849,1.0043849 0 0 0 0.0625,0 l 1.8124994,0 a 1.0001,1.0001 0 1 0 0,-2 l -1.8124994,0 a 1.0001,1.0001 0 0 0 -0.0625,0 c 6e-6,-1.4538 -1.1926734,-2.5938 -2.6249994,-2.5938 z m 0,2 c 0.27199,0 0.625001,0.3432 0.625,0.5938 0.01105,2.799 -0.0038,4.4747 0,7.2812 l 0,0.5313 0.4375,0.2812 c 0.472666,0.3299 0.78125,0.8867 0.78125,1.5 0,1.0129 -0.799639,1.8125 -1.8125,1.8125 -1.012861,0 -1.8125,-0.7996 -1.8125,-1.8125 0,-0.6006 0.316404,-1.1338 0.78125,-1.4687 l 0.40625,-0.3125 0,-0.5 0,-7.3125 c 0,-0.272 0.32176,-0.5938 0.59375,-0.5938 z"
+       id="path3008-6-89-2-4" />
+    <path
+       inkscape:connector-curvature="0"
+       style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#3c3c3c;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans"
+       d="m 7.1156462,1036.3979 c -1.432326,0 -2.59375,1.1614 -2.59375,2.5938 l 0,6.9687 c -0.686446,0.6856 -1.1874999,1.5722 -1.1874999,2.625 0,2.0937 1.7187589,3.8125 3.8124999,3.8125 2.093741,0 3.8124988,-1.7188 3.8124988,-3.8125 0,-1.0573 -0.523629,-1.9349 -1.2187494,-2.625 -7.2e-4,-0.7438 -9.24e-4,-1.3598 0,-2 a 1.0043849,1.0043849 0 0 0 0.0625,0 l 1.8124994,0 a 1.0001,1.0001 0 1 0 0,-2 l -1.8124994,0 a 1.0001,1.0001 0 0 0 -0.0625,0 c 3.43e-4,-0.3034 3.2e-5,-0.653 0,-0.9687 a 1.0043849,1.0043849 0 0 0 0.0625,0 l 1.8124994,0 a 1.0001,1.0001 0 1 0 0,-2 l -1.8124994,0 a 1.0001,1.0001 0 0 0 -0.0625,0 c 6e-6,-1.4538 -1.1926734,-2.5938 -2.6249994,-2.5938 z m 0,2 c 0.27199,0 0.625001,0.3432 0.625,0.5938 0.01105,2.799 -0.0038,4.4747 0,7.2812 l 0,0.5313 0.4375,0.2812 c 0.472666,0.3299 0.78125,0.8867 0.78125,1.5 0,1.0129 -0.799639,1.8125 -1.8125,1.8125 -1.012861,0 -1.8125,-0.7996 -1.8125,-1.8125 0,-0.6006 0.316404,-1.1338 0.78125,-1.4687 l 0.40625,-0.3125 0,-0.5 0,-7.3125 c 0,-0.272 0.32176,-0.5938 0.59375,-0.5938 z"
+       id="path3008-6-89-9" />
+  </g>
 </svg>
 </svg>
index 4c32efc..30d27cb 100644 (file)
@@ -12,7 +12,6 @@ fr
 hu
 it
 lv
 hu
 it
 lv
-nl
 pt_BR
 ru
 sl
 pt_BR
 ru
 sl
index 43829d4..3e0c08f 100644 (file)
Binary files a/po/de.gmo and b/po/de.gmo differ
index 7cff987..644c7dc 100644 (file)
--- a/po/de.po
+++ b/po/de.po
@@ -1,54 +1,48 @@
 # German translations for psensor package.
 # Copyright (C) 2012 Free Software Foundation, Inc.
 # This file is distributed under the same license as the psensor package.
 # German translations for psensor package.
 # Copyright (C) 2012 Free Software Foundation, Inc.
 # This file is distributed under the same license as the psensor package.
-# Maintained by Jean-Philippe Orsini <jeanfi@gmail.com>
+#  <jeanfi@gmail.com>, 2012.
 #
 msgid ""
 msgstr ""
 "Project-Id-Version: psensor 0.7.0.x\n"
 "Report-Msgid-Bugs-To: jeanfi@gmail.com\n"
 #
 msgid ""
 msgstr ""
 "Project-Id-Version: psensor 0.7.0.x\n"
 "Report-Msgid-Bugs-To: jeanfi@gmail.com\n"
-"POT-Creation-Date: 2014-04-10 08:17+0200\n"
-"PO-Revision-Date: 2013-10-20 09:56+0000\n"
+"POT-Creation-Date: 2013-10-16 09:19+0200\n"
+"PO-Revision-Date: 2013-05-20 21:13+0000\n"
 "Last-Translator: Dennis Baudys <Unknown>\n"
 "Language-Team: German\n"
 "Language: de\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Last-Translator: Dennis Baudys <Unknown>\n"
 "Language-Team: German\n"
 "Language: de\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2014-02-11 20:01+0000\n"
-"X-Generator: Launchpad (build 16916)\n"
+"X-Launchpad-Export-Date: 2013-10-18 06:32+0000\n"
+"X-Generator: Launchpad (build 16799)\n"
 
 
-#: src/glade/psensor.glade:5
+#: src/glade/psensor.glade:5 src/ui_appindicator.c:124
 msgid "About"
 msgstr "Info"
 
 msgid "About"
 msgstr "Info"
 
-#: src/glade/psensor.glade:9 src/glade/psensor.glade:10
-#: src/glade/psensor.glade:19 src/ui_sensorlist.c:209
+#: src/glade/psensor.glade:9 src/ui_sensorlist.c:209 src/ui_appindicator.c:112
 msgid "Preferences"
 msgstr "Einstellungen"
 
 msgid "Preferences"
 msgstr "Einstellungen"
 
-#: src/glade/psensor.glade:14 src/glade/psensor.glade:15
-#: src/glade/psensor.glade:27
-msgid "Sensor Preferences"
-msgstr "Sensoreinstellungen"
-
-#: src/glade/psensor.glade:23
+#: src/glade/psensor.glade:13 src/ui_appindicator.c:130
 msgid "Quit"
 msgstr "Beenden"
 
 msgid "Quit"
 msgstr "Beenden"
 
-#: src/glade/psensor.glade:31
-msgid "Show"
-msgstr "Anzeigen"
+#: src/glade/psensor.glade:17
+msgid "Sensor Preferences"
+msgstr "Sensoreinstellungen"
 
 
-#: src/glade/psensor.glade:180
+#: src/glade/psensor.glade:96
 msgid "Psensor - Temperature Monitor"
 msgstr "Psensor – Temperaturüberwachung"
 
 msgid "Psensor - Temperature Monitor"
 msgstr "Psensor – Temperaturüberwachung"
 
-#: src/glade/psensor.glade:195
+#: src/glade/psensor.glade:111
 msgid "_Psensor"
 msgstr "_Psensor"
 
 msgid "_Psensor"
 msgstr "_Psensor"
 
-#: src/glade/psensor.glade:242
+#: src/glade/psensor.glade:158
 msgid "_Help"
 msgstr "_Hilfe"
 
 msgid "_Help"
 msgstr "_Hilfe"
 
@@ -159,7 +153,7 @@ msgstr "Sekunde(n)"
 
 #: src/glade/psensor-pref.glade:718
 msgid "Script executed when an alarm is raised"
 
 #: src/glade/psensor-pref.glade:718
 msgid "Script executed when an alarm is raised"
-msgstr "Bei Alarm auszuführendes Skript"
+msgstr ""
 
 #: src/glade/psensor-pref.glade:751
 msgid "Sensors"
 
 #: src/glade/psensor-pref.glade:751
 msgid "Sensors"
@@ -566,10 +560,10 @@ msgstr "Psensor ist eine GTK-Anwendung zur Überwachung von Hardware-Sensoren"
 
 #: src/ui.c:87
 msgid ""
 
 #: src/ui.c:87
 msgid ""
-"Copyright(c) 2010-2014\n"
+"Copyright(c) 2010-2013\n"
 "jeanfi@gmail.com"
 msgstr ""
 "jeanfi@gmail.com"
 msgstr ""
-"Copyright © 2010-2014\n"
+"Copyright © 2010-2013\n"
 "jeanfi@gmail.com"
 
 #: src/ui.c:90
 "jeanfi@gmail.com"
 
 #: src/ui.c:90
@@ -608,6 +602,39 @@ msgstr "Max."
 msgid "Color"
 msgstr "Farbe"
 
 msgid "Color"
 msgstr "Farbe"
 
+#: src/ui_appindicator.c:106
+msgid "_Show"
+msgstr "_Anzeigen"
+
+#: src/ui_appindicator.c:107
+msgid "Show"
+msgstr "Anzeigen"
+
+#: src/ui_appindicator.c:111
+msgid "_Preferences"
+msgstr "_Einstellungen"
+
+#: src/ui_appindicator.c:116
+msgid "S_ensor Preferences"
+msgstr "_Sensoreinstellungen"
+
+#: src/ui_appindicator.c:118
+msgid "SensorPreferences"
+msgstr "Sensoreinstellungen"
+
+#: src/ui_appindicator.c:122
+msgid "_About"
+msgstr "_Info"
+
+#: src/ui_appindicator.c:129
+msgid "_Quit"
+msgstr "_Beenden"
+
+#: src/ui_appindicator.c:220
+#, c-format
+msgid "building menus failed: %s"
+msgstr "Erstellen der Menüs ist gescheitert: %s"
+
 #: src/ui_notify.c:48
 msgid "gettimeofday failed."
 msgstr "gettimeofday ist gescheitert."
 #: src/ui_notify.c:48
 msgid "gettimeofday failed."
 msgstr "gettimeofday ist gescheitert."
@@ -624,23 +651,20 @@ msgstr "Lüfteralarm"
 msgid "Unknown"
 msgstr "Unbekannt"
 
 msgid "Unknown"
 msgstr "Unbekannt"
 
-#~ msgid "_Show"
-#~ msgstr "_Anzeigen"
-
-#~ msgid "_Preferences"
-#~ msgstr "_Einstellungen"
-
-#~ msgid "S_ensor Preferences"
-#~ msgstr "_Sensoreinstellungen"
+#~ msgid "Sensor Name"
+#~ msgstr "Sensor-Name"
 
 
-#~ msgid "SensorPreferences"
-#~ msgstr "Sensoreinstellungen"
+#~ msgid "Enabled"
+#~ msgstr "Aktiviert"
 
 
-#~ msgid "_About"
-#~ msgstr "_Info"
+#, fuzzy
+#~ msgid "Enable log of measures"
+#~ msgstr "Menü aktivieren"
 
 
-#~ msgid "_Quit"
-#~ msgstr "_Beenden"
+#, fuzzy
+#~ msgid "slog_init: cannot open sensor log file: %s"
+#~ msgstr "Protokolldatei kann nicht geöffnet werden: %s"
 
 
-#~ msgid "building menus failed: %s"
-#~ msgstr "Erstellen der Menüs ist gescheitert: %s"
+#, fuzzy
+#~ msgid "Enable indicator"
+#~ msgstr "Aktiviert"
index b450a0c..fb34226 100644 (file)
Binary files a/po/es.gmo and b/po/es.gmo differ
index a3e0f4e..2eee923 100644 (file)
--- a/po/es.po
+++ b/po/es.po
@@ -1,13 +1,13 @@
 # Spanish translation for psensor
 # Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012
 # This file is distributed under the same license as the psensor package.
 # Spanish translation for psensor
 # Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012
 # This file is distributed under the same license as the psensor package.
-# Maintained by Jean-Philippe Orsini <jeanfi@gmail.com>
+# Jean-Philippe Orsini <jeanfi@gmail.com> 2012.
 #
 msgid ""
 msgstr ""
 "Project-Id-Version: psensor\n"
 "Report-Msgid-Bugs-To: jeanfi@gmail.com\n"
 #
 msgid ""
 msgstr ""
 "Project-Id-Version: psensor\n"
 "Report-Msgid-Bugs-To: jeanfi@gmail.com\n"
-"POT-Creation-Date: 2014-04-10 08:17+0200\n"
+"POT-Creation-Date: 2013-10-16 09:19+0200\n"
 "PO-Revision-Date: 2013-05-12 22:16+0000\n"
 "Last-Translator: Javier <buik8roadmaster@hotmail.com>\n"
 "Language-Team: Spanish <es@li.org>\n"
 "PO-Revision-Date: 2013-05-12 22:16+0000\n"
 "Last-Translator: Javier <buik8roadmaster@hotmail.com>\n"
 "Language-Team: Spanish <es@li.org>\n"
@@ -18,37 +18,31 @@ msgstr ""
 "X-Launchpad-Export-Date: 2013-10-18 06:32+0000\n"
 "X-Generator: Launchpad (build 16799)\n"
 
 "X-Launchpad-Export-Date: 2013-10-18 06:32+0000\n"
 "X-Generator: Launchpad (build 16799)\n"
 
-#: src/glade/psensor.glade:5
+#: src/glade/psensor.glade:5 src/ui_appindicator.c:124
 msgid "About"
 msgstr "Acerca de"
 
 msgid "About"
 msgstr "Acerca de"
 
-#: src/glade/psensor.glade:9 src/glade/psensor.glade:10
-#: src/glade/psensor.glade:19 src/ui_sensorlist.c:209
+#: src/glade/psensor.glade:9 src/ui_sensorlist.c:209 src/ui_appindicator.c:112
 msgid "Preferences"
 msgstr "Ajustes"
 
 msgid "Preferences"
 msgstr "Ajustes"
 
-#: src/glade/psensor.glade:14 src/glade/psensor.glade:15
-#: src/glade/psensor.glade:27
-msgid "Sensor Preferences"
-msgstr "Ajustes de los Sensores"
-
-#: src/glade/psensor.glade:23
+#: src/glade/psensor.glade:13 src/ui_appindicator.c:130
 msgid "Quit"
 msgstr "Salir"
 
 msgid "Quit"
 msgstr "Salir"
 
-#: src/glade/psensor.glade:31
-msgid "Show"
-msgstr "Mostrar"
+#: src/glade/psensor.glade:17
+msgid "Sensor Preferences"
+msgstr "Ajustes de los Sensores"
 
 
-#: src/glade/psensor.glade:180
+#: src/glade/psensor.glade:96
 msgid "Psensor - Temperature Monitor"
 msgstr "Psensor - Monitor de temperatura"
 
 msgid "Psensor - Temperature Monitor"
 msgstr "Psensor - Monitor de temperatura"
 
-#: src/glade/psensor.glade:195
+#: src/glade/psensor.glade:111
 msgid "_Psensor"
 msgstr "_Psensor"
 
 msgid "_Psensor"
 msgstr "_Psensor"
 
-#: src/glade/psensor.glade:242
+#: src/glade/psensor.glade:158
 msgid "_Help"
 msgstr "_Ayuda"
 
 msgid "_Help"
 msgstr "_Ayuda"
 
@@ -565,10 +559,10 @@ msgstr ""
 
 #: src/ui.c:87
 msgid ""
 
 #: src/ui.c:87
 msgid ""
-"Copyright(c) 2010-2014\n"
+"Copyright(c) 2010-2013\n"
 "jeanfi@gmail.com"
 msgstr ""
 "jeanfi@gmail.com"
 msgstr ""
-"Copyright(c) 2010-2014\n"
+"Copyright(c) 2010-2013\n"
 "jeanfi@gmail.com"
 
 #: src/ui.c:90
 "jeanfi@gmail.com"
 
 #: src/ui.c:90
@@ -607,6 +601,39 @@ msgstr "Máx"
 msgid "Color"
 msgstr "Color"
 
 msgid "Color"
 msgstr "Color"
 
+#: src/ui_appindicator.c:106
+msgid "_Show"
+msgstr "_Mostrar"
+
+#: src/ui_appindicator.c:107
+msgid "Show"
+msgstr "Mostrar"
+
+#: src/ui_appindicator.c:111
+msgid "_Preferences"
+msgstr "_Ajustes"
+
+#: src/ui_appindicator.c:116
+msgid "S_ensor Preferences"
+msgstr "Ajust_es del sensores"
+
+#: src/ui_appindicator.c:118
+msgid "SensorPreferences"
+msgstr "Ajustes del sensor"
+
+#: src/ui_appindicator.c:122
+msgid "_About"
+msgstr "_Acerca de"
+
+#: src/ui_appindicator.c:129
+msgid "_Quit"
+msgstr "_Salir"
+
+#: src/ui_appindicator.c:220
+#, c-format
+msgid "building menus failed: %s"
+msgstr "Error al construir los menús :%s"
+
 #: src/ui_notify.c:48
 msgid "gettimeofday failed."
 msgstr "Error en la adquisición del horario."
 #: src/ui_notify.c:48
 msgid "gettimeofday failed."
 msgstr "Error en la adquisición del horario."
@@ -622,68 +649,3 @@ msgstr "Alarma por parada de ventilador."
 #: src/ui_sensorpref.c:248
 msgid "Unknown"
 msgstr "Desconocido"
 #: src/ui_sensorpref.c:248
 msgid "Unknown"
 msgstr "Desconocido"
-
-#~ msgid "_Show"
-#~ msgstr "_Mostrar"
-
-#~ msgid "_Preferences"
-#~ msgstr "_Ajustes"
-
-#~ msgid "S_ensor Preferences"
-#~ msgstr "Ajust_es del sensores"
-
-#~ msgid "SensorPreferences"
-#~ msgstr "Ajustes del sensor"
-
-#~ msgid "_About"
-#~ msgstr "_Acerca de"
-
-#~ msgid "_Quit"
-#~ msgstr "_Salir"
-
-#~ msgid "building menus failed: %s"
-#~ msgstr "Error al construir los menús :%s"
-
-#~ msgid ""
-#~ "Copyright(c) 2010-2012\n"
-#~ "jeanfi@gmail.com"
-#~ msgstr ""
-#~ "Copyright(c) 2010-2012\n"
-#~ "jeanfi@gmail.com"
-
-#~ msgid "Enabled"
-#~ msgstr "Activado."
-
-#~ msgid "Sensor Name"
-#~ msgstr "Nombre del sensor"
-
-#~ msgid ""
-#~ "Copyright (C) %s wpitchoune@gmail.com\n"
-#~ "License GPLv2: GNU GPL version 2 or later <http://www.gnu.org/licenses/"
-#~ "old-licenses/gpl-2.0.html>\n"
-#~ "This is free software: you are free to change and redistribute it.\n"
-#~ "There is NO WARRANTY, to the extent permitted by law.\n"
-#~ msgstr ""
-#~ "Copyright © %s wpitchoune@gmail.com\n"
-#~ "Licencia GPLv2: GNU GPL versión 2 o posterior <http://www.gnu.org/"
-#~ "licenses/old-licenses/gpl-2.0.html>\n"
-#~ "Esto es software libre: es libre de modificarlo y redistribuirlo.\n"
-#~ "NO HAY GARANTÍA, en la medida en que lo permita la ley.\n"
-
-#~ msgid "Current"
-#~ msgstr "Actual"
-
-#~ msgid "Left"
-#~ msgstr "Izquierda"
-
-#~ msgid "Bottom"
-#~ msgstr "Abajo"
-
-#~ msgid "Temperature limit:"
-#~ msgstr "Límite de temperatura:"
-
-#~ msgid "Right"
-#~ msgstr "Derecha"
-
-#~ msgid "Top"
-#~ msgstr "Arriba"
index 05b956a..e41f20c 100644 (file)
Binary files a/po/fr.gmo and b/po/fr.gmo differ
index a2b8b77..3b035be 100644 (file)
--- a/po/fr.po
+++ b/po/fr.po
@@ -1,13 +1,13 @@
 # Oriya translations for psensor package.
 # Copyright (C) 2011 Free Software Foundation, Inc.
 # This file is distributed under the same license as the psensor package.
 # Oriya translations for psensor package.
 # Copyright (C) 2011 Free Software Foundation, Inc.
 # This file is distributed under the same license as the psensor package.
-# Maintained by Jean-Philippe Orsini <jeanfi@gmail.com>
+# Jean-Philippe Orsini <jeanfi@gmail.com>, 2011, 2012.
 #
 msgid ""
 msgstr ""
 "Project-Id-Version: psensor\n"
 "Report-Msgid-Bugs-To: jeanfi@gmail.com\n"
 #
 msgid ""
 msgstr ""
 "Project-Id-Version: psensor\n"
 "Report-Msgid-Bugs-To: jeanfi@gmail.com\n"
-"POT-Creation-Date: 2014-04-10 08:17+0200\n"
+"POT-Creation-Date: 2013-10-16 09:19+0200\n"
 "PO-Revision-Date: 2013-06-29 15:14+0000\n"
 "Last-Translator: londumas <helion331990@gmail.com>\n"
 "Language-Team: French <>\n"
 "PO-Revision-Date: 2013-06-29 15:14+0000\n"
 "Last-Translator: londumas <helion331990@gmail.com>\n"
 "Language-Team: French <>\n"
@@ -18,37 +18,31 @@ msgstr ""
 "X-Launchpad-Export-Date: 2013-10-18 06:32+0000\n"
 "X-Generator: Launchpad (build 16799)\n"
 
 "X-Launchpad-Export-Date: 2013-10-18 06:32+0000\n"
 "X-Generator: Launchpad (build 16799)\n"
 
-#: src/glade/psensor.glade:5
+#: src/glade/psensor.glade:5 src/ui_appindicator.c:124
 msgid "About"
 msgstr "À propos"
 
 msgid "About"
 msgstr "À propos"
 
-#: src/glade/psensor.glade:9 src/glade/psensor.glade:10
-#: src/glade/psensor.glade:19 src/ui_sensorlist.c:209
+#: src/glade/psensor.glade:9 src/ui_sensorlist.c:209 src/ui_appindicator.c:112
 msgid "Preferences"
 msgstr "Préférences"
 
 msgid "Preferences"
 msgstr "Préférences"
 
-#: src/glade/psensor.glade:14 src/glade/psensor.glade:15
-#: src/glade/psensor.glade:27
-msgid "Sensor Preferences"
-msgstr "Préférences des capteurs"
-
-#: src/glade/psensor.glade:23
+#: src/glade/psensor.glade:13 src/ui_appindicator.c:130
 msgid "Quit"
 msgstr "Quitter"
 
 msgid "Quit"
 msgstr "Quitter"
 
-#: src/glade/psensor.glade:31
-msgid "Show"
-msgstr "Afficher"
+#: src/glade/psensor.glade:17
+msgid "Sensor Preferences"
+msgstr "Préférences des capteurs"
 
 
-#: src/glade/psensor.glade:180
+#: src/glade/psensor.glade:96
 msgid "Psensor - Temperature Monitor"
 msgid "Psensor - Temperature Monitor"
-msgstr "Psensor - Surveillance des températures"
+msgstr "Psensor - Surveillance Des Températures"
 
 
-#: src/glade/psensor.glade:195
+#: src/glade/psensor.glade:111
 msgid "_Psensor"
 msgstr ""
 
 msgid "_Psensor"
 msgstr ""
 
-#: src/glade/psensor.glade:242
+#: src/glade/psensor.glade:158
 msgid "_Help"
 msgstr "_Aide"
 
 msgid "_Help"
 msgstr "_Aide"
 
@@ -58,7 +52,7 @@ msgstr "Modifier les préférences"
 
 #: src/glade/psensor-pref.glade:72
 msgid "Position of sensors table:"
 
 #: src/glade/psensor-pref.glade:72
 msgid "Position of sensors table:"
-msgstr "Position de la table des capteurs :"
+msgstr "Position de la table des capteurs:"
 
 #: src/glade/psensor-pref.glade:81
 msgid "Hide window decoration"
 
 #: src/glade/psensor-pref.glade:81
 msgid "Hide window decoration"
@@ -86,7 +80,7 @@ msgstr "Rétablir la position et la taille de la fenêtre"
 
 #: src/glade/psensor-pref.glade:186
 msgid "Temperature unit:"
 
 #: src/glade/psensor-pref.glade:186
 msgid "Temperature unit:"
-msgstr "Unité de température :"
+msgstr "Unité de température:"
 
 #: src/glade/psensor-pref.glade:238
 msgid "Interface"
 
 #: src/glade/psensor-pref.glade:238
 msgid "Interface"
@@ -94,11 +88,11 @@ msgstr "Interface"
 
 #: src/glade/psensor-pref.glade:276
 msgid "Foreground:"
 
 #: src/glade/psensor-pref.glade:276
 msgid "Foreground:"
-msgstr "Avant-plan :"
+msgstr "Avant-plan:"
 
 #: src/glade/psensor-pref.glade:291
 msgid "Background:"
 
 #: src/glade/psensor-pref.glade:291
 msgid "Background:"
-msgstr "Arrière-plan :"
+msgstr "Arrière-plan:"
 
 #: src/glade/psensor-pref.glade:325
 msgid "Background opacity:"
 
 #: src/glade/psensor-pref.glade:325
 msgid "Background opacity:"
@@ -118,7 +112,7 @@ msgstr "Couleurs"
 
 #: src/glade/psensor-pref.glade:419
 msgid "Monitoring duration:"
 
 #: src/glade/psensor-pref.glade:419
 msgid "Monitoring duration:"
-msgstr "Durée de surveillance :"
+msgstr "Durée de surveillance:"
 
 #: src/glade/psensor-pref.glade:457
 msgid "minute(s)"
 
 #: src/glade/psensor-pref.glade:457
 msgid "minute(s)"
@@ -130,7 +124,7 @@ msgstr "seconde(s)"
 
 #: src/glade/psensor-pref.glade:510
 msgid "Update interval:"
 
 #: src/glade/psensor-pref.glade:510
 msgid "Update interval:"
-msgstr "Intervalle de mise à jour :"
+msgstr "Intervalle de mise à jour:"
 
 #: src/glade/psensor-pref.glade:528
 msgid "Measures"
 
 #: src/glade/psensor-pref.glade:528
 msgid "Measures"
@@ -143,7 +137,7 @@ msgstr "Graphe"
 
 #: src/glade/psensor-pref.glade:588
 msgid "Measure update interval:"
 
 #: src/glade/psensor-pref.glade:588
 msgid "Measure update interval:"
-msgstr "Intervalle de mise à jour des mesures :"
+msgstr "Intervalle de mise à jour des mesures:"
 
 #: src/glade/psensor-pref.glade:637
 msgid "Enable sensors logging"
 
 #: src/glade/psensor-pref.glade:637
 msgid "Enable sensors logging"
@@ -175,7 +169,7 @@ msgstr "Nom :"
 
 #: src/glade/sensor-edit.glade:138
 msgid "Type:"
 
 #: src/glade/sensor-edit.glade:138
 msgid "Type:"
-msgstr "Type :"
+msgstr "Type :"
 
 #: src/glade/sensor-edit.glade:153 src/glade/sensor-edit.glade:294
 #: src/glade/sensor-edit.glade:388 src/glade/sensor-edit.glade:459
 
 #: src/glade/sensor-edit.glade:153 src/glade/sensor-edit.glade:294
 #: src/glade/sensor-edit.glade:388 src/glade/sensor-edit.glade:459
@@ -185,7 +179,7 @@ msgstr "N/A"
 
 #: src/glade/sensor-edit.glade:187
 msgid "Color:"
 
 #: src/glade/sensor-edit.glade:187
 msgid "Color:"
-msgstr "Couleur :"
+msgstr "Couleur:"
 
 #: src/glade/sensor-edit.glade:201
 msgid "Alarm"
 
 #: src/glade/sensor-edit.glade:201
 msgid "Alarm"
@@ -205,11 +199,11 @@ msgstr "Dessiner la courbe du capteur"
 
 #: src/glade/sensor-edit.glade:333
 msgid "High threshold:"
 
 #: src/glade/sensor-edit.glade:333
 msgid "High threshold:"
-msgstr "Seuil supérieur :"
+msgstr "Seuil supérieur:"
 
 #: src/glade/sensor-edit.glade:348
 msgid "Low threshold:"
 
 #: src/glade/sensor-edit.glade:348
 msgid "Low threshold:"
-msgstr "Seuil inférieur :"
+msgstr "Seuil inférieur:"
 
 #: src/glade/sensor-edit.glade:409
 msgid "Ubuntu Application Indicator"
 
 #: src/glade/sensor-edit.glade:409
 msgid "Ubuntu Application Indicator"
@@ -225,7 +219,7 @@ msgstr "Puce :"
 
 #: src/glade/sensor-edit.glade:489
 msgid "Id:"
 
 #: src/glade/sensor-edit.glade:489
 msgid "Id:"
-msgstr "Id :"
+msgstr "Id:"
 
 #: src/glade/sensor-edit.glade:523
 msgid "Details"
 
 #: src/glade/sensor-edit.glade:523
 msgid "Details"
@@ -233,23 +227,23 @@ msgstr "Détails"
 
 #: src/glade/sensor-edit.glade:541
 msgid "Name:"
 
 #: src/glade/sensor-edit.glade:541
 msgid "Name:"
-msgstr "Nom :"
+msgstr "Nom:"
 
 #: src/lib/amd.c:170
 msgid "AMD: cannot found ADL library."
 
 #: src/lib/amd.c:170
 msgid "AMD: cannot found ADL library."
-msgstr "AMD : impossible de trouver la bibliothèque ADL."
+msgstr "AMD: impossible de trouver la bibliothèque ADL."
 
 #: src/lib/amd.c:197
 msgid "AMD: missing ADL's API."
 
 #: src/lib/amd.c:197
 msgid "AMD: missing ADL's API."
-msgstr "AMD : L'interface de programmation ADL est manquante."
+msgstr "AMD: L'interface de programmation ADL est manquante."
 
 #: src/lib/amd.c:207
 msgid "AMD: failed to initialize ADL."
 
 #: src/lib/amd.c:207
 msgid "AMD: failed to initialize ADL."
-msgstr "AMD : échec de l'initialisation d'ADL."
+msgstr "AMD: échec de l'initialisation d'ADL."
 
 #: src/lib/amd.c:213
 msgid "AMD: cannot get the number of adapters."
 
 #: src/lib/amd.c:213
 msgid "AMD: cannot get the number of adapters."
-msgstr "AMD : impossible de récupérer le nombre d'adaptateurs."
+msgstr "AMD: impossible de récupérer le nombre d'adaptateurs."
 
 #: src/lib/amd.c:252
 #, c-format
 
 #: src/lib/amd.c:252
 #, c-format
@@ -264,37 +258,35 @@ msgstr ""
 #: src/lib/hdd_atasmart.c:152
 #, c-format
 msgid "atasmart: sk_disk_open() failure: %s."
 #: src/lib/hdd_atasmart.c:152
 #, c-format
 msgid "atasmart: sk_disk_open() failure: %s."
-msgstr "atasmart : échec de sk_disk_open() : %s."
+msgstr "atasmart: échec de sk_disk_open(): %s."
 
 #: src/lib/hdd_hddtemp.c:59
 
 #: src/lib/hdd_hddtemp.c:59
-#, fuzzy
 msgid "hddtemp: failed to open socket."
 msgid "hddtemp: failed to open socket."
-msgstr "hddtemp : échec d'ouverture de l'interface de connexion."
+msgstr "hddtemp: échec d'ouverture de l'interface de connexion."
 
 #: src/lib/hdd_hddtemp.c:72
 msgid "hddtemp: failed to open connection."
 
 #: src/lib/hdd_hddtemp.c:72
 msgid "hddtemp: failed to open connection."
-msgstr "hddtemp : échec de l'ouverture de la connexion."
+msgstr "hddtemp: échec de l'ouverture de la connexion."
 
 #: src/lib/hdd_hddtemp.c:186 src/lib/hdd_hddtemp.c:256
 #, c-format
 msgid "hddtemp: wrong string: %s."
 
 #: src/lib/hdd_hddtemp.c:186 src/lib/hdd_hddtemp.c:256
 #, c-format
 msgid "hddtemp: wrong string: %s."
-msgstr "hddtemp : mauvaise chaîne: %s."
+msgstr "hddtemp: mauvaise chaîne: %s."
 
 #: src/lib/lmsensor.c:42
 #, c-format
 msgid "lmsensor: cannot get value of subfeature %s: %s."
 msgstr ""
 
 #: src/lib/lmsensor.c:42
 #, c-format
 msgid "lmsensor: cannot get value of subfeature %s: %s."
 msgstr ""
-"lmsensor : impossible de récupérer la valeur de la sous-fonction %s: %s."
+"lmsensor: impossible de récupérer la valeur de la sous-fonction %s: %s."
 
 #: src/lib/lmsensor.c:123
 msgid "lmsensor: lmsensor_psensor_create failure: wrong feature type."
 
 #: src/lib/lmsensor.c:123
 msgid "lmsensor: lmsensor_psensor_create failure: wrong feature type."
-msgstr ""
-"lmsensor : échec de lmsensor_psensor_create : mauvais type de fonction."
+msgstr "lmsensor: échec de lmsensor_psensor_create : mauvais type de fonction."
 
 #: src/lib/lmsensor.c:218
 #, c-format
 msgid "lmsensor: initialization failure: %s."
 
 #: src/lib/lmsensor.c:218
 #, c-format
 msgid "lmsensor: initialization failure: %s."
-msgstr "lmsensor : échec de l'initialisation: %s."
+msgstr "lmsensor: échec de l'initialisation: %s."
 
 #: src/lib/log.c:43
 #, c-format
 
 #: src/lib/log.c:43
 #, c-format
@@ -316,7 +308,7 @@ msgstr "Échec de la récupération des information NVIDIA."
 
 #: src/lib/psensor.c:482 tests/test_psensor_type_to_unit_str.c:62
 msgid "RPM"
 
 #: src/lib/psensor.c:482 tests/test_psensor_type_to_unit_str.c:62
 msgid "RPM"
-msgstr "Tr/mn"
+msgstr "Tr/min"
 
 #: src/lib/psensor.c:484
 msgid "%"
 
 #: src/lib/psensor.c:484
 msgid "%"
@@ -333,7 +325,7 @@ msgstr "Le journal des capteurs est déjà ouvert."
 #: src/lib/slog.c:87
 #, fuzzy, c-format
 msgid "Cannot open sensor log file: %s."
 #: src/lib/slog.c:87
 #, fuzzy, c-format
 msgid "Cannot open sensor log file: %s."
-msgstr "Ne peut ouvrir le journal : %s."
+msgstr "Ne peut ouvrir le journal : %s."
 
 #: src/lib/slog.c:118
 msgid "Sensor log file not open."
 
 #: src/lib/slog.c:118
 msgid "Sensor log file not open."
@@ -363,7 +355,7 @@ msgstr ""
 #: src/main.c:88 src/server/server.c:94
 #, c-format
 msgid "Usage: %s [OPTION]...\n"
 #: src/main.c:88 src/server/server.c:94
 #, c-format
 msgid "Usage: %s [OPTION]...\n"
-msgstr "Utilisation : %s [OPTION]...\n"
+msgstr "Utilisation: %s [OPTION]...\n"
 
 #: src/main.c:90
 msgid ""
 
 #: src/main.c:90
 msgid ""
@@ -375,7 +367,7 @@ msgstr ""
 
 #: src/main.c:94
 msgid "Options:"
 
 #: src/main.c:94
 msgid "Options:"
-msgstr "Options :"
+msgstr "Options:"
 
 #: src/main.c:95
 msgid ""
 
 #: src/main.c:95
 msgid ""
@@ -443,17 +435,17 @@ msgstr "Une instance de Psensor existe déjà."
 #: src/rsensor.c:107
 #, c-format
 msgid "Fail to connect to: %s"
 #: src/rsensor.c:107
 #, c-format
 msgid "Fail to connect to: %s"
-msgstr "Échec de la connexion à : %s"
+msgstr "Échec de la connexion à: %s"
 
 #: src/rsensor.c:144
 #, c-format
 msgid "Invalid content: %s"
 
 #: src/rsensor.c:144
 #, c-format
 msgid "Invalid content: %s"
-msgstr "Contenu invalide : %s"
+msgstr "Contenu invalide: %s"
 
 #: src/rsensor.c:184
 #, c-format
 msgid "Invalid JSON: %s"
 
 #: src/rsensor.c:184
 #, c-format
 msgid "Invalid JSON: %s"
-msgstr "JSON invalide : %s"
+msgstr "JSON invalide: %s"
 
 #: src/server/server.c:54
 msgid "<html><body><p>Server stop requested</p></body></html>"
 
 #: src/server/server.c:54
 msgid "<html><body><p>Server stop requested</p></body></html>"
@@ -529,7 +521,7 @@ msgstr ""
 #: src/server/server.c:297
 #, c-format
 msgid "HTTP Request: %s"
 #: src/server/server.c:297
 #, c-format
 msgid "HTTP Request: %s"
-msgstr "Requête HTTP : %s"
+msgstr "Requête HTTP: %s"
 
 #: src/server/server.c:360
 #, c-format
 
 #: src/server/server.c:360
 #, c-format
@@ -552,7 +544,7 @@ msgstr "Le serveur Web a été démarré sur le port: %d"
 #: src/server/server.c:414
 #, c-format
 msgid "WWW directory: %s"
 #: src/server/server.c:414
 #, c-format
 msgid "WWW directory: %s"
-msgstr "WWW répertoire : %s"
+msgstr "WWW répertoire: %s"
 
 #: src/server/server.c:415
 #, c-format
 
 #: src/server/server.c:415
 #, c-format
@@ -571,10 +563,10 @@ msgstr ""
 
 #: src/ui.c:87
 msgid ""
 
 #: src/ui.c:87
 msgid ""
-"Copyright(c) 2010-2014\n"
+"Copyright(c) 2010-2013\n"
 "jeanfi@gmail.com"
 msgstr ""
 "jeanfi@gmail.com"
 msgstr ""
-"Copyright © 2010-2014\n"
+"Copyright © 2010-2013\n"
 "jeanfi@gmail.com"
 
 #: src/ui.c:90
 "jeanfi@gmail.com"
 
 #: src/ui.c:90
@@ -613,6 +605,39 @@ msgstr "Max"
 msgid "Color"
 msgstr "Couleur"
 
 msgid "Color"
 msgstr "Couleur"
 
+#: src/ui_appindicator.c:106
+msgid "_Show"
+msgstr "_Afficher"
+
+#: src/ui_appindicator.c:107
+msgid "Show"
+msgstr "Afficher"
+
+#: src/ui_appindicator.c:111
+msgid "_Preferences"
+msgstr "_Préférences"
+
+#: src/ui_appindicator.c:116
+msgid "S_ensor Preferences"
+msgstr "Préférences des capteurs"
+
+#: src/ui_appindicator.c:118
+msgid "SensorPreferences"
+msgstr "Configuration des capteurs"
+
+#: src/ui_appindicator.c:122
+msgid "_About"
+msgstr "À _propos"
+
+#: src/ui_appindicator.c:129
+msgid "_Quit"
+msgstr "_Quitter"
+
+#: src/ui_appindicator.c:220
+#, c-format
+msgid "building menus failed: %s"
+msgstr "La construction des menus a échouée: %s"
+
 #: src/ui_notify.c:48
 msgid "gettimeofday failed."
 msgstr "Échec de gettimeofday."
 #: src/ui_notify.c:48
 msgid "gettimeofday failed."
 msgstr "Échec de gettimeofday."
@@ -629,23 +654,28 @@ msgstr "Alerte ventilateur"
 msgid "Unknown"
 msgstr "Inconnu"
 
 msgid "Unknown"
 msgstr "Inconnu"
 
-#~ msgid "_Show"
-#~ msgstr "_Afficher"
+#~ msgid "Sensor Name"
+#~ msgstr "Nom de la Sonde"
 
 
-#~ msgid "_Preferences"
-#~ msgstr "_Préférences"
+#~ msgid "Enabled"
+#~ msgstr "Activé"
 
 
-#~ msgid "S_ensor Preferences"
-#~ msgstr "Préférences des capteurs"
+#, fuzzy
+#~ msgid "Enable log of measures"
+#~ msgstr "Activer le menu"
 
 
-#~ msgid "SensorPreferences"
-#~ msgstr "Configuration des capteurs"
+#, fuzzy
+#~ msgid "slog_init: cannot open sensor log file: %s"
+#~ msgstr "Impossible d'ouvrir le journal: %s"
 
 
-#~ msgid "_About"
-#~ msgstr "À _propos"
+#, fuzzy
+#~ msgid "slog_init: gettimeofday failed."
+#~ msgstr "Échec de gettimeofday."
 
 
-#~ msgid "_Quit"
-#~ msgstr "_Quitter"
+#, fuzzy
+#~ msgid "slog_write_sensors: gettimeofday failed."
+#~ msgstr "Échec de gettimeofday."
 
 
-#~ msgid "building menus failed: %s"
-#~ msgstr "La construction des menus a échouée : %s"
+#, fuzzy
+#~ msgid "Enable indicator"
+#~ msgstr "Activée"
index c4e8aa2..68e6bd6 100644 (file)
Binary files a/po/hu.gmo and b/po/hu.gmo differ
index 1de2b8c..2ad2ad6 100644 (file)
--- a/po/hu.po
+++ b/po/hu.po
@@ -1,14 +1,14 @@
 # Hungarian translation for psensor
 # Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012
 # This file is distributed under the same license as the psensor package.
 # Hungarian translation for psensor
 # Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012
 # This file is distributed under the same license as the psensor package.
-# Maintained by Jean-Philippe Orsini <jeanfi@gmail.com>
 #
 #
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2012.
 # Lukács Bence <lukacs.bence1 at gmail dot com>, 2012.
 msgid ""
 msgstr ""
 "Project-Id-Version: psensor\n"
 "Report-Msgid-Bugs-To: jeanfi@gmail.com\n"
 # Lukács Bence <lukacs.bence1 at gmail dot com>, 2012.
 msgid ""
 msgstr ""
 "Project-Id-Version: psensor\n"
 "Report-Msgid-Bugs-To: jeanfi@gmail.com\n"
-"POT-Creation-Date: 2014-04-10 08:17+0200\n"
+"POT-Creation-Date: 2013-10-16 09:19+0200\n"
 "PO-Revision-Date: 2012-10-29 09:41+0000\n"
 "Last-Translator: Bence Lukács <Unknown>\n"
 "Language-Team: Hungarian <gnome-hu-list-request@gnome.org>\n"
 "PO-Revision-Date: 2012-10-29 09:41+0000\n"
 "Last-Translator: Bence Lukács <Unknown>\n"
 "Language-Team: Hungarian <gnome-hu-list-request@gnome.org>\n"
@@ -19,37 +19,31 @@ msgstr ""
 "X-Launchpad-Export-Date: 2013-01-21 09:32+0000\n"
 "X-Generator: Launchpad (build 16430)\n"
 
 "X-Launchpad-Export-Date: 2013-01-21 09:32+0000\n"
 "X-Generator: Launchpad (build 16430)\n"
 
-#: src/glade/psensor.glade:5
+#: src/glade/psensor.glade:5 src/ui_appindicator.c:124
 msgid "About"
 msgstr "Névjegy"
 
 msgid "About"
 msgstr "Névjegy"
 
-#: src/glade/psensor.glade:9 src/glade/psensor.glade:10
-#: src/glade/psensor.glade:19 src/ui_sensorlist.c:209
+#: src/glade/psensor.glade:9 src/ui_sensorlist.c:209 src/ui_appindicator.c:112
 msgid "Preferences"
 msgstr "Beállítások"
 
 msgid "Preferences"
 msgstr "Beállítások"
 
-#: src/glade/psensor.glade:14 src/glade/psensor.glade:15
-#: src/glade/psensor.glade:27
-msgid "Sensor Preferences"
-msgstr "Érzékelő beállításai"
-
-#: src/glade/psensor.glade:23
+#: src/glade/psensor.glade:13 src/ui_appindicator.c:130
 msgid "Quit"
 msgstr "Kilépés"
 
 msgid "Quit"
 msgstr "Kilépés"
 
-#: src/glade/psensor.glade:31
-msgid "Show"
-msgstr "Megjelenítés"
+#: src/glade/psensor.glade:17
+msgid "Sensor Preferences"
+msgstr "Érzékelő beállításai"
 
 
-#: src/glade/psensor.glade:180
+#: src/glade/psensor.glade:96
 msgid "Psensor - Temperature Monitor"
 msgstr "Psensor - hőmérsékletfigyelő"
 
 msgid "Psensor - Temperature Monitor"
 msgstr "Psensor - hőmérsékletfigyelő"
 
-#: src/glade/psensor.glade:195
+#: src/glade/psensor.glade:111
 msgid "_Psensor"
 msgstr ""
 
 msgid "_Psensor"
 msgstr ""
 
-#: src/glade/psensor.glade:242
+#: src/glade/psensor.glade:158
 msgid "_Help"
 msgstr "_Súgó"
 
 msgid "_Help"
 msgstr "_Súgó"
 
@@ -561,10 +555,10 @@ msgstr "A Psensor egy GTK+ alkalmazás a hardver érzékelőinek figyelésére"
 
 #: src/ui.c:87
 msgid ""
 
 #: src/ui.c:87
 msgid ""
-"Copyright(c) 2010-2014\n"
+"Copyright(c) 2010-2013\n"
 "jeanfi@gmail.com"
 msgstr ""
 "jeanfi@gmail.com"
 msgstr ""
-"Copyright(c) 2010-2014\n"
+"Copyright(c) 2010-2013\n"
 "jeanfi@gmail.com"
 
 #: src/ui.c:90
 "jeanfi@gmail.com"
 
 #: src/ui.c:90
@@ -603,6 +597,39 @@ msgstr "Maximum"
 msgid "Color"
 msgstr "Szín"
 
 msgid "Color"
 msgstr "Szín"
 
+#: src/ui_appindicator.c:106
+msgid "_Show"
+msgstr "_Megjelenítés"
+
+#: src/ui_appindicator.c:107
+msgid "Show"
+msgstr "Megjelenítés"
+
+#: src/ui_appindicator.c:111
+msgid "_Preferences"
+msgstr "_Beállítások"
+
+#: src/ui_appindicator.c:116
+msgid "S_ensor Preferences"
+msgstr "_Érzékelő beállításai"
+
+#: src/ui_appindicator.c:118
+msgid "SensorPreferences"
+msgstr "Érzékelőbeállítások"
+
+#: src/ui_appindicator.c:122
+msgid "_About"
+msgstr "_Névjegy"
+
+#: src/ui_appindicator.c:129
+msgid "_Quit"
+msgstr "_Kilépés"
+
+#: src/ui_appindicator.c:220
+#, c-format
+msgid "building menus failed: %s"
+msgstr "menük építése meghiúsult: %s"
+
 #: src/ui_notify.c:48
 msgid "gettimeofday failed."
 msgstr "gettimeofday meghiúsult."
 #: src/ui_notify.c:48
 msgid "gettimeofday failed."
 msgstr "gettimeofday meghiúsult."
@@ -619,27 +646,6 @@ msgstr "Ventilátor riasztás"
 msgid "Unknown"
 msgstr "Ismeretlen"
 
 msgid "Unknown"
 msgstr "Ismeretlen"
 
-#~ msgid "_Show"
-#~ msgstr "_Megjelenítés"
-
-#~ msgid "_Preferences"
-#~ msgstr "_Beállítások"
-
-#~ msgid "S_ensor Preferences"
-#~ msgstr "_Érzékelő beállításai"
-
-#~ msgid "SensorPreferences"
-#~ msgstr "Érzékelőbeállítások"
-
-#~ msgid "_About"
-#~ msgstr "_Névjegy"
-
-#~ msgid "_Quit"
-#~ msgstr "_Kilépés"
-
-#~ msgid "building menus failed: %s"
-#~ msgstr "menük építése meghiúsult: %s"
-
 #~ msgid "Sensor Name"
 #~ msgstr "Érzékelő neve"
 
 #~ msgid "Sensor Name"
 #~ msgstr "Érzékelő neve"
 
index 68bbf7d..42928b4 100644 (file)
Binary files a/po/it.gmo and b/po/it.gmo differ
index 56315bc..b6046d7 100644 (file)
--- a/po/it.po
+++ b/po/it.po
@@ -1,13 +1,13 @@
 # Italian translations for psensor package.
 # Copyright (C) 2012 Free Software Foundation, Inc.
 # This file is distributed under the same license as the psensor package.
 # Italian translations for psensor package.
 # Copyright (C) 2012 Free Software Foundation, Inc.
 # This file is distributed under the same license as the psensor package.
-# Maintained by Jean-Philippe Orsini <jeanfi@gmail.com>
+#  <jeanfi@gmail.com>, 2012.
 #
 msgid ""
 msgstr ""
 "Project-Id-Version: psensor 0.7.0.x\n"
 "Report-Msgid-Bugs-To: jeanfi@gmail.com\n"
 #
 msgid ""
 msgstr ""
 "Project-Id-Version: psensor 0.7.0.x\n"
 "Report-Msgid-Bugs-To: jeanfi@gmail.com\n"
-"POT-Creation-Date: 2014-04-10 08:17+0200\n"
+"POT-Creation-Date: 2013-10-16 09:19+0200\n"
 "PO-Revision-Date: 2013-04-14 16:06+0000\n"
 "Last-Translator: Diego Pierotto <Unknown>\n"
 "Language-Team: Italian\n"
 "PO-Revision-Date: 2013-04-14 16:06+0000\n"
 "Last-Translator: Diego Pierotto <Unknown>\n"
 "Language-Team: Italian\n"
@@ -18,37 +18,31 @@ msgstr ""
 "X-Launchpad-Export-Date: 2013-04-20 08:36+0000\n"
 "X-Generator: Launchpad (build 16567)\n"
 
 "X-Launchpad-Export-Date: 2013-04-20 08:36+0000\n"
 "X-Generator: Launchpad (build 16567)\n"
 
-#: src/glade/psensor.glade:5
+#: src/glade/psensor.glade:5 src/ui_appindicator.c:124
 msgid "About"
 msgstr "Informazioni su..."
 
 msgid "About"
 msgstr "Informazioni su..."
 
-#: src/glade/psensor.glade:9 src/glade/psensor.glade:10
-#: src/glade/psensor.glade:19 src/ui_sensorlist.c:209
+#: src/glade/psensor.glade:9 src/ui_sensorlist.c:209 src/ui_appindicator.c:112
 msgid "Preferences"
 msgstr "Preferenze"
 
 msgid "Preferences"
 msgstr "Preferenze"
 
-#: src/glade/psensor.glade:14 src/glade/psensor.glade:15
-#: src/glade/psensor.glade:27
-msgid "Sensor Preferences"
-msgstr "Sensor Preferenze"
-
-#: src/glade/psensor.glade:23
+#: src/glade/psensor.glade:13 src/ui_appindicator.c:130
 msgid "Quit"
 msgstr "Esci"
 
 msgid "Quit"
 msgstr "Esci"
 
-#: src/glade/psensor.glade:31
-msgid "Show"
-msgstr "Mostra"
+#: src/glade/psensor.glade:17
+msgid "Sensor Preferences"
+msgstr "Sensor Preferenze"
 
 
-#: src/glade/psensor.glade:180
+#: src/glade/psensor.glade:96
 msgid "Psensor - Temperature Monitor"
 msgstr "Psensor - Monitor temperatura"
 
 msgid "Psensor - Temperature Monitor"
 msgstr "Psensor - Monitor temperatura"
 
-#: src/glade/psensor.glade:195
+#: src/glade/psensor.glade:111
 msgid "_Psensor"
 msgstr "_Psensor"
 
 msgid "_Psensor"
 msgstr "_Psensor"
 
-#: src/glade/psensor.glade:242
+#: src/glade/psensor.glade:158
 msgid "_Help"
 msgstr "_Aiuto"
 
 msgid "_Help"
 msgstr "_Aiuto"
 
@@ -564,10 +558,10 @@ msgstr "Psensor è un'applicazione GTK+ per monitorare i sensori hardware"
 
 #: src/ui.c:87
 msgid ""
 
 #: src/ui.c:87
 msgid ""
-"Copyright(c) 2010-2014\n"
+"Copyright(c) 2010-2013\n"
 "jeanfi@gmail.com"
 msgstr ""
 "jeanfi@gmail.com"
 msgstr ""
-"Copyright(c) 2010-2014\n"
+"Copyright(c) 2010-2013\n"
 "jeanfi@gmail.com"
 
 #: src/ui.c:90
 "jeanfi@gmail.com"
 
 #: src/ui.c:90
@@ -606,6 +600,39 @@ msgstr "Massimo"
 msgid "Color"
 msgstr "Colore"
 
 msgid "Color"
 msgstr "Colore"
 
+#: src/ui_appindicator.c:106
+msgid "_Show"
+msgstr "_Mostra"
+
+#: src/ui_appindicator.c:107
+msgid "Show"
+msgstr "Mostra"
+
+#: src/ui_appindicator.c:111
+msgid "_Preferences"
+msgstr "_Preferenze"
+
+#: src/ui_appindicator.c:116
+msgid "S_ensor Preferences"
+msgstr "S_ensor Preferenze"
+
+#: src/ui_appindicator.c:118
+msgid "SensorPreferences"
+msgstr "SensorPreferenze"
+
+#: src/ui_appindicator.c:122
+msgid "_About"
+msgstr "_Informazioni"
+
+#: src/ui_appindicator.c:129
+msgid "_Quit"
+msgstr "_Esci"
+
+#: src/ui_appindicator.c:220
+#, c-format
+msgid "building menus failed: %s"
+msgstr "costruzione dei menù fallita: %s"
+
 #: src/ui_notify.c:48
 msgid "gettimeofday failed."
 msgstr "gettimeofday fallito."
 #: src/ui_notify.c:48
 msgid "gettimeofday failed."
 msgstr "gettimeofday fallito."
@@ -622,27 +649,6 @@ msgstr "Allarme ventola"
 msgid "Unknown"
 msgstr "Sconosciuto"
 
 msgid "Unknown"
 msgstr "Sconosciuto"
 
-#~ msgid "_Show"
-#~ msgstr "_Mostra"
-
-#~ msgid "_Preferences"
-#~ msgstr "_Preferenze"
-
-#~ msgid "S_ensor Preferences"
-#~ msgstr "S_ensor Preferenze"
-
-#~ msgid "SensorPreferences"
-#~ msgstr "SensorPreferenze"
-
-#~ msgid "_About"
-#~ msgstr "_Informazioni"
-
-#~ msgid "_Quit"
-#~ msgstr "_Esci"
-
-#~ msgid "building menus failed: %s"
-#~ msgstr "costruzione dei menù fallita: %s"
-
 #~ msgid "Sensor Name"
 #~ msgstr "Nome sensore"
 
 #~ msgid "Sensor Name"
 #~ msgstr "Nome sensore"
 
index 9de9380..1f519e4 100644 (file)
Binary files a/po/lv.gmo and b/po/lv.gmo differ
index 2b7b70a..f8d2229 100644 (file)
--- a/po/lv.po
+++ b/po/lv.po
@@ -1,54 +1,48 @@
 # Latvian translation for psensor
 # Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012
 # This file is distributed under the same license as the psensor package.
 # Latvian translation for psensor
 # Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012
 # This file is distributed under the same license as the psensor package.
-# Maintained by Jean-Philippe Orsini <jeanfi@gmail.com>
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2012.
 #
 msgid ""
 msgstr ""
 "Project-Id-Version: psensor\n"
 "Report-Msgid-Bugs-To: jeanfi@gmail.com\n"
 #
 msgid ""
 msgstr ""
 "Project-Id-Version: psensor\n"
 "Report-Msgid-Bugs-To: jeanfi@gmail.com\n"
-"POT-Creation-Date: 2014-04-10 08:17+0200\n"
-"PO-Revision-Date: 2013-10-24 12:32+0000\n"
+"POT-Creation-Date: 2013-10-16 09:19+0200\n"
+"PO-Revision-Date: 2013-05-01 09:48+0000\n"
 "Last-Translator: tuxmaniack <Unknown>\n"
 "Language-Team: Latvian <lv@li.org>\n"
 "Language: lv\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Last-Translator: tuxmaniack <Unknown>\n"
 "Language-Team: Latvian <lv@li.org>\n"
 "Language: lv\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2014-02-11 20:01+0000\n"
-"X-Generator: Launchpad (build 16916)\n"
+"X-Launchpad-Export-Date: 2013-05-20 08:44+0000\n"
+"X-Generator: Launchpad (build 16626)\n"
 
 
-#: src/glade/psensor.glade:5
+#: src/glade/psensor.glade:5 src/ui_appindicator.c:124
 msgid "About"
 msgstr "Par"
 
 msgid "About"
 msgstr "Par"
 
-#: src/glade/psensor.glade:9 src/glade/psensor.glade:10
-#: src/glade/psensor.glade:19 src/ui_sensorlist.c:209
+#: src/glade/psensor.glade:9 src/ui_sensorlist.c:209 src/ui_appindicator.c:112
 msgid "Preferences"
 msgstr "Iestatījumi"
 
 msgid "Preferences"
 msgstr "Iestatījumi"
 
-#: src/glade/psensor.glade:14 src/glade/psensor.glade:15
-#: src/glade/psensor.glade:27
-msgid "Sensor Preferences"
-msgstr "Sensoru iestatījumi"
-
-#: src/glade/psensor.glade:23
+#: src/glade/psensor.glade:13 src/ui_appindicator.c:130
 msgid "Quit"
 msgstr "Iziet"
 
 msgid "Quit"
 msgstr "Iziet"
 
-#: src/glade/psensor.glade:31
-msgid "Show"
-msgstr "Rādīt"
+#: src/glade/psensor.glade:17
+msgid "Sensor Preferences"
+msgstr "Sensoru iestatījumi"
 
 
-#: src/glade/psensor.glade:180
+#: src/glade/psensor.glade:96
 msgid "Psensor - Temperature Monitor"
 msgstr "Psensor - temperatūras pārraugs"
 
 msgid "Psensor - Temperature Monitor"
 msgstr "Psensor - temperatūras pārraugs"
 
-#: src/glade/psensor.glade:195
+#: src/glade/psensor.glade:111
 msgid "_Psensor"
 msgstr "_Psensor"
 
 msgid "_Psensor"
 msgstr "_Psensor"
 
-#: src/glade/psensor.glade:242
+#: src/glade/psensor.glade:158
 msgid "_Help"
 msgstr "_Palīdzība"
 
 msgid "_Help"
 msgstr "_Palīdzība"
 
@@ -159,7 +153,7 @@ msgstr "sekunde(s)"
 
 #: src/glade/psensor-pref.glade:718
 msgid "Script executed when an alarm is raised"
 
 #: src/glade/psensor-pref.glade:718
 msgid "Script executed when an alarm is raised"
-msgstr "Skrips izpildīts, kad trauksme ir aktivizēta"
+msgstr ""
 
 #: src/glade/psensor-pref.glade:751
 msgid "Sensors"
 
 #: src/glade/psensor-pref.glade:751
 msgid "Sensors"
@@ -546,10 +540,10 @@ msgstr "Psensor ir GTK+ lietotne aparatūras sensoru pārraudzībai"
 
 #: src/ui.c:87
 msgid ""
 
 #: src/ui.c:87
 msgid ""
-"Copyright(c) 2010-2014\n"
+"Copyright(c) 2010-2013\n"
 "jeanfi@gmail.com"
 msgstr ""
 "jeanfi@gmail.com"
 msgstr ""
-"Autortiesības(c) 2010-2014\n"
+"Autortiesības(c) 2010-2013\n"
 "jeanfi@gmail.com"
 
 #: src/ui.c:90
 "jeanfi@gmail.com"
 
 #: src/ui.c:90
@@ -588,6 +582,39 @@ msgstr "Maks."
 msgid "Color"
 msgstr "Krāsa"
 
 msgid "Color"
 msgstr "Krāsa"
 
+#: src/ui_appindicator.c:106
+msgid "_Show"
+msgstr "_Rādīt"
+
+#: src/ui_appindicator.c:107
+msgid "Show"
+msgstr "Rādīt"
+
+#: src/ui_appindicator.c:111
+msgid "_Preferences"
+msgstr "_Iestatījumi"
+
+#: src/ui_appindicator.c:116
+msgid "S_ensor Preferences"
+msgstr "S_ensoru iestatījumi"
+
+#: src/ui_appindicator.c:118
+msgid "SensorPreferences"
+msgstr "SensoraIestatījumi"
+
+#: src/ui_appindicator.c:122
+msgid "_About"
+msgstr "P_ar"
+
+#: src/ui_appindicator.c:129
+msgid "_Quit"
+msgstr "_Iziet"
+
+#: src/ui_appindicator.c:220
+#, c-format
+msgid "building menus failed: %s"
+msgstr "neizdevās izveidot izvēlnes: %s"
+
 #: src/ui_notify.c:48
 msgid "gettimeofday failed."
 msgstr "gettimeofday neizdevās."
 #: src/ui_notify.c:48
 msgid "gettimeofday failed."
 msgstr "gettimeofday neizdevās."
@@ -604,23 +631,16 @@ msgstr "Ventilatora trauksme"
 msgid "Unknown"
 msgstr "Nezināms"
 
 msgid "Unknown"
 msgstr "Nezināms"
 
-#~ msgid "_Show"
-#~ msgstr "_Rādīt"
-
-#~ msgid "_Preferences"
-#~ msgstr "_Iestatījumi"
-
-#~ msgid "S_ensor Preferences"
-#~ msgstr "S_ensoru iestatījumi"
-
-#~ msgid "SensorPreferences"
-#~ msgstr "SensoraIestatījumi"
+#~ msgid "Sensor Name"
+#~ msgstr "Sensora nosaukums"
 
 
-#~ msgid "_About"
-#~ msgstr "P_ar"
+#~ msgid "Enabled"
+#~ msgstr "Aktivizēts"
 
 
-#~ msgid "_Quit"
-#~ msgstr "_Iziet"
+#, fuzzy
+#~ msgid "Enable log of measures"
+#~ msgstr "Aktivizēt izvēlni"
 
 
-#~ msgid "building menus failed: %s"
-#~ msgstr "neizdevās izveidot izvēlnes: %s"
+#, fuzzy
+#~ msgid "Enable indicator"
+#~ msgstr "Aktivizēts"
diff --git a/po/nl.gmo b/po/nl.gmo
deleted file mode 100644 (file)
index 3dc58bc..0000000
Binary files a/po/nl.gmo and /dev/null differ
diff --git a/po/nl.po b/po/nl.po
deleted file mode 100644 (file)
index da18789..0000000
--- a/po/nl.po
+++ /dev/null
@@ -1,644 +0,0 @@
-# Dutch translation for psensor
-# Copyright (c) 2014 Rosetta Contributors and Canonical Ltd 2014
-# This file is distributed under the same license as the psensor package.
-# FIRST AUTHOR <EMAIL@ADDRESS>, 2014.
-#
-msgid ""
-msgstr ""
-"Project-Id-Version: psensor\n"
-"Report-Msgid-Bugs-To: jeanfi@gmail.com\n"
-"POT-Creation-Date: 2014-04-10 08:17+0200\n"
-"PO-Revision-Date: 2014-04-07 08:50+0000\n"
-"Last-Translator: Pjotr12345 <Unknown>\n"
-"Language-Team: Dutch <nl@li.org>\n"
-"Language: nl\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2014-04-09 22:52+0000\n"
-"X-Generator: Launchpad (build 16976)\n"
-
-#: src/glade/psensor.glade:5
-msgid "About"
-msgstr "Over"
-
-#: src/glade/psensor.glade:9 src/glade/psensor.glade:10
-#: src/glade/psensor.glade:19 src/ui_sensorlist.c:209
-msgid "Preferences"
-msgstr "Voorkeuren"
-
-#: src/glade/psensor.glade:14 src/glade/psensor.glade:15
-#: src/glade/psensor.glade:27
-msgid "Sensor Preferences"
-msgstr "Sensorvoorkeuren"
-
-#: src/glade/psensor.glade:23
-msgid "Quit"
-msgstr "Afsluiten"
-
-#: src/glade/psensor.glade:31
-msgid "Show"
-msgstr "Tonen"
-
-#: src/glade/psensor.glade:180
-msgid "Psensor - Temperature Monitor"
-msgstr "Psensor - Temperatuurbewaker"
-
-#: src/glade/psensor.glade:195
-msgid "_Psensor"
-msgstr "_Psensor"
-
-#: src/glade/psensor.glade:242
-msgid "_Help"
-msgstr "_Hulp"
-
-#: src/glade/psensor-pref.glade:7
-msgid "Edit Preferences"
-msgstr "Voorkeuren bewerken"
-
-#: src/glade/psensor-pref.glade:72
-msgid "Position of sensors table:"
-msgstr "Positie van sensorentabel:"
-
-#: src/glade/psensor-pref.glade:81
-msgid "Hide window decoration"
-msgstr "Vensteromlijsting verbergen"
-
-#: src/glade/psensor-pref.glade:98
-msgid "Keep window below"
-msgstr "Houd venster eronder"
-
-#: src/glade/psensor-pref.glade:115
-msgid "Enable menu"
-msgstr "Menu inschakelen"
-
-#: src/glade/psensor-pref.glade:132
-msgid "Enable Unity Launcher counter"
-msgstr "Teller voor Unity-starter inschakelen"
-
-#: src/glade/psensor-pref.glade:149
-msgid "Hide window on startup"
-msgstr "Venster bij opstarten verbergen"
-
-#: src/glade/psensor-pref.glade:166
-msgid "Restore window position and size"
-msgstr "Vensterpositie en -grootte herstellen"
-
-#: src/glade/psensor-pref.glade:186
-msgid "Temperature unit:"
-msgstr "Temperatuureenheid:"
-
-#: src/glade/psensor-pref.glade:238
-msgid "Interface"
-msgstr "Bedieningsschil"
-
-#: src/glade/psensor-pref.glade:276
-msgid "Foreground:"
-msgstr "Voorgrond:"
-
-#: src/glade/psensor-pref.glade:291
-msgid "Background:"
-msgstr "Achtergrond:"
-
-#: src/glade/psensor-pref.glade:325
-msgid "Background opacity:"
-msgstr "Ondoorzichtigheid van achtergrond:"
-
-#: src/glade/psensor-pref.glade:348
-msgid "<i>Min</i>"
-msgstr "<i>Min</i>"
-
-#: src/glade/psensor-pref.glade:375
-msgid "<i>Max</i>"
-msgstr "<i>Max</i>"
-
-#: src/glade/psensor-pref.glade:401
-msgid "Colors"
-msgstr "Kleuren"
-
-#: src/glade/psensor-pref.glade:419
-msgid "Monitoring duration:"
-msgstr "Duur van bewaking:"
-
-#: src/glade/psensor-pref.glade:457
-msgid "minute(s)"
-msgstr "minu(u)t(en)"
-
-#: src/glade/psensor-pref.glade:474 src/glade/psensor-pref.glade:626
-msgid "second(s)"
-msgstr "seconde(n)"
-
-#: src/glade/psensor-pref.glade:510
-msgid "Update interval:"
-msgstr "Tussenpoze voor bijwerken:"
-
-#: src/glade/psensor-pref.glade:528
-msgid "Measures"
-msgstr "Metingen"
-
-#: src/glade/psensor-pref.glade:564 src/glade/sensor-edit.glade:169
-#: src/ui_sensorlist.c:334
-msgid "Graph"
-msgstr "Grafiek"
-
-#: src/glade/psensor-pref.glade:588
-msgid "Measure update interval:"
-msgstr "Tussenpoze voor bijwerken van meting:"
-
-#: src/glade/psensor-pref.glade:637
-msgid "Enable sensors logging"
-msgstr "Logboeken bijhouden inschakelen voor sensoren"
-
-#: src/glade/psensor-pref.glade:684
-msgid "Sensors logging interval"
-msgstr "Tussenpoze voor bijhouden van logboeken voor sensoren"
-
-#: src/glade/psensor-pref.glade:701
-msgid "seconds(s)"
-msgstr "seconden(s)"
-
-#: src/glade/psensor-pref.glade:718
-msgid "Script executed when an alarm is raised"
-msgstr "Script dat wordt uitgevoerd wanneer er een alarm plaatsvindt"
-
-#: src/glade/psensor-pref.glade:751
-msgid "Sensors"
-msgstr "Sensoren"
-
-#: src/glade/sensor-edit.glade:19
-msgid "Edit Sensor Preferences"
-msgstr "Sensorvoorkeuren bewerken"
-
-#: src/glade/sensor-edit.glade:87
-msgid "Name"
-msgstr "Naam"
-
-#: src/glade/sensor-edit.glade:138
-msgid "Type:"
-msgstr "Soort:"
-
-#: src/glade/sensor-edit.glade:153 src/glade/sensor-edit.glade:294
-#: src/glade/sensor-edit.glade:388 src/glade/sensor-edit.glade:459
-#: src/glade/sensor-edit.glade:508 src/lib/psensor.c:486 src/ui_notify.c:81
-msgid "N/A"
-msgstr "N.v.t."
-
-#: src/glade/sensor-edit.glade:187
-msgid "Color:"
-msgstr "Kleur:"
-
-#: src/glade/sensor-edit.glade:201
-msgid "Alarm"
-msgstr "Alarm"
-
-#: src/glade/sensor-edit.glade:216
-msgid "Activate desktop notifications"
-msgstr "Bureaubladmeldingen inschakelen"
-
-#: src/glade/sensor-edit.glade:236
-msgid "Sensor Information"
-msgstr "Sensorinformatie"
-
-#: src/glade/sensor-edit.glade:249
-msgid "Draw sensor curve"
-msgstr "Sensor-curve tekenen"
-
-#: src/glade/sensor-edit.glade:333
-msgid "High threshold:"
-msgstr "Drempel voor hoog:"
-
-#: src/glade/sensor-edit.glade:348
-msgid "Low threshold:"
-msgstr "Drempel voor laag:"
-
-#: src/glade/sensor-edit.glade:409
-msgid "Ubuntu Application Indicator"
-msgstr "Ubuntu Toepassingsindicator"
-
-#: src/glade/sensor-edit.glade:424
-msgid "Display sensor in the Application Indicator menu"
-msgstr "Sensor tonen in het menu van de Toepassingsindicator"
-
-#: src/glade/sensor-edit.glade:444
-msgid "Chip:"
-msgstr "Chip:"
-
-#: src/glade/sensor-edit.glade:489
-msgid "Id:"
-msgstr "Id:"
-
-#: src/glade/sensor-edit.glade:523
-msgid "Details"
-msgstr "Bijzonderheden"
-
-#: src/glade/sensor-edit.glade:541
-msgid "Name:"
-msgstr "Naam:"
-
-#: src/lib/amd.c:170
-msgid "AMD: cannot found ADL library."
-msgstr "AMD: kan ADL-bibliotheekbestand niet vinden"
-
-#: src/lib/amd.c:197
-msgid "AMD: missing ADL's API."
-msgstr "AMD: ontbrekende ADL's API."
-
-#: src/lib/amd.c:207
-msgid "AMD: failed to initialize ADL."
-msgstr "AMD: kon ADL niet initialiseren."
-
-#: src/lib/amd.c:213
-msgid "AMD: cannot get the number of adapters."
-msgstr "AMD: kan het aantal videokaarten niet bepalen."
-
-#: src/lib/amd.c:252
-#, c-format
-msgid "Number of AMD/ATI adapters: %d"
-msgstr "Aantal AMD/ATI-videokaarten: %d"
-
-#: src/lib/amd.c:253
-#, c-format
-msgid "Number of active AMD/ATI adapters: %d"
-msgstr "Aantal actieve AMD/ATI-videokaarten: %d"
-
-#: src/lib/hdd_atasmart.c:152
-#, c-format
-msgid "atasmart: sk_disk_open() failure: %s."
-msgstr "atasmart: sk_disk_open() mislukking: %s."
-
-#: src/lib/hdd_hddtemp.c:59
-msgid "hddtemp: failed to open socket."
-msgstr "hddtemp: kon contactpunt niet openen."
-
-#: src/lib/hdd_hddtemp.c:72
-msgid "hddtemp: failed to open connection."
-msgstr "hddtemp: kon verbinding niet openen."
-
-#: src/lib/hdd_hddtemp.c:186 src/lib/hdd_hddtemp.c:256
-#, c-format
-msgid "hddtemp: wrong string: %s."
-msgstr "hddtemp: verkeerde tekenreeks: %s."
-
-#: src/lib/lmsensor.c:42
-#, c-format
-msgid "lmsensor: cannot get value of subfeature %s: %s."
-msgstr "lmsensor: kan waarde van subfunctie %s niet bepalen: %s."
-
-#: src/lib/lmsensor.c:123
-msgid "lmsensor: lmsensor_psensor_create failure: wrong feature type."
-msgstr "lmsensor: lmsensor_psensor_create failure: verkeerd functietype."
-
-#: src/lib/lmsensor.c:218
-#, c-format
-msgid "lmsensor: initialization failure: %s."
-msgstr "lmsensor: opstartfout: %s."
-
-#: src/lib/log.c:43
-#, c-format
-msgid "Cannot open log file: %s"
-msgstr "Kan logboekbestand niet openen: %s"
-
-#: src/lib/nvidia.c:54
-msgid ""
-"NVIDIA proprietary driver not used or cannot retrieve NVIDIA GPU temperature."
-msgstr ""
-"Het niet-vrije Nvidia-stuurprogramma wordt niet gebruikt of het kan de "
-"temperatuur van de grafische Nvidia-chip niet bepalen."
-
-#: src/lib/nvidia.c:97
-msgid "Cannot open connection to X11 server."
-msgstr "Kan verbinding met X11-server niet openen."
-
-#: src/lib/nvidia.c:105
-msgid "Failed to retrieve NVIDIA information."
-msgstr "Kon Nvidia-informatie niet ophalen."
-
-#: src/lib/psensor.c:482 tests/test_psensor_type_to_unit_str.c:62
-msgid "RPM"
-msgstr "RPM"
-
-#: src/lib/psensor.c:484
-msgid "%"
-msgstr "%"
-
-#: src/lib/slog.c:68
-msgid "HOME variable not set."
-msgstr "Variabele voor HOME niet ingesteld."
-
-#: src/lib/slog.c:78
-msgid "Sensor log file already open."
-msgstr "Logboekbestand van sensor is al geopend."
-
-#: src/lib/slog.c:87
-#, c-format
-msgid "Cannot open sensor log file: %s."
-msgstr "Kan logboekbestand van sensor niet openen: %s."
-
-#: src/lib/slog.c:118
-msgid "Sensor log file not open."
-msgstr "Logboekbestand van sensor niet geopend."
-
-#: src/lib/slog.c:174
-msgid "Sensor log not open, cannot close."
-msgstr "Logboekbestand van sensor niet geopend, kan niet sluiten."
-
-#: src/main.c:77
-#, c-format
-msgid ""
-"Copyright (C) %s jeanfi@gmail.com\n"
-"License GPLv2: GNU GPL version 2 or later <http://www.gnu.org/licenses/old-"
-"licenses/gpl-2.0.html>\n"
-"This is free software: you are free to change and  redistribute it.\n"
-"There is NO WARRANTY, to the extent permitted by law.\n"
-msgstr ""
-"Auteursrecht (C) %s jeanfi@gmail.com\n"
-"Licentie GPLv2: GNU GPL versie 2 of nieuwer <http://www.gnu.org/licenses/old-"
-"licenses/gpl-2.0.html>\n"
-"Dit is vrije programmatuur: u mag hem wijzigen en doorgeven.\n"
-"Er zit geen garantie op, voor zover de wet dat toestaat.\n"
-
-#: src/main.c:88 src/server/server.c:94
-#, c-format
-msgid "Usage: %s [OPTION]...\n"
-msgstr "Gebruik: %s [OPTIE]...\n"
-
-#: src/main.c:90
-msgid ""
-"Psensor is a GTK+ application for monitoring hardware sensors, including "
-"temperatures and fan speeds."
-msgstr ""
-"Psensor is een GTK+ toepassing voor het bewaken van apparatuursensoren, "
-"inclusief temperaturen en ventilatorsnelheden."
-
-#: src/main.c:94
-msgid "Options:"
-msgstr "Opties:"
-
-#: src/main.c:95
-msgid ""
-"  -h, --help          display this help and exit\n"
-"  -v, --version       display version information and exit"
-msgstr ""
-"  -h, --help          toon deze hulpinformatie en sluit af\n"
-"  -v, --version       toon versie-informatie en sluit af"
-
-#: src/main.c:101
-msgid ""
-"  -u, --url=URL       the URL of the psensor-server,\n"
-"                      example: http://hostname:3131"
-msgstr ""
-"  -u, --url=URL       het webadres van de psensor-server,\n"
-"                      voorbeeld: http://hostname:3131"
-
-#: src/main.c:104
-msgid ""
-"  --use-libatasmart   use atasmart library for disk monitoring instead of\n"
-"                      hddtemp daemon"
-msgstr ""
-"  --use-libatasmart   gebruik atasmart-bibiotheekbestand voor "
-"schijfbewaking\n"
-"               i.p.v. hddtemp-achtergronddienst"
-
-#: src/main.c:107
-msgid "  -n, --new-instance  force the creation of a new Psensor application"
-msgstr ""
-"  -n, --new-instance  forceer het aanmaken van een nieuwe Psensor-toepassing"
-
-#: src/main.c:110
-msgid "  -d, --debug=LEVEL   set the debug level, integer between 0 and 3"
-msgstr ""
-"  -d, --debug=LEVEL   stel het foutopsporingsniveau in, integer tussen 0 en 3"
-
-#: src/main.c:115 src/server/server.c:117
-#, c-format
-msgid "Report bugs to: %s\n"
-msgstr "Meld fouten aan: %s\n"
-
-#: src/main.c:117 src/server/server.c:119
-#, c-format
-msgid "%s home page: <%s>\n"
-msgstr "Webpagina van %s: <%s>\n"
-
-#: src/main.c:454
-msgid "Psensor has not been compiled with remote sensor support."
-msgstr ""
-"Psensor os niet gecompileerd met ondersteuning voor sensoren op afstand."
-
-#: src/main.c:517
-msgid "Enables debug mode."
-msgstr "Schakelt foutopsporingsmodus in."
-
-#: src/main.c:529 src/server/server.c:380
-#, c-format
-msgid "Try `%s --help' for more information.\n"
-msgstr "Probeer '%s --help' voor meer informatie.\n"
-
-#: src/main.c:542
-msgid "A Psensor instance already exists."
-msgstr "Er bestaat reeds een instantie van Psensor."
-
-#: src/rsensor.c:107
-#, c-format
-msgid "Fail to connect to: %s"
-msgstr "Kon niet verbinden met: %s"
-
-#: src/rsensor.c:144
-#, c-format
-msgid "Invalid content: %s"
-msgstr "Ongeldige inhoud: %s"
-
-#: src/rsensor.c:184
-#, c-format
-msgid "Invalid JSON: %s"
-msgstr "Ongeldige JSON: %s"
-
-#: src/server/server.c:54
-msgid "<html><body><p>Server stop requested</p></body></html>"
-msgstr "<html><body><p>Stilzetting van server verzocht</p></body></html>"
-
-#: src/server/server.c:60
-msgid ""
-"<html><body><p>Page not found - Go to <a href='/'>Main page</a></p></body>"
-msgstr ""
-"<html><body><p>Pagina niet gevonden - ga naar <a href='/'>Hoofdpagina</a></"
-"p></body>"
-
-#: src/server/server.c:84
-#, c-format
-msgid ""
-"Copyright (C) %s jeanfi@gmail.com\n"
-"License GPLv2: GNU GPL version 2 or later <http://www.gnu.org/licenses/old-"
-"licenses/gpl-2.0.html>\n"
-"This is free software: you are free to change and redistribute it.\n"
-"There is NO WARRANTY, to the extent permitted by law.\n"
-msgstr ""
-"Auteursrecht (C) %s jeanfi@gmail.com\n"
-"Licentie GPLv2: GNU GPL versie 2 of nieuwer <http://www.gnu.org/licenses/old-"
-"licenses/gpl-2.0.html>\n"
-"Dit is vrije programmatuur: u mag hem wijzigen en doorgeven.\n"
-"Er zit geen garantie op, voor zover de wet dat toestaat.\n"
-
-#: src/server/server.c:96
-msgid ""
-"psensor-server is an HTTP server for monitoring hardware sensors remotely."
-msgstr ""
-"psensor-server is een HTTP-server voor het bewaken van apparatuursensoren op "
-"afstand."
-
-#: src/server/server.c:101
-msgid ""
-"  -h, --help\t\tdisplay this help and exit\n"
-"  -v, --version\t\tdisplay version information and exit"
-msgstr ""
-"  -h, --help\t\ttoon deze hulptekst en sluit af\n"
-"  -v, --version\t\ttoon versie-infomatie en sluit af"
-
-#: src/server/server.c:105
-msgid ""
-"  -p,--port=PORT\twebserver port\n"
-"  -w,--wdir=DIR\t\tdirectory containing webserver pages"
-msgstr ""
-"  -p,--port=PORT\twebserverpoort\n"
-"  -w,--wdir=DIR\t\tmap die webserverpagina's bevat"
-
-#: src/server/server.c:109
-msgid "  -d, --debug=LEVEL     set the debug level, integer between 0 and 3"
-msgstr ""
-"  -d, --debug=LEVEL     stel het foutopsporingsniveau in, integer tussen 0 "
-"en 3"
-
-#: src/server/server.c:111
-msgid "  -l, --log-file=PATH   set the log file to PATH"
-msgstr "  -l, --log-file=PATH   stel het logboekbestand in op PATH"
-
-#: src/server/server.c:112
-msgid "  --sensor-log-file=PATH set the sensor log file to PATH"
-msgstr "  --sensor-log-file=PATH stel het sensorlogboekbestand in op PATH"
-
-#: src/server/server.c:113
-msgid "  --sensor-log-interval=S set the sensor log interval to S (seconds)"
-msgstr ""
-"  --sensor-log-interval=S stel de tussenpoze voor het sensorlogboek in op S "
-"(seconden)"
-
-#: src/server/server.c:297
-#, c-format
-msgid "HTTP Request: %s"
-msgstr "HTTP-verzoek: %s"
-
-#: src/server/server.c:360
-#, c-format
-msgid "Enables debug mode: %d"
-msgstr "Schakelt foutopsporingsmodus in: %d"
-
-#: src/server/server.c:402
-msgid "No sensors detected."
-msgstr "Geen sensoren bespeurd."
-
-#: src/server/server.c:409
-msgid "Failed to create Web server."
-msgstr "Kon geen webserver maken."
-
-#: src/server/server.c:413
-#, c-format
-msgid "Web server started on port: %d"
-msgstr "Webserver gestart op poort: %d"
-
-#: src/server/server.c:414
-#, c-format
-msgid "WWW directory: %s"
-msgstr "WWW-map: %s"
-
-#: src/server/server.c:415
-#, c-format
-msgid "URL: http://localhost:%d"
-msgstr "URL: http://localhost:%d"
-
-#: src/server/server.c:425
-msgid "Failed to activate logging of sensors."
-msgstr "Kon logboeken bijhouden niet inschakelen voor sensoren."
-
-#: src/ui.c:84
-msgid "Psensor is a GTK+ application for monitoring hardware sensors"
-msgstr "Psensor is een GTK+ toepassing voor het bewaken van apparatuursensoren"
-
-#: src/ui.c:87
-msgid ""
-"Copyright(c) 2010-2014\n"
-"jeanfi@gmail.com"
-msgstr ""
-"Auteursrecht(c) 2010-2014\n"
-"jeanfi@gmail.com"
-
-#: src/ui.c:90
-msgid "About Psensor"
-msgstr "Over Psensor"
-
-#: src/ui.c:93
-msgid "Psensor Homepage"
-msgstr "Thuispagina van Psensor"
-
-#: src/ui.c:217
-msgid "Failed to load Psensor icon."
-msgstr "Kon pictogram van Psensor niet laden."
-
-#: src/ui_sensorlist.c:245
-msgid "Select foreground color"
-msgstr "Kies voorgrondkleur"
-
-#: src/ui_sensorlist.c:297
-msgid "Sensor"
-msgstr "Sensor"
-
-#: src/ui_sensorlist.c:303
-msgid "Value"
-msgstr "Waarde"
-
-#: src/ui_sensorlist.c:309
-msgid "Min"
-msgstr "Min"
-
-#: src/ui_sensorlist.c:315
-msgid "Max"
-msgstr "Max"
-
-#: src/ui_sensorlist.c:322
-msgid "Color"
-msgstr "Kleur"
-
-#: src/ui_notify.c:48
-msgid "gettimeofday failed."
-msgstr "gettimeofday (tijdbepaling) is mislukt."
-
-#: src/ui_notify.c:77
-msgid "Temperature alert"
-msgstr "Temperatuurwaarschuwing"
-
-#: src/ui_notify.c:79
-msgid "Fan alert"
-msgstr "Ventilatorwaarschuwing"
-
-#: src/ui_sensorpref.c:248
-msgid "Unknown"
-msgstr "Onbekend"
-
-#~ msgid "_Show"
-#~ msgstr "_Tonen"
-
-#~ msgid "_Preferences"
-#~ msgstr "_Voorkeuren"
-
-#~ msgid "S_ensor Preferences"
-#~ msgstr "Sensorvoorkeuren"
-
-#~ msgid "SensorPreferences"
-#~ msgstr "Sensorvoorkeuren"
-
-#~ msgid "_About"
-#~ msgstr "_Over"
-
-#~ msgid "_Quit"
-#~ msgstr "_Afsluiten"
-
-#~ msgid "building menus failed: %s"
-#~ msgstr "opbouwen van menu's is mislukt: %s"
index e66f88f..3e17ba0 100644 (file)
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: jeanfi@gmail.com\n"
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: jeanfi@gmail.com\n"
-"POT-Creation-Date: 2014-04-10 08:17+0200\n"
+"POT-Creation-Date: 2013-10-16 09:19+0200\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -17,37 +17,31 @@ msgstr ""
 "Content-Type: text/plain; charset=CHARSET\n"
 "Content-Transfer-Encoding: 8bit\n"
 
 "Content-Type: text/plain; charset=CHARSET\n"
 "Content-Transfer-Encoding: 8bit\n"
 
-#: src/glade/psensor.glade:5
+#: src/glade/psensor.glade:5 src/ui_appindicator.c:124
 msgid "About"
 msgstr ""
 
 msgid "About"
 msgstr ""
 
-#: src/glade/psensor.glade:9 src/glade/psensor.glade:10
-#: src/glade/psensor.glade:19 src/ui_sensorlist.c:209
+#: src/glade/psensor.glade:9 src/ui_sensorlist.c:209 src/ui_appindicator.c:112
 msgid "Preferences"
 msgstr ""
 
 msgid "Preferences"
 msgstr ""
 
-#: src/glade/psensor.glade:14 src/glade/psensor.glade:15
-#: src/glade/psensor.glade:27
-msgid "Sensor Preferences"
-msgstr ""
-
-#: src/glade/psensor.glade:23
+#: src/glade/psensor.glade:13 src/ui_appindicator.c:130
 msgid "Quit"
 msgstr ""
 
 msgid "Quit"
 msgstr ""
 
-#: src/glade/psensor.glade:31
-msgid "Show"
+#: src/glade/psensor.glade:17
+msgid "Sensor Preferences"
 msgstr ""
 
 msgstr ""
 
-#: src/glade/psensor.glade:180
+#: src/glade/psensor.glade:96
 msgid "Psensor - Temperature Monitor"
 msgstr ""
 
 msgid "Psensor - Temperature Monitor"
 msgstr ""
 
-#: src/glade/psensor.glade:195
+#: src/glade/psensor.glade:111
 msgid "_Psensor"
 msgstr ""
 
 msgid "_Psensor"
 msgstr ""
 
-#: src/glade/psensor.glade:242
+#: src/glade/psensor.glade:158
 msgid "_Help"
 msgstr ""
 
 msgid "_Help"
 msgstr ""
 
@@ -527,7 +521,7 @@ msgstr ""
 
 #: src/ui.c:87
 msgid ""
 
 #: src/ui.c:87
 msgid ""
-"Copyright(c) 2010-2014\n"
+"Copyright(c) 2010-2013\n"
 "jeanfi@gmail.com"
 msgstr ""
 
 "jeanfi@gmail.com"
 msgstr ""
 
@@ -567,6 +561,39 @@ msgstr ""
 msgid "Color"
 msgstr ""
 
 msgid "Color"
 msgstr ""
 
+#: src/ui_appindicator.c:106
+msgid "_Show"
+msgstr ""
+
+#: src/ui_appindicator.c:107
+msgid "Show"
+msgstr ""
+
+#: src/ui_appindicator.c:111
+msgid "_Preferences"
+msgstr ""
+
+#: src/ui_appindicator.c:116
+msgid "S_ensor Preferences"
+msgstr ""
+
+#: src/ui_appindicator.c:118
+msgid "SensorPreferences"
+msgstr ""
+
+#: src/ui_appindicator.c:122
+msgid "_About"
+msgstr ""
+
+#: src/ui_appindicator.c:129
+msgid "_Quit"
+msgstr ""
+
+#: src/ui_appindicator.c:220
+#, c-format
+msgid "building menus failed: %s"
+msgstr ""
+
 #: src/ui_notify.c:48
 msgid "gettimeofday failed."
 msgstr ""
 #: src/ui_notify.c:48
 msgid "gettimeofday failed."
 msgstr ""
index b2be0d9..37391f2 100644 (file)
Binary files a/po/pt_BR.gmo and b/po/pt_BR.gmo differ
index aac7c6b..e19e29d 100644 (file)
@@ -1,13 +1,13 @@
 # Portuguese translations for psensor package.
 # Copyright (C) 2012 Free Software Foundation, Inc.
 # This file is distributed under the same license as the psensor package.
 # Portuguese translations for psensor package.
 # Copyright (C) 2012 Free Software Foundation, Inc.
 # This file is distributed under the same license as the psensor package.
-# Maintained by Jean-Philippe Orsini <jeanfi@gmail.com>
+#  <jeanfi@gmail.com>, 2012.
 #
 msgid ""
 msgstr ""
 "Project-Id-Version: psensor 0.7.0.x\n"
 "Report-Msgid-Bugs-To: jeanfi@gmail.com\n"
 #
 msgid ""
 msgstr ""
 "Project-Id-Version: psensor 0.7.0.x\n"
 "Report-Msgid-Bugs-To: jeanfi@gmail.com\n"
-"POT-Creation-Date: 2014-04-10 08:17+0200\n"
+"POT-Creation-Date: 2013-10-16 09:19+0200\n"
 "PO-Revision-Date: 2013-09-01 18:54+0000\n"
 "Last-Translator: Celio Alves <Unknown>\n"
 "Language-Team: Brazilian Portuguese\n"
 "PO-Revision-Date: 2013-09-01 18:54+0000\n"
 "Last-Translator: Celio Alves <Unknown>\n"
 "Language-Team: Brazilian Portuguese\n"
@@ -18,37 +18,31 @@ msgstr ""
 "X-Launchpad-Export-Date: 2013-10-18 06:32+0000\n"
 "X-Generator: Launchpad (build 16799)\n"
 
 "X-Launchpad-Export-Date: 2013-10-18 06:32+0000\n"
 "X-Generator: Launchpad (build 16799)\n"
 
-#: src/glade/psensor.glade:5
+#: src/glade/psensor.glade:5 src/ui_appindicator.c:124
 msgid "About"
 msgstr "Sobre"
 
 msgid "About"
 msgstr "Sobre"
 
-#: src/glade/psensor.glade:9 src/glade/psensor.glade:10
-#: src/glade/psensor.glade:19 src/ui_sensorlist.c:209
+#: src/glade/psensor.glade:9 src/ui_sensorlist.c:209 src/ui_appindicator.c:112
 msgid "Preferences"
 msgstr "Preferências"
 
 msgid "Preferences"
 msgstr "Preferências"
 
-#: src/glade/psensor.glade:14 src/glade/psensor.glade:15
-#: src/glade/psensor.glade:27
-msgid "Sensor Preferences"
-msgstr "Preferências de sensores"
-
-#: src/glade/psensor.glade:23
+#: src/glade/psensor.glade:13 src/ui_appindicator.c:130
 msgid "Quit"
 msgstr "Sair"
 
 msgid "Quit"
 msgstr "Sair"
 
-#: src/glade/psensor.glade:31
-msgid "Show"
-msgstr "Mostrar"
+#: src/glade/psensor.glade:17
+msgid "Sensor Preferences"
+msgstr "Preferências de sensores"
 
 
-#: src/glade/psensor.glade:180
+#: src/glade/psensor.glade:96
 msgid "Psensor - Temperature Monitor"
 msgstr "Psensor - Monitor de temperatura"
 
 msgid "Psensor - Temperature Monitor"
 msgstr "Psensor - Monitor de temperatura"
 
-#: src/glade/psensor.glade:195
+#: src/glade/psensor.glade:111
 msgid "_Psensor"
 msgstr "_Psensor"
 
 msgid "_Psensor"
 msgstr "_Psensor"
 
-#: src/glade/psensor.glade:242
+#: src/glade/psensor.glade:158
 msgid "_Help"
 msgstr "Ajuda"
 
 msgid "_Help"
 msgstr "Ajuda"
 
@@ -543,10 +537,10 @@ msgstr "Psensor é uma aplicação GTK+ para monitorar sensores de hardware"
 
 #: src/ui.c:87
 msgid ""
 
 #: src/ui.c:87
 msgid ""
-"Copyright(c) 2010-2014\n"
+"Copyright(c) 2010-2013\n"
 "jeanfi@gmail.com"
 msgstr ""
 "jeanfi@gmail.com"
 msgstr ""
-"Copyright(c) 2010-2014\n"
+"Copyright(c) 2010-2013\n"
 "jeanfi@gmail.com"
 
 #: src/ui.c:90
 "jeanfi@gmail.com"
 
 #: src/ui.c:90
@@ -585,6 +579,39 @@ msgstr "Max"
 msgid "Color"
 msgstr "Cor"
 
 msgid "Color"
 msgstr "Cor"
 
+#: src/ui_appindicator.c:106
+msgid "_Show"
+msgstr "Mo_strar"
+
+#: src/ui_appindicator.c:107
+msgid "Show"
+msgstr "Mostrar"
+
+#: src/ui_appindicator.c:111
+msgid "_Preferences"
+msgstr "_Preferências"
+
+#: src/ui_appindicator.c:116
+msgid "S_ensor Preferences"
+msgstr ""
+
+#: src/ui_appindicator.c:118
+msgid "SensorPreferences"
+msgstr "Preferências do Sensor"
+
+#: src/ui_appindicator.c:122
+msgid "_About"
+msgstr "Sobre"
+
+#: src/ui_appindicator.c:129
+msgid "_Quit"
+msgstr "Sair"
+
+#: src/ui_appindicator.c:220
+#, c-format
+msgid "building menus failed: %s"
+msgstr "falha na montagem dos menus: %s"
+
 #: src/ui_notify.c:48
 msgid "gettimeofday failed."
 msgstr "falha em gettimeofday."
 #: src/ui_notify.c:48
 msgid "gettimeofday failed."
 msgstr "falha em gettimeofday."
@@ -601,24 +628,6 @@ msgstr "Alenta do ventilador"
 msgid "Unknown"
 msgstr "Desconhecido"
 
 msgid "Unknown"
 msgstr "Desconhecido"
 
-#~ msgid "_Show"
-#~ msgstr "Mo_strar"
-
-#~ msgid "_Preferences"
-#~ msgstr "_Preferências"
-
-#~ msgid "SensorPreferences"
-#~ msgstr "Preferências do Sensor"
-
-#~ msgid "_About"
-#~ msgstr "Sobre"
-
-#~ msgid "_Quit"
-#~ msgstr "Sair"
-
-#~ msgid "building menus failed: %s"
-#~ msgstr "falha na montagem dos menus: %s"
-
 #~ msgid "Sensor Name"
 #~ msgstr "Nome do sensor"
 
 #~ msgid "Sensor Name"
 #~ msgstr "Nome do sensor"
 
index 96ab4c1..9ac0d04 100644 (file)
Binary files a/po/ru.gmo and b/po/ru.gmo differ
index 136eb23..1bad7e3 100644 (file)
--- a/po/ru.po
+++ b/po/ru.po
@@ -1,54 +1,48 @@
 # Russian translations for psensor package.
 # Copyright (C) 2012 Free Software Foundation, Inc.
 # This file is distributed under the same license as the psensor package.
 # Russian translations for psensor package.
 # Copyright (C) 2012 Free Software Foundation, Inc.
 # This file is distributed under the same license as the psensor package.
-# Maintained by Jean-Philippe Orsini <jeanfi@gmail.com>
+#  <jeanfi@gmail.com>, 2012.
 #
 msgid ""
 msgstr ""
 "Project-Id-Version: psensor 0.7.0.x\n"
 "Report-Msgid-Bugs-To: jeanfi@gmail.com\n"
 #
 msgid ""
 msgstr ""
 "Project-Id-Version: psensor 0.7.0.x\n"
 "Report-Msgid-Bugs-To: jeanfi@gmail.com\n"
-"POT-Creation-Date: 2014-04-10 08:17+0200\n"
-"PO-Revision-Date: 2014-01-27 16:37+0000\n"
-"Last-Translator: Dmitry <dmitri.s93@gmail.com>\n"
+"POT-Creation-Date: 2013-10-16 09:19+0200\n"
+"PO-Revision-Date: 2012-12-25 06:05+0000\n"
+"Last-Translator: Ilya Volchanetskiy <Unknown>\n"
 "Language-Team: Russian\n"
 "Language: ru\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Language-Team: Russian\n"
 "Language: ru\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2014-02-11 20:01+0000\n"
-"X-Generator: Launchpad (build 16916)\n"
+"X-Launchpad-Export-Date: 2013-01-21 09:32+0000\n"
+"X-Generator: Launchpad (build 16430)\n"
 
 
-#: src/glade/psensor.glade:5
+#: src/glade/psensor.glade:5 src/ui_appindicator.c:124
 msgid "About"
 msgstr "О программе"
 
 msgid "About"
 msgstr "О программе"
 
-#: src/glade/psensor.glade:9 src/glade/psensor.glade:10
-#: src/glade/psensor.glade:19 src/ui_sensorlist.c:209
+#: src/glade/psensor.glade:9 src/ui_sensorlist.c:209 src/ui_appindicator.c:112
 msgid "Preferences"
 msgstr "Параметры"
 
 msgid "Preferences"
 msgstr "Параметры"
 
-#: src/glade/psensor.glade:14 src/glade/psensor.glade:15
-#: src/glade/psensor.glade:27
-msgid "Sensor Preferences"
-msgstr "Параметры датчиков"
-
-#: src/glade/psensor.glade:23
+#: src/glade/psensor.glade:13 src/ui_appindicator.c:130
 msgid "Quit"
 msgstr "Выход"
 
 msgid "Quit"
 msgstr "Выход"
 
-#: src/glade/psensor.glade:31
-msgid "Show"
-msgstr "Ð\9fоказаÑ\82Ñ\8c"
+#: src/glade/psensor.glade:17
+msgid "Sensor Preferences"
+msgstr "Ð\9fаÑ\80амеÑ\82Ñ\80Ñ\8b Ð´Ð°Ñ\82Ñ\87иков"
 
 
-#: src/glade/psensor.glade:180
+#: src/glade/psensor.glade:96
 msgid "Psensor - Temperature Monitor"
 msgstr "Psensor - монитор температуры"
 
 msgid "Psensor - Temperature Monitor"
 msgstr "Psensor - монитор температуры"
 
-#: src/glade/psensor.glade:195
+#: src/glade/psensor.glade:111
 msgid "_Psensor"
 msgstr ""
 
 msgid "_Psensor"
 msgstr ""
 
-#: src/glade/psensor.glade:242
+#: src/glade/psensor.glade:158
 msgid "_Help"
 msgstr "_Справка"
 
 msgid "_Help"
 msgstr "_Справка"
 
@@ -171,7 +165,7 @@ msgstr "Изменить параметры датчика"
 
 #: src/glade/sensor-edit.glade:87
 msgid "Name"
 
 #: src/glade/sensor-edit.glade:87
 msgid "Name"
-msgstr "Название"
+msgstr ""
 
 #: src/glade/sensor-edit.glade:138
 msgid "Type:"
 
 #: src/glade/sensor-edit.glade:138
 msgid "Type:"
@@ -546,7 +540,7 @@ msgstr "Psensor — это  GTK+ приложения для мониторин
 
 #: src/ui.c:87
 msgid ""
 
 #: src/ui.c:87
 msgid ""
-"Copyright(c) 2010-2014\n"
+"Copyright(c) 2010-2013\n"
 "jeanfi@gmail.com"
 msgstr ""
 
 "jeanfi@gmail.com"
 msgstr ""
 
@@ -586,6 +580,39 @@ msgstr "Макс."
 msgid "Color"
 msgstr "Цвет"
 
 msgid "Color"
 msgstr "Цвет"
 
+#: src/ui_appindicator.c:106
+msgid "_Show"
+msgstr "_Показать"
+
+#: src/ui_appindicator.c:107
+msgid "Show"
+msgstr "Показать"
+
+#: src/ui_appindicator.c:111
+msgid "_Preferences"
+msgstr "_Параметры"
+
+#: src/ui_appindicator.c:116
+msgid "S_ensor Preferences"
+msgstr "Параметры д_атчика"
+
+#: src/ui_appindicator.c:118
+msgid "SensorPreferences"
+msgstr ""
+
+#: src/ui_appindicator.c:122
+msgid "_About"
+msgstr "_О программе"
+
+#: src/ui_appindicator.c:129
+msgid "_Quit"
+msgstr "_Выход"
+
+#: src/ui_appindicator.c:220
+#, c-format
+msgid "building menus failed: %s"
+msgstr "не удалось создать меню: %s"
+
 #: src/ui_notify.c:48
 msgid "gettimeofday failed."
 msgstr "ошибка gettimeofday."
 #: src/ui_notify.c:48
 msgid "gettimeofday failed."
 msgstr "ошибка gettimeofday."
@@ -602,20 +629,28 @@ msgstr "Уведомление вентилятора"
 msgid "Unknown"
 msgstr ""
 
 msgid "Unknown"
 msgstr ""
 
-#~ msgid "_Show"
-#~ msgstr "_Показать"
+#~ msgid "Sensor Name"
+#~ msgstr "Название датчика"
+
+#~ msgid "Enabled"
+#~ msgstr "Включён"
 
 
-#~ msgid "_Preferences"
-#~ msgstr "_Параметры"
+#, fuzzy
+#~ msgid "Enable log of measures"
+#~ msgstr "Включить меню"
 
 
-#~ msgid "S_ensor Preferences"
-#~ msgstr "Параметры д_атчика"
+#, fuzzy
+#~ msgid "slog_init: cannot open sensor log file: %s"
+#~ msgstr "Ошибка открытия файла журнала: %s"
 
 
-#~ msgid "_About"
-#~ msgstr "_О программе"
+#, fuzzy
+#~ msgid "slog_init: gettimeofday failed."
+#~ msgstr "ошибка gettimeofday."
 
 
-#~ msgid "_Quit"
-#~ msgstr "_Выход"
+#, fuzzy
+#~ msgid "slog_write_sensors: gettimeofday failed."
+#~ msgstr "ошибка gettimeofday."
 
 
-#~ msgid "building menus failed: %s"
-#~ msgstr "не удалось создать меню: %s"
+#, fuzzy
+#~ msgid "Enable indicator"
+#~ msgstr "Включён"
index f06c32e..4512682 100644 (file)
Binary files a/po/sl.gmo and b/po/sl.gmo differ
index 1d43487..776b3aa 100644 (file)
--- a/po/sl.po
+++ b/po/sl.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: psensor\n"
 "Report-Msgid-Bugs-To: jeanfi@gmail.com\n"
 msgstr ""
 "Project-Id-Version: psensor\n"
 "Report-Msgid-Bugs-To: jeanfi@gmail.com\n"
-"POT-Creation-Date: 2014-04-10 08:17+0200\n"
+"POT-Creation-Date: 2013-10-16 09:19+0200\n"
 "PO-Revision-Date: 2012-04-14 21:02+0000\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: Slovenian <sl@li.org>\n"
 "PO-Revision-Date: 2012-04-14 21:02+0000\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: Slovenian <sl@li.org>\n"
@@ -18,37 +18,31 @@ msgstr ""
 "X-Launchpad-Export-Date: 2012-07-02 08:28+0000\n"
 "X-Generator: Launchpad (build 15520)\n"
 
 "X-Launchpad-Export-Date: 2012-07-02 08:28+0000\n"
 "X-Generator: Launchpad (build 15520)\n"
 
-#: src/glade/psensor.glade:5
+#: src/glade/psensor.glade:5 src/ui_appindicator.c:124
 msgid "About"
 msgstr ""
 
 msgid "About"
 msgstr ""
 
-#: src/glade/psensor.glade:9 src/glade/psensor.glade:10
-#: src/glade/psensor.glade:19 src/ui_sensorlist.c:209
+#: src/glade/psensor.glade:9 src/ui_sensorlist.c:209 src/ui_appindicator.c:112
 msgid "Preferences"
 msgstr ""
 
 msgid "Preferences"
 msgstr ""
 
-#: src/glade/psensor.glade:14 src/glade/psensor.glade:15
-#: src/glade/psensor.glade:27
-msgid "Sensor Preferences"
-msgstr ""
-
-#: src/glade/psensor.glade:23
+#: src/glade/psensor.glade:13 src/ui_appindicator.c:130
 msgid "Quit"
 msgstr ""
 
 msgid "Quit"
 msgstr ""
 
-#: src/glade/psensor.glade:31
-msgid "Show"
+#: src/glade/psensor.glade:17
+msgid "Sensor Preferences"
 msgstr ""
 
 msgstr ""
 
-#: src/glade/psensor.glade:180
+#: src/glade/psensor.glade:96
 msgid "Psensor - Temperature Monitor"
 msgstr ""
 
 msgid "Psensor - Temperature Monitor"
 msgstr ""
 
-#: src/glade/psensor.glade:195
+#: src/glade/psensor.glade:111
 msgid "_Psensor"
 msgstr ""
 
 msgid "_Psensor"
 msgstr ""
 
-#: src/glade/psensor.glade:242
+#: src/glade/psensor.glade:158
 msgid "_Help"
 msgstr ""
 
 msgid "_Help"
 msgstr ""
 
@@ -528,7 +522,7 @@ msgstr ""
 
 #: src/ui.c:87
 msgid ""
 
 #: src/ui.c:87
 msgid ""
-"Copyright(c) 2010-2014\n"
+"Copyright(c) 2010-2013\n"
 "jeanfi@gmail.com"
 msgstr ""
 
 "jeanfi@gmail.com"
 msgstr ""
 
@@ -568,6 +562,39 @@ msgstr ""
 msgid "Color"
 msgstr ""
 
 msgid "Color"
 msgstr ""
 
+#: src/ui_appindicator.c:106
+msgid "_Show"
+msgstr ""
+
+#: src/ui_appindicator.c:107
+msgid "Show"
+msgstr ""
+
+#: src/ui_appindicator.c:111
+msgid "_Preferences"
+msgstr ""
+
+#: src/ui_appindicator.c:116
+msgid "S_ensor Preferences"
+msgstr ""
+
+#: src/ui_appindicator.c:118
+msgid "SensorPreferences"
+msgstr ""
+
+#: src/ui_appindicator.c:122
+msgid "_About"
+msgstr ""
+
+#: src/ui_appindicator.c:129
+msgid "_Quit"
+msgstr ""
+
+#: src/ui_appindicator.c:220
+#, c-format
+msgid "building menus failed: %s"
+msgstr ""
+
 #: src/ui_notify.c:48
 msgid "gettimeofday failed."
 msgstr ""
 #: src/ui_notify.c:48
 msgid "gettimeofday failed."
 msgstr ""
index 4b24017..d5cfaa6 100644 (file)
Binary files a/po/sr.gmo and b/po/sr.gmo differ
index dd28403..decb6d7 100644 (file)
--- a/po/sr.po
+++ b/po/sr.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: psensor\n"
 "Report-Msgid-Bugs-To: jeanfi@gmail.com\n"
 msgstr ""
 "Project-Id-Version: psensor\n"
 "Report-Msgid-Bugs-To: jeanfi@gmail.com\n"
-"POT-Creation-Date: 2014-04-10 08:17+0200\n"
+"POT-Creation-Date: 2013-10-16 09:19+0200\n"
 "PO-Revision-Date: 2012-05-03 02:31+0000\n"
 "Last-Translator: Мирослав Николић <miroslavnikolic@rocketmail.com>\n"
 "Language-Team: Serbian <sr@li.org>\n"
 "PO-Revision-Date: 2012-05-03 02:31+0000\n"
 "Last-Translator: Мирослав Николић <miroslavnikolic@rocketmail.com>\n"
 "Language-Team: Serbian <sr@li.org>\n"
@@ -18,37 +18,31 @@ msgstr ""
 "X-Launchpad-Export-Date: 2012-07-02 08:28+0000\n"
 "X-Generator: Launchpad (build 15520)\n"
 
 "X-Launchpad-Export-Date: 2012-07-02 08:28+0000\n"
 "X-Generator: Launchpad (build 15520)\n"
 
-#: src/glade/psensor.glade:5
+#: src/glade/psensor.glade:5 src/ui_appindicator.c:124
 msgid "About"
 msgstr "О програму"
 
 msgid "About"
 msgstr "О програму"
 
-#: src/glade/psensor.glade:9 src/glade/psensor.glade:10
-#: src/glade/psensor.glade:19 src/ui_sensorlist.c:209
+#: src/glade/psensor.glade:9 src/ui_sensorlist.c:209 src/ui_appindicator.c:112
 msgid "Preferences"
 msgstr "Поставке"
 
 msgid "Preferences"
 msgstr "Поставке"
 
-#: src/glade/psensor.glade:14 src/glade/psensor.glade:15
-#: src/glade/psensor.glade:27
-msgid "Sensor Preferences"
-msgstr ""
-
-#: src/glade/psensor.glade:23
+#: src/glade/psensor.glade:13 src/ui_appindicator.c:130
 msgid "Quit"
 msgstr "Изађи"
 
 msgid "Quit"
 msgstr "Изађи"
 
-#: src/glade/psensor.glade:31
-msgid "Show"
+#: src/glade/psensor.glade:17
+msgid "Sensor Preferences"
 msgstr ""
 
 msgstr ""
 
-#: src/glade/psensor.glade:180
+#: src/glade/psensor.glade:96
 msgid "Psensor - Temperature Monitor"
 msgstr ""
 
 msgid "Psensor - Temperature Monitor"
 msgstr ""
 
-#: src/glade/psensor.glade:195
+#: src/glade/psensor.glade:111
 msgid "_Psensor"
 msgstr ""
 
 msgid "_Psensor"
 msgstr ""
 
-#: src/glade/psensor.glade:242
+#: src/glade/psensor.glade:158
 msgid "_Help"
 msgstr ""
 
 msgid "_Help"
 msgstr ""
 
@@ -528,7 +522,7 @@ msgstr ""
 
 #: src/ui.c:87
 msgid ""
 
 #: src/ui.c:87
 msgid ""
-"Copyright(c) 2010-2014\n"
+"Copyright(c) 2010-2013\n"
 "jeanfi@gmail.com"
 msgstr ""
 
 "jeanfi@gmail.com"
 msgstr ""
 
@@ -568,6 +562,39 @@ msgstr "Највише"
 msgid "Color"
 msgstr "У боји"
 
 msgid "Color"
 msgstr "У боји"
 
+#: src/ui_appindicator.c:106
+msgid "_Show"
+msgstr ""
+
+#: src/ui_appindicator.c:107
+msgid "Show"
+msgstr ""
+
+#: src/ui_appindicator.c:111
+msgid "_Preferences"
+msgstr "_Поставке"
+
+#: src/ui_appindicator.c:116
+msgid "S_ensor Preferences"
+msgstr ""
+
+#: src/ui_appindicator.c:118
+msgid "SensorPreferences"
+msgstr ""
+
+#: src/ui_appindicator.c:122
+msgid "_About"
+msgstr "О _програму"
+
+#: src/ui_appindicator.c:129
+msgid "_Quit"
+msgstr "_Изађи"
+
+#: src/ui_appindicator.c:220
+#, c-format
+msgid "building menus failed: %s"
+msgstr ""
+
 #: src/ui_notify.c:48
 msgid "gettimeofday failed."
 msgstr ""
 #: src/ui_notify.c:48
 msgid "gettimeofday failed."
 msgstr ""
@@ -584,11 +611,16 @@ msgstr ""
 msgid "Unknown"
 msgstr ""
 
 msgid "Unknown"
 msgstr ""
 
-#~ msgid "_Preferences"
-#~ msgstr "_Поставке"
+#~ msgid "Sensor Name"
+#~ msgstr "Назив сензора"
+
+#~ msgid "Enabled"
+#~ msgstr "Укључено"
 
 
-#~ msgid "_About"
-#~ msgstr "О _програму"
+#, fuzzy
+#~ msgid "Enable log of measures"
+#~ msgstr "Укључено"
 
 
-#~ msgid "_Quit"
-#~ msgstr "_Изађи"
+#, fuzzy
+#~ msgid "Enable indicator"
+#~ msgstr "Укључено"
index da73e07..3bb90cd 100644 (file)
Binary files a/po/tr.gmo and b/po/tr.gmo differ
index c10ab06..47c13c4 100644 (file)
--- a/po/tr.po
+++ b/po/tr.po
@@ -1,92 +1,86 @@
 # Turkish translation for psensor
 # Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011
 # This file is distributed under the same license as the psensor package.
 # Turkish translation for psensor
 # Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011
 # This file is distributed under the same license as the psensor package.
-# Maintained by Jean-Philippe Orsini <jeanfi@gmail.com>
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2011.
 #
 msgid ""
 msgstr ""
 "Project-Id-Version: psensor\n"
 "Report-Msgid-Bugs-To: jeanfi@gmail.com\n"
 #
 msgid ""
 msgstr ""
 "Project-Id-Version: psensor\n"
 "Report-Msgid-Bugs-To: jeanfi@gmail.com\n"
-"POT-Creation-Date: 2014-04-10 08:17+0200\n"
-"PO-Revision-Date: 2013-11-24 08:42+0000\n"
-"Last-Translator: İbrahim Çelik <ibrahimcelik89@gmail.com>\n"
+"POT-Creation-Date: 2013-10-16 09:19+0200\n"
+"PO-Revision-Date: 2012-04-28 11:24+0000\n"
+"Last-Translator: zeugma <Unknown>\n"
 "Language-Team: Turkish <tr@li.org>\n"
 "Language: tr\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Language-Team: Turkish <tr@li.org>\n"
 "Language: tr\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2014-02-11 20:01+0000\n"
-"X-Generator: Launchpad (build 16916)\n"
+"X-Launchpad-Export-Date: 2012-07-02 08:28+0000\n"
+"X-Generator: Launchpad (build 15520)\n"
 
 
-#: src/glade/psensor.glade:5
+#: src/glade/psensor.glade:5 src/ui_appindicator.c:124
 msgid "About"
 msgid "About"
-msgstr "Hakkında"
+msgstr ""
 
 
-#: src/glade/psensor.glade:9 src/glade/psensor.glade:10
-#: src/glade/psensor.glade:19 src/ui_sensorlist.c:209
+#: src/glade/psensor.glade:9 src/ui_sensorlist.c:209 src/ui_appindicator.c:112
 msgid "Preferences"
 msgstr "Tercihler"
 
 msgid "Preferences"
 msgstr "Tercihler"
 
-#: src/glade/psensor.glade:14 src/glade/psensor.glade:15
-#: src/glade/psensor.glade:27
-msgid "Sensor Preferences"
-msgstr "Algılayıcı Tercihleri"
-
-#: src/glade/psensor.glade:23
+#: src/glade/psensor.glade:13 src/ui_appindicator.c:130
 msgid "Quit"
 msgid "Quit"
-msgstr "Çıkış"
+msgstr ""
 
 
-#: src/glade/psensor.glade:31
-msgid "Show"
-msgstr "Göster"
+#: src/glade/psensor.glade:17
+msgid "Sensor Preferences"
+msgstr "Tercihleri düzenle"
 
 
-#: src/glade/psensor.glade:180
+#: src/glade/psensor.glade:96
 msgid "Psensor - Temperature Monitor"
 msgid "Psensor - Temperature Monitor"
-msgstr "Psensor - Sıcaklık Gözlemleyici"
+msgstr ""
 
 
-#: src/glade/psensor.glade:195
+#: src/glade/psensor.glade:111
 msgid "_Psensor"
 msgid "_Psensor"
-msgstr "_Psensor"
+msgstr ""
 
 
-#: src/glade/psensor.glade:242
+#: src/glade/psensor.glade:158
 msgid "_Help"
 msgid "_Help"
-msgstr "_Yardım"
+msgstr ""
 
 #: src/glade/psensor-pref.glade:7
 msgid "Edit Preferences"
 
 #: src/glade/psensor-pref.glade:7
 msgid "Edit Preferences"
-msgstr "Tercihleri Düzenle"
+msgstr "Tercihleri düzenle"
 
 #: src/glade/psensor-pref.glade:72
 msgid "Position of sensors table:"
 
 #: src/glade/psensor-pref.glade:72
 msgid "Position of sensors table:"
-msgstr "Gözlemleyici tablosunun konumu:"
+msgstr ""
 
 #: src/glade/psensor-pref.glade:81
 msgid "Hide window decoration"
 
 #: src/glade/psensor-pref.glade:81
 msgid "Hide window decoration"
-msgstr "Pencere çubuğunu gizle"
+msgstr ""
 
 #: src/glade/psensor-pref.glade:98
 msgid "Keep window below"
 
 #: src/glade/psensor-pref.glade:98
 msgid "Keep window below"
-msgstr "Pencereyi aşağıda tut"
+msgstr ""
 
 #: src/glade/psensor-pref.glade:115
 msgid "Enable menu"
 
 #: src/glade/psensor-pref.glade:115
 msgid "Enable menu"
-msgstr "Menüyü etkinleştir"
+msgstr ""
 
 #: src/glade/psensor-pref.glade:132
 msgid "Enable Unity Launcher counter"
 
 #: src/glade/psensor-pref.glade:132
 msgid "Enable Unity Launcher counter"
-msgstr "Unity Başlatıcı sayacını etkinleştir"
+msgstr ""
 
 #: src/glade/psensor-pref.glade:149
 msgid "Hide window on startup"
 
 #: src/glade/psensor-pref.glade:149
 msgid "Hide window on startup"
-msgstr "Başlangıçta pencereyi gizle"
+msgstr ""
 
 #: src/glade/psensor-pref.glade:166
 msgid "Restore window position and size"
 
 #: src/glade/psensor-pref.glade:166
 msgid "Restore window position and size"
-msgstr "Pencere konumunu ve boyutunu yeniden yükle"
+msgstr ""
 
 #: src/glade/psensor-pref.glade:186
 msgid "Temperature unit:"
 
 #: src/glade/psensor-pref.glade:186
 msgid "Temperature unit:"
-msgstr "Sıcaklık birimi:"
+msgstr ""
 
 #: src/glade/psensor-pref.glade:238
 msgid "Interface"
 
 #: src/glade/psensor-pref.glade:238
 msgid "Interface"
@@ -94,7 +88,7 @@ msgstr "Arayüz"
 
 #: src/glade/psensor-pref.glade:276
 msgid "Foreground:"
 
 #: src/glade/psensor-pref.glade:276
 msgid "Foreground:"
-msgstr "Önplan:"
+msgstr ""
 
 #: src/glade/psensor-pref.glade:291
 msgid "Background:"
 
 #: src/glade/psensor-pref.glade:291
 msgid "Background:"
@@ -102,15 +96,15 @@ msgstr "Arkaplan:"
 
 #: src/glade/psensor-pref.glade:325
 msgid "Background opacity:"
 
 #: src/glade/psensor-pref.glade:325
 msgid "Background opacity:"
-msgstr "Arkaplan saydamlığı:"
+msgstr "Arkaplan belirginliği:"
 
 #: src/glade/psensor-pref.glade:348
 msgid "<i>Min</i>"
 
 #: src/glade/psensor-pref.glade:348
 msgid "<i>Min</i>"
-msgstr "<i>Asgari</i>"
+msgstr ""
 
 #: src/glade/psensor-pref.glade:375
 msgid "<i>Max</i>"
 
 #: src/glade/psensor-pref.glade:375
 msgid "<i>Max</i>"
-msgstr "<i>Azami</i>"
+msgstr ""
 
 #: src/glade/psensor-pref.glade:401
 msgid "Colors"
 
 #: src/glade/psensor-pref.glade:401
 msgid "Colors"
@@ -118,23 +112,23 @@ msgstr "Renk"
 
 #: src/glade/psensor-pref.glade:419
 msgid "Monitoring duration:"
 
 #: src/glade/psensor-pref.glade:419
 msgid "Monitoring duration:"
-msgstr "Gözlemleme süresi:"
+msgstr ""
 
 #: src/glade/psensor-pref.glade:457
 msgid "minute(s)"
 
 #: src/glade/psensor-pref.glade:457
 msgid "minute(s)"
-msgstr "dakika"
+msgstr ""
 
 #: src/glade/psensor-pref.glade:474 src/glade/psensor-pref.glade:626
 msgid "second(s)"
 
 #: src/glade/psensor-pref.glade:474 src/glade/psensor-pref.glade:626
 msgid "second(s)"
-msgstr "saniye"
+msgstr ""
 
 #: src/glade/psensor-pref.glade:510
 msgid "Update interval:"
 
 #: src/glade/psensor-pref.glade:510
 msgid "Update interval:"
-msgstr "Güncelleme aralığı:"
+msgstr ""
 
 #: src/glade/psensor-pref.glade:528
 msgid "Measures"
 
 #: src/glade/psensor-pref.glade:528
 msgid "Measures"
-msgstr "Ölçümler"
+msgstr ""
 
 #: src/glade/psensor-pref.glade:564 src/glade/sensor-edit.glade:169
 #: src/ui_sensorlist.c:334
 
 #: src/glade/psensor-pref.glade:564 src/glade/sensor-edit.glade:169
 #: src/ui_sensorlist.c:334
@@ -143,35 +137,35 @@ msgstr "Grafik"
 
 #: src/glade/psensor-pref.glade:588
 msgid "Measure update interval:"
 
 #: src/glade/psensor-pref.glade:588
 msgid "Measure update interval:"
-msgstr "Ölçüm güncelleştirme aralığı:"
+msgstr ""
 
 #: src/glade/psensor-pref.glade:637
 msgid "Enable sensors logging"
 
 #: src/glade/psensor-pref.glade:637
 msgid "Enable sensors logging"
-msgstr "Algılayıcı günlük kaydını etkinleştir"
+msgstr ""
 
 #: src/glade/psensor-pref.glade:684
 msgid "Sensors logging interval"
 
 #: src/glade/psensor-pref.glade:684
 msgid "Sensors logging interval"
-msgstr "Algılayıcı günlük kaydı aralığı"
+msgstr ""
 
 #: src/glade/psensor-pref.glade:701
 msgid "seconds(s)"
 
 #: src/glade/psensor-pref.glade:701
 msgid "seconds(s)"
-msgstr "saniye"
+msgstr ""
 
 #: src/glade/psensor-pref.glade:718
 msgid "Script executed when an alarm is raised"
 
 #: src/glade/psensor-pref.glade:718
 msgid "Script executed when an alarm is raised"
-msgstr "Alarm çaldığında betik çalıştırılır"
+msgstr ""
 
 #: src/glade/psensor-pref.glade:751
 msgid "Sensors"
 
 #: src/glade/psensor-pref.glade:751
 msgid "Sensors"
-msgstr "Algılayıcılar"
+msgstr "Algılayıcı"
 
 #: src/glade/sensor-edit.glade:19
 msgid "Edit Sensor Preferences"
 
 #: src/glade/sensor-edit.glade:19
 msgid "Edit Sensor Preferences"
-msgstr "Algılayıcı Tercihlerini Düzenle"
+msgstr "Tercihleri düzenle"
 
 #: src/glade/sensor-edit.glade:87
 msgid "Name"
 
 #: src/glade/sensor-edit.glade:87
 msgid "Name"
-msgstr "Ad"
+msgstr ""
 
 #: src/glade/sensor-edit.glade:138
 msgid "Type:"
 
 #: src/glade/sensor-edit.glade:138
 msgid "Type:"
@@ -181,7 +175,7 @@ msgstr "Tür:"
 #: src/glade/sensor-edit.glade:388 src/glade/sensor-edit.glade:459
 #: src/glade/sensor-edit.glade:508 src/lib/psensor.c:486 src/ui_notify.c:81
 msgid "N/A"
 #: src/glade/sensor-edit.glade:388 src/glade/sensor-edit.glade:459
 #: src/glade/sensor-edit.glade:508 src/lib/psensor.c:486 src/ui_notify.c:81
 msgid "N/A"
-msgstr "Bilinmeyen"
+msgstr ""
 
 #: src/glade/sensor-edit.glade:187
 msgid "Color:"
 
 #: src/glade/sensor-edit.glade:187
 msgid "Color:"
@@ -193,43 +187,43 @@ msgstr "Alarm"
 
 #: src/glade/sensor-edit.glade:216
 msgid "Activate desktop notifications"
 
 #: src/glade/sensor-edit.glade:216
 msgid "Activate desktop notifications"
-msgstr "Masaüstü bildirimlerini etkinleştir"
+msgstr ""
 
 #: src/glade/sensor-edit.glade:236
 msgid "Sensor Information"
 
 #: src/glade/sensor-edit.glade:236
 msgid "Sensor Information"
-msgstr "Algılayıcı Bilgisi"
+msgstr ""
 
 #: src/glade/sensor-edit.glade:249
 msgid "Draw sensor curve"
 
 #: src/glade/sensor-edit.glade:249
 msgid "Draw sensor curve"
-msgstr "Algılayıcı eğrisini çiz"
+msgstr ""
 
 #: src/glade/sensor-edit.glade:333
 msgid "High threshold:"
 
 #: src/glade/sensor-edit.glade:333
 msgid "High threshold:"
-msgstr "Yüksek eşik:"
+msgstr ""
 
 #: src/glade/sensor-edit.glade:348
 msgid "Low threshold:"
 
 #: src/glade/sensor-edit.glade:348
 msgid "Low threshold:"
-msgstr "Düşük eşik:"
+msgstr ""
 
 #: src/glade/sensor-edit.glade:409
 msgid "Ubuntu Application Indicator"
 
 #: src/glade/sensor-edit.glade:409
 msgid "Ubuntu Application Indicator"
-msgstr "Ubuntu Uygulama Göstergesi"
+msgstr ""
 
 #: src/glade/sensor-edit.glade:424
 msgid "Display sensor in the Application Indicator menu"
 
 #: src/glade/sensor-edit.glade:424
 msgid "Display sensor in the Application Indicator menu"
-msgstr "Algılayıcıyı Uygulama Göstergesi menüsünde göster"
+msgstr ""
 
 #: src/glade/sensor-edit.glade:444
 msgid "Chip:"
 
 #: src/glade/sensor-edit.glade:444
 msgid "Chip:"
-msgstr "Yonga:"
+msgstr ""
 
 #: src/glade/sensor-edit.glade:489
 msgid "Id:"
 
 #: src/glade/sensor-edit.glade:489
 msgid "Id:"
-msgstr "Kimlik:"
+msgstr ""
 
 #: src/glade/sensor-edit.glade:523
 msgid "Details"
 
 #: src/glade/sensor-edit.glade:523
 msgid "Details"
-msgstr "Ayrıntılar"
+msgstr ""
 
 #: src/glade/sensor-edit.glade:541
 msgid "Name:"
 
 #: src/glade/sensor-edit.glade:541
 msgid "Name:"
@@ -237,110 +231,108 @@ msgstr "İsim:"
 
 #: src/lib/amd.c:170
 msgid "AMD: cannot found ADL library."
 
 #: src/lib/amd.c:170
 msgid "AMD: cannot found ADL library."
-msgstr "AMD:  ADL kütüphanesi bulunamadı."
+msgstr ""
 
 #: src/lib/amd.c:197
 msgid "AMD: missing ADL's API."
 
 #: src/lib/amd.c:197
 msgid "AMD: missing ADL's API."
-msgstr "AMD: ADL'nin API'sı kayıp."
+msgstr ""
 
 #: src/lib/amd.c:207
 msgid "AMD: failed to initialize ADL."
 
 #: src/lib/amd.c:207
 msgid "AMD: failed to initialize ADL."
-msgstr "AMD: ADL başlatılamadı."
+msgstr ""
 
 #: src/lib/amd.c:213
 msgid "AMD: cannot get the number of adapters."
 
 #: src/lib/amd.c:213
 msgid "AMD: cannot get the number of adapters."
-msgstr "AMD: bağdaştırıcıların sayısı alınamadı."
+msgstr ""
 
 #: src/lib/amd.c:252
 #, c-format
 msgid "Number of AMD/ATI adapters: %d"
 
 #: src/lib/amd.c:252
 #, c-format
 msgid "Number of AMD/ATI adapters: %d"
-msgstr "AMD/ATI bağdaştırıcı sayısı: %d"
+msgstr ""
 
 #: src/lib/amd.c:253
 #, c-format
 msgid "Number of active AMD/ATI adapters: %d"
 
 #: src/lib/amd.c:253
 #, c-format
 msgid "Number of active AMD/ATI adapters: %d"
-msgstr "Etkin AMD/ATI bağdaştırıcı sayısı: %d"
+msgstr ""
 
 #: src/lib/hdd_atasmart.c:152
 #, c-format
 msgid "atasmart: sk_disk_open() failure: %s."
 
 #: src/lib/hdd_atasmart.c:152
 #, c-format
 msgid "atasmart: sk_disk_open() failure: %s."
-msgstr "atasmart: sk_disk_open() hatası: %s."
+msgstr ""
 
 #: src/lib/hdd_hddtemp.c:59
 msgid "hddtemp: failed to open socket."
 
 #: src/lib/hdd_hddtemp.c:59
 msgid "hddtemp: failed to open socket."
-msgstr "hddtemp: yuva açılamadı"
+msgstr ""
 
 #: src/lib/hdd_hddtemp.c:72
 msgid "hddtemp: failed to open connection."
 
 #: src/lib/hdd_hddtemp.c:72
 msgid "hddtemp: failed to open connection."
-msgstr "hddtemp: bağlantı açılamadı."
+msgstr ""
 
 #: src/lib/hdd_hddtemp.c:186 src/lib/hdd_hddtemp.c:256
 #, c-format
 msgid "hddtemp: wrong string: %s."
 
 #: src/lib/hdd_hddtemp.c:186 src/lib/hdd_hddtemp.c:256
 #, c-format
 msgid "hddtemp: wrong string: %s."
-msgstr "hddtemp: yanlış dizi: %s."
+msgstr ""
 
 #: src/lib/lmsensor.c:42
 #, c-format
 msgid "lmsensor: cannot get value of subfeature %s: %s."
 
 #: src/lib/lmsensor.c:42
 #, c-format
 msgid "lmsensor: cannot get value of subfeature %s: %s."
-msgstr "lmsensor: %s alt özelliğinin değeri alınamıyor: %s."
+msgstr ""
 
 #: src/lib/lmsensor.c:123
 msgid "lmsensor: lmsensor_psensor_create failure: wrong feature type."
 
 #: src/lib/lmsensor.c:123
 msgid "lmsensor: lmsensor_psensor_create failure: wrong feature type."
-msgstr "lmsensor: lmsensor_psensor_create hatası: yanlış özellik tipi."
+msgstr ""
 
 #: src/lib/lmsensor.c:218
 #, c-format
 msgid "lmsensor: initialization failure: %s."
 
 #: src/lib/lmsensor.c:218
 #, c-format
 msgid "lmsensor: initialization failure: %s."
-msgstr "lmsensor: başlatma hatası: %s."
+msgstr ""
 
 #: src/lib/log.c:43
 #, c-format
 msgid "Cannot open log file: %s"
 
 #: src/lib/log.c:43
 #, c-format
 msgid "Cannot open log file: %s"
-msgstr "Günlükleme dosyası açılamadı: %s"
+msgstr ""
 
 #: src/lib/nvidia.c:54
 msgid ""
 "NVIDIA proprietary driver not used or cannot retrieve NVIDIA GPU temperature."
 msgstr ""
 
 #: src/lib/nvidia.c:54
 msgid ""
 "NVIDIA proprietary driver not used or cannot retrieve NVIDIA GPU temperature."
 msgstr ""
-"NVIDIA kapalı kaynak sürücüsü kullanılmıyor veya NVIDIA ekran kartı "
-"sıcaklığı alınamıyor."
 
 #: src/lib/nvidia.c:97
 msgid "Cannot open connection to X11 server."
 
 #: src/lib/nvidia.c:97
 msgid "Cannot open connection to X11 server."
-msgstr "X11 sunucusu bağlantısı açılamıyor."
+msgstr ""
 
 #: src/lib/nvidia.c:105
 msgid "Failed to retrieve NVIDIA information."
 
 #: src/lib/nvidia.c:105
 msgid "Failed to retrieve NVIDIA information."
-msgstr "NVIDIA bilgisi alınamıyor."
+msgstr ""
 
 #: src/lib/psensor.c:482 tests/test_psensor_type_to_unit_str.c:62
 msgid "RPM"
 
 #: src/lib/psensor.c:482 tests/test_psensor_type_to_unit_str.c:62
 msgid "RPM"
-msgstr "RPM"
+msgstr ""
 
 #: src/lib/psensor.c:484
 msgid "%"
 
 #: src/lib/psensor.c:484
 msgid "%"
-msgstr "%"
+msgstr ""
 
 #: src/lib/slog.c:68
 msgid "HOME variable not set."
 
 #: src/lib/slog.c:68
 msgid "HOME variable not set."
-msgstr "HOME değişkeni ayarlanmamış."
+msgstr ""
 
 #: src/lib/slog.c:78
 msgid "Sensor log file already open."
 
 #: src/lib/slog.c:78
 msgid "Sensor log file already open."
-msgstr "Algılayıcı günlük kaydı dosyası zaten açık."
+msgstr ""
 
 #: src/lib/slog.c:87
 #, c-format
 msgid "Cannot open sensor log file: %s."
 
 #: src/lib/slog.c:87
 #, c-format
 msgid "Cannot open sensor log file: %s."
-msgstr "Algılayıcı günlük kaydı dosyası açılamıyor: %s."
+msgstr ""
 
 #: src/lib/slog.c:118
 msgid "Sensor log file not open."
 
 #: src/lib/slog.c:118
 msgid "Sensor log file not open."
-msgstr "Algılayıcı günlük kaydı dosyası açık değil."
+msgstr ""
 
 #: src/lib/slog.c:174
 msgid "Sensor log not open, cannot close."
 
 #: src/lib/slog.c:174
 msgid "Sensor log not open, cannot close."
-msgstr "Algılayıcı günlük kaydı açık değil, kapatılamıyor."
+msgstr ""
 
 #: src/main.c:77
 #, c-format
 
 #: src/main.c:77
 #, c-format
@@ -351,11 +343,6 @@ msgid ""
 "This is free software: you are free to change and  redistribute it.\n"
 "There is NO WARRANTY, to the extent permitted by law.\n"
 msgstr ""
 "This is free software: you are free to change and  redistribute it.\n"
 "There is NO WARRANTY, to the extent permitted by law.\n"
 msgstr ""
-"Telif Hakkı (C) %s jeanfi@gmail.com\n"
-"Lisans GPLv2: GNU GPL 2. sürümü veya daha yenisi <http://www.gnu.org/"
-"licenses/old-licenses/gpl-2.0.html>\n"
-"Bu bir özgür yazılımdır: değiştirmekte ve yeniden dağıtmakta özgürsünüz.\n"
-"Yasaların izin verdiği çerçevede hiçbir garantisi YOKTUR.\n"
 
 #: src/main.c:88 src/server/server.c:94
 #, c-format
 
 #: src/main.c:88 src/server/server.c:94
 #, c-format
@@ -367,46 +354,36 @@ msgid ""
 "Psensor is a GTK+ application for monitoring hardware sensors, including "
 "temperatures and fan speeds."
 msgstr ""
 "Psensor is a GTK+ application for monitoring hardware sensors, including "
 "temperatures and fan speeds."
 msgstr ""
-"Psensor, sıcaklık ve fan hızı da dahil olmak üzere donanım algılayıcılarını "
-"gözlemleyen bir GTK+ uygulamasıdır."
 
 #: src/main.c:94
 msgid "Options:"
 
 #: src/main.c:94
 msgid "Options:"
-msgstr "Seçenekler:"
+msgstr ""
 
 #: src/main.c:95
 msgid ""
 "  -h, --help          display this help and exit\n"
 "  -v, --version       display version information and exit"
 msgstr ""
 
 #: src/main.c:95
 msgid ""
 "  -h, --help          display this help and exit\n"
 "  -v, --version       display version information and exit"
 msgstr ""
-"  -h, --help          yardımı göster ve çık\n"
-"  -v, --version       sürüm bilgisini göster ve çık"
 
 #: src/main.c:101
 msgid ""
 "  -u, --url=URL       the URL of the psensor-server,\n"
 "                      example: http://hostname:3131"
 msgstr ""
 
 #: src/main.c:101
 msgid ""
 "  -u, --url=URL       the URL of the psensor-server,\n"
 "                      example: http://hostname:3131"
 msgstr ""
-"  -u, --url=URL       psensor sunucusunun bağlantısı,\n"
-"                      example: http://hostname:3131"
 
 #: src/main.c:104
 msgid ""
 "  --use-libatasmart   use atasmart library for disk monitoring instead of\n"
 "                      hddtemp daemon"
 msgstr ""
 
 #: src/main.c:104
 msgid ""
 "  --use-libatasmart   use atasmart library for disk monitoring instead of\n"
 "                      hddtemp daemon"
 msgstr ""
-"  --use-libatasmart   disk gözlemleme için hddtemp yerine bir atasmart\n"
-"                      kütüphanesi kullan"
 
 #: src/main.c:107
 msgid "  -n, --new-instance  force the creation of a new Psensor application"
 msgstr ""
 
 #: src/main.c:107
 msgid "  -n, --new-instance  force the creation of a new Psensor application"
 msgstr ""
-"  -n, --new-instance  yeni bir Psensor uygulaması oluşturulmasını zorla"
 
 #: src/main.c:110
 msgid "  -d, --debug=LEVEL   set the debug level, integer between 0 and 3"
 msgstr ""
 
 #: src/main.c:110
 msgid "  -d, --debug=LEVEL   set the debug level, integer between 0 and 3"
 msgstr ""
-"  -d, --debug=LEVEL   hata ayıklama seviyesin ayarla, 0 ve 3 arasında tamsayı"
 
 #: src/main.c:115 src/server/server.c:117
 #, c-format
 
 #: src/main.c:115 src/server/server.c:117
 #, c-format
@@ -420,11 +397,11 @@ msgstr "%s ana sayfa: <%s>\n"
 
 #: src/main.c:454
 msgid "Psensor has not been compiled with remote sensor support."
 
 #: src/main.c:454
 msgid "Psensor has not been compiled with remote sensor support."
-msgstr "Psensor, uzaktan algılayıcı desteği ile derlenmemiştir."
+msgstr ""
 
 #: src/main.c:517
 msgid "Enables debug mode."
 
 #: src/main.c:517
 msgid "Enables debug mode."
-msgstr "Hata ayıklama modunu etkinleştirir."
+msgstr ""
 
 #: src/main.c:529 src/server/server.c:380
 #, c-format
 
 #: src/main.c:529 src/server/server.c:380
 #, c-format
@@ -433,33 +410,31 @@ msgstr "Daha fazla bilgi için `%s --help' yazın.\n"
 
 #: src/main.c:542
 msgid "A Psensor instance already exists."
 
 #: src/main.c:542
 msgid "A Psensor instance already exists."
-msgstr "Bir Psensor örneği zaten mevcut."
+msgstr ""
 
 #: src/rsensor.c:107
 #, c-format
 msgid "Fail to connect to: %s"
 
 #: src/rsensor.c:107
 #, c-format
 msgid "Fail to connect to: %s"
-msgstr "Şuna bağlanamadı: %s"
+msgstr ""
 
 #: src/rsensor.c:144
 #, c-format
 msgid "Invalid content: %s"
 
 #: src/rsensor.c:144
 #, c-format
 msgid "Invalid content: %s"
-msgstr "Geçersiz içerik: %s"
+msgstr ""
 
 #: src/rsensor.c:184
 #, c-format
 msgid "Invalid JSON: %s"
 
 #: src/rsensor.c:184
 #, c-format
 msgid "Invalid JSON: %s"
-msgstr "Geçersiz JSON: %s"
+msgstr ""
 
 #: src/server/server.c:54
 msgid "<html><body><p>Server stop requested</p></body></html>"
 
 #: src/server/server.c:54
 msgid "<html><body><p>Server stop requested</p></body></html>"
-msgstr "<html><body><p>Sunucu durdurma istendi</p></body></html>"
+msgstr ""
 
 #: src/server/server.c:60
 msgid ""
 "<html><body><p>Page not found - Go to <a href='/'>Main page</a></p></body>"
 msgstr ""
 
 #: src/server/server.c:60
 msgid ""
 "<html><body><p>Page not found - Go to <a href='/'>Main page</a></p></body>"
 msgstr ""
-"<html><body><p>Sayfa bulunamadı - Şuraya gidin <a href='/'>Main page</a></"
-"p></body>"
 
 #: src/server/server.c:84
 #, c-format
 
 #: src/server/server.c:84
 #, c-format
@@ -470,121 +445,102 @@ msgid ""
 "This is free software: you are free to change and redistribute it.\n"
 "There is NO WARRANTY, to the extent permitted by law.\n"
 msgstr ""
 "This is free software: you are free to change and redistribute it.\n"
 "There is NO WARRANTY, to the extent permitted by law.\n"
 msgstr ""
-"Telif Hakkı (C) %s jeanfi@gmail.com\n"
-"Lisans GPLv2: GNU GPL 2. sürümü veya daha yenisi <http://www.gnu.org/"
-"licenses/old-licenses/gpl-2.0.html>\n"
-"Bu bir özgür yazılımdır: değiştirmekte ve yeniden dağıtmakta özgürsünüz.\n"
-"Yasaların izin verdiği çerçevede hiçbir garantisi YOKTUR.\n"
 
 #: src/server/server.c:96
 msgid ""
 "psensor-server is an HTTP server for monitoring hardware sensors remotely."
 msgstr ""
 
 #: src/server/server.c:96
 msgid ""
 "psensor-server is an HTTP server for monitoring hardware sensors remotely."
 msgstr ""
-"psensor-sunucusu, donanım algılayıcılarını uzaktan gözlemleme amaçlı bir "
-"HTTP sunucusudur."
 
 #: src/server/server.c:101
 msgid ""
 "  -h, --help\t\tdisplay this help and exit\n"
 "  -v, --version\t\tdisplay version information and exit"
 msgstr ""
 
 #: src/server/server.c:101
 msgid ""
 "  -h, --help\t\tdisplay this help and exit\n"
 "  -v, --version\t\tdisplay version information and exit"
 msgstr ""
-"  -h, --help\t\tyardımı göster ve çık\n"
-"  -v, --version\t\tsürüm bilgisini göster ve çık"
 
 #: src/server/server.c:105
 msgid ""
 "  -p,--port=PORT\twebserver port\n"
 "  -w,--wdir=DIR\t\tdirectory containing webserver pages"
 msgstr ""
 
 #: src/server/server.c:105
 msgid ""
 "  -p,--port=PORT\twebserver port\n"
 "  -w,--wdir=DIR\t\tdirectory containing webserver pages"
 msgstr ""
-"  -p,--port=PORT\twebsunucu bağlantı noktası\n"
-"  -w,--wdir=DIR\t\tdizin websunucusu sayfaları içerir"
 
 #: src/server/server.c:109
 msgid "  -d, --debug=LEVEL     set the debug level, integer between 0 and 3"
 msgstr ""
 
 #: src/server/server.c:109
 msgid "  -d, --debug=LEVEL     set the debug level, integer between 0 and 3"
 msgstr ""
-"  -d, --debug=LEVEL     hata ayıklama seviyesini ayarla, 0 ve 3 arasında bir "
-"tamsayı"
 
 #: src/server/server.c:111
 msgid "  -l, --log-file=PATH   set the log file to PATH"
 
 #: src/server/server.c:111
 msgid "  -l, --log-file=PATH   set the log file to PATH"
-msgstr "  -l, --log-file=PATH   günlük kaydı dosyasını PATH olarak ayarla"
+msgstr ""
 
 #: src/server/server.c:112
 msgid "  --sensor-log-file=PATH set the sensor log file to PATH"
 msgstr ""
 
 #: src/server/server.c:112
 msgid "  --sensor-log-file=PATH set the sensor log file to PATH"
 msgstr ""
-"  --sensor-log-file=PATH algılayıcı günlük kaydı dosyasını PATH olarak ayarla"
 
 #: src/server/server.c:113
 msgid "  --sensor-log-interval=S set the sensor log interval to S (seconds)"
 msgstr ""
 
 #: src/server/server.c:113
 msgid "  --sensor-log-interval=S set the sensor log interval to S (seconds)"
 msgstr ""
-"  --sensor-log-interval=S algılayıcı günlük kaydı aralığını S (saniye) "
-"olarak ayarla"
 
 #: src/server/server.c:297
 #, c-format
 msgid "HTTP Request: %s"
 
 #: src/server/server.c:297
 #, c-format
 msgid "HTTP Request: %s"
-msgstr "HTTP İsteği: %s"
+msgstr ""
 
 #: src/server/server.c:360
 #, c-format
 msgid "Enables debug mode: %d"
 
 #: src/server/server.c:360
 #, c-format
 msgid "Enables debug mode: %d"
-msgstr "Hata ayıklama modunu etkinleştirir: %d"
+msgstr ""
 
 #: src/server/server.c:402
 msgid "No sensors detected."
 
 #: src/server/server.c:402
 msgid "No sensors detected."
-msgstr "Hiçbir algılayıcı bulunamadı."
+msgstr ""
 
 #: src/server/server.c:409
 msgid "Failed to create Web server."
 
 #: src/server/server.c:409
 msgid "Failed to create Web server."
-msgstr "Web sunucusu oluşturulamadı."
+msgstr ""
 
 #: src/server/server.c:413
 #, c-format
 msgid "Web server started on port: %d"
 
 #: src/server/server.c:413
 #, c-format
 msgid "Web server started on port: %d"
-msgstr "Web sunucusu şu noktadan başlatıldı: %d"
+msgstr ""
 
 #: src/server/server.c:414
 #, c-format
 msgid "WWW directory: %s"
 
 #: src/server/server.c:414
 #, c-format
 msgid "WWW directory: %s"
-msgstr "WWW dizini: %s"
+msgstr ""
 
 #: src/server/server.c:415
 #, c-format
 msgid "URL: http://localhost:%d"
 
 #: src/server/server.c:415
 #, c-format
 msgid "URL: http://localhost:%d"
-msgstr "URL: http://localhost:%d"
+msgstr ""
 
 #: src/server/server.c:425
 msgid "Failed to activate logging of sensors."
 
 #: src/server/server.c:425
 msgid "Failed to activate logging of sensors."
-msgstr "Algılayıcıların günlük kaydı etkinleştirilemedi."
+msgstr ""
 
 #: src/ui.c:84
 msgid "Psensor is a GTK+ application for monitoring hardware sensors"
 msgstr ""
 
 #: src/ui.c:84
 msgid "Psensor is a GTK+ application for monitoring hardware sensors"
 msgstr ""
-"Psensor, donanım algılayıcılarının gözlenmesi amaçlı bir GTK+ uygulamasıdır"
 
 #: src/ui.c:87
 msgid ""
 
 #: src/ui.c:87
 msgid ""
-"Copyright(c) 2010-2014\n"
+"Copyright(c) 2010-2013\n"
 "jeanfi@gmail.com"
 msgstr ""
 "jeanfi@gmail.com"
 msgstr ""
-"Telif Hakkı(c) 2010-2014\n"
-"jeanfi@gmail.com"
 
 #: src/ui.c:90
 msgid "About Psensor"
 
 #: src/ui.c:90
 msgid "About Psensor"
-msgstr "Psensor Hakkında"
+msgstr ""
 
 #: src/ui.c:93
 msgid "Psensor Homepage"
 
 #: src/ui.c:93
 msgid "Psensor Homepage"
-msgstr "Psensor Anasayfası"
+msgstr ""
 
 #: src/ui.c:217
 msgid "Failed to load Psensor icon."
 
 #: src/ui.c:217
 msgid "Failed to load Psensor icon."
-msgstr "Psensor simgesi yüklenemedi."
+msgstr ""
 
 #: src/ui_sensorlist.c:245
 msgid "Select foreground color"
 
 #: src/ui_sensorlist.c:245
 msgid "Select foreground color"
-msgstr "Önplan rengini seçin"
+msgstr ""
 
 #: src/ui_sensorlist.c:297
 msgid "Sensor"
 
 #: src/ui_sensorlist.c:297
 msgid "Sensor"
@@ -592,53 +548,68 @@ msgstr "Algılayıcı"
 
 #: src/ui_sensorlist.c:303
 msgid "Value"
 
 #: src/ui_sensorlist.c:303
 msgid "Value"
-msgstr "Değer"
+msgstr ""
 
 #: src/ui_sensorlist.c:309
 msgid "Min"
 
 #: src/ui_sensorlist.c:309
 msgid "Min"
-msgstr "Asgari"
+msgstr ""
 
 #: src/ui_sensorlist.c:315
 msgid "Max"
 
 #: src/ui_sensorlist.c:315
 msgid "Max"
-msgstr "Azami"
+msgstr ""
 
 #: src/ui_sensorlist.c:322
 msgid "Color"
 msgstr "Renk"
 
 
 #: src/ui_sensorlist.c:322
 msgid "Color"
 msgstr "Renk"
 
+#: src/ui_appindicator.c:106
+msgid "_Show"
+msgstr ""
+
+#: src/ui_appindicator.c:107
+msgid "Show"
+msgstr ""
+
+#: src/ui_appindicator.c:111
+msgid "_Preferences"
+msgstr "Tercihler"
+
+#: src/ui_appindicator.c:116
+msgid "S_ensor Preferences"
+msgstr "Tercihleri düzenle"
+
+#: src/ui_appindicator.c:118
+msgid "SensorPreferences"
+msgstr "Tercihleri düzenle"
+
+#: src/ui_appindicator.c:122
+msgid "_About"
+msgstr ""
+
+#: src/ui_appindicator.c:129
+msgid "_Quit"
+msgstr ""
+
+#: src/ui_appindicator.c:220
+#, c-format
+msgid "building menus failed: %s"
+msgstr ""
+
 #: src/ui_notify.c:48
 msgid "gettimeofday failed."
 #: src/ui_notify.c:48
 msgid "gettimeofday failed."
-msgstr "gettimeofday başarısız."
+msgstr ""
 
 #: src/ui_notify.c:77
 msgid "Temperature alert"
 
 #: src/ui_notify.c:77
 msgid "Temperature alert"
-msgstr "Sıcaklık uyarısı"
+msgstr ""
 
 #: src/ui_notify.c:79
 msgid "Fan alert"
 
 #: src/ui_notify.c:79
 msgid "Fan alert"
-msgstr "Fan uyarısı"
+msgstr ""
 
 #: src/ui_sensorpref.c:248
 msgid "Unknown"
 
 #: src/ui_sensorpref.c:248
 msgid "Unknown"
-msgstr "Bilinmeyen"
-
-#~ msgid "_Show"
-#~ msgstr "_Göster"
-
-#~ msgid "_Preferences"
-#~ msgstr "_Tercihler"
-
-#~ msgid "S_ensor Preferences"
-#~ msgstr "A_lgılayıcı Tercihleri"
-
-#~ msgid "SensorPreferences"
-#~ msgstr "AlgılayıcıTercihleri"
-
-#~ msgid "_About"
-#~ msgstr "_Hakkında"
-
-#~ msgid "_Quit"
-#~ msgstr "_Çıkış"
+msgstr ""
 
 
-#~ msgid "building menus failed: %s"
-#~ msgstr "menüler inşaa edilemedi: %s"
+#~ msgid "Sensor Name"
+#~ msgstr "Algılayıcı"
index 1016506..a8fc5cd 100644 (file)
Binary files a/po/uk.gmo and b/po/uk.gmo differ
index efd7b09..b2abb0c 100644 (file)
--- a/po/uk.po
+++ b/po/uk.po
@@ -1,13 +1,13 @@
 # Ukrainian translation for psensor
 # Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012
 # This file is distributed under the same license as the psensor package.
 # Ukrainian translation for psensor
 # Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012
 # This file is distributed under the same license as the psensor package.
-# Maintained by Jean-Philippe Orsini <jeanfi@gmail.com>
+#  <jeanfi@gmail.com>, 2012.
 #
 msgid ""
 msgstr ""
 "Project-Id-Version: psensor\n"
 "Report-Msgid-Bugs-To: jeanfi@gmail.com\n"
 #
 msgid ""
 msgstr ""
 "Project-Id-Version: psensor\n"
 "Report-Msgid-Bugs-To: jeanfi@gmail.com\n"
-"POT-Creation-Date: 2014-04-10 08:17+0200\n"
+"POT-Creation-Date: 2013-10-16 09:19+0200\n"
 "PO-Revision-Date: 2012-10-13 16:24+0000\n"
 "Last-Translator: Ilya Volchanetskiy <Unknown>\n"
 "Language-Team: Ukrainian <uk@li.org>\n"
 "PO-Revision-Date: 2012-10-13 16:24+0000\n"
 "Last-Translator: Ilya Volchanetskiy <Unknown>\n"
 "Language-Team: Ukrainian <uk@li.org>\n"
@@ -18,37 +18,31 @@ msgstr ""
 "X-Launchpad-Export-Date: 2013-01-21 09:32+0000\n"
 "X-Generator: Launchpad (build 16430)\n"
 
 "X-Launchpad-Export-Date: 2013-01-21 09:32+0000\n"
 "X-Generator: Launchpad (build 16430)\n"
 
-#: src/glade/psensor.glade:5
+#: src/glade/psensor.glade:5 src/ui_appindicator.c:124
 msgid "About"
 msgstr "Про програму"
 
 msgid "About"
 msgstr "Про програму"
 
-#: src/glade/psensor.glade:9 src/glade/psensor.glade:10
-#: src/glade/psensor.glade:19 src/ui_sensorlist.c:209
+#: src/glade/psensor.glade:9 src/ui_sensorlist.c:209 src/ui_appindicator.c:112
 msgid "Preferences"
 msgstr "Налаштування"
 
 msgid "Preferences"
 msgstr "Налаштування"
 
-#: src/glade/psensor.glade:14 src/glade/psensor.glade:15
-#: src/glade/psensor.glade:27
-msgid "Sensor Preferences"
-msgstr "Налаштування датчиків"
-
-#: src/glade/psensor.glade:23
+#: src/glade/psensor.glade:13 src/ui_appindicator.c:130
 msgid "Quit"
 msgstr "Вихід"
 
 msgid "Quit"
 msgstr "Вихід"
 
-#: src/glade/psensor.glade:31
-msgid "Show"
-msgstr "Ð\9fоказаÑ\82и"
+#: src/glade/psensor.glade:17
+msgid "Sensor Preferences"
+msgstr "Ð\9dалаÑ\88Ñ\82Ñ\83ваннÑ\8f Ð´Ð°Ñ\82Ñ\87икÑ\96в"
 
 
-#: src/glade/psensor.glade:180
+#: src/glade/psensor.glade:96
 msgid "Psensor - Temperature Monitor"
 msgstr ""
 
 msgid "Psensor - Temperature Monitor"
 msgstr ""
 
-#: src/glade/psensor.glade:195
+#: src/glade/psensor.glade:111
 msgid "_Psensor"
 msgstr ""
 
 msgid "_Psensor"
 msgstr ""
 
-#: src/glade/psensor.glade:242
+#: src/glade/psensor.glade:158
 msgid "_Help"
 msgstr "_Довдіка"
 
 msgid "_Help"
 msgstr "_Довдіка"
 
@@ -541,7 +535,7 @@ msgstr ""
 
 #: src/ui.c:87
 msgid ""
 
 #: src/ui.c:87
 msgid ""
-"Copyright(c) 2010-2014\n"
+"Copyright(c) 2010-2013\n"
 "jeanfi@gmail.com"
 msgstr ""
 
 "jeanfi@gmail.com"
 msgstr ""
 
@@ -581,6 +575,39 @@ msgstr "Макс."
 msgid "Color"
 msgstr "Колір"
 
 msgid "Color"
 msgstr "Колір"
 
+#: src/ui_appindicator.c:106
+msgid "_Show"
+msgstr "Пок_азати"
+
+#: src/ui_appindicator.c:107
+msgid "Show"
+msgstr "Показати"
+
+#: src/ui_appindicator.c:111
+msgid "_Preferences"
+msgstr "_Налаштування"
+
+#: src/ui_appindicator.c:116
+msgid "S_ensor Preferences"
+msgstr "Налаштув_ання датчиків"
+
+#: src/ui_appindicator.c:118
+msgid "SensorPreferences"
+msgstr ""
+
+#: src/ui_appindicator.c:122
+msgid "_About"
+msgstr "_Про програму"
+
+#: src/ui_appindicator.c:129
+msgid "_Quit"
+msgstr "_Вихід"
+
+#: src/ui_appindicator.c:220
+#, c-format
+msgid "building menus failed: %s"
+msgstr "не вдалося створити меню: %s"
+
 #: src/ui_notify.c:48
 msgid "gettimeofday failed."
 msgstr "помилка gettimeofday."
 #: src/ui_notify.c:48
 msgid "gettimeofday failed."
 msgstr "помилка gettimeofday."
@@ -597,24 +624,6 @@ msgstr ""
 msgid "Unknown"
 msgstr ""
 
 msgid "Unknown"
 msgstr ""
 
-#~ msgid "_Show"
-#~ msgstr "Пок_азати"
-
-#~ msgid "_Preferences"
-#~ msgstr "_Налаштування"
-
-#~ msgid "S_ensor Preferences"
-#~ msgstr "Налаштув_ання датчиків"
-
-#~ msgid "_About"
-#~ msgstr "_Про програму"
-
-#~ msgid "_Quit"
-#~ msgstr "_Вихід"
-
-#~ msgid "building menus failed: %s"
-#~ msgstr "не вдалося створити меню: %s"
-
 #~ msgid "Sensor Name"
 #~ msgstr "Назва датчика"
 
 #~ msgid "Sensor Name"
 #~ msgstr "Назва датчика"
 
index 5ee4395..96e1924 100644 (file)
Binary files a/po/zh_CN.gmo and b/po/zh_CN.gmo differ
index 95788fc..98115f2 100644 (file)
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: psensor\n"
 "Report-Msgid-Bugs-To: jeanfi@gmail.com\n"
 msgstr ""
 "Project-Id-Version: psensor\n"
 "Report-Msgid-Bugs-To: jeanfi@gmail.com\n"
-"POT-Creation-Date: 2014-04-10 08:17+0200\n"
+"POT-Creation-Date: 2013-10-16 09:19+0200\n"
 "PO-Revision-Date: 2013-01-15 12:24+0000\n"
 "Last-Translator: Wang Dianjin <Unknown>\n"
 "Language-Team: Chinese (simplified)\n"
 "PO-Revision-Date: 2013-01-15 12:24+0000\n"
 "Last-Translator: Wang Dianjin <Unknown>\n"
 "Language-Team: Chinese (simplified)\n"
@@ -18,37 +18,31 @@ msgstr ""
 "X-Launchpad-Export-Date: 2013-01-21 09:32+0000\n"
 "X-Generator: Launchpad (build 16430)\n"
 
 "X-Launchpad-Export-Date: 2013-01-21 09:32+0000\n"
 "X-Generator: Launchpad (build 16430)\n"
 
-#: src/glade/psensor.glade:5
+#: src/glade/psensor.glade:5 src/ui_appindicator.c:124
 msgid "About"
 msgstr "关于"
 
 msgid "About"
 msgstr "关于"
 
-#: src/glade/psensor.glade:9 src/glade/psensor.glade:10
-#: src/glade/psensor.glade:19 src/ui_sensorlist.c:209
+#: src/glade/psensor.glade:9 src/ui_sensorlist.c:209 src/ui_appindicator.c:112
 msgid "Preferences"
 msgstr "首选项"
 
 msgid "Preferences"
 msgstr "首选项"
 
-#: src/glade/psensor.glade:14 src/glade/psensor.glade:15
-#: src/glade/psensor.glade:27
-msgid "Sensor Preferences"
-msgstr "传感器首选项"
-
-#: src/glade/psensor.glade:23
+#: src/glade/psensor.glade:13 src/ui_appindicator.c:130
 msgid "Quit"
 msgstr "退出"
 
 msgid "Quit"
 msgstr "退出"
 
-#: src/glade/psensor.glade:31
-msgid "Show"
-msgstr "显示"
+#: src/glade/psensor.glade:17
+msgid "Sensor Preferences"
+msgstr "传感器首选项"
 
 
-#: src/glade/psensor.glade:180
+#: src/glade/psensor.glade:96
 msgid "Psensor - Temperature Monitor"
 msgstr "Psensor - 温度监视器"
 
 msgid "Psensor - Temperature Monitor"
 msgstr "Psensor - 温度监视器"
 
-#: src/glade/psensor.glade:195
+#: src/glade/psensor.glade:111
 msgid "_Psensor"
 msgstr ""
 
 msgid "_Psensor"
 msgstr ""
 
-#: src/glade/psensor.glade:242
+#: src/glade/psensor.glade:158
 msgid "_Help"
 msgstr "帮助(_H)"
 
 msgid "_Help"
 msgstr "帮助(_H)"
 
@@ -548,10 +542,10 @@ msgstr "Psensor 是一款 GTK+ 硬件监测传感应用程序"
 
 #: src/ui.c:87
 msgid ""
 
 #: src/ui.c:87
 msgid ""
-"Copyright(c) 2010-2014\n"
+"Copyright(c) 2010-2013\n"
 "jeanfi@gmail.com"
 msgstr ""
 "jeanfi@gmail.com"
 msgstr ""
-"版权所有(c) 2010-2014\n"
+"版权所有(c) 2010-2013\n"
 "jeanfi@gmail.com"
 
 #: src/ui.c:90
 "jeanfi@gmail.com"
 
 #: src/ui.c:90
@@ -590,6 +584,39 @@ msgstr "最大值"
 msgid "Color"
 msgstr "颜色"
 
 msgid "Color"
 msgstr "颜色"
 
+#: src/ui_appindicator.c:106
+msgid "_Show"
+msgstr "显示(_S)"
+
+#: src/ui_appindicator.c:107
+msgid "Show"
+msgstr "显示"
+
+#: src/ui_appindicator.c:111
+msgid "_Preferences"
+msgstr "首选项(_P)"
+
+#: src/ui_appindicator.c:116
+msgid "S_ensor Preferences"
+msgstr "传感器首选项(_E)"
+
+#: src/ui_appindicator.c:118
+msgid "SensorPreferences"
+msgstr "传感器首选项"
+
+#: src/ui_appindicator.c:122
+msgid "_About"
+msgstr "关于(_A)"
+
+#: src/ui_appindicator.c:129
+msgid "_Quit"
+msgstr "退出(_Q)"
+
+#: src/ui_appindicator.c:220
+#, c-format
+msgid "building menus failed: %s"
+msgstr "创建菜单失败:%s"
+
 #: src/ui_notify.c:48
 msgid "gettimeofday failed."
 msgstr "获取时间失败。"
 #: src/ui_notify.c:48
 msgid "gettimeofday failed."
 msgstr "获取时间失败。"
@@ -606,27 +633,6 @@ msgstr "风扇警报"
 msgid "Unknown"
 msgstr "未知"
 
 msgid "Unknown"
 msgstr "未知"
 
-#~ msgid "_Show"
-#~ msgstr "显示(_S)"
-
-#~ msgid "_Preferences"
-#~ msgstr "首选项(_P)"
-
-#~ msgid "S_ensor Preferences"
-#~ msgstr "传感器首选项(_E)"
-
-#~ msgid "SensorPreferences"
-#~ msgstr "传感器首选项"
-
-#~ msgid "_About"
-#~ msgstr "关于(_A)"
-
-#~ msgid "_Quit"
-#~ msgstr "退出(_Q)"
-
-#~ msgid "building menus failed: %s"
-#~ msgstr "创建菜单失败:%s"
-
 #~ msgid "Sensor Name"
 #~ msgstr "传感器名称"
 
 #~ msgid "Sensor Name"
 #~ msgstr "传感器名称"
 
index 390e78b..3e76173 100644 (file)
@@ -4,11 +4,11 @@ Version=1.0
 Name=Psensor
 GenericName=Psensor
 Comment=Psensor is a graphical temperature monitor for Linux
 Name=Psensor
 GenericName=Psensor
 Comment=Psensor is a graphical temperature monitor for Linux
-Keywords=temperature;fan;monitoring;indicator;
+Keywords=temperature;fan;monitoring;indicator
 Icon=psensor
 TryExec=psensor
 Exec=psensor
 Icon=psensor
 TryExec=psensor
 Exec=psensor
-Categories=System;Monitor;
+Categories=Application;System;
 X-GNOME-Autostart-Delay=30
 StartupNotify=true
 
 X-GNOME-Autostart-Delay=30
 StartupNotify=true
 
index 55f3c8e..41aa09a 100644 (file)
--- a/src/cfg.c
+++ b/src/cfg.c
@@ -1,5 +1,5 @@
 /*
 /*
- * Copyright (C) 2010-2014 jeanfi@gmail.com
+ * Copyright (C) 2010-2013 jeanfi@gmail.com
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License as
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License as
index 9a9fce1..b8fccd1 100644 (file)
--- a/src/cfg.h
+++ b/src/cfg.h
@@ -1,5 +1,5 @@
 /*
 /*
- * Copyright (C) 2010-2014 jeanfi@gmail.com
+ * Copyright (C) 2010-2013 jeanfi@gmail.com
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License as
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License as
index 25b2109..71276b3 100644 (file)
@@ -5,16 +5,6 @@
     <property name="label" translatable="yes">About</property>
     <signal name="activate" handler="ui_cb_about" swapped="no"/>
   </object>
     <property name="label" translatable="yes">About</property>
     <signal name="activate" handler="ui_cb_about" swapped="no"/>
   </object>
-  <object class="GtkAction" id="AppIndicatorPreferencesAction">
-    <property name="label" translatable="yes">Preferences</property>
-    <property name="short_label" translatable="yes">Preferences</property>
-    <signal name="activate" handler="ui_appindicator_cb_preferences" swapped="no"/>
-  </object>
-  <object class="GtkAction" id="AppIndicatorSensorPreferencesAction">
-    <property name="label" translatable="yes">Sensor Preferences</property>
-    <property name="short_label" translatable="yes">Sensor Preferences</property>
-    <signal name="activate" handler="ui_appindicator_cb_sensor_preferences" swapped="no"/>
-  </object>
   <object class="GtkAction" id="PreferencesAction">
     <property name="label" translatable="yes">Preferences</property>
     <signal name="activate" handler="ui_cb_preferences" swapped="no"/>
   <object class="GtkAction" id="PreferencesAction">
     <property name="label" translatable="yes">Preferences</property>
     <signal name="activate" handler="ui_cb_preferences" swapped="no"/>
     <property name="label" translatable="yes">Sensor Preferences</property>
     <signal name="activate" handler="ui_cb_sensor_preferences" swapped="no"/>
   </object>
     <property name="label" translatable="yes">Sensor Preferences</property>
     <signal name="activate" handler="ui_cb_sensor_preferences" swapped="no"/>
   </object>
-  <object class="GtkAction" id="ShowAction">
-    <property name="label" translatable="yes">Show</property>
-    <signal name="activate" handler="cb_menu_show" swapped="no"/>
-  </object>
-  <object class="GtkMenu" id="appindicator_menu">
-    <property name="visible">True</property>
-    <property name="can_focus">False</property>
-    <child>
-      <object class="GtkImageMenuItem" id="menuitem8">
-        <property name="related_action">ShowAction</property>
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
-        <property name="use_stock">True</property>
-      </object>
-    </child>
-    <child>
-      <object class="GtkSeparatorMenuItem" id="menuitem9">
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
-      </object>
-    </child>
-    <child>
-      <object class="GtkImageMenuItem" id="menuitem1">
-        <property name="related_action">AppIndicatorPreferencesAction</property>
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
-        <property name="use_stock">True</property>
-      </object>
-    </child>
-    <child>
-      <object class="GtkImageMenuItem" id="menuitem2">
-        <property name="related_action">AppIndicatorSensorPreferencesAction</property>
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
-        <property name="use_stock">True</property>
-      </object>
-    </child>
-    <child>
-      <object class="GtkSeparatorMenuItem" id="menuitem3">
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
-      </object>
-    </child>
-    <child>
-      <object class="GtkSeparatorMenuItem" id="menuitem4">
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
-      </object>
-    </child>
-    <child>
-      <object class="GtkImageMenuItem" id="menuitem5">
-        <property name="related_action">AboutAction</property>
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
-        <property name="use_underline">True</property>
-        <property name="use_stock">True</property>
-      </object>
-    </child>
-    <child>
-      <object class="GtkSeparatorMenuItem" id="menuitem6">
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
-      </object>
-    </child>
-    <child>
-      <object class="GtkImageMenuItem" id="menuitem7">
-        <property name="related_action">QuitAction</property>
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
-        <property name="use_underline">True</property>
-        <property name="use_stock">True</property>
-      </object>
-    </child>
-  </object>
   <object class="GtkMenu" id="popup_menu">
     <property name="visible">True</property>
     <property name="can_focus">False</property>
   <object class="GtkMenu" id="popup_menu">
     <property name="visible">True</property>
     <property name="can_focus">False</property>
index d8ca848..f12a155 100644 (file)
@@ -1,5 +1,5 @@
 /*
 /*
- * Copyright (C) 2010-2014 jeanfi@gmail.com
+ * Copyright (C) 2010-2013 jeanfi@gmail.com
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License as
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License as
index 88d4e0e..e4966da 100644 (file)
@@ -1,5 +1,5 @@
 /*
 /*
- * Copyright (C) 2010-2014 jeanfi@gmail.com
+ * Copyright (C) 2010-2013 jeanfi@gmail.com
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License as
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License as
index 0cc2b35..02fcc03 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 2010-2011 thgreasi@gmail.com, jeanfi@gmail.com
 /*
  * Copyright (C) 2010-2011 thgreasi@gmail.com, jeanfi@gmail.com
- * Copyright (C) 2012-2014 jeanfi@gmail.com
+ * Copyright (C) 2010-2013 jeanfi@gmail.com
  *
  * GPU usage is a contribution of MestreLion
  *
  *
  * GPU usage is a contribution of MestreLion
  *
index acb234d..1a5449c 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 2010-2011 thgreasi@gmail.com, jeanfi@gmail.com
 /*
  * Copyright (C) 2010-2011 thgreasi@gmail.com, jeanfi@gmail.com
- * Copyright (C) 2012-2014 jeanfi@gmail.com
+ * Copyright (C) 2010-2013 jeanfi@gmail.com
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License as
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License as
index 3aba0b6..900edc1 100644 (file)
@@ -1,5 +1,5 @@
 /*
 /*
- * Copyright (C) 2010-2014 jeanfi@gmail.com
+ * Copyright (C) 2010-2013 jeanfi@gmail.com
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License as
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License as
index 89a01a9..ab8462d 100644 (file)
@@ -1,5 +1,5 @@
 /*
 /*
- * Copyright (C) 2010-2014 jeanfi@gmail.com
+ * Copyright (C) 2010-2013 jeanfi@gmail.com
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License as
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License as
index cefb94b..eb8fac9 100644 (file)
@@ -1,5 +1,5 @@
 /*
 /*
- * Copyright (C) 2010-2014 jeanfi@gmail.com
+ * Copyright (C) 2010-2013 jeanfi@gmail.com
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License as
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License as
index e7704f2..7cf2105 100644 (file)
@@ -1,5 +1,5 @@
 /*
 /*
- * Copyright (C) 2010-2014 jeanfi@gmail.com
+ * Copyright (C) 2010-2013 jeanfi@gmail.com
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License as
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License as
index a1d7125..7acc4eb 100644 (file)
@@ -1,5 +1,5 @@
 /*
 /*
- * Copyright (C) 2010-2014 jeanfi@gmail.com
+ * Copyright (C) 2010-2013 jeanfi@gmail.com
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License as
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License as
index 6c79dbc..41b63ee 100644 (file)
@@ -1,5 +1,5 @@
 /*
 /*
- * Copyright (C) 2010-2014 jeanfi@gmail.com
+ * Copyright (C) 2010-2013 jeanfi@gmail.com
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License as
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License as
index 8da5c85..7e99648 100644 (file)
@@ -1,5 +1,5 @@
 /*
 /*
- * Copyright (C) 2010-2014 jeanfi@gmail.com
+ * Copyright (C) 2010-2013 jeanfi@gmail.com
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License as
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License as
index 613b701..afd57b4 100644 (file)
@@ -1,5 +1,5 @@
 /*
 /*
- * Copyright (C) 2010-2014 jeanfi@gmail.com
+ * Copyright (C) 2010-2013 jeanfi@gmail.com
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License as
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License as
index 99ce552..2ace110 100644 (file)
@@ -1,5 +1,5 @@
 /*
 /*
- * Copyright (C) 2010-2014 jeanfi@gmail.com
+ * Copyright (C) 2010-2013 jeanfi@gmail.com
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License as
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License as
index 10e7398..d9e5787 100644 (file)
@@ -1,5 +1,5 @@
 /*
 /*
- * Copyright (C) 2010-2014 jeanfi@gmail.com
+ * Copyright (C) 2010-2013 jeanfi@gmail.com
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License as
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License as
index 9df4629..7b4331f 100644 (file)
@@ -1,5 +1,5 @@
 /*
 /*
- * Copyright (C) 2010-2014 jeanfi@gmail.com
+ * Copyright (C) 2010-2013 jeanfi@gmail.com
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License as
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License as
index 30a904b..5d4e2bc 100644 (file)
@@ -1,5 +1,5 @@
 /*
 /*
- * Copyright (C) 2010-2014 jeanfi@gmail.com
+ * Copyright (C) 2010-2013 jeanfi@gmail.com
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License as
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License as
index 39727d3..146ae16 100644 (file)
@@ -1,5 +1,5 @@
 /*
 /*
- * Copyright (C) 2010-2014 jeanfi@gmail.com
+ * Copyright (C) 2010-2013 jeanfi@gmail.com
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License as
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License as
index c9cdb64..16181ca 100644 (file)
@@ -1,5 +1,5 @@
 /*
 /*
- * Copyright (C) 2010-2014 jeanfi@gmail.com
+ * Copyright (C) 2010-2013 jeanfi@gmail.com
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License as
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License as
index 9910521..92d7574 100644 (file)
@@ -1,5 +1,5 @@
 /*
 /*
- * Copyright (C) 2010-2014 jeanfi@gmail.com
+ * Copyright (C) 2010-2013 jeanfi@gmail.com
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License as
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License as
index 9c1089c..64ad279 100644 (file)
@@ -1,5 +1,5 @@
 /*
 /*
- * Copyright (C) 2010-2014 jeanfi@gmail.com
+ * Copyright (C) 2010-2013 jeanfi@gmail.com
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License as
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License as
index cf92139..d150bed 100644 (file)
@@ -1,5 +1,5 @@
 /*
 /*
- * Copyright (C) 2010-2014 jeanfi@gmail.com
+ * Copyright (C) 2010-2013 jeanfi@gmail.com
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License as
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License as
index 808a0cc..29aa798 100644 (file)
@@ -1,5 +1,5 @@
 /*
 /*
- * Copyright (C) 2010-2014 jeanfi@gmail.com
+ * Copyright (C) 2010-2013 jeanfi@gmail.com
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License as
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License as
index 8b92c01..5be048e 100644 (file)
@@ -1,5 +1,5 @@
 /*
 /*
- * Copyright (C) 2010-2014 jeanfi@gmail.com
+ * Copyright (C) 2010-2013 jeanfi@gmail.com
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License as
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License as
index 292525a..e459866 100644 (file)
@@ -1,5 +1,5 @@
 /*
 /*
- * Copyright (C) 2010-2014 jeanfi@gmail.com
+ * Copyright (C) 2010-2013 jeanfi@gmail.com
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License as
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License as
index d97a620..b6feecf 100644 (file)
@@ -1,5 +1,5 @@
 /*
 /*
- * Copyright (C) 2010-2014 jeanfi@gmail.com
+ * Copyright (C) 2010-2013 jeanfi@gmail.com
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License as
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License as
index 50634e9..31ceb00 100644 (file)
@@ -1,5 +1,5 @@
 /*
 /*
- * Copyright (C) 2010-2014 jeanfi@gmail.com
+ * Copyright (C) 2010-2013 jeanfi@gmail.com
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License as
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License as
index 95c3342..34ae92e 100644 (file)
@@ -1,5 +1,5 @@
 /*
 /*
- * Copyright (C) 2010-2014 jeanfi@gmail.com
+ * Copyright (C) 2010-2013 jeanfi@gmail.com
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License as
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License as
index 63e1e80..aac8c52 100644 (file)
@@ -1,5 +1,5 @@
 /*
 /*
- * Copyright (C) 2010-2014 jeanfi@gmail.com
+ * Copyright (C) 2010-2013 jeanfi@gmail.com
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License as
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License as
index cb2b124..d3e646d 100644 (file)
@@ -1,5 +1,5 @@
 /*
 /*
- * Copyright (C) 2010-2014 jeanfi@gmail.com
+ * Copyright (C) 2010-2013 jeanfi@gmail.com
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License as
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License as
index ea2d6d1..34ebe23 100644 (file)
@@ -1,5 +1,5 @@
 /*
 /*
- * Copyright (C) 2010-2014 jeanfi@gmail.com
+ * Copyright (C) 2010-2013 jeanfi@gmail.com
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License as
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License as
index c586a2a..a08ccd3 100644 (file)
@@ -1,5 +1,5 @@
 /*
 /*
- * Copyright (C) 2010-2014 jeanfi@gmail.com
+ * Copyright (C) 2010-2013 jeanfi@gmail.com
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License as
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License as
index 35820f3..ed2df80 100644 (file)
@@ -1,5 +1,5 @@
 /*
 /*
- * Copyright (C) 2010-2014 jeanfi@gmail.com
+ * Copyright (C) 2010-2013 jeanfi@gmail.com
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License as
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License as
index 89a2177..ede84e6 100644 (file)
@@ -1,5 +1,5 @@
 /*
 /*
- * Copyright (C) 2010-2014 jeanfi@gmail.com
+ * Copyright (C) 2010-2013 jeanfi@gmail.com
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License as
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License as
@@ -80,7 +80,7 @@ static void print_version()
                 "This is free software: you are free to change and "
                 " redistribute it.\n"
                 "There is NO WARRANTY, to the extent permitted by law.\n"),
                 "This is free software: you are free to change and "
                 " redistribute it.\n"
                 "There is NO WARRANTY, to the extent permitted by law.\n"),
-              "2010-2014");
+              "2010-2013");
 }
 
 static void print_help()
 }
 
 static void print_help()
index 84b12d5..dd42e92 100644 (file)
@@ -1,5 +1,5 @@
 /*
 /*
- * Copyright (C) 2010-2014 jeanfi@gmail.com
+ * Copyright (C) 2010-2013 jeanfi@gmail.com
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License as
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License as
index df8fea5..8f60bcf 100644 (file)
@@ -1,5 +1,5 @@
 /*
 /*
- * Copyright (C) 2010-2014 jeanfi@gmail.com
+ * Copyright (C) 2010-2013 jeanfi@gmail.com
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License as
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License as
index 20560d3..01df5b5 100644 (file)
@@ -1,5 +1,5 @@
 .\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.43.3.
 .\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.43.3.
-.TH PSENSOR "1" "April 2014" "psensor 0.8.0.6" "User Commands"
+.TH PSENSOR "1" "October 2013" "psensor 0.8.0.4" "User Commands"
 .SH NAME
 psensor \- Temperature monitoring application
 .SH SYNOPSIS
 .SH NAME
 psensor \- Temperature monitoring application
 .SH SYNOPSIS
@@ -35,7 +35,7 @@ Report bugs to: jeanfi@gmail.com
 .PP
 psensor home page: <http://wpitchoune.net/psensor>
 .SH COPYRIGHT
 .PP
 psensor home page: <http://wpitchoune.net/psensor>
 .SH COPYRIGHT
-Copyright \(co 2010\-2014 jeanfi@gmail.com
+Copyright \(co 2010\-2013 jeanfi@gmail.com
 License GPLv2: GNU GPL version 2 or later <http://www.gnu.org/licenses/old\-licenses/gpl\-2.0.html>
 .br
 This is free software: you are free to change and  redistribute it.
 License GPLv2: GNU GPL version 2 or later <http://www.gnu.org/licenses/old\-licenses/gpl\-2.0.html>
 .br
 This is free software: you are free to change and  redistribute it.
index fac4391..177ee17 100644 (file)
@@ -1,4 +1,4 @@
-<!-- Copyright (C) 2012-2014 jeanfi@gmail.com                            -->
+<!-- Copyright (C) 2012-2013 jeanfi@gmail.com                            -->
 
 <!-- This program is free software; you can redistribute it and/or       -->
 <!-- modify it under the terms of the GNU General Public License as      -->
 
 <!-- This program is free software; you can redistribute it and/or       -->
 <!-- modify it under the terms of the GNU General Public License as      -->
index 32c182c..9bebb7a 100644 (file)
@@ -1,5 +1,5 @@
 /*
 /*
- * Copyright (C) 2010-2014 jeanfi@gmail.com
+ * Copyright (C) 2010-2013 jeanfi@gmail.com
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License as
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License as
index 8269479..312f4a1 100644 (file)
@@ -1,5 +1,5 @@
 /*
 /*
- * Copyright (C) 2010-2014 jeanfi@gmail.com
+ * Copyright (C) 2010-2013 jeanfi@gmail.com
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License as
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License as
index e149839..bab3d19 100644 (file)
@@ -1,5 +1,5 @@
 .\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.43.3.
 .\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.43.3.
-.TH PSENSOR-SERVER "1" "April 2014" "psensor-server 0.8.0.6" "User Commands"
+.TH PSENSOR-SERVER "1" "October 2013" "psensor-server 0.8.0.4" "User Commands"
 .SH NAME
 psensor-server \- Temperature and system monitoring Web server
 .SH SYNOPSIS
 .SH NAME
 psensor-server \- Temperature and system monitoring Web server
 .SH SYNOPSIS
index f4557d8..39e1f49 100644 (file)
@@ -1,5 +1,5 @@
 /*
 /*
- * Copyright (C) 2010-2014 jeanfi@gmail.com
+ * Copyright (C) 2010-2013 jeanfi@gmail.com
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License as
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License as
index 2ac33ee..8ce56c2 100644 (file)
@@ -1,5 +1,5 @@
 /*
 /*
- * Copyright (C) 2010-2014 jeanfi@gmail.com
+ * Copyright (C) 2010-2013 jeanfi@gmail.com
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License as
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License as
index a278a3a..81d793e 100644 (file)
@@ -1,5 +1,5 @@
 /*
 /*
- * Copyright (C) 2010-2014 jeanfi@gmail.com
+ * Copyright (C) 2010-2013 jeanfi@gmail.com
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License as
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License as
index 3330eb7..491cb91 100644 (file)
@@ -1,5 +1,5 @@
 /*
 /*
- * Copyright (C) 2010-2014 jeanfi@gmail.com
+ * Copyright (C) 2010-2013 jeanfi@gmail.com
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License as
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License as
index 967f31e..53aa4fb 100644 (file)
--- a/src/ui.c
+++ b/src/ui.c
@@ -1,5 +1,5 @@
 /*
 /*
- * Copyright (C) 2010-2014 jeanfi@gmail.com
+ * Copyright (C) 2010-2013 jeanfi@gmail.com
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License as
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License as
@@ -84,7 +84,7 @@ void ui_show_about_dialog()
                 _("Psensor is a GTK+ application for monitoring hardware "
                   "sensors"),
                 "copyright",
                 _("Psensor is a GTK+ application for monitoring hardware "
                   "sensors"),
                 "copyright",
-                _("Copyright(c) 2010-2014\njeanfi@gmail.com"),
+                _("Copyright(c) 2010-2013\njeanfi@gmail.com"),
                 "logo-icon-name", "psensor",
                 "program-name", "Psensor",
                 "title", _("About Psensor"),
                 "logo-icon-name", "psensor",
                 "program-name", "Psensor",
                 "title", _("About Psensor"),
index af17b78..a68a6c9 100644 (file)
--- a/src/ui.h
+++ b/src/ui.h
@@ -1,5 +1,5 @@
 /*
 /*
- * Copyright (C) 2010-2014 jeanfi@gmail.com
+ * Copyright (C) 2010-2013 jeanfi@gmail.com
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License as
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License as
index 49ca58f..31616a1 100644 (file)
@@ -1,5 +1,5 @@
 /*
 /*
- * Copyright (C) 2010-2014 jeanfi@gmail.com
+ * Copyright (C) 2010-2013 jeanfi@gmail.com
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License as
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License as
@@ -40,12 +40,17 @@ static int appindicator_supported = 1;
 static AppIndicator *indicator;
 static struct ui_psensor *ui_psensor;
 
 static AppIndicator *indicator;
 static struct ui_psensor *ui_psensor;
 
-void cb_menu_show(GtkMenuItem *mi, gpointer data)
+static void cb_menu_show(GtkMenuItem *mi, gpointer data)
 {
        ui_window_show((struct ui_psensor *)data);
 }
 
 {
        ui_window_show((struct ui_psensor *)data);
 }
 
-void ui_appindicator_cb_preferences(GtkMenuItem *mi, gpointer data)
+static void cb_menu_quit(GtkMenuItem *mi, gpointer data)
+{
+       ui_psensor_quit(data);
+}
+
+static void cb_menu_preferences(GtkMenuItem *mi, gpointer data)
 {
 #ifdef HAVE_APPINDICATOR_029
        gdk_threads_enter();
 {
 #ifdef HAVE_APPINDICATOR_029
        gdk_threads_enter();
@@ -58,7 +63,7 @@ void ui_appindicator_cb_preferences(GtkMenuItem *mi, gpointer data)
 #endif
 }
 
 #endif
 }
 
-void ui_appindicator_cb_sensor_preferences(GtkMenuItem *mi, gpointer data)
+static void cb_sensor_preferences(GtkMenuItem *mi, gpointer data)
 {
        struct ui_psensor *ui = data;
 
 {
        struct ui_psensor *ui = data;
 
@@ -74,6 +79,59 @@ void ui_appindicator_cb_sensor_preferences(GtkMenuItem *mi, gpointer data)
 #endif
 }
 
 #endif
 }
 
+static void cb_about(GtkMenuItem *mi, gpointer data)
+{
+       ui_show_about_dialog();
+}
+
+static const char *menu_desc =
+"<ui>"
+"  <popup name='MainMenu'>"
+"      <menuitem name='Show' action='ShowAction' />"
+"      <separator />"
+"      <separator />"
+"      <menuitem name='Preferences' action='PreferencesAction' />"
+"      <menuitem name='SensorPreferences' action='SensorPreferencesAction' />"
+"      <separator />"
+"      <menuitem name='About' action='AboutAction' />"
+"      <separator />"
+"      <menuitem name='Quit' action='QuitAction' />"
+"  </popup>"
+"</ui>";
+
+static GtkActionEntry entries[] = {
+       { "PsensorMenuAction", NULL, "_Psensor" },
+
+       { "ShowAction", NULL,
+         N_("_Show"), NULL,
+         N_("Show"),
+         G_CALLBACK(cb_menu_show) },
+
+       { "PreferencesAction", GTK_STOCK_PREFERENCES,
+         N_("_Preferences"), NULL,
+         N_("Preferences"),
+         G_CALLBACK(cb_menu_preferences) },
+
+       { "SensorPreferencesAction", GTK_STOCK_PREFERENCES,
+         N_("S_ensor Preferences"),
+         NULL,
+         N_("SensorPreferences"),
+         G_CALLBACK(cb_sensor_preferences) },
+
+       { "AboutAction", NULL,
+         N_("_About"),
+         NULL,
+         N_("About"),
+         G_CALLBACK(cb_about) },
+
+       { "QuitAction",
+         GTK_STOCK_QUIT,
+         N_("_Quit"),
+         NULL, N_("Quit"),
+         G_CALLBACK(cb_menu_quit) }
+};
+static guint n_entries = G_N_ELEMENTS(entries);
+
 static void
 update_menu_item(GtkMenuItem *item, struct psensor *s, int use_celcius)
 {
 static void
 update_menu_item(GtkMenuItem *item, struct psensor *s, int use_celcius)
 {
@@ -143,31 +201,27 @@ build_sensor_menu_items(const struct ui_psensor *ui,
 
 static GtkWidget *get_menu(struct ui_psensor *ui)
 {
 
 static GtkWidget *get_menu(struct ui_psensor *ui)
 {
+       GtkActionGroup *action_group;
+       GtkUIManager *menu_manager;
        GError *error;
        GtkMenu *menu;
        GError *error;
        GtkMenu *menu;
-       guint ok;
-       GtkBuilder *builder;
 
 
-       builder = gtk_builder_new();
+       action_group = gtk_action_group_new("PsensorActions");
+       gtk_action_group_set_translation_domain(action_group, PACKAGE);
+       menu_manager = gtk_ui_manager_new();
+
+       gtk_action_group_add_actions(action_group, entries, n_entries, ui);
+       gtk_ui_manager_insert_action_group(menu_manager, action_group, 0);
 
        error = NULL;
 
        error = NULL;
-       ok = gtk_builder_add_from_file
-               (builder,
-                PACKAGE_DATA_DIR G_DIR_SEPARATOR_S "psensor.glade",
-                &error);
-
-       if (!ok) {
-               log_printf(LOG_ERR, error->message);
-               g_error_free(error);
-               return NULL;
-       }
+       gtk_ui_manager_add_ui_from_string(menu_manager, menu_desc, -1, &error);
 
 
-       menu = GTK_MENU(gtk_builder_get_object(builder, "appindicator_menu"));
-       build_sensor_menu_items(ui, menu);
-       gtk_builder_connect_signals(builder, ui);
+       if (error)
+               g_error(_("building menus failed: %s"), error->message);
+
+       menu = GTK_MENU(gtk_ui_manager_get_widget(menu_manager, "/MainMenu"));
 
 
-       g_object_ref(G_OBJECT(menu));
-       g_object_unref(G_OBJECT(builder));
+       build_sensor_menu_items(ui, menu);
 
        return GTK_WIDGET(menu);
 }
 
        return GTK_WIDGET(menu);
 }
@@ -253,4 +307,5 @@ int is_appindicator_supported()
 void ui_appindicator_cleanup()
 {
        free(sensors);
 void ui_appindicator_cleanup()
 {
        free(sensors);
+       /* TODO: cleanup menu items. */
 }
 }
index 1dc682e..1ed263a 100644 (file)
@@ -1,5 +1,5 @@
 /*
 /*
- * Copyright (C) 2010-2014 jeanfi@gmail.com
+ * Copyright (C) 2010-2013 jeanfi@gmail.com
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License as
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License as
index d7f6eff..cae61f0 100644 (file)
@@ -1,5 +1,5 @@
 /*
 /*
- * Copyright (C) 2010-2014 jeanfi@gmail.com
+ * Copyright (C) 2010-2013 jeanfi@gmail.com
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License as
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License as
index 8d957f1..c73b2ed 100644 (file)
@@ -1,5 +1,5 @@
 /*
 /*
- * Copyright (C) 2010-2014 jeanfi@gmail.com
+ * Copyright (C) 2010-2013 jeanfi@gmail.com
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License as
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License as
index 0b9b41b..a50d6a1 100644 (file)
@@ -1,5 +1,5 @@
 /*
 /*
- * Copyright (C) 2010-2014 jeanfi@gmail.com
+ * Copyright (C) 2010-2013 jeanfi@gmail.com
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License as
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License as
index c53cd5d..d877d42 100644 (file)
@@ -1,5 +1,5 @@
 /*
 /*
- * Copyright (C) 2010-2014 jeanfi@gmail.com
+ * Copyright (C) 2010-2013 jeanfi@gmail.com
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License as
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License as
index 7e7217d..f55821c 100644 (file)
@@ -1,5 +1,5 @@
 /*
 /*
- * Copyright (C) 2010-2014 jeanfi@gmail.com
+ * Copyright (C) 2010-2013 jeanfi@gmail.com
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License as
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License as
index 82b66a1..f68fac8 100644 (file)
@@ -1,5 +1,5 @@
 /*
 /*
- * Copyright (C) 2010-2014 jeanfi@gmail.com
+ * Copyright (C) 2010-2013 jeanfi@gmail.com
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License as
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License as
index aae6556..b66748e 100644 (file)
@@ -1,5 +1,5 @@
 /*
 /*
- * Copyright (C) 2010-2014 jeanfi@gmail.com
+ * Copyright (C) 2010-2013 jeanfi@gmail.com
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License as
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License as
index 9670624..42c886f 100644 (file)
@@ -1,5 +1,5 @@
 /*
 /*
- * Copyright (C) 2010-2014 jeanfi@gmail.com
+ * Copyright (C) 2010-2013 jeanfi@gmail.com
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License as
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License as
index 1a0aa83..1c3ffb1 100644 (file)
@@ -1,5 +1,5 @@
 /*
 /*
- * Copyright (C) 2010-2014 jeanfi@gmail.com
+ * Copyright (C) 2010-2013 jeanfi@gmail.com
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License as
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License as
index 8e4d6c6..b565ecc 100644 (file)
@@ -1,5 +1,5 @@
 /*
 /*
- * Copyright (C) 2010-2014 jeanfi@gmail.com
+ * Copyright (C) 2010-2013 jeanfi@gmail.com
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License as
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License as
index 4337c53..ecf2655 100644 (file)
@@ -1,5 +1,5 @@
 /*
 /*
- * Copyright (C) 2010-2014 jeanfi@gmail.com
+ * Copyright (C) 2010-2013 jeanfi@gmail.com
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License as
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License as
index e23c743..e46b8d2 100644 (file)
@@ -1,5 +1,5 @@
 /*
 /*
- * Copyright (C) 2010-2014 jeanfi@gmail.com
+ * Copyright (C) 2010-2013 jeanfi@gmail.com
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License as
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License as
index ddaf75c..d39284b 100644 (file)
@@ -1,5 +1,5 @@
 /*
 /*
- * Copyright (C) 2010-2014 jeanfi@gmail.com
+ * Copyright (C) 2010-2013 jeanfi@gmail.com
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License as
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License as
index cd23300..d215f0f 100644 (file)
@@ -1,5 +1,5 @@
 /*
 /*
- * Copyright (C) 2010-2014 jeanfi@gmail.com
+ * Copyright (C) 2010-2013 jeanfi@gmail.com
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License as
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License as
index adeacc0..b9461d1 100644 (file)
@@ -1,5 +1,5 @@
 /*
 /*
- * Copyright (C) 2010-2014 jeanfi@gmail.com
+ * Copyright (C) 2010-2013 jeanfi@gmail.com
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License as
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License as
index 15045e8..4a40b1b 100644 (file)
@@ -1,5 +1,5 @@
 /*
 /*
- * Copyright (C) 2010-2014 jeanfi@gmail.com
+ * Copyright (C) 2010-2013 jeanfi@gmail.com
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License as
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License as
index bec8522..de61dcf 100644 (file)
@@ -1,13 +1,15 @@
 defaultwwwdir = $(pkgdatadir)/www
 defaultwww_DATA = \
        details.html \
 defaultwwwdir = $(pkgdatadir)/www
 defaultwww_DATA = \
        details.html \
-       favicon.ico \
        index.html \
        index.html \
-       jqplot.css \
+        excanvas.js \
+       favicon.ico \
+       monitor.html \
+       psensor.js \
        jqplot.dateAxisRenderer.js \
        jqplot.dateAxisRenderer.js \
+       jqplot.css \
        jqplot.js \
        jquery.js \
        jqplot.js \
        jquery.js \
-       psensor.js \
        style.css 
 
 EXTRA_DIST=$(defaultwww_DATA)
        style.css 
 
 EXTRA_DIST=$(defaultwww_DATA)
index dbffe57..ce82eb6 100644 (file)
@@ -254,13 +254,15 @@ top_srcdir = @top_srcdir@
 defaultwwwdir = $(pkgdatadir)/www
 defaultwww_DATA = \
        details.html \
 defaultwwwdir = $(pkgdatadir)/www
 defaultwww_DATA = \
        details.html \
-       favicon.ico \
        index.html \
        index.html \
-       jqplot.css \
+        excanvas.js \
+       favicon.ico \
+       monitor.html \
+       psensor.js \
        jqplot.dateAxisRenderer.js \
        jqplot.dateAxisRenderer.js \
+       jqplot.css \
        jqplot.js \
        jquery.js \
        jqplot.js \
        jquery.js \
-       psensor.js \
        style.css 
 
 EXTRA_DIST = $(defaultwww_DATA)
        style.css 
 
 EXTRA_DIST = $(defaultwww_DATA)
index 68656a0..3dabb65 100644 (file)
@@ -3,9 +3,15 @@
     <meta charset="utf-8">
     <title id="title">Sensor </title>
 
     <meta charset="utf-8">
     <title id="title">Sensor </title>
 
+    <link type="text/css"
+         rel="stylesheet"
+href="http://fonts.googleapis.com/css?family=Ubuntu:regular,bold&subset=Latin">
+
     <link href="jqplot.css" rel="stylesheet" type="text/css"/> 
     <link href="style.css" rel="stylesheet" type="text/css"/>  
 
     <link href="jqplot.css" rel="stylesheet" type="text/css"/> 
     <link href="style.css" rel="stylesheet" type="text/css"/>  
 
+<!--[if lt IE 9]><script language="javascript" type="text/javascript" src="excanvas.js"></script><![endif]-->
+
     <script src="jquery.js" type="text/javascript"></script>
     <script src="jqplot.js" type="text/javascript"></script>
     <script src="jqplot.dateAxisRenderer.js" type="text/javascript"></script>
     <script src="jquery.js" type="text/javascript"></script>
     <script src="jqplot.js" type="text/javascript"></script>
     <script src="jqplot.dateAxisRenderer.js" type="text/javascript"></script>
     </script>
   </head>
   <body>
     </script>
   </head>
   <body>
-
-    <div id="page">
       <div id="menu">
        <ul id="menu-list">
       <div id="menu">
        <ul id="menu-list">
-         <li><a href="index.html">Summary</a></li>
+         <li><em><a href="monitor.html">All</a></em></li>
        </ul>
       </div>
       
       <div id="main">
        <h1></h1>
        
        </ul>
       </div>
       
       <div id="main">
        <h1></h1>
        
-       <div class="chart" id="chart"></div>    
+       <div class="chart" id="chart"></div>
+       
       </div>
       
       <div id="footer">
        Generated by <a href='http://wpitchoune.net/psensor'>psensor-server</a>
       </div>
       </div>
       
       <div id="footer">
        Generated by <a href='http://wpitchoune.net/psensor'>psensor-server</a>
       </div>
-    </div>
   </body>
 </html>
   </body>
 </html>
diff --git a/www/excanvas.js b/www/excanvas.js
new file mode 100644 (file)
index 0000000..c8fe662
--- /dev/null
@@ -0,0 +1,30 @@
+/**
+ * jqPlot
+ * Pure JavaScript plotting plugin using jQuery
+ *
+ * Version: @VERSION
+ *
+ * Copyright (c) 2009-2011 Chris Leonello
+ * jqPlot is currently available for use in all personal or commercial projects 
+ * under both the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL 
+ * version 2.0 (http://www.gnu.org/licenses/gpl-2.0.html) licenses. This means that you can 
+ * choose the license that best suits your project and use it accordingly. 
+ *
+ * Although not required, the author would appreciate an email letting him 
+ * know of any substantial use of jqPlot.  You can reach the author at: 
+ * chris at jqplot dot com or see http://www.jqplot.com/info.php .
+ *
+ * If you are feeling kind and generous, consider supporting the project by
+ * making a donation at: http://www.jqplot.com/donate.php .
+ *
+ * sprintf functions contained in jqplot.sprintf.js by Ash Searle:
+ *
+ *     version 2007.04.27
+ *     author Ash Searle
+ *     http://hexmen.com/blog/2007/03/printf-sprintf/
+ *     http://hexmen.com/js/sprintf.js
+ *     The author (Ash Searle) has placed this code in the public domain:
+ *     "This code is unrestricted: you are free to use it however you like."
+ * 
+ */
+if(!document.createElement("canvas").getContext){(function(){var ab=Math;var n=ab.round;var l=ab.sin;var A=ab.cos;var H=ab.abs;var N=ab.sqrt;var d=10;var f=d/2;var z=+navigator.userAgent.match(/MSIE ([\d.]+)?/)[1];function y(){return this.context_||(this.context_=new D(this))}var t=Array.prototype.slice;function g(j,m,p){var i=t.call(arguments,2);return function(){return j.apply(m,i.concat(t.call(arguments)))}}function af(i){return String(i).replace(/&/g,"&amp;").replace(/"/g,"&quot;")}function Y(m,j,i){if(!m.namespaces[j]){m.namespaces.add(j,i,"#default#VML")}}function R(j){Y(j,"g_vml_","urn:schemas-microsoft-com:vml");Y(j,"g_o_","urn:schemas-microsoft-com:office:office");if(!j.styleSheets.ex_canvas_){var i=j.createStyleSheet();i.owningElement.id="ex_canvas_";i.cssText="canvas{display:inline-block;overflow:hidden;text-align:left;width:300px;height:150px}"}}R(document);var e={init:function(i){var j=i||document;j.createElement("canvas");j.attachEvent("onreadystatechange",g(this.init_,this,j))},init_:function(p){var m=p.getElementsByTagName("canvas");for(var j=0;j<m.length;j++){this.initElement(m[j])}},initElement:function(j){if(!j.getContext){j.getContext=y;R(j.ownerDocument);j.innerHTML="";j.attachEvent("onpropertychange",x);j.attachEvent("onresize",W);var i=j.attributes;if(i.width&&i.width.specified){j.style.width=i.width.nodeValue+"px"}else{j.width=j.clientWidth}if(i.height&&i.height.specified){j.style.height=i.height.nodeValue+"px"}else{j.height=j.clientHeight}}return j},uninitElement:function(j){if(j.getContext){var i=j.getContext();delete i.element_;delete i.canvas;j.innerHTML="";j.context_=null;j.getContext=null;j.detachEvent("onpropertychange",x);j.detachEvent("onresize",W)}}};function x(j){var i=j.srcElement;switch(j.propertyName){case"width":i.getContext().clearRect();i.style.width=i.attributes.width.nodeValue+"px";i.firstChild.style.width=i.clientWidth+"px";break;case"height":i.getContext().clearRect();i.style.height=i.attributes.height.nodeValue+"px";i.firstChild.style.height=i.clientHeight+"px";break}}function W(j){var i=j.srcElement;if(i.firstChild){i.firstChild.style.width=i.clientWidth+"px";i.firstChild.style.height=i.clientHeight+"px"}}e.init();var k=[];for(var ae=0;ae<16;ae++){for(var ad=0;ad<16;ad++){k[ae*16+ad]=ae.toString(16)+ad.toString(16)}}function B(){return[[1,0,0],[0,1,0],[0,0,1]]}function J(p,m){var j=B();for(var i=0;i<3;i++){for(var ah=0;ah<3;ah++){var Z=0;for(var ag=0;ag<3;ag++){Z+=p[i][ag]*m[ag][ah]}j[i][ah]=Z}}return j}function v(j,i){i.fillStyle=j.fillStyle;i.lineCap=j.lineCap;i.lineJoin=j.lineJoin;i.lineWidth=j.lineWidth;i.miterLimit=j.miterLimit;i.shadowBlur=j.shadowBlur;i.shadowColor=j.shadowColor;i.shadowOffsetX=j.shadowOffsetX;i.shadowOffsetY=j.shadowOffsetY;i.strokeStyle=j.strokeStyle;i.globalAlpha=j.globalAlpha;i.font=j.font;i.textAlign=j.textAlign;i.textBaseline=j.textBaseline;i.arcScaleX_=j.arcScaleX_;i.arcScaleY_=j.arcScaleY_;i.lineScale_=j.lineScale_}var b={aliceblue:"#F0F8FF",antiquewhite:"#FAEBD7",aquamarine:"#7FFFD4",azure:"#F0FFFF",beige:"#F5F5DC",bisque:"#FFE4C4",black:"#000000",blanchedalmond:"#FFEBCD",blueviolet:"#8A2BE2",brown:"#A52A2A",burlywood:"#DEB887",cadetblue:"#5F9EA0",chartreuse:"#7FFF00",chocolate:"#D2691E",coral:"#FF7F50",cornflowerblue:"#6495ED",cornsilk:"#FFF8DC",crimson:"#DC143C",cyan:"#00FFFF",darkblue:"#00008B",darkcyan:"#008B8B",darkgoldenrod:"#B8860B",darkgray:"#A9A9A9",darkgreen:"#006400",darkgrey:"#A9A9A9",darkkhaki:"#BDB76B",darkmagenta:"#8B008B",darkolivegreen:"#556B2F",darkorange:"#FF8C00",darkorchid:"#9932CC",darkred:"#8B0000",darksalmon:"#E9967A",darkseagreen:"#8FBC8F",darkslateblue:"#483D8B",darkslategray:"#2F4F4F",darkslategrey:"#2F4F4F",darkturquoise:"#00CED1",darkviolet:"#9400D3",deeppink:"#FF1493",deepskyblue:"#00BFFF",dimgray:"#696969",dimgrey:"#696969",dodgerblue:"#1E90FF",firebrick:"#B22222",floralwhite:"#FFFAF0",forestgreen:"#228B22",gainsboro:"#DCDCDC",ghostwhite:"#F8F8FF",gold:"#FFD700",goldenrod:"#DAA520",grey:"#808080",greenyellow:"#ADFF2F",honeydew:"#F0FFF0",hotpink:"#FF69B4",indianred:"#CD5C5C",indigo:"#4B0082",ivory:"#FFFFF0",khaki:"#F0E68C",lavender:"#E6E6FA",lavenderblush:"#FFF0F5",lawngreen:"#7CFC00",lemonchiffon:"#FFFACD",lightblue:"#ADD8E6",lightcoral:"#F08080",lightcyan:"#E0FFFF",lightgoldenrodyellow:"#FAFAD2",lightgreen:"#90EE90",lightgrey:"#D3D3D3",lightpink:"#FFB6C1",lightsalmon:"#FFA07A",lightseagreen:"#20B2AA",lightskyblue:"#87CEFA",lightslategray:"#778899",lightslategrey:"#778899",lightsteelblue:"#B0C4DE",lightyellow:"#FFFFE0",limegreen:"#32CD32",linen:"#FAF0E6",magenta:"#FF00FF",mediumaquamarine:"#66CDAA",mediumblue:"#0000CD",mediumorchid:"#BA55D3",mediumpurple:"#9370DB",mediumseagreen:"#3CB371",mediumslateblue:"#7B68EE",mediumspringgreen:"#00FA9A",mediumturquoise:"#48D1CC",mediumvioletred:"#C71585",midnightblue:"#191970",mintcream:"#F5FFFA",mistyrose:"#FFE4E1",moccasin:"#FFE4B5",navajowhite:"#FFDEAD",oldlace:"#FDF5E6",olivedrab:"#6B8E23",orange:"#FFA500",orangered:"#FF4500",orchid:"#DA70D6",palegoldenrod:"#EEE8AA",palegreen:"#98FB98",paleturquoise:"#AFEEEE",palevioletred:"#DB7093",papayawhip:"#FFEFD5",peachpuff:"#FFDAB9",peru:"#CD853F",pink:"#FFC0CB",plum:"#DDA0DD",powderblue:"#B0E0E6",rosybrown:"#BC8F8F",royalblue:"#4169E1",saddlebrown:"#8B4513",salmon:"#FA8072",sandybrown:"#F4A460",seagreen:"#2E8B57",seashell:"#FFF5EE",sienna:"#A0522D",skyblue:"#87CEEB",slateblue:"#6A5ACD",slategray:"#708090",slategrey:"#708090",snow:"#FFFAFA",springgreen:"#00FF7F",steelblue:"#4682B4",tan:"#D2B48C",thistle:"#D8BFD8",tomato:"#FF6347",turquoise:"#40E0D0",violet:"#EE82EE",wheat:"#F5DEB3",whitesmoke:"#F5F5F5",yellowgreen:"#9ACD32"};function M(j){var p=j.indexOf("(",3);var i=j.indexOf(")",p+1);var m=j.substring(p+1,i).split(",");if(m.length!=4||j.charAt(3)!="a"){m[3]=1}return m}function c(i){return parseFloat(i)/100}function r(j,m,i){return Math.min(i,Math.max(m,j))}function I(ag){var i,ai,aj,ah,ak,Z;ah=parseFloat(ag[0])/360%360;if(ah<0){ah++}ak=r(c(ag[1]),0,1);Z=r(c(ag[2]),0,1);if(ak==0){i=ai=aj=Z}else{var j=Z<0.5?Z*(1+ak):Z+ak-Z*ak;var m=2*Z-j;i=a(m,j,ah+1/3);ai=a(m,j,ah);aj=a(m,j,ah-1/3)}return"#"+k[Math.floor(i*255)]+k[Math.floor(ai*255)]+k[Math.floor(aj*255)]}function a(j,i,m){if(m<0){m++}if(m>1){m--}if(6*m<1){return j+(i-j)*6*m}else{if(2*m<1){return i}else{if(3*m<2){return j+(i-j)*(2/3-m)*6}else{return j}}}}var C={};function F(j){if(j in C){return C[j]}var ag,Z=1;j=String(j);if(j.charAt(0)=="#"){ag=j}else{if(/^rgb/.test(j)){var p=M(j);var ag="#",ah;for(var m=0;m<3;m++){if(p[m].indexOf("%")!=-1){ah=Math.floor(c(p[m])*255)}else{ah=+p[m]}ag+=k[r(ah,0,255)]}Z=+p[3]}else{if(/^hsl/.test(j)){var p=M(j);ag=I(p);Z=p[3]}else{ag=b[j]||j}}}return C[j]={color:ag,alpha:Z}}var o={style:"normal",variant:"normal",weight:"normal",size:10,family:"sans-serif"};var L={};function E(i){if(L[i]){return L[i]}var p=document.createElement("div");var m=p.style;try{m.font=i}catch(j){}return L[i]={style:m.fontStyle||o.style,variant:m.fontVariant||o.variant,weight:m.fontWeight||o.weight,size:m.fontSize||o.size,family:m.fontFamily||o.family}}function u(m,j){var i={};for(var ah in m){i[ah]=m[ah]}var ag=parseFloat(j.currentStyle.fontSize),Z=parseFloat(m.size);if(typeof m.size=="number"){i.size=m.size}else{if(m.size.indexOf("px")!=-1){i.size=Z}else{if(m.size.indexOf("em")!=-1){i.size=ag*Z}else{if(m.size.indexOf("%")!=-1){i.size=(ag/100)*Z}else{if(m.size.indexOf("pt")!=-1){i.size=Z/0.75}else{i.size=ag}}}}}i.size*=0.981;return i}function ac(i){return i.style+" "+i.variant+" "+i.weight+" "+i.size+"px "+i.family}var s={butt:"flat",round:"round"};function S(i){return s[i]||"square"}function D(i){this.m_=B();this.mStack_=[];this.aStack_=[];this.currentPath_=[];this.strokeStyle="#000";this.fillStyle="#000";this.lineWidth=1;this.lineJoin="miter";this.lineCap="butt";this.miterLimit=d*1;this.globalAlpha=1;this.font="10px sans-serif";this.textAlign="left";this.textBaseline="alphabetic";this.canvas=i;var m="width:"+i.clientWidth+"px;height:"+i.clientHeight+"px;overflow:hidden;position:absolute";var j=i.ownerDocument.createElement("div");j.style.cssText=m;i.appendChild(j);var p=j.cloneNode(false);p.style.backgroundColor="red";p.style.filter="alpha(opacity=0)";i.appendChild(p);this.element_=j;this.arcScaleX_=1;this.arcScaleY_=1;this.lineScale_=1}var q=D.prototype;q.clearRect=function(){if(this.textMeasureEl_){this.textMeasureEl_.removeNode(true);this.textMeasureEl_=null}this.element_.innerHTML=""};q.beginPath=function(){this.currentPath_=[]};q.moveTo=function(j,i){var m=V(this,j,i);this.currentPath_.push({type:"moveTo",x:m.x,y:m.y});this.currentX_=m.x;this.currentY_=m.y};q.lineTo=function(j,i){var m=V(this,j,i);this.currentPath_.push({type:"lineTo",x:m.x,y:m.y});this.currentX_=m.x;this.currentY_=m.y};q.bezierCurveTo=function(m,j,ak,aj,ai,ag){var i=V(this,ai,ag);var ah=V(this,m,j);var Z=V(this,ak,aj);K(this,ah,Z,i)};function K(i,Z,m,j){i.currentPath_.push({type:"bezierCurveTo",cp1x:Z.x,cp1y:Z.y,cp2x:m.x,cp2y:m.y,x:j.x,y:j.y});i.currentX_=j.x;i.currentY_=j.y}q.quadraticCurveTo=function(ai,m,j,i){var ah=V(this,ai,m);var ag=V(this,j,i);var aj={x:this.currentX_+2/3*(ah.x-this.currentX_),y:this.currentY_+2/3*(ah.y-this.currentY_)};var Z={x:aj.x+(ag.x-this.currentX_)/3,y:aj.y+(ag.y-this.currentY_)/3};K(this,aj,Z,ag)};q.arc=function(al,aj,ak,ag,j,m){ak*=d;var ap=m?"at":"wa";var am=al+A(ag)*ak-f;var ao=aj+l(ag)*ak-f;var i=al+A(j)*ak-f;var an=aj+l(j)*ak-f;if(am==i&&!m){am+=0.125}var Z=V(this,al,aj);var ai=V(this,am,ao);var ah=V(this,i,an);this.currentPath_.push({type:ap,x:Z.x,y:Z.y,radius:ak,xStart:ai.x,yStart:ai.y,xEnd:ah.x,yEnd:ah.y})};q.rect=function(m,j,i,p){this.moveTo(m,j);this.lineTo(m+i,j);this.lineTo(m+i,j+p);this.lineTo(m,j+p);this.closePath()};q.strokeRect=function(m,j,i,p){var Z=this.currentPath_;this.beginPath();this.moveTo(m,j);this.lineTo(m+i,j);this.lineTo(m+i,j+p);this.lineTo(m,j+p);this.closePath();this.stroke();this.currentPath_=Z};q.fillRect=function(m,j,i,p){var Z=this.currentPath_;this.beginPath();this.moveTo(m,j);this.lineTo(m+i,j);this.lineTo(m+i,j+p);this.lineTo(m,j+p);this.closePath();this.fill();this.currentPath_=Z};q.createLinearGradient=function(j,p,i,m){var Z=new U("gradient");Z.x0_=j;Z.y0_=p;Z.x1_=i;Z.y1_=m;return Z};q.createRadialGradient=function(p,ag,m,j,Z,i){var ah=new U("gradientradial");ah.x0_=p;ah.y0_=ag;ah.r0_=m;ah.x1_=j;ah.y1_=Z;ah.r1_=i;return ah};q.drawImage=function(aq,m){var aj,ah,al,ay,ao,am,at,aA;var ak=aq.runtimeStyle.width;var ap=aq.runtimeStyle.height;aq.runtimeStyle.width="auto";aq.runtimeStyle.height="auto";var ai=aq.width;var aw=aq.height;aq.runtimeStyle.width=ak;aq.runtimeStyle.height=ap;if(arguments.length==3){aj=arguments[1];ah=arguments[2];ao=am=0;at=al=ai;aA=ay=aw}else{if(arguments.length==5){aj=arguments[1];ah=arguments[2];al=arguments[3];ay=arguments[4];ao=am=0;at=ai;aA=aw}else{if(arguments.length==9){ao=arguments[1];am=arguments[2];at=arguments[3];aA=arguments[4];aj=arguments[5];ah=arguments[6];al=arguments[7];ay=arguments[8]}else{throw Error("Invalid number of arguments")}}}var az=V(this,aj,ah);var p=at/2;var j=aA/2;var ax=[];var i=10;var ag=10;ax.push(" <g_vml_:group",' coordsize="',d*i,",",d*ag,'"',' coordorigin="0,0"',' style="width:',i,"px;height:",ag,"px;position:absolute;");if(this.m_[0][0]!=1||this.m_[0][1]||this.m_[1][1]!=1||this.m_[1][0]){var Z=[];Z.push("M11=",this.m_[0][0],",","M12=",this.m_[1][0],",","M21=",this.m_[0][1],",","M22=",this.m_[1][1],",","Dx=",n(az.x/d),",","Dy=",n(az.y/d),"");var av=az;var au=V(this,aj+al,ah);var ar=V(this,aj,ah+ay);var an=V(this,aj+al,ah+ay);av.x=ab.max(av.x,au.x,ar.x,an.x);av.y=ab.max(av.y,au.y,ar.y,an.y);ax.push("padding:0 ",n(av.x/d),"px ",n(av.y/d),"px 0;filter:progid:DXImageTransform.Microsoft.Matrix(",Z.join(""),", sizingmethod='clip');")}else{ax.push("top:",n(az.y/d),"px;left:",n(az.x/d),"px;")}ax.push(' ">','<g_vml_:image src="',aq.src,'"',' style="width:',d*al,"px;"," height:",d*ay,'px"',' cropleft="',ao/ai,'"',' croptop="',am/aw,'"',' cropright="',(ai-ao-at)/ai,'"',' cropbottom="',(aw-am-aA)/aw,'"'," />","</g_vml_:group>");this.element_.insertAdjacentHTML("BeforeEnd",ax.join(""))};q.stroke=function(al){var aj=[];var Z=false;var m=10;var am=10;aj.push("<g_vml_:shape",' filled="',!!al,'"',' style="position:absolute;width:',m,"px;height:",am,'px;"',' coordorigin="0,0"',' coordsize="',d*m,",",d*am,'"',' stroked="',!al,'"',' path="');var an=false;var ag={x:null,y:null};var ak={x:null,y:null};for(var ah=0;ah<this.currentPath_.length;ah++){var j=this.currentPath_[ah];var ai;switch(j.type){case"moveTo":ai=j;aj.push(" m ",n(j.x),",",n(j.y));break;case"lineTo":aj.push(" l ",n(j.x),",",n(j.y));break;case"close":aj.push(" x ");j=null;break;case"bezierCurveTo":aj.push(" c ",n(j.cp1x),",",n(j.cp1y),",",n(j.cp2x),",",n(j.cp2y),",",n(j.x),",",n(j.y));break;case"at":case"wa":aj.push(" ",j.type," ",n(j.x-this.arcScaleX_*j.radius),",",n(j.y-this.arcScaleY_*j.radius)," ",n(j.x+this.arcScaleX_*j.radius),",",n(j.y+this.arcScaleY_*j.radius)," ",n(j.xStart),",",n(j.yStart)," ",n(j.xEnd),",",n(j.yEnd));break}if(j){if(ag.x==null||j.x<ag.x){ag.x=j.x}if(ak.x==null||j.x>ak.x){ak.x=j.x}if(ag.y==null||j.y<ag.y){ag.y=j.y}if(ak.y==null||j.y>ak.y){ak.y=j.y}}}aj.push(' ">');if(!al){w(this,aj)}else{G(this,aj,ag,ak)}aj.push("</g_vml_:shape>");this.element_.insertAdjacentHTML("beforeEnd",aj.join(""))};function w(m,ag){var j=F(m.strokeStyle);var p=j.color;var Z=j.alpha*m.globalAlpha;var i=m.lineScale_*m.lineWidth;if(i<1){Z*=i}ag.push("<g_vml_:stroke",' opacity="',Z,'"',' joinstyle="',m.lineJoin,'"',' miterlimit="',m.miterLimit,'"',' endcap="',S(m.lineCap),'"',' weight="',i,'px"',' color="',p,'" />')}function G(aq,ai,aK,ar){var aj=aq.fillStyle;var aB=aq.arcScaleX_;var aA=aq.arcScaleY_;var j=ar.x-aK.x;var p=ar.y-aK.y;if(aj instanceof U){var an=0;var aF={x:0,y:0};var ax=0;var am=1;if(aj.type_=="gradient"){var al=aj.x0_/aB;var m=aj.y0_/aA;var ak=aj.x1_/aB;var aM=aj.y1_/aA;var aJ=V(aq,al,m);var aI=V(aq,ak,aM);var ag=aI.x-aJ.x;var Z=aI.y-aJ.y;an=Math.atan2(ag,Z)*180/Math.PI;if(an<0){an+=360}if(an<0.000001){an=0}}else{var aJ=V(aq,aj.x0_,aj.y0_);aF={x:(aJ.x-aK.x)/j,y:(aJ.y-aK.y)/p};j/=aB*d;p/=aA*d;var aD=ab.max(j,p);ax=2*aj.r0_/aD;am=2*aj.r1_/aD-ax}var av=aj.colors_;av.sort(function(aN,i){return aN.offset-i.offset});var ap=av.length;var au=av[0].color;var at=av[ap-1].color;var az=av[0].alpha*aq.globalAlpha;var ay=av[ap-1].alpha*aq.globalAlpha;var aE=[];for(var aH=0;aH<ap;aH++){var ao=av[aH];aE.push(ao.offset*am+ax+" "+ao.color)}ai.push('<g_vml_:fill type="',aj.type_,'"',' method="none" focus="100%"',' color="',au,'"',' color2="',at,'"',' colors="',aE.join(","),'"',' opacity="',ay,'"',' g_o_:opacity2="',az,'"',' angle="',an,'"',' focusposition="',aF.x,",",aF.y,'" />')}else{if(aj instanceof T){if(j&&p){var ah=-aK.x;var aC=-aK.y;ai.push("<g_vml_:fill",' position="',ah/j*aB*aB,",",aC/p*aA*aA,'"',' type="tile"',' src="',aj.src_,'" />')}}else{var aL=F(aq.fillStyle);var aw=aL.color;var aG=aL.alpha*aq.globalAlpha;ai.push('<g_vml_:fill color="',aw,'" opacity="',aG,'" />')}}}q.fill=function(){this.stroke(true)};q.closePath=function(){this.currentPath_.push({type:"close"})};function V(j,Z,p){var i=j.m_;return{x:d*(Z*i[0][0]+p*i[1][0]+i[2][0])-f,y:d*(Z*i[0][1]+p*i[1][1]+i[2][1])-f}}q.save=function(){var i={};v(this,i);this.aStack_.push(i);this.mStack_.push(this.m_);this.m_=J(B(),this.m_)};q.restore=function(){if(this.aStack_.length){v(this.aStack_.pop(),this);this.m_=this.mStack_.pop()}};function h(i){return isFinite(i[0][0])&&isFinite(i[0][1])&&isFinite(i[1][0])&&isFinite(i[1][1])&&isFinite(i[2][0])&&isFinite(i[2][1])}function aa(j,i,p){if(!h(i)){return}j.m_=i;if(p){var Z=i[0][0]*i[1][1]-i[0][1]*i[1][0];j.lineScale_=N(H(Z))}}q.translate=function(m,j){var i=[[1,0,0],[0,1,0],[m,j,1]];aa(this,J(i,this.m_),false)};q.rotate=function(j){var p=A(j);var m=l(j);var i=[[p,m,0],[-m,p,0],[0,0,1]];aa(this,J(i,this.m_),false)};q.scale=function(m,j){this.arcScaleX_*=m;this.arcScaleY_*=j;var i=[[m,0,0],[0,j,0],[0,0,1]];aa(this,J(i,this.m_),true)};q.transform=function(Z,p,ah,ag,j,i){var m=[[Z,p,0],[ah,ag,0],[j,i,1]];aa(this,J(m,this.m_),true)};q.setTransform=function(ag,Z,ai,ah,p,j){var i=[[ag,Z,0],[ai,ah,0],[p,j,1]];aa(this,i,true)};q.drawText_=function(am,ak,aj,ap,ai){var ao=this.m_,at=1000,j=0,ar=at,ah={x:0,y:0},ag=[];var i=u(E(this.font),this.element_);var p=ac(i);var au=this.element_.currentStyle;var Z=this.textAlign.toLowerCase();switch(Z){case"left":case"center":case"right":break;case"end":Z=au.direction=="ltr"?"right":"left";break;case"start":Z=au.direction=="rtl"?"right":"left";break;default:Z="left"}switch(this.textBaseline){case"hanging":case"top":ah.y=i.size/1.75;break;case"middle":break;default:case null:case"alphabetic":case"ideographic":case"bottom":ah.y=-i.size/2.25;break}switch(Z){case"right":j=at;ar=0.05;break;case"center":j=ar=at/2;break}var aq=V(this,ak+ah.x,aj+ah.y);ag.push('<g_vml_:line from="',-j,' 0" to="',ar,' 0.05" ',' coordsize="100 100" coordorigin="0 0"',' filled="',!ai,'" stroked="',!!ai,'" style="position:absolute;width:1px;height:1px;">');if(ai){w(this,ag)}else{G(this,ag,{x:-j,y:0},{x:ar,y:i.size})}var an=ao[0][0].toFixed(3)+","+ao[1][0].toFixed(3)+","+ao[0][1].toFixed(3)+","+ao[1][1].toFixed(3)+",0,0";var al=n(aq.x/d)+","+n(aq.y/d);ag.push('<g_vml_:skew on="t" matrix="',an,'" ',' offset="',al,'" origin="',j,' 0" />','<g_vml_:path textpathok="true" />','<g_vml_:textpath on="true" string="',af(am),'" style="v-text-align:',Z,";font:",af(p),'" /></g_vml_:line>');this.element_.insertAdjacentHTML("beforeEnd",ag.join(""))};q.fillText=function(m,i,p,j){this.drawText_(m,i,p,j,false)};q.strokeText=function(m,i,p,j){this.drawText_(m,i,p,j,true)};q.measureText=function(m){if(!this.textMeasureEl_){var i='<span style="position:absolute;top:-20000px;left:0;padding:0;margin:0;border:none;white-space:pre;"></span>';this.element_.insertAdjacentHTML("beforeEnd",i);this.textMeasureEl_=this.element_.lastChild}var j=this.element_.ownerDocument;this.textMeasureEl_.innerHTML="";this.textMeasureEl_.style.font=this.font;this.textMeasureEl_.appendChild(j.createTextNode(m));return{width:this.textMeasureEl_.offsetWidth}};q.clip=function(){};q.arcTo=function(){};q.createPattern=function(j,i){return new T(j,i)};function U(i){this.type_=i;this.x0_=0;this.y0_=0;this.r0_=0;this.x1_=0;this.y1_=0;this.r1_=0;this.colors_=[]}U.prototype.addColorStop=function(j,i){i=F(i);this.colors_.push({offset:j,color:i.color,alpha:i.alpha})};function T(j,i){Q(j);switch(i){case"repeat":case null:case"":this.repetition_="repeat";break;case"repeat-x":case"repeat-y":case"no-repeat":this.repetition_=i;break;default:O("SYNTAX_ERR")}this.src_=j.src;this.width_=j.width;this.height_=j.height}function O(i){throw new P(i)}function Q(i){if(!i||i.nodeType!=1||i.tagName!="IMG"){O("TYPE_MISMATCH_ERR")}if(i.readyState!="complete"){O("INVALID_STATE_ERR")}}function P(i){this.code=this[i];this.message=i+": DOM Exception "+this.code}var X=P.prototype=new Error;X.INDEX_SIZE_ERR=1;X.DOMSTRING_SIZE_ERR=2;X.HIERARCHY_REQUEST_ERR=3;X.WRONG_DOCUMENT_ERR=4;X.INVALID_CHARACTER_ERR=5;X.NO_DATA_ALLOWED_ERR=6;X.NO_MODIFICATION_ALLOWED_ERR=7;X.NOT_FOUND_ERR=8;X.NOT_SUPPORTED_ERR=9;X.INUSE_ATTRIBUTE_ERR=10;X.INVALID_STATE_ERR=11;X.SYNTAX_ERR=12;X.INVALID_MODIFICATION_ERR=13;X.NAMESPACE_ERR=14;X.INVALID_ACCESS_ERR=15;X.VALIDATION_ERR=16;X.TYPE_MISMATCH_ERR=17;G_vmlCanvasManager=e;CanvasRenderingContext2D=D;CanvasGradient=U;CanvasPattern=T;DOMException=P})()};
\ No newline at end of file
index 722024d..4c57443 100644 (file)
 <html>
   <head>
 <html>
   <head>
-    <meta charset="utf-8">
-    <title>Psensor Server Monitoring</title>
-
+    <title>Psensor Server</title>
+    <link type="text/css" rel="stylesheet" href="http://fonts.googleapis.com/css?family=Ubuntu:regular,bold&subset=Latin">
     <link type="text/css" href="style.css" rel="stylesheet" /> 
     <link type="text/css" href="style.css" rel="stylesheet" /> 
-    <script type="text/javascript" src="jquery.js"></script>
-    <script type="text/javascript" src="psensor.js"></script>
-    <script>  
-       $(document).ready(function() {          
-               update_menu();
-
-               update_summary_sensors();
-               update_summary_sysinfo();      
-
-               $(document).ready(function() {
-                       setInterval(function() {
-                               update_summary_sensors();
-                               update_summary_sysinfo();
-                       }, 5000);
-               });
-         
-
-      });
-    </script>
   </head>
   <body>
 
   </head>
   <body>
 
-    <div id="page">
-      <div id="menu">
-       <ul id="menu-list">
-         <li><a href="index.html">Summary</a></li>
-       </ul>
+    <div class='page'>
+      <div class='page-header'>
+       <h1>Psensor Server</h1>
       </div>
       
       </div>
       
-      <div id="main">
-       <h1>System Monitoring</h1>
-       
-       <p><em>Uptime</em>: <span id='uptime'></span></p>
-       
-       <h2><a name="cpu">CPU</a></h2>
-       
-       <table id='cpu'>
-         <thead>
-           <tr>
-             <th>Current usage</th>
-             <th>Load 1mn</th>
-             <th>Load 5mn</th>
-             <th>Load 15mn</th>
-           </tr>
-         </thead>
-         <tbody></tbody>
-       </table>
+      <div class='page-content'>
+       <p>Go to the <a href='monitor.html'>Monitoring page</a></p>
        
        
-       <h2><a name="memory">Memory</a></h2>
-       
-       <table>
-         <thead>
-           <tr>
-             <th></th>
-             <th>Total</th>
-             <th>Used</th>
-             <th>Free</th>
-             <th>Shared</th>
-             <th>Buffer</th>
-           </tr>
-         </thead>
-         <tbody>
-           <tr id='memory'></tr>
-           <tr id='swap'></tr>
-         </tbody>
-       </table>
-       
-       <h2><a name="network">Network</a></h2>
-       
-       <table id='net'>
-         <thead>
-           <tr>
-             <th>Interface</th>
-             <th>Bytes In</th>
-             <th>Bytes Out</th>
-           </tr>
-         </thead>
-         <tbody>
-         </tbody>
-       </table>
-       
-       <h2><a name="sensors">Sensors</a></h2>
-       
-       <table id='sensors'>
-         <thead>
-           <tr>
-             <th>Name</th>
-             <th>Value</th>
-             <th>Min</th>
-             <th>Max</th>
-             <th>Type</th>
-           </tr>
-         </thead>
-         <tbody id ="sensors"></tbody>
-       </table>
-      </div>
-      
-      <div id="footer">
-       Generated by <a href='http://wpitchoune.net/psensor'>psensor-server</a>
       </div>
     </div>
       </div>
     </div>
+    
+    <div id="footer">Generated by <a href='http://wpitchoune.net/psensor'>psensor-server</a></div>
   </body>
 </html>
   </body>
 </html>
index f6768a6..d1b2fef 100644 (file)
@@ -1,259 +1 @@
-/*rules for the plot target div.  These will be cascaded down to all plot elements according to css rules*/
-.jqplot-target {
-    position: relative;
-    color: #666666;
-    font-family: "Trebuchet MS", Arial, Helvetica, sans-serif;
-    font-size: 1em;
-/*    height: 300px;
-    width: 400px;*/
-}
-
-/*rules applied to all axes*/
-.jqplot-axis {
-    font-size: 0.75em;
-}
-
-.jqplot-xaxis {
-    margin-top: 10px;
-}
-
-.jqplot-x2axis {
-    margin-bottom: 10px;
-}
-
-.jqplot-yaxis {
-    margin-right: 10px;
-}
-
-.jqplot-y2axis, .jqplot-y3axis, .jqplot-y4axis, .jqplot-y5axis, .jqplot-y6axis, .jqplot-y7axis, .jqplot-y8axis, .jqplot-y9axis, .jqplot-yMidAxis {
-    margin-left: 10px;
-    margin-right: 10px;
-}
-
-/*rules applied to all axis tick divs*/
-.jqplot-axis-tick, .jqplot-xaxis-tick, .jqplot-yaxis-tick, .jqplot-x2axis-tick, .jqplot-y2axis-tick, .jqplot-y3axis-tick, .jqplot-y4axis-tick, .jqplot-y5axis-tick, .jqplot-y6axis-tick, .jqplot-y7axis-tick, .jqplot-y8axis-tick, .jqplot-y9axis-tick, .jqplot-yMidAxis-tick {
-    position: absolute;
-    white-space: pre;
-}
-
-
-.jqplot-xaxis-tick {
-    top: 0px;
-    /* initial position untill tick is drawn in proper place */
-    left: 15px;
-/*    padding-top: 10px;*/
-    vertical-align: top;
-}
-
-.jqplot-x2axis-tick {
-    bottom: 0px;
-    /* initial position untill tick is drawn in proper place */
-    left: 15px;
-/*    padding-bottom: 10px;*/
-    vertical-align: bottom;
-}
-
-.jqplot-yaxis-tick {
-    right: 0px;
-    /* initial position untill tick is drawn in proper place */
-    top: 15px;
-/*    padding-right: 10px;*/
-    text-align: right;
-}
-
-.jqplot-yaxis-tick.jqplot-breakTick {
-    right: -20px;
-    margin-right: 0px;
-    padding:1px 5px 1px 5px;
-    /*background-color: white;*/
-    z-index: 2;
-    font-size: 1.5em;
-}
-
-.jqplot-y2axis-tick, .jqplot-y3axis-tick, .jqplot-y4axis-tick, .jqplot-y5axis-tick, .jqplot-y6axis-tick, .jqplot-y7axis-tick, .jqplot-y8axis-tick, .jqplot-y9axis-tick {
-    left: 0px;
-    /* initial position untill tick is drawn in proper place */
-    top: 15px;
-/*    padding-left: 10px;*/
-/*    padding-right: 15px;*/
-    text-align: left;
-}
-
-.jqplot-yMidAxis-tick {
-    text-align: center;
-    white-space: nowrap;
-}
-
-.jqplot-xaxis-label {
-    margin-top: 10px;
-    font-size: 11pt;
-    position: absolute;
-}
-
-.jqplot-x2axis-label {
-    margin-bottom: 10px;
-    font-size: 11pt;
-    position: absolute;
-}
-
-.jqplot-yaxis-label {
-    margin-right: 10px;
-/*    text-align: center;*/
-    font-size: 11pt;
-    position: absolute;
-}
-
-.jqplot-yMidAxis-label {
-    font-size: 11pt;
-    position: absolute;
-}
-
-.jqplot-y2axis-label, .jqplot-y3axis-label, .jqplot-y4axis-label, .jqplot-y5axis-label, .jqplot-y6axis-label, .jqplot-y7axis-label, .jqplot-y8axis-label, .jqplot-y9axis-label {
-/*    text-align: center;*/
-    font-size: 11pt;
-    margin-left: 10px;
-    position: absolute;
-}
-
-.jqplot-meterGauge-tick {
-    font-size: 0.75em;
-    color: #999999;
-}
-
-.jqplot-meterGauge-label {
-    font-size: 1em;
-    color: #999999;
-}
-
-table.jqplot-table-legend {
-    margin-top: 12px;
-    margin-bottom: 12px;
-    margin-left: 12px;
-    margin-right: 12px;
-}
-
-table.jqplot-table-legend, table.jqplot-cursor-legend {
-    background-color: rgba(255,255,255,0.6);
-    border: 1px solid #cccccc;
-    position: absolute;
-    font-size: 0.75em;
-}
-
-td.jqplot-table-legend {
-    vertical-align:middle;
-}
-
-/*
-These rules could be used instead of assigning
-element styles and relying on js object properties.
-*/
-
-/*
-td.jqplot-table-legend-swatch {
-    padding-top: 0.5em;
-    text-align: center;
-}
-
-tr.jqplot-table-legend:first td.jqplot-table-legend-swatch {
-    padding-top: 0px;
-}
-*/
-
-td.jqplot-seriesToggle:hover, td.jqplot-seriesToggle:active {
-    cursor: pointer;
-}
-
-.jqplot-table-legend .jqplot-series-hidden {
-    text-decoration: line-through;
-}
-
-div.jqplot-table-legend-swatch-outline {
-    border: 1px solid #cccccc;
-    padding:1px;
-}
-
-div.jqplot-table-legend-swatch {
-    width:0px;
-    height:0px;
-    border-top-width: 5px;
-    border-bottom-width: 5px;
-    border-left-width: 6px;
-    border-right-width: 6px;
-    border-top-style: solid;
-    border-bottom-style: solid;
-    border-left-style: solid;
-    border-right-style: solid;
-}
-
-.jqplot-title {
-    top: 0px;
-    left: 0px;
-    padding-bottom: 0.5em;
-    font-size: 1.2em;
-}
-
-table.jqplot-cursor-tooltip {
-    border: 1px solid #cccccc;
-    font-size: 0.75em;
-}
-
-
-.jqplot-cursor-tooltip {
-    border: 1px solid #cccccc;
-    font-size: 0.75em;
-    white-space: nowrap;
-    background: rgba(208,208,208,0.5);
-    padding: 1px;
-}
-
-.jqplot-highlighter-tooltip, .jqplot-canvasOverlay-tooltip {
-    border: 1px solid #cccccc;
-    font-size: 0.75em;
-    white-space: nowrap;
-    background: rgba(208,208,208,0.5);
-    padding: 1px;
-}
-
-.jqplot-point-label {
-    font-size: 0.75em;
-    z-index: 2;
-}
-      
-td.jqplot-cursor-legend-swatch {
-    vertical-align: middle;
-    text-align: center;
-}
-
-div.jqplot-cursor-legend-swatch {
-    width: 1.2em;
-    height: 0.7em;
-}
-
-.jqplot-error {
-/*   Styles added to the plot target container when there is an error go here.*/
-    text-align: center;
-}
-
-.jqplot-error-message {
-/*    Styling of the custom error message div goes here.*/
-    position: relative;
-    top: 46%;
-    display: inline-block;
-}
-
-div.jqplot-bubble-label {
-    font-size: 0.8em;
-/*    background: rgba(90%, 90%, 90%, 0.15);*/
-    padding-left: 2px;
-    padding-right: 2px;
-    color: rgb(20%, 20%, 20%);
-}
-
-div.jqplot-bubble-label.jqplot-bubble-label-highlight {
-    background: rgba(90%, 90%, 90%, 0.7);
-}
-
-div.jqplot-noData-container {
-    text-align: center;
-    background-color: rgba(96%, 96%, 96%, 0.3);
-}
+.jqplot-target{position:relative;color:#666;font-family:"Trebuchet MS",Arial,Helvetica,sans-serif;font-size:1em;}.jqplot-axis{font-size:.75em;}.jqplot-xaxis{margin-top:10px;}.jqplot-x2axis{margin-bottom:10px;}.jqplot-yaxis{margin-right:10px;}.jqplot-y2axis,.jqplot-y3axis,.jqplot-y4axis,.jqplot-y5axis,.jqplot-y6axis,.jqplot-y7axis,.jqplot-y8axis,.jqplot-y9axis{margin-left:10px;margin-right:10px;}.jqplot-axis-tick,.jqplot-xaxis-tick,.jqplot-yaxis-tick,.jqplot-x2axis-tick,.jqplot-y2axis-tick,.jqplot-y3axis-tick,.jqplot-y4axis-tick,.jqplot-y5axis-tick,.jqplot-y6axis-tick,.jqplot-y7axis-tick,.jqplot-y8axis-tick,.jqplot-y9axis-tick{position:absolute;}.jqplot-xaxis-tick{top:0;left:15px;vertical-align:top;}.jqplot-x2axis-tick{bottom:0;left:15px;vertical-align:bottom;}.jqplot-yaxis-tick{right:0;top:15px;text-align:right;}.jqplot-yaxis-tick.jqplot-breakTick{right:-20px;margin-right:0;padding:1px 5px 1px 5px;z-index:2;font-size:1.5em;}.jqplot-y2axis-tick,.jqplot-y3axis-tick,.jqplot-y4axis-tick,.jqplot-y5axis-tick,.jqplot-y6axis-tick,.jqplot-y7axis-tick,.jqplot-y8axis-tick,.jqplot-y9axis-tick{left:0;top:15px;text-align:left;}.jqplot-meterGauge-tick{font-size:.75em;color:#999;}.jqplot-meterGauge-label{font-size:1em;color:#999;}.jqplot-xaxis-label{margin-top:10px;font-size:11pt;position:absolute;}.jqplot-x2axis-label{margin-bottom:10px;font-size:11pt;position:absolute;}.jqplot-yaxis-label{margin-right:10px;font-size:11pt;position:absolute;}.jqplot-y2axis-label,.jqplot-y3axis-label,.jqplot-y4axis-label,.jqplot-y5axis-label,.jqplot-y6axis-label,.jqplot-y7axis-label,.jqplot-y8axis-label,.jqplot-y9axis-label{font-size:11pt;position:absolute;}table.jqplot-table-legend{margin-top:12px;margin-bottom:12px;margin-left:12px;margin-right:12px;}table.jqplot-table-legend,table.jqplot-cursor-legend{background-color:rgba(255,255,255,0.6);border:1px solid #ccc;position:absolute;font-size:.75em;}td.jqplot-table-legend{vertical-align:middle;}td.jqplot-seriesToggle:hover,td.jqplot-seriesToggle:active{cursor:pointer;}td.jqplot-table-legend>div{border:1px solid #ccc;padding:1px;}div.jqplot-table-legend-swatch{width:0;height:0;border-top-width:5px;border-bottom-width:5px;border-left-width:6px;border-right-width:6px;border-top-style:solid;border-bottom-style:solid;border-left-style:solid;border-right-style:solid;}.jqplot-title{top:0;left:0;padding-bottom:.5em;font-size:1.2em;}table.jqplot-cursor-tooltip{border:1px solid #ccc;font-size:.75em;}.jqplot-cursor-tooltip{border:1px solid #ccc;font-size:.75em;white-space:nowrap;background:rgba(208,208,208,0.5);padding:1px;}.jqplot-highlighter-tooltip{border:1px solid #ccc;font-size:.75em;white-space:nowrap;background:rgba(208,208,208,0.5);padding:1px;}.jqplot-point-label{font-size:.75em;z-index:2;}td.jqplot-cursor-legend-swatch{vertical-align:middle;text-align:center;}div.jqplot-cursor-legend-swatch{width:1.2em;height:.7em;}.jqplot-error{text-align:center;}.jqplot-error-message{position:relative;top:46%;display:inline-block;}div.jqplot-bubble-label{font-size:.8em;padding-left:2px;padding-right:2px;color:rgb(20%,20%,20%);}div.jqplot-bubble-label.jqplot-bubble-label-highlight{background:rgba(90%,90%,90%,0.7);}div.jqplot-noData-container{text-align:center;background-color:rgba(96%,96%,96%,0.3);}
\ No newline at end of file
index e371a28..e60846a 100644 (file)
@@ -2,10 +2,9 @@
  * jqPlot
  * Pure JavaScript plotting plugin using jQuery
  *
  * jqPlot
  * Pure JavaScript plotting plugin using jQuery
  *
- * Version: 1.0.8
- * Revision: 1250
+ * Version: 1.0.0b2_r792
  *
  *
- * Copyright (c) 2009-2013 Chris Leonello
+ * Copyright (c) 2009-2011 Chris Leonello
  * jqPlot is currently available for use in all personal or commercial projects 
  * under both the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL 
  * version 2.0 (http://www.gnu.org/licenses/gpl-2.0.html) licenses. This means that you can 
  * jqPlot is currently available for use in all personal or commercial projects 
  * under both the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL 
  * version 2.0 (http://www.gnu.org/licenses/gpl-2.0.html) licenses. This means that you can 
  *     "This code is unrestricted: you are free to use it however you like."
  * 
  */
  *     "This code is unrestricted: you are free to use it however you like."
  * 
  */
-(function($) {  
-    /**
-     * Class: $.jqplot.DateAxisRenderer
-     * A plugin for a jqPlot to render an axis as a series of date values.
-     * This renderer has no options beyond those supplied by the <Axis> class.
-     * It supplies its own tick formatter, so the tickOptions.formatter option
-     * should not be overridden.
-     * 
-     * Thanks to Ken Synder for his enhanced Date instance methods which are
-     * included with this code <http://kendsnyder.com/sandbox/date/>.
-     * 
-     * To use this renderer, include the plugin in your source
-     * > <script type="text/javascript" language="javascript" src="plugins/jqplot.dateAxisRenderer.js"></script>
-     * 
-     * and supply the appropriate options to your plot
-     * 
-     * > {axes:{xaxis:{renderer:$.jqplot.DateAxisRenderer}}}
-     * 
-     * Dates can be passed into the axis in almost any recognizable value and 
-     * will be parsed.  They will be rendered on the axis in the format
-     * specified by tickOptions.formatString.  e.g. tickOptions.formatString = '%Y-%m-%d'.
-     * 
-     * Accecptable format codes 
-     * are:
-     * 
-     * > Code    Result                  Description
-     * >             == Years ==
-     * > %Y      2008                Four-digit year
-     * > %y      08                  Two-digit year
-     * >             == Months ==
-     * > %m      09                  Two-digit month
-     * > %#m     9                   One or two-digit month
-     * > %B      September           Full month name
-     * > %b      Sep                 Abbreviated month name
-     * >             == Days ==
-     * > %d      05                  Two-digit day of month
-     * > %#d     5                   One or two-digit day of month
-     * > %e      5                   One or two-digit day of month
-     * > %A      Sunday              Full name of the day of the week
-     * > %a      Sun                 Abbreviated name of the day of the week
-     * > %w      0                   Number of the day of the week (0 = Sunday, 6 = Saturday)
-     * > %o      th                  The ordinal suffix string following the day of the month
-     * >             == Hours ==
-     * > %H      23                  Hours in 24-hour format (two digits)
-     * > %#H     3                   Hours in 24-hour integer format (one or two digits)
-     * > %I      11                  Hours in 12-hour format (two digits)
-     * > %#I     3                   Hours in 12-hour integer format (one or two digits)
-     * > %p      PM                  AM or PM
-     * >             == Minutes ==
-     * > %M      09                  Minutes (two digits)
-     * > %#M     9                   Minutes (one or two digits)
-     * >             == Seconds ==
-     * > %S      02                  Seconds (two digits)
-     * > %#S     2                   Seconds (one or two digits)
-     * > %s      1206567625723       Unix timestamp (Seconds past 1970-01-01 00:00:00)
-     * >             == Milliseconds ==
-     * > %N      008                 Milliseconds (three digits)
-     * > %#N     8                   Milliseconds (one to three digits)
-     * >             == Timezone ==
-     * > %O      360                 difference in minutes between local time and GMT
-     * > %Z      Mountain Standard Time  Name of timezone as reported by browser
-     * > %G      -06:00              Hours and minutes between GMT
-     * >             == Shortcuts ==
-     * > %F      2008-03-26          %Y-%m-%d
-     * > %T      05:06:30            %H:%M:%S
-     * > %X      05:06:30            %H:%M:%S
-     * > %x      03/26/08            %m/%d/%y
-     * > %D      03/26/08            %m/%d/%y
-     * > %#c     Wed Mar 26 15:31:00 2008  %a %b %e %H:%M:%S %Y
-     * > %v      3-Sep-2008          %e-%b-%Y
-     * > %R      15:31               %H:%M
-     * > %r      3:31:00 PM          %I:%M:%S %p
-     * >             == Characters ==
-     * > %n      \n                  Newline
-     * > %t      \t                  Tab
-     * > %%      %                   Percent Symbol 
-     */
-    $.jqplot.DateAxisRenderer = function() {
-        $.jqplot.LinearAxisRenderer.call(this);
-        this.date = new $.jsDate();
-    };
-
-    var second = 1000;
-    var minute = 60 * second;
-    var hour = 60 * minute;
-    var day = 24 * hour;
-    var week = 7 * day;
-
-    // these are less definitive
-    var month = 30.4368499 * day;
-    var year = 365.242199 * day;
-
-    var daysInMonths = [31,28,31,30,31,30,31,30,31,30,31,30];
-    // array of consistent nice intervals.  Longer intervals
-    // will depend on days in month, days in year, etc.
-    var niceFormatStrings = ['%M:%S.%#N', '%M:%S.%#N', '%M:%S.%#N', '%M:%S', '%M:%S', '%M:%S', '%M:%S', '%H:%M:%S', '%H:%M:%S', '%H:%M', '%H:%M', '%H:%M', '%H:%M', '%H:%M', '%H:%M', '%a %H:%M', '%a %H:%M', '%b %e %H:%M', '%b %e %H:%M', '%b %e %H:%M', '%b %e %H:%M', '%v', '%v', '%v', '%v', '%v', '%v', '%v'];
-    var niceIntervals = [0.1*second, 0.2*second, 0.5*second, second, 2*second, 5*second, 10*second, 15*second, 30*second, minute, 2*minute, 5*minute, 10*minute, 15*minute, 30*minute, hour, 2*hour, 4*hour, 6*hour, 8*hour, 12*hour, day, 2*day, 3*day, 4*day, 5*day, week, 2*week];
-
-    var niceMonthlyIntervals = [];
-
-    function bestDateInterval(min, max, titarget) {
-        // iterate through niceIntervals to find one closest to titarget
-        var badness = Number.MAX_VALUE;
-        var temp, bestTi, bestfmt;
-        for (var i=0, l=niceIntervals.length; i < l; i++) {
-            temp = Math.abs(titarget - niceIntervals[i]);
-            if (temp < badness) {
-                badness = temp;
-                bestTi = niceIntervals[i];
-                bestfmt = niceFormatStrings[i];
-            }
-        }
-
-        return [bestTi, bestfmt];
-    }
-    
-    $.jqplot.DateAxisRenderer.prototype = new $.jqplot.LinearAxisRenderer();
-    $.jqplot.DateAxisRenderer.prototype.constructor = $.jqplot.DateAxisRenderer;
-    
-    $.jqplot.DateTickFormatter = function(format, val) {
-        if (!format) {
-            format = '%Y/%m/%d';
-        }
-        return $.jsDate.strftime(val, format);
-    };
-    
-    $.jqplot.DateAxisRenderer.prototype.init = function(options){
-        // prop: tickRenderer
-        // A class of a rendering engine for creating the ticks labels displayed on the plot, 
-        // See <$.jqplot.AxisTickRenderer>.
-        // this.tickRenderer = $.jqplot.AxisTickRenderer;
-        // this.labelRenderer = $.jqplot.AxisLabelRenderer;
-        this.tickOptions.formatter = $.jqplot.DateTickFormatter;
-        // prop: tickInset
-        // Controls the amount to inset the first and last ticks from 
-        // the edges of the grid, in multiples of the tick interval.
-        // 0 is no inset, 0.5 is one half a tick interval, 1 is a full
-        // tick interval, etc.
-        this.tickInset = 0;
-        // prop: drawBaseline
-        // True to draw the axis baseline.
-        this.drawBaseline = true;
-        // prop: baselineWidth
-        // width of the baseline in pixels.
-        this.baselineWidth = null;
-        // prop: baselineColor
-        // CSS color spec for the baseline.
-        this.baselineColor = null;
-        this.daTickInterval = null;
-        this._daTickInterval = null;
-        
-        $.extend(true, this, options);
-        
-        var db = this._dataBounds,
-            stats, 
-            sum,
-            s,
-            d,
-            pd,
-            sd,
-            intv;
-        
-        // Go through all the series attached to this axis and find
-        // the min/max bounds for this axis.
-        for (var i=0; i<this._series.length; i++) {
-            stats = {intervals:[], frequencies:{}, sortedIntervals:[], min:null, max:null, mean:null};
-            sum = 0;
-            s = this._series[i];
-            d = s.data;
-            pd = s._plotData;
-            sd = s._stackData;
-            intv = 0;
-            
-            for (var j=0; j<d.length; j++) { 
-                if (this.name == 'xaxis' || this.name == 'x2axis') {
-                    d[j][0] = new $.jsDate(d[j][0]).getTime();
-                    pd[j][0] = new $.jsDate(d[j][0]).getTime();
-                    sd[j][0] = new $.jsDate(d[j][0]).getTime();
-                    if ((d[j][0] != null && d[j][0] < db.min) || db.min == null) {
-                        db.min = d[j][0];
-                    }
-                    if ((d[j][0] != null && d[j][0] > db.max) || db.max == null) {
-                        db.max = d[j][0];
-                    }
-                    if (j>0) {
-                        intv = Math.abs(d[j][0] - d[j-1][0]);
-                        stats.intervals.push(intv);
-                        if (stats.frequencies.hasOwnProperty(intv)) {
-                            stats.frequencies[intv] += 1;
-                        }
-                        else {
-                            stats.frequencies[intv] = 1;
-                        }
-                    }
-                    sum += intv;
-                    
-                }              
-                else {
-                    d[j][1] = new $.jsDate(d[j][1]).getTime();
-                    pd[j][1] = new $.jsDate(d[j][1]).getTime();
-                    sd[j][1] = new $.jsDate(d[j][1]).getTime();
-                    if ((d[j][1] != null && d[j][1] < db.min) || db.min == null) {
-                        db.min = d[j][1];
-                    }
-                    if ((d[j][1] != null && d[j][1] > db.max) || db.max == null) {
-                        db.max = d[j][1];
-                    }
-                    if (j>0) {
-                        intv = Math.abs(d[j][1] - d[j-1][1]);
-                        stats.intervals.push(intv);
-                        if (stats.frequencies.hasOwnProperty(intv)) {
-                            stats.frequencies[intv] += 1;
-                        }
-                        else {
-                            stats.frequencies[intv] = 1;
-                        }
-                    }
-                }
-                sum += intv;              
-            }
-
-            if (s.renderer.bands) {
-                if (s.renderer.bands.hiData.length) {
-                    var bd = s.renderer.bands.hiData;
-                    for (var j=0, l=bd.length; j < l; j++) {
-                        if (this.name === 'xaxis' || this.name === 'x2axis') {
-                            bd[j][0] = new $.jsDate(bd[j][0]).getTime();
-                            if ((bd[j][0] != null && bd[j][0] > db.max) || db.max == null) {
-                                db.max = bd[j][0];
-                            }                        
-                        }              
-                        else {
-                            bd[j][1] = new $.jsDate(bd[j][1]).getTime();
-                            if ((bd[j][1] != null && bd[j][1] > db.max) || db.max == null) {
-                                db.max = bd[j][1];
-                            }
-                        }
-                    }
-                }
-                if (s.renderer.bands.lowData.length) {
-                    var bd = s.renderer.bands.lowData;
-                    for (var j=0, l=bd.length; j < l; j++) {
-                        if (this.name === 'xaxis' || this.name === 'x2axis') {
-                            bd[j][0] = new $.jsDate(bd[j][0]).getTime();
-                            if ((bd[j][0] != null && bd[j][0] < db.min) || db.min == null) {
-                                db.min = bd[j][0];
-                            }                       
-                        }              
-                        else {
-                            bd[j][1] = new $.jsDate(bd[j][1]).getTime();
-                            if ((bd[j][1] != null && bd[j][1] < db.min) || db.min == null) {
-                                db.min = bd[j][1];
-                            }
-                        }
-                    }
-                }
-            }
-            
-            var tempf = 0,
-                tempn=0;
-            for (var n in stats.frequencies) {
-                stats.sortedIntervals.push({interval:n, frequency:stats.frequencies[n]});
-            }
-            stats.sortedIntervals.sort(function(a, b){
-                return b.frequency - a.frequency;
-            });
-            
-            stats.min = $.jqplot.arrayMin(stats.intervals);
-            stats.max = $.jqplot.arrayMax(stats.intervals);
-            stats.mean = sum/d.length;
-            this._intervalStats.push(stats);
-            stats = sum = s = d = pd = sd = null;
-        }
-        db = null;
-        
-    };
-    
-    // called with scope of an axis
-    $.jqplot.DateAxisRenderer.prototype.reset = function() {
-        this.min = this._options.min;
-        this.max = this._options.max;
-        this.tickInterval = this._options.tickInterval;
-        this.numberTicks = this._options.numberTicks;
-        this._autoFormatString = '';
-        if (this._overrideFormatString && this.tickOptions && this.tickOptions.formatString) {
-            this.tickOptions.formatString = '';
-        }
-        this.daTickInterval = this._daTickInterval;
-        // this._ticks = this.__ticks;
-    };
-    
-    $.jqplot.DateAxisRenderer.prototype.createTicks = function(plot) {
-        // we're are operating on an axis here
-        var ticks = this._ticks;
-        var userTicks = this.ticks;
-        var name = this.name;
-        // databounds were set on axis initialization.
-        var db = this._dataBounds;
-        var iv = this._intervalStats;
-        var dim = (this.name.charAt(0) === 'x') ? this._plotDimensions.width : this._plotDimensions.height;
-        var interval;
-        var min, max;
-        var pos1, pos2;
-        var tt, i;
-        var threshold = 30;
-        var insetMult = 1;
-        var daTickInterval = null;
-        
-        // if user specified a tick interval, convert to usable.
-        if (this.tickInterval != null)
-        {
-            // if interval is a number or can be converted to one, use it.
-            // Assume it is in SECONDS!!!
-            if (Number(this.tickInterval)) {
-                daTickInterval = [Number(this.tickInterval), 'seconds'];
-            }
-            // else, parse out something we can build from.
-            else if (typeof this.tickInterval == "string") {
-                var parts = this.tickInterval.split(' ');
-                if (parts.length == 1) {
-                    daTickInterval = [1, parts[0]];
-                }
-                else if (parts.length == 2) {
-                    daTickInterval = [parts[0], parts[1]];
-                }
-            }
-        }
-
-        var tickInterval = this.tickInterval;
-        
-        // if we already have ticks, use them.
-        // ticks must be in order of increasing value.
-        
-        min = new $.jsDate((this.min != null) ? this.min : db.min).getTime();
-        max = new $.jsDate((this.max != null) ? this.max : db.max).getTime();
-
-        // see if we're zooming.  if we are, don't use the min and max we're given,
-        // but compute some nice ones.  They will be reset later.
-
-        var cursor = plot.plugins.cursor;
-
-        if (cursor && cursor._zoom && cursor._zoom.zooming) {
-            this.min = null;
-            this.max = null;
-        }
-
-        var range = max - min;
-
-        if (this.tickOptions == null || !this.tickOptions.formatString) {
-            this._overrideFormatString = true;
-        }
-        
-        if (userTicks.length) {
-            // ticks could be 1D or 2D array of [val, val, ,,,] or [[val, label], [val, label], ...] or mixed
-            for (i=0; i<userTicks.length; i++){
-                var ut = userTicks[i];
-                var t = new this.tickRenderer(this.tickOptions);
-                if (ut.constructor == Array) {
-                    t.value = new $.jsDate(ut[0]).getTime();
-                    t.label = ut[1];
-                    if (!this.showTicks) {
-                        t.showLabel = false;
-                        t.showMark = false;
-                    }
-                    else if (!this.showTickMarks) {
-                        t.showMark = false;
-                    }
-                    t.setTick(t.value, this.name);
-                    this._ticks.push(t);
-                }
-                
-                else {
-                    t.value = new $.jsDate(ut).getTime();
-                    if (!this.showTicks) {
-                        t.showLabel = false;
-                        t.showMark = false;
-                    }
-                    else if (!this.showTickMarks) {
-                        t.showMark = false;
-                    }
-                    t.setTick(t.value, this.name);
-                    this._ticks.push(t);
-                }
-            }
-            this.numberTicks = userTicks.length;
-            this.min = this._ticks[0].value;
-            this.max = this._ticks[this.numberTicks-1].value;
-            this.daTickInterval = [(this.max - this.min) / (this.numberTicks - 1)/1000, 'seconds'];
-        }
-
-        ////////
-        // We don't have any ticks yet, let's make some!
-        ////////
-
-        // special case when there is only one point, make three tick marks to center the point
-        else if (this.min == null && this.max == null && db.min == db.max)
-        {
-             var onePointOpts = $.extend(true, {}, this.tickOptions, {name: this.name, value: null});
-             var delta = 300000;
-             this.min = db.min - delta;
-             this.max = db.max + delta;
-             this.numberTicks = 3;
-
-             for(var i=this.min;i<=this.max;i+= delta)
-             {
-                 onePointOpts.value = i;
-
-                 var t = new this.tickRenderer(onePointOpts);
-
-                 if (this._overrideFormatString && this._autoFormatString != '') {
-                    t.formatString = this._autoFormatString;
-                 }
-
-                 t.showLabel = false;
-                 t.showMark = false;
-
-                 this._ticks.push(t);
-             }
-
-             if(this.showTicks) {
-                 this._ticks[1].showLabel = true;
-             }
-             if(this.showTickMarks) {
-                 this._ticks[1].showTickMarks = true;
-             }                   
-        }
-        // if user specified min and max are null, we set those to make best ticks.
-        else if (this.min == null && this.max == null) {
-
-            var opts = $.extend(true, {}, this.tickOptions, {name: this.name, value: null});
-
-            // want to find a nice interval 
-            var nttarget,
-                titarget;
-
-            // if no tickInterval or numberTicks options specified,  make a good guess.
-            if (!this.tickInterval && !this.numberTicks) {
-                var tdim = Math.max(dim, threshold+1);
-                // how many ticks to put on the axis?
-                // date labels tend to be long.  If ticks not rotated,
-                // don't use too many and have a high spacing factor.
-                // If we are rotating ticks, use a lower factor.
-                var spacingFactor = 115;
-                if (this.tickRenderer === $.jqplot.CanvasAxisTickRenderer && this.tickOptions.angle) {
-                    spacingFactor = 115 - 40 * Math.abs(Math.sin(this.tickOptions.angle/180*Math.PI));
-                }
-
-                nttarget =  Math.ceil((tdim-threshold)/spacingFactor + 1);
-                titarget = (max - min) / (nttarget - 1);
-            }
-
-            // If tickInterval is specified, we'll try to honor it.
-            // Not guaranteed to get this interval, but we'll get as close as
-            // we can.
-            // tickInterval will be used before numberTicks, that is if
-            // both are specified, numberTicks will be ignored.
-            else if (this.tickInterval) {
-                titarget = new $.jsDate(0).add(daTickInterval[0], daTickInterval[1]).getTime();
-            }
-
-            // if numberTicks specified, try to honor it.
-            // Not guaranteed, but will try to get close.
-            else if (this.numberTicks) {
-                nttarget = this.numberTicks;
-                titarget = (max - min) / (nttarget - 1);
-            }
-
-            // If we can use an interval of 2 weeks or less, pick best one
-            if (titarget <= 19*day) {
-                var ret = bestDateInterval(min, max, titarget);
-                var tempti = ret[0];
-                this._autoFormatString = ret[1];
-
-                min = new $.jsDate(min);
-                min = Math.floor((min.getTime() - min.getUtcOffset())/tempti) * tempti + min.getUtcOffset();
-
-                nttarget = Math.ceil((max - min) / tempti) + 1;
-                this.min = min;
-                this.max = min + (nttarget - 1) * tempti;
-
-                // if max is less than max, add an interval
-                if (this.max < max) {
-                    this.max += tempti;
-                    nttarget += 1;
-                }
-                this.tickInterval = tempti;
-                this.numberTicks = nttarget;
-
-                for (var i=0; i<nttarget; i++) {
-                    opts.value = this.min + i * tempti;
-                    t = new this.tickRenderer(opts);
-                    
-                    if (this._overrideFormatString && this._autoFormatString != '') {
-                        t.formatString = this._autoFormatString;
-                    }
-                    if (!this.showTicks) {
-                        t.showLabel = false;
-                        t.showMark = false;
-                    }
-                    else if (!this.showTickMarks) {
-                        t.showMark = false;
-                    }
-                    this._ticks.push(t);
-                }
-
-                insetMult = this.tickInterval;
-            }
-
-            // should we use a monthly interval?
-            else if (titarget <= 9 * month) {
-
-                this._autoFormatString = '%v';
-
-                // how many months in an interval?
-                var intv = Math.round(titarget/month);
-                if (intv < 1) {
-                    intv = 1;
-                }
-                else if (intv > 6) {
-                    intv = 6;
-                }
-
-                // figure out the starting month and ending month.
-                var mstart = new $.jsDate(min).setDate(1).setHours(0,0,0,0);
-
-                // See if max ends exactly on a month
-                var tempmend = new $.jsDate(max);
-                var mend = new $.jsDate(max).setDate(1).setHours(0,0,0,0);
-
-                if (tempmend.getTime() !== mend.getTime()) {
-                    mend = mend.add(1, 'month');
-                }
-
-                var nmonths = mend.diff(mstart, 'month');
-
-                nttarget = Math.ceil(nmonths/intv) + 1;
-
-                this.min = mstart.getTime();
-                this.max = mstart.clone().add((nttarget - 1) * intv, 'month').getTime();
-                this.numberTicks = nttarget;
-
-                for (var i=0; i<nttarget; i++) {
-                    if (i === 0) {
-                        opts.value = mstart.getTime();
-                    }
-                    else {
-                        opts.value = mstart.add(intv, 'month').getTime();
-                    }
-                    t = new this.tickRenderer(opts);
-                    
-                    if (this._overrideFormatString && this._autoFormatString != '') {
-                        t.formatString = this._autoFormatString;
-                    }
-                    if (!this.showTicks) {
-                        t.showLabel = false;
-                        t.showMark = false;
-                    }
-                    else if (!this.showTickMarks) {
-                        t.showMark = false;
-                    }
-                    this._ticks.push(t);
-                }
-
-                insetMult = intv * month;
-            }
-
-            // use yearly intervals
-            else {
-
-                this._autoFormatString = '%v';
-
-                // how many years in an interval?
-                var intv = Math.round(titarget/year);
-                if (intv < 1) {
-                    intv = 1;
-                }
-
-                // figure out the starting and ending years.
-                var mstart = new $.jsDate(min).setMonth(0, 1).setHours(0,0,0,0);
-                var mend = new $.jsDate(max).add(1, 'year').setMonth(0, 1).setHours(0,0,0,0);
-
-                var nyears = mend.diff(mstart, 'year');
-
-                nttarget = Math.ceil(nyears/intv) + 1;
-
-                this.min = mstart.getTime();
-                this.max = mstart.clone().add((nttarget - 1) * intv, 'year').getTime();
-                this.numberTicks = nttarget;
-
-                for (var i=0; i<nttarget; i++) {
-                    if (i === 0) {
-                        opts.value = mstart.getTime();
-                    }
-                    else {
-                        opts.value = mstart.add(intv, 'year').getTime();
-                    }
-                    t = new this.tickRenderer(opts);
-                    
-                    if (this._overrideFormatString && this._autoFormatString != '') {
-                        t.formatString = this._autoFormatString;
-                    }
-                    if (!this.showTicks) {
-                        t.showLabel = false;
-                        t.showMark = false;
-                    }
-                    else if (!this.showTickMarks) {
-                        t.showMark = false;
-                    }
-                    this._ticks.push(t);
-                }
-
-                insetMult = intv * year;
-            }
-        }
-
-        ////////
-        // Some option(s) specified, work around that.
-        ////////
-        
-        else {      
-            if (name == 'xaxis' || name == 'x2axis') {
-                dim = this._plotDimensions.width;
-            }
-            else {
-                dim = this._plotDimensions.height;
-            }
-            
-            // if min, max and number of ticks specified, user can't specify interval.
-            if (this.min != null && this.max != null && this.numberTicks != null) {
-                this.tickInterval = null;
-            }
-            
-            if (this.tickInterval != null && daTickInterval != null) {
-                this.daTickInterval = daTickInterval;
-            }
-            
-            // if min and max are same, space them out a bit
-            if (min == max) {
-                var adj = 24*60*60*500;  // 1/2 day
-                min -= adj;
-                max += adj;
-            }
-
-            range = max - min;
-            
-            var optNumTicks = 2 + parseInt(Math.max(0, dim-100)/100, 10);
-            
-            
-            var rmin, rmax;
-            
-            rmin = (this.min != null) ? new $.jsDate(this.min).getTime() : min - range/2*(this.padMin - 1);
-            rmax = (this.max != null) ? new $.jsDate(this.max).getTime() : max + range/2*(this.padMax - 1);
-            this.min = rmin;
-            this.max = rmax;
-            range = this.max - this.min;
-            
-            if (this.numberTicks == null){
-                // if tickInterval is specified by user, we will ignore computed maximum.
-                // max will be equal or greater to fit even # of ticks.
-                if (this.daTickInterval != null) {
-                    var nc = new $.jsDate(this.max).diff(this.min, this.daTickInterval[1], true);
-                    this.numberTicks = Math.ceil(nc/this.daTickInterval[0]) +1;
-                    // this.max = new $.jsDate(this.min).add(this.numberTicks-1, this.daTickInterval[1]).getTime();
-                    this.max = new $.jsDate(this.min).add((this.numberTicks-1) * this.daTickInterval[0], this.daTickInterval[1]).getTime();
-                }
-                else if (dim > 200) {
-                    this.numberTicks = parseInt(3+(dim-200)/100, 10);
-                }
-                else {
-                    this.numberTicks = 2;
-                }
-            }
-            
-            insetMult = range / (this.numberTicks-1)/1000;
-
-            if (this.daTickInterval == null) {
-                this.daTickInterval = [insetMult, 'seconds'];
-            }
-
-
-            for (var i=0; i<this.numberTicks; i++){
-                var min = new $.jsDate(this.min);
-                tt = min.add(i*this.daTickInterval[0], this.daTickInterval[1]).getTime();
-                var t = new this.tickRenderer(this.tickOptions);
-                // var t = new $.jqplot.AxisTickRenderer(this.tickOptions);
-                if (!this.showTicks) {
-                    t.showLabel = false;
-                    t.showMark = false;
-                }
-                else if (!this.showTickMarks) {
-                    t.showMark = false;
-                }
-                t.setTick(tt, this.name);
-                this._ticks.push(t);
-            }
-        }
-
-        if (this.tickInset) {
-            this.min = this.min - this.tickInset * insetMult;
-            this.max = this.max + this.tickInset * insetMult;
-        }
-
-        if (this._daTickInterval == null) {
-            this._daTickInterval = this.daTickInterval;    
-        }
-
-        ticks = null;
-    };
-   
-})(jQuery);
-
+(function(a){a.jqplot.DateAxisRenderer=function(){a.jqplot.LinearAxisRenderer.call(this);this.date=new a.jsDate()};a.jqplot.DateAxisRenderer.prototype=new a.jqplot.LinearAxisRenderer();a.jqplot.DateAxisRenderer.prototype.constructor=a.jqplot.DateAxisRenderer;a.jqplot.DateTickFormatter=function(b,c){if(!b){b="%Y/%m/%d"}return a.jsDate.strftime(c,b)};a.jqplot.DateAxisRenderer.prototype.init=function(t){this.tickOptions.formatter=a.jqplot.DateTickFormatter;this.daTickInterval=null;this._daTickInterval=null;a.extend(true,this,t);var q=this._dataBounds,g,k,r,l,o,m,b;for(var f=0;f<this._series.length;f++){g={intervals:[],frequencies:{},sortedIntervals:[],min:null,max:null,mean:null};k=0;r=this._series[f];l=r.data;o=r._plotData;m=r._stackData;b=0;for(var e=0;e<l.length;e++){if(this.name=="xaxis"||this.name=="x2axis"){l[e][0]=new a.jsDate(l[e][0]).getTime();o[e][0]=new a.jsDate(l[e][0]).getTime();m[e][0]=new a.jsDate(l[e][0]).getTime();if((l[e][0]!=null&&l[e][0]<q.min)||q.min==null){q.min=l[e][0]}if((l[e][0]!=null&&l[e][0]>q.max)||q.max==null){q.max=l[e][0]}if(e>0){b=Math.abs(l[e][0]-l[e-1][0]);g.intervals.push(b);if(g.frequencies.hasOwnProperty(b)){g.frequencies[b]+=1}else{g.frequencies[b]=1}}k+=b}else{l[e][1]=new a.jsDate(l[e][1]).getTime();o[e][1]=new a.jsDate(l[e][1]).getTime();m[e][1]=new a.jsDate(l[e][1]).getTime();if((l[e][1]!=null&&l[e][1]<q.min)||q.min==null){q.min=l[e][1]}if((l[e][1]!=null&&l[e][1]>q.max)||q.max==null){q.max=l[e][1]}if(e>0){b=Math.abs(l[e][1]-l[e-1][1]);g.intervals.push(b);if(g.frequencies.hasOwnProperty(b)){g.frequencies[b]+=1}else{g.frequencies[b]=1}}}k+=b}var p=0,h=0;for(var c in g.frequencies){g.sortedIntervals.push({interval:c,frequency:g.frequencies[c]})}g.sortedIntervals.sort(function(i,d){return d.frequency-i.frequency});g.min=a.jqplot.arrayMin(g.intervals);g.max=a.jqplot.arrayMax(g.intervals);g.mean=k/l.length;this._intervalStats.push(g);g=k=r=l=o=m=null}q=null};a.jqplot.DateAxisRenderer.prototype.reset=function(){this.min=this._min;this.max=this._max;this.tickInterval=this._tickInterval;this.numberTicks=this._numberTicks;this.daTickInterval=this._daTickInterval};a.jqplot.DateAxisRenderer.prototype.createTicks=function(){var z=this._ticks;var w=this.ticks;var B=this.name;var y=this._dataBounds;var e=this._intervalStats;var q,x;var o,s;var d,c;var b,u;o=((this.min!=null)?new a.jsDate(this.min).getTime():y.min);s=((this.max!=null)?new a.jsDate(this.max).getTime():y.max);var k=s-o;if(w.length){for(u=0;u<w.length;u++){var g=w[u];var j=new this.tickRenderer(this.tickOptions);if(g.constructor==Array){j.value=new a.jsDate(g[0]).getTime();j.label=g[1];if(!this.showTicks){j.showLabel=false;j.showMark=false}else{if(!this.showTickMarks){j.showMark=false}}j.setTick(j.value,this.name);this._ticks.push(j)}else{j.value=new a.jsDate(g).getTime();if(!this.showTicks){j.showLabel=false;j.showMark=false}else{if(!this.showTickMarks){j.showMark=false}}j.setTick(j.value,this.name);this._ticks.push(j)}}this.numberTicks=w.length;this.min=this._ticks[0].value;this.max=this._ticks[this.numberTicks-1].value;this.daTickInterval=[(this.max-this.min)/(this.numberTicks-1)/1000,"seconds"]}else{if(this.tickInterval==null&&this.min==null&&this.max==null&&this.numberTicks==null){var A=a.jqplot.LinearTickGenerator(o,s);var n=o+k*(this.padMin-1);var r=s-k*(this.padMax-1);if(o<=n||s>=r){n=o-k*(this.padMin-1);r=s+k*(this.padMax-1);A=a.jqplot.LinearTickGenerator(n,r)}this.min=A[0];this.max=A[1];this.numberTicks=A[2];this.tickInterval=A[4];this.daTickInterval=[this.tickInterval/1000,"seconds"];for(var u=0;u<this.numberTicks;u++){var o=new a.jsDate(this.min);b=o.add(u*this.daTickInterval[0],this.daTickInterval[1]).getTime();var j=new this.tickRenderer(this.tickOptions);if(!this.showTicks){j.showLabel=false;j.showMark=false}else{if(!this.showTickMarks){j.showMark=false}}j.setTick(b,this.name);this._ticks.push(j)}}else{if(B=="xaxis"||B=="x2axis"){q=this._plotDimensions.width}else{q=this._plotDimensions.height}if(this.min!=null&&this.max!=null&&this.numberTicks!=null){this.tickInterval=null}if(this.tickInterval!=null){if(Number(this.tickInterval)){this.daTickInterval=[Number(this.tickInterval),"seconds"]}else{if(typeof this.tickInterval=="string"){var l=this.tickInterval.split(" ");if(l.length==1){this.daTickInterval=[1,l[0]]}else{if(l.length==2){this.daTickInterval=[l[0],l[1]]}}}}}if(o==s){var h=24*60*60*500;o-=h;s+=h}k=s-o;var v=2+parseInt(Math.max(0,q-100)/100,10);var m,p;m=(this.min!=null)?new a.jsDate(this.min).getTime():o-k/2*(this.padMin-1);p=(this.max!=null)?new a.jsDate(this.max).getTime():s+k/2*(this.padMax-1);this.min=m;this.max=p;k=this.max-this.min;if(this.numberTicks==null){if(this.daTickInterval!=null){var f=new a.jsDate(this.max).diff(this.min,this.daTickInterval[1],true);this.numberTicks=Math.ceil(f/this.daTickInterval[0])+1;this.max=new a.jsDate(this.min).add((this.numberTicks-1)*this.daTickInterval[0],this.daTickInterval[1]).getTime()}else{if(q>200){this.numberTicks=parseInt(3+(q-200)/100,10)}else{this.numberTicks=2}}}if(this.daTickInterval==null){this.daTickInterval=[k/(this.numberTicks-1)/1000,"seconds"]}for(var u=0;u<this.numberTicks;u++){var o=new a.jsDate(this.min);b=o.add(u*this.daTickInterval[0],this.daTickInterval[1]).getTime();var j=new this.tickRenderer(this.tickOptions);if(!this.showTicks){j.showLabel=false;j.showMark=false}else{if(!this.showTickMarks){j.showMark=false}}j.setTick(b,this.name);this._ticks.push(j)}}}if(this._daTickInterval==null){this._daTickInterval=this.daTickInterval}}})(jQuery);
\ No newline at end of file
index 49812b7..56dc881 100644 (file)
@@ -1,31 +1,24 @@
 /**
 /**
- * Title: jqPlot Charts
- * 
- * Pure JavaScript plotting plugin for jQuery.
- * 
- * About: Version
- * 
- * version: 1.0.8 
- * revision: 1250
- * 
- * About: Copyright & License
- * 
- * Copyright (c) 2009-2013 Chris Leonello
+ * jqPlot
+ * Pure JavaScript plotting plugin using jQuery
+ *
+ * Version: 1.0.0b2_r792
+ *
+ * Copyright (c) 2009-2011 Chris Leonello
  * jqPlot is currently available for use in all personal or commercial projects 
  * jqPlot is currently available for use in all personal or commercial projects 
- * under both the MIT and GPL version 2.0 licenses. This means that you can 
- * choose the license that best suits your project and use it accordingly.
- * 
- * See <GPL Version 2> and <MIT License> contained within this distribution for further information. 
+ * under both the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL 
+ * version 2.0 (http://www.gnu.org/licenses/gpl-2.0.html) licenses. This means that you can 
+ * choose the license that best suits your project and use it accordingly. 
  *
  *
- * The author would appreciate an email letting him know of any substantial
- * use of jqPlot.  You can reach the author at: chris at jqplot dot com 
- * or see http://www.jqplot.com/info.php.  This is, of course, not required.
+ * Although not required, the author would appreciate an email letting him 
+ * know of any substantial use of jqPlot.  You can reach the author at: 
+ * chris at jqplot dot com or see http://www.jqplot.com/info.php .
  *
  * If you are feeling kind and generous, consider supporting the project by
  *
  * If you are feeling kind and generous, consider supporting the project by
- * making a donation at: http://www.jqplot.com/donate.php.
+ * making a donation at: http://www.jqplot.com/donate.php .
  *
  * sprintf functions contained in jqplot.sprintf.js by Ash Searle:
  *
  * sprintf functions contained in jqplot.sprintf.js by Ash Searle:
- * 
+ *
  *     version 2007.04.27
  *     author Ash Searle
  *     http://hexmen.com/blog/2007/03/printf-sprintf/
  *     version 2007.04.27
  *     author Ash Searle
  *     http://hexmen.com/blog/2007/03/printf-sprintf/
  *     The author (Ash Searle) has placed this code in the public domain:
  *     "This code is unrestricted: you are free to use it however you like."
  * 
  *     The author (Ash Searle) has placed this code in the public domain:
  *     "This code is unrestricted: you are free to use it however you like."
  * 
- * 
- * About: Introduction
- * 
- * jqPlot requires jQuery (1.4+ required for certain features). jQuery 1.4.2 is included in the distribution.  
- * To use jqPlot include jQuery, the jqPlot jQuery plugin, the jqPlot css file and optionally 
- * the excanvas script for IE support in your web page:
- * 
- * > <!--[if lt IE 9]><script language="javascript" type="text/javascript" src="excanvas.js"></script><![endif]-->
- * > <script language="javascript" type="text/javascript" src="jquery-1.4.4.min.js"></script>
- * > <script language="javascript" type="text/javascript" src="jquery.jqplot.min.js"></script>
- * > <link rel="stylesheet" type="text/css" href="jquery.jqplot.css" />
- * 
- * jqPlot can be customized by overriding the defaults of any of the objects which make
- * up the plot. The general usage of jqplot is:
- * 
- * > chart = $.jqplot('targetElemId', [dataArray,...], {optionsObject});
- * 
- * The options available to jqplot are detailed in <jqPlot Options> in the jqPlotOptions.txt file.
- * 
- * An actual call to $.jqplot() may look like the 
- * examples below:
- * 
- * > chart = $.jqplot('chartdiv',  [[[1, 2],[3,5.12],[5,13.1],[7,33.6],[9,85.9],[11,219.9]]]);
- * 
- * or
- * 
- * > dataArray = [34,12,43,55,77];
- * > chart = $.jqplot('targetElemId', [dataArray, ...], {title:'My Plot', axes:{yaxis:{min:20, max:100}}});
- * 
- * For more inforrmation, see <jqPlot Usage>.
- * 
- * About: Usage
- * 
- * See <jqPlot Usage>
- * 
- * About: Available Options 
- * 
- * See <jqPlot Options> for a list of options available thorugh the options object (not complete yet!)
- * 
- * About: Options Usage
- * 
- * See <Options Tutorial>
- * 
- * About: Changes
- * 
- * See <Change Log>
- * 
  */
  */
-
-(function($) {
-    // make sure undefined is undefined
-    var undefined;
-    
-    $.fn.emptyForce = function() {
-      for ( var i = 0, elem; (elem = $(this)[i]) != null; i++ ) {
-        // Remove element nodes and prevent memory leaks
-        if ( elem.nodeType === 1 ) {
-          $.cleanData( elem.getElementsByTagName("*") );
-        }
-  
-        // Remove any remaining nodes
-        if ($.jqplot.use_excanvas) {
-          elem.outerHTML = "";
-        }
-        else {
-          while ( elem.firstChild ) {
-            elem.removeChild( elem.firstChild );
-          }
-        }
-
-        elem = null;
-      }
-  
-      return $(this);
-    };
-  
-    $.fn.removeChildForce = function(parent) {
-      while ( parent.firstChild ) {
-        this.removeChildForce( parent.firstChild );
-        parent.removeChild( parent.firstChild );
-      }
-    };
-
-    $.fn.jqplot = function() {
-        var datas = [];
-        var options = [];
-        // see how many data arrays we have
-        for (var i=0, l=arguments.length; i<l; i++) {
-            if ($.isArray(arguments[i])) {
-                datas.push(arguments[i]);
-            }
-            else if ($.isPlainObject(arguments[i])) {
-                options.push(arguments[i]);
-            }
-        }
-
-        return this.each(function(index) {
-            var tid, 
-                plot, 
-                $this = $(this),
-                dl = datas.length,
-                ol = options.length,
-                data, 
-                opts;
-
-            if (index < dl) {
-                data = datas[index];
-            }
-            else {
-                data = dl ? datas[dl-1] : null;
-            }
-
-            if (index < ol) {
-                opts = options[index];
-            }
-            else {
-                opts = ol ? options[ol-1] : null;
-            }
-
-            // does el have an id?
-            // if not assign it one.
-            tid = $this.attr('id');
-            if (tid === undefined) {
-                tid = 'jqplot_target_' + $.jqplot.targetCounter++;
-                $this.attr('id', tid);
-            }
-
-            plot = $.jqplot(tid, data, opts);
-
-            $this.data('jqplot', plot);
-        });
-    };
-
-
-    /**
-     * Namespace: $.jqplot
-     * jQuery function called by the user to create a plot.
-     *  
-     * Parameters:
-     * target - ID of target element to render the plot into.
-     * data - an array of data series.
-     * options - user defined options object.  See the individual classes for available options.
-     * 
-     * Properties:
-     * config - object to hold configuration information for jqPlot plot object.
-     * 
-     * attributes:
-     * enablePlugins - False to disable plugins by default.  Plugins must then be explicitly 
-     *   enabled in the individual plot options.  Default: false.
-     *   This property sets the "show" property of certain plugins to true or false.
-     *   Only plugins that can be immediately active upon loading are affected.  This includes
-     *   non-renderer plugins like cursor, dragable, highlighter, and trendline.
-     * defaultHeight - Default height for plots where no css height specification exists.  This
-     *   is a jqplot wide default.
-     * defaultWidth - Default height for plots where no css height specification exists.  This
-     *   is a jqplot wide default.
-     */
-
-    $.jqplot = function(target, data, options) {
-        var _data = null, _options = null;
-
-        if (arguments.length === 3) {
-            _data = data;
-            _options = options;
-        }
-
-        else if (arguments.length === 2) {
-            if ($.isArray(data)) {
-                _data = data;
-            }
-
-            else if ($.isPlainObject(data)) {
-                _options = data;
-            }
-        }
-
-        if (_data === null && _options !== null && _options.data) {
-            _data = _options.data;
-        }
-
-        var plot = new jqPlot();
-        // remove any error class that may be stuck on target.
-        $('#'+target).removeClass('jqplot-error');
-        
-        if ($.jqplot.config.catchErrors) {
-            try {
-                plot.init(target, _data, _options);
-                plot.draw();
-                plot.themeEngine.init.call(plot);
-                return plot;
-            }
-            catch(e) {
-                var msg = $.jqplot.config.errorMessage || e.message;
-                $('#'+target).append('<div class="jqplot-error-message">'+msg+'</div>');
-                $('#'+target).addClass('jqplot-error');
-                document.getElementById(target).style.background = $.jqplot.config.errorBackground;
-                document.getElementById(target).style.border = $.jqplot.config.errorBorder;
-                document.getElementById(target).style.fontFamily = $.jqplot.config.errorFontFamily;
-                document.getElementById(target).style.fontSize = $.jqplot.config.errorFontSize;
-                document.getElementById(target).style.fontStyle = $.jqplot.config.errorFontStyle;
-                document.getElementById(target).style.fontWeight = $.jqplot.config.errorFontWeight;
-            }
-        }
-        else {        
-            plot.init(target, _data, _options);
-            plot.draw();
-            plot.themeEngine.init.call(plot);
-            return plot;
-        }
-    };
-
-    $.jqplot.version = "1.0.8";
-    $.jqplot.revision = "1250";
-
-    $.jqplot.targetCounter = 1;
-
-    // canvas manager to reuse canvases on the plot.
-    // Should help solve problem of canvases not being freed and
-    // problem of waiting forever for firefox to decide to free memory.
-    $.jqplot.CanvasManager = function() {
-        // canvases are managed globally so that they can be reused
-        // across plots after they have been freed
-        if (typeof $.jqplot.CanvasManager.canvases == 'undefined') {
-            $.jqplot.CanvasManager.canvases = [];
-            $.jqplot.CanvasManager.free = [];
-        }
-        
-        var myCanvases = [];
-        
-        this.getCanvas = function() {
-            var canvas;
-            var makeNew = true;
-            
-            if (!$.jqplot.use_excanvas) {
-                for (var i = 0, l = $.jqplot.CanvasManager.canvases.length; i < l; i++) {
-                    if ($.jqplot.CanvasManager.free[i] === true) {
-                        makeNew = false;
-                        canvas = $.jqplot.CanvasManager.canvases[i];
-                        // $(canvas).removeClass('jqplot-canvasManager-free').addClass('jqplot-canvasManager-inuse');
-                        $.jqplot.CanvasManager.free[i] = false;
-                        myCanvases.push(i);
-                        break;
-                    }
-                }
-            }
-
-            if (makeNew) {
-                canvas = document.createElement('canvas');
-                myCanvases.push($.jqplot.CanvasManager.canvases.length);
-                $.jqplot.CanvasManager.canvases.push(canvas);
-                $.jqplot.CanvasManager.free.push(false);
-            }   
-            
-            return canvas;
-        };
-        
-        // this method has to be used after settings the dimesions
-        // on the element returned by getCanvas()
-        this.initCanvas = function(canvas) {
-            if ($.jqplot.use_excanvas) {
-                return window.G_vmlCanvasManager.initElement(canvas);
-            }
-            return canvas;
-        };
-
-        this.freeAllCanvases = function() {
-            for (var i = 0, l=myCanvases.length; i < l; i++) {
-                this.freeCanvas(myCanvases[i]);
-            }
-            myCanvases = [];
-        };
-
-        this.freeCanvas = function(idx) {
-            if ($.jqplot.use_excanvas && window.G_vmlCanvasManager.uninitElement !== undefined) {
-                // excanvas can't be reused, but properly unset
-                window.G_vmlCanvasManager.uninitElement($.jqplot.CanvasManager.canvases[idx]);
-                $.jqplot.CanvasManager.canvases[idx] = null;
-            } 
-            else {
-                var canvas = $.jqplot.CanvasManager.canvases[idx];
-                canvas.getContext('2d').clearRect(0, 0, canvas.width, canvas.height);
-                $(canvas).unbind().removeAttr('class').removeAttr('style');
-                // Style attributes seemed to be still hanging around.  wierd.  Some ticks
-                // still retained a left: 0px attribute after reusing a canvas.
-                $(canvas).css({left: '', top: '', position: ''});
-                // setting size to 0 may save memory of unused canvases?
-                canvas.width = 0;
-                canvas.height = 0;
-                $.jqplot.CanvasManager.free[idx] = true;
-            }
-        };
-        
-    };
-
-            
-    // Convienence function that won't hang IE or FF without FireBug.
-    $.jqplot.log = function() {
-        if (window.console) {
-            window.console.log.apply(window.console, arguments);
-        }
-    };
-        
-    $.jqplot.config = {
-        addDomReference: false,
-        enablePlugins:false,
-        defaultHeight:300,
-        defaultWidth:400,
-        UTCAdjust:false,
-        timezoneOffset: new Date(new Date().getTimezoneOffset() * 60000),
-        errorMessage: '',
-        errorBackground: '',
-        errorBorder: '',
-        errorFontFamily: '',
-        errorFontSize: '',
-        errorFontStyle: '',
-        errorFontWeight: '',
-        catchErrors: false,
-        defaultTickFormatString: "%.1f",
-        defaultColors: [ "#4bb2c5", "#EAA228", "#c5b47f", "#579575", "#839557", "#958c12", "#953579", "#4b5de4", "#d8b83f", "#ff5800", "#0085cc", "#c747a3", "#cddf54", "#FBD178", "#26B4E3", "#bd70c7"],
-        defaultNegativeColors: [ "#498991", "#C08840", "#9F9274", "#546D61", "#646C4A", "#6F6621", "#6E3F5F", "#4F64B0", "#A89050", "#C45923", "#187399", "#945381", "#959E5C", "#C7AF7B", "#478396", "#907294"],
-        dashLength: 4,
-        gapLength: 4,
-        dotGapLength: 2.5,
-        srcLocation: 'jqplot/src/',
-        pluginLocation: 'jqplot/src/plugins/'
-    };
-    
-    
-    $.jqplot.arrayMax = function( array ){
-        return Math.max.apply( Math, array );
-    };
-    
-    $.jqplot.arrayMin = function( array ){
-        return Math.min.apply( Math, array );
-    };
-    
-    $.jqplot.enablePlugins = $.jqplot.config.enablePlugins;
-    
-    // canvas related tests taken from modernizer:
-    // Copyright (c) 2009 - 2010 Faruk Ates.
-    // http://www.modernizr.com
-    
-    $.jqplot.support_canvas = function() {
-        if (typeof $.jqplot.support_canvas.result == 'undefined') {
-            $.jqplot.support_canvas.result = !!document.createElement('canvas').getContext; 
-        }
-        return $.jqplot.support_canvas.result;
-    };
-            
-    $.jqplot.support_canvas_text = function() {
-        if (typeof $.jqplot.support_canvas_text.result == 'undefined') {
-            if (window.G_vmlCanvasManager !== undefined && window.G_vmlCanvasManager._version > 887) {
-                $.jqplot.support_canvas_text.result = true;
-            }
-            else {
-                $.jqplot.support_canvas_text.result = !!(document.createElement('canvas').getContext && typeof document.createElement('canvas').getContext('2d').fillText == 'function');
-            }
-             
-        }
-        return $.jqplot.support_canvas_text.result;
-    };
-    
-    $.jqplot.use_excanvas = ((!$.support.boxModel || !$.support.objectAll || !$support.leadingWhitespace) && !$.jqplot.support_canvas()) ? true : false;
-    
-    /**
-     * 
-     * Hooks: jqPlot Pugin Hooks
-     * 
-     * $.jqplot.preInitHooks - called before initialization.
-     * $.jqplot.postInitHooks - called after initialization.
-     * $.jqplot.preParseOptionsHooks - called before user options are parsed.
-     * $.jqplot.postParseOptionsHooks - called after user options are parsed.
-     * $.jqplot.preDrawHooks - called before plot draw.
-     * $.jqplot.postDrawHooks - called after plot draw.
-     * $.jqplot.preDrawSeriesHooks - called before each series is drawn.
-     * $.jqplot.postDrawSeriesHooks - called after each series is drawn.
-     * $.jqplot.preDrawLegendHooks - called before the legend is drawn.
-     * $.jqplot.addLegendRowHooks - called at the end of legend draw, so plugins
-     *     can add rows to the legend table.
-     * $.jqplot.preSeriesInitHooks - called before series is initialized.
-     * $.jqplot.postSeriesInitHooks - called after series is initialized.
-     * $.jqplot.preParseSeriesOptionsHooks - called before series related options
-     *     are parsed.
-     * $.jqplot.postParseSeriesOptionsHooks - called after series related options
-     *     are parsed.
-     * $.jqplot.eventListenerHooks - called at the end of plot drawing, binds
-     *     listeners to the event canvas which lays on top of the grid area.
-     * $.jqplot.preDrawSeriesShadowHooks - called before series shadows are drawn.
-     * $.jqplot.postDrawSeriesShadowHooks - called after series shadows are drawn.
-     * 
-     */
-    
-    $.jqplot.preInitHooks = [];
-    $.jqplot.postInitHooks = [];
-    $.jqplot.preParseOptionsHooks = [];
-    $.jqplot.postParseOptionsHooks = [];
-    $.jqplot.preDrawHooks = [];
-    $.jqplot.postDrawHooks = [];
-    $.jqplot.preDrawSeriesHooks = [];
-    $.jqplot.postDrawSeriesHooks = [];
-    $.jqplot.preDrawLegendHooks = [];
-    $.jqplot.addLegendRowHooks = [];
-    $.jqplot.preSeriesInitHooks = [];
-    $.jqplot.postSeriesInitHooks = [];
-    $.jqplot.preParseSeriesOptionsHooks = [];
-    $.jqplot.postParseSeriesOptionsHooks = [];
-    $.jqplot.eventListenerHooks = [];
-    $.jqplot.preDrawSeriesShadowHooks = [];
-    $.jqplot.postDrawSeriesShadowHooks = [];
-
-    // A superclass holding some common properties and methods.
-    $.jqplot.ElemContainer = function() {
-        this._elem;
-        this._plotWidth;
-        this._plotHeight;
-        this._plotDimensions = {height:null, width:null};
-    };
-    
-    $.jqplot.ElemContainer.prototype.createElement = function(el, offsets, clss, cssopts, attrib) {
-        this._offsets = offsets;
-        var klass = clss || 'jqplot';
-        var elem = document.createElement(el);
-        this._elem = $(elem);
-        this._elem.addClass(klass);
-        this._elem.css(cssopts);
-        this._elem.attr(attrib);
-        // avoid memory leak;
-        elem = null;
-        return this._elem;
-    };
-    
-    $.jqplot.ElemContainer.prototype.getWidth = function() {
-        if (this._elem) {
-            return this._elem.outerWidth(true);
-        }
-        else {
-            return null;
-        }
-    };
-    
-    $.jqplot.ElemContainer.prototype.getHeight = function() {
-        if (this._elem) {
-            return this._elem.outerHeight(true);
-        }
-        else {
-            return null;
-        }
-    };
-    
-    $.jqplot.ElemContainer.prototype.getPosition = function() {
-        if (this._elem) {
-            return this._elem.position();
-        }
-        else {
-            return {top:null, left:null, bottom:null, right:null};
-        }
-    };
-    
-    $.jqplot.ElemContainer.prototype.getTop = function() {
-        return this.getPosition().top;
-    };
-    
-    $.jqplot.ElemContainer.prototype.getLeft = function() {
-        return this.getPosition().left;
-    };
-    
-    $.jqplot.ElemContainer.prototype.getBottom = function() {
-        return this._elem.css('bottom');
-    };
-    
-    $.jqplot.ElemContainer.prototype.getRight = function() {
-        return this._elem.css('right');
-    };
-    
-
-    /**
-     * Class: Axis
-     * An individual axis object.  Cannot be instantiated directly, but created
-     * by the Plot object.  Axis properties can be set or overridden by the 
-     * options passed in from the user.
-     * 
-     */
-    function Axis(name) {
-        $.jqplot.ElemContainer.call(this);
-        // Group: Properties
-        //
-        // Axes options are specified within an axes object at the top level of the 
-        // plot options like so:
-        // > {
-        // >    axes: {
-        // >        xaxis: {min: 5},
-        // >        yaxis: {min: 2, max: 8, numberTicks:4},
-        // >        x2axis: {pad: 1.5},
-        // >        y2axis: {ticks:[22, 44, 66, 88]}
-        // >        }
-        // > }
-        // There are 2 x axes, 'xaxis' and 'x2axis', and 
-        // 9 yaxes, 'yaxis', 'y2axis'. 'y3axis', ...  Any or all of which may be specified.
-        this.name = name;
-        this._series = [];
-        // prop: show
-        // Wether to display the axis on the graph.
-        this.show = false;
-        // prop: tickRenderer
-        // A class of a rendering engine for creating the ticks labels displayed on the plot, 
-        // See <$.jqplot.AxisTickRenderer>.
-        this.tickRenderer = $.jqplot.AxisTickRenderer;
-        // prop: tickOptions
-        // Options that will be passed to the tickRenderer, see <$.jqplot.AxisTickRenderer> options.
-        this.tickOptions = {};
-        // prop: labelRenderer
-        // A class of a rendering engine for creating an axis label.
-        this.labelRenderer = $.jqplot.AxisLabelRenderer;
-        // prop: labelOptions
-        // Options passed to the label renderer.
-        this.labelOptions = {};
-        // prop: label
-        // Label for the axis
-        this.label = null;
-        // prop: showLabel
-        // true to show the axis label.
-        this.showLabel = true;
-        // prop: min
-        // minimum value of the axis (in data units, not pixels).
-        this.min = null;
-        // prop: max
-        // maximum value of the axis (in data units, not pixels).
-        this.max = null;
-        // prop: autoscale
-        // DEPRECATED
-        // the default scaling algorithm produces superior results.
-        this.autoscale = false;
-        // prop: pad
-        // Padding to extend the range above and below the data bounds.
-        // The data range is multiplied by this factor to determine minimum and maximum axis bounds.
-        // A value of 0 will be interpreted to mean no padding, and pad will be set to 1.0.
-        this.pad = 1.2;
-        // prop: padMax
-        // Padding to extend the range above data bounds.
-        // The top of the data range is multiplied by this factor to determine maximum axis bounds.
-        // A value of 0 will be interpreted to mean no padding, and padMax will be set to 1.0.
-        this.padMax = null;
-        // prop: padMin
-        // Padding to extend the range below data bounds.
-        // The bottom of the data range is multiplied by this factor to determine minimum axis bounds.
-        // A value of 0 will be interpreted to mean no padding, and padMin will be set to 1.0.
-        this.padMin = null;
-        // prop: ticks
-        // 1D [val, val, ...] or 2D [[val, label], [val, label], ...] array of ticks for the axis.
-        // If no label is specified, the value is formatted into an appropriate label.
-        this.ticks = [];
-        // prop: numberTicks
-        // Desired number of ticks.  Default is to compute automatically.
-        this.numberTicks;
-        // prop: tickInterval
-        // number of units between ticks.  Mutually exclusive with numberTicks.
-        this.tickInterval;
-        // prop: renderer
-        // A class of a rendering engine that handles tick generation, 
-        // scaling input data to pixel grid units and drawing the axis element.
-        this.renderer = $.jqplot.LinearAxisRenderer;
-        // prop: rendererOptions
-        // renderer specific options.  See <$.jqplot.LinearAxisRenderer> for options.
-        this.rendererOptions = {};
-        // prop: showTicks
-        // Wether to show the ticks (both marks and labels) or not.
-        // Will not override showMark and showLabel options if specified on the ticks themselves.
-        this.showTicks = true;
-        // prop: showTickMarks
-        // Wether to show the tick marks (line crossing grid) or not.
-        // Overridden by showTicks and showMark option of tick itself.
-        this.showTickMarks = true;
-        // prop: showMinorTicks
-        // Wether or not to show minor ticks.  This is renderer dependent.
-        this.showMinorTicks = true;
-        // prop: drawMajorGridlines
-        // True to draw gridlines for major axis ticks.
-        this.drawMajorGridlines = true;
-        // prop: drawMinorGridlines
-        // True to draw gridlines for minor ticks.
-        this.drawMinorGridlines = false;
-        // prop: drawMajorTickMarks
-        // True to draw tick marks for major axis ticks.
-        this.drawMajorTickMarks = true;
-        // prop: drawMinorTickMarks
-        // True to draw tick marks for minor ticks.  This is renderer dependent.
-        this.drawMinorTickMarks = true;
-        // prop: useSeriesColor
-        // Use the color of the first series associated with this axis for the
-        // tick marks and line bordering this axis.
-        this.useSeriesColor = false;
-        // prop: borderWidth
-        // width of line stroked at the border of the axis.  Defaults
-        // to the width of the grid boarder.
-        this.borderWidth = null;
-        // prop: borderColor
-        // color of the border adjacent to the axis.  Defaults to grid border color.
-        this.borderColor = null;
-        // prop: scaleToHiddenSeries
-        // True to include hidden series when computing axes bounds and scaling.
-        this.scaleToHiddenSeries = false;
-        // minimum and maximum values on the axis.
-        this._dataBounds = {min:null, max:null};
-        // statistics (min, max, mean) as well as actual data intervals for each series attached to axis.
-        // holds collection of {intervals:[], min:, max:, mean: } objects for each series on axis.
-        this._intervalStats = [];
-        // pixel position from the top left of the min value and max value on the axis.
-        this._offsets = {min:null, max:null};
-        this._ticks=[];
-        this._label = null;
-        // prop: syncTicks
-        // true to try and synchronize tick spacing across multiple axes so that ticks and
-        // grid lines line up.  This has an impact on autoscaling algorithm, however.
-        // In general, autoscaling an individual axis will work better if it does not
-        // have to sync ticks.
-        this.syncTicks = null;
-        // prop: tickSpacing
-        // Approximate pixel spacing between ticks on graph.  Used during autoscaling.
-        // This number will be an upper bound, actual spacing will be less.
-        this.tickSpacing = 75;
-        // Properties to hold the original values for min, max, ticks, tickInterval and numberTicks
-        // so they can be restored if altered by plugins.
-        this._min = null;
-        this._max = null;
-        this._tickInterval = null;
-        this._numberTicks = null;
-        this.__ticks = null;
-        // hold original user options.
-        this._options = {};
-    }
-    
-    Axis.prototype = new $.jqplot.ElemContainer();
-    Axis.prototype.constructor = Axis;
-    
-    Axis.prototype.init = function() {
-        if ($.isFunction(this.renderer)) {
-            this.renderer = new this.renderer();  
-        }
-        // set the axis name
-        this.tickOptions.axis = this.name;
-        // if showMark or showLabel tick options not specified, use value of axis option.
-        // showTicks overrides showTickMarks.
-        if (this.tickOptions.showMark == null) {
-            this.tickOptions.showMark = this.showTicks;
-        }
-        if (this.tickOptions.showMark == null) {
-            this.tickOptions.showMark = this.showTickMarks;
-        }
-        if (this.tickOptions.showLabel == null) {
-            this.tickOptions.showLabel = this.showTicks;
-        }
-        
-        if (this.label == null || this.label == '') {
-            this.showLabel = false;
-        }
-        else {
-            this.labelOptions.label = this.label;
-        }
-        if (this.showLabel == false) {
-            this.labelOptions.show = false;
-        }
-        // set the default padMax, padMin if not specified
-        // special check, if no padding desired, padding
-        // should be set to 1.0
-        if (this.pad == 0) {
-            this.pad = 1.0;
-        }
-        if (this.padMax == 0) {
-            this.padMax = 1.0;
-        }
-        if (this.padMin == 0) {
-            this.padMin = 1.0;
-        }
-        if (this.padMax == null) {
-            this.padMax = (this.pad-1)/2 + 1;
-        }
-        if (this.padMin == null) {
-            this.padMin = (this.pad-1)/2 + 1;
-        }
-        // now that padMin and padMax are correctly set, reset pad in case user has supplied 
-        // padMin and/or padMax
-        this.pad = this.padMax + this.padMin - 1;
-        if (this.min != null || this.max != null) {
-            this.autoscale = false;
-        }
-        // if not set, sync ticks for y axes but not x by default.
-        if (this.syncTicks == null && this.name.indexOf('y') > -1) {
-            this.syncTicks = true;
-        }
-        else if (this.syncTicks == null){
-            this.syncTicks = false;
-        }
-        this.renderer.init.call(this, this.rendererOptions);
-        
-    };
-    
-    Axis.prototype.draw = function(ctx, plot) {
-        // Memory Leaks patch
-        if (this.__ticks) {
-          this.__ticks = null;
-        }
-
-        return this.renderer.draw.call(this, ctx, plot);
-        
-    };
-    
-    Axis.prototype.set = function() {
-        this.renderer.set.call(this);
-    };
-    
-    Axis.prototype.pack = function(pos, offsets) {
-        if (this.show) {
-            this.renderer.pack.call(this, pos, offsets);
-        }
-        // these properties should all be available now.
-        if (this._min == null) {
-            this._min = this.min;
-            this._max = this.max;
-            this._tickInterval = this.tickInterval;
-            this._numberTicks = this.numberTicks;
-            this.__ticks = this._ticks;
-        }
-    };
-    
-    // reset the axis back to original values if it has been scaled, zoomed, etc.
-    Axis.prototype.reset = function() {
-        this.renderer.reset.call(this);
-    };
-    
-    Axis.prototype.resetScale = function(opts) {
-        $.extend(true, this, {min: null, max: null, numberTicks: null, tickInterval: null, _ticks: [], ticks: []}, opts);
-        this.resetDataBounds();
-    };
-    
-    Axis.prototype.resetDataBounds = function() {
-        // Go through all the series attached to this axis and find
-        // the min/max bounds for this axis.
-        var db = this._dataBounds;
-        db.min = null;
-        db.max = null;
-        var l, s, d;
-        // check for when to force min 0 on bar series plots.
-        var doforce = (this.show) ? true : false;
-        for (var i=0; i<this._series.length; i++) {
-            s = this._series[i];
-            if (s.show || this.scaleToHiddenSeries) {
-                d = s._plotData;
-                if (s._type === 'line' && s.renderer.bands.show && this.name.charAt(0) !== 'x') {
-                    d = [[0, s.renderer.bands._min], [1, s.renderer.bands._max]];
-                }
-
-                var minyidx = 1, maxyidx = 1;
-
-                if (s._type != null && s._type == 'ohlc') {
-                    minyidx = 3;
-                    maxyidx = 2;
-                }
-                
-                for (var j=0, l=d.length; j<l; j++) { 
-                    if (this.name == 'xaxis' || this.name == 'x2axis') {
-                        if ((d[j][0] != null && d[j][0] < db.min) || db.min == null) {
-                            db.min = d[j][0];
-                        }
-                        if ((d[j][0] != null && d[j][0] > db.max) || db.max == null) {
-                            db.max = d[j][0];
-                        }
-                    }              
-                    else {
-                        if ((d[j][minyidx] != null && d[j][minyidx] < db.min) || db.min == null) {
-                            db.min = d[j][minyidx];
-                        }
-                        if ((d[j][maxyidx] != null && d[j][maxyidx] > db.max) || db.max == null) {
-                            db.max = d[j][maxyidx];
-                        }
-                    }              
-                }
-
-                // Hack to not pad out bottom of bar plots unless user has specified a padding.
-                // every series will have a chance to set doforce to false.  once it is set to 
-                // false, it cannot be reset to true.
-                // If any series attached to axis is not a bar, wont force 0.
-                if (doforce && s.renderer.constructor !== $.jqplot.BarRenderer) {
-                    doforce = false;
-                }
-
-                else if (doforce && this._options.hasOwnProperty('forceTickAt0') && this._options.forceTickAt0 == false) {
-                    doforce = false;
-                }
-
-                else if (doforce && s.renderer.constructor === $.jqplot.BarRenderer) {
-                    if (s.barDirection == 'vertical' && this.name != 'xaxis' && this.name != 'x2axis') { 
-                        if (this._options.pad != null || this._options.padMin != null) {
-                            doforce = false;
-                        }
-                    }
-
-                    else if (s.barDirection == 'horizontal' && (this.name == 'xaxis' || this.name == 'x2axis')) {
-                        if (this._options.pad != null || this._options.padMin != null) {
-                            doforce = false;
-                        }
-                    }
-
-                }
-            }
-        }
-
-        if (doforce && this.renderer.constructor === $.jqplot.LinearAxisRenderer && db.min >= 0) {
-            this.padMin = 1.0;
-            this.forceTickAt0 = true;
-        }
-    };
-
-    /**
-     * Class: Legend
-     * Legend object.  Cannot be instantiated directly, but created
-     * by the Plot object.  Legend properties can be set or overridden by the 
-     * options passed in from the user.
-     */
-    function Legend(options) {
-        $.jqplot.ElemContainer.call(this);
-        // Group: Properties
-        
-        // prop: show
-        // Wether to display the legend on the graph.
-        this.show = false;
-        // prop: location
-        // Placement of the legend.  one of the compass directions: nw, n, ne, e, se, s, sw, w
-        this.location = 'ne';
-        // prop: labels
-        // Array of labels to use.  By default the renderer will look for labels on the series.
-        // Labels specified in this array will override labels specified on the series.
-        this.labels = [];
-        // prop: showLabels
-        // true to show the label text on the  legend.
-        this.showLabels = true;
-        // prop: showSwatch
-        // true to show the color swatches on the legend.
-        this.showSwatches = true;
-        // prop: placement
-        // "insideGrid" places legend inside the grid area of the plot.
-        // "outsideGrid" places the legend outside the grid but inside the plot container, 
-        // shrinking the grid to accomodate the legend.
-        // "inside" synonym for "insideGrid", 
-        // "outside" places the legend ouside the grid area, but does not shrink the grid which
-        // can cause the legend to overflow the plot container.
-        this.placement = "insideGrid";
-        // prop: xoffset
-        // DEPRECATED.  Set the margins on the legend using the marginTop, marginLeft, etc. 
-        // properties or via CSS margin styling of the .jqplot-table-legend class.
-        this.xoffset = 0;
-        // prop: yoffset
-        // DEPRECATED.  Set the margins on the legend using the marginTop, marginLeft, etc. 
-        // properties or via CSS margin styling of the .jqplot-table-legend class.
-        this.yoffset = 0;
-        // prop: border
-        // css spec for the border around the legend box.
-        this.border;
-        // prop: background
-        // css spec for the background of the legend box.
-        this.background;
-        // prop: textColor
-        // css color spec for the legend text.
-        this.textColor;
-        // prop: fontFamily
-        // css font-family spec for the legend text.
-        this.fontFamily; 
-        // prop: fontSize
-        // css font-size spec for the legend text.
-        this.fontSize ;
-        // prop: rowSpacing
-        // css padding-top spec for the rows in the legend.
-        this.rowSpacing = '0.5em';
-        // renderer
-        // A class that will create a DOM object for the legend,
-        // see <$.jqplot.TableLegendRenderer>.
-        this.renderer = $.jqplot.TableLegendRenderer;
-        // prop: rendererOptions
-        // renderer specific options passed to the renderer.
-        this.rendererOptions = {};
-        // prop: predraw
-        // Wether to draw the legend before the series or not.
-        // Used with series specific legend renderers for pie, donut, mekko charts, etc.
-        this.preDraw = false;
-        // prop: marginTop
-        // CSS margin for the legend DOM element. This will set an element 
-        // CSS style for the margin which will override any style sheet setting.
-        // The default will be taken from the stylesheet.
-        this.marginTop = null;
-        // prop: marginRight
-        // CSS margin for the legend DOM element. This will set an element 
-        // CSS style for the margin which will override any style sheet setting.
-        // The default will be taken from the stylesheet.
-        this.marginRight = null;
-        // prop: marginBottom
-        // CSS margin for the legend DOM element. This will set an element 
-        // CSS style for the margin which will override any style sheet setting.
-        // The default will be taken from the stylesheet.
-        this.marginBottom = null;
-        // prop: marginLeft
-        // CSS margin for the legend DOM element. This will set an element 
-        // CSS style for the margin which will override any style sheet setting.
-        // The default will be taken from the stylesheet.
-        this.marginLeft = null;
-        // prop: escapeHtml
-        // True to escape special characters with their html entity equivalents
-        // in legend text.  "<" becomes &lt; and so on, so html tags are not rendered.
-        this.escapeHtml = false;
-        this._series = [];
-        
-        $.extend(true, this, options);
-    }
-    
-    Legend.prototype = new $.jqplot.ElemContainer();
-    Legend.prototype.constructor = Legend;
-    
-    Legend.prototype.setOptions = function(options) {
-        $.extend(true, this, options);
-        
-        // Try to emulate deprecated behaviour
-        // if user has specified xoffset or yoffset, copy these to
-        // the margin properties.
-        
-        if (this.placement ==  'inside') {
-            this.placement = 'insideGrid';
-        }
-        
-        if (this.xoffset >0) {
-            if (this.placement == 'insideGrid') {
-                switch (this.location) {
-                    case 'nw':
-                    case 'w':
-                    case 'sw':
-                        if (this.marginLeft == null) {
-                            this.marginLeft = this.xoffset + 'px';
-                        }
-                        this.marginRight = '0px';
-                        break;
-                    case 'ne':
-                    case 'e':
-                    case 'se':
-                    default:
-                        if (this.marginRight == null) {
-                            this.marginRight = this.xoffset + 'px';
-                        }
-                        this.marginLeft = '0px';
-                        break;
-                }
-            }
-            else if (this.placement == 'outside') {
-                switch (this.location) {
-                    case 'nw':
-                    case 'w':
-                    case 'sw':
-                        if (this.marginRight == null) {
-                            this.marginRight = this.xoffset + 'px';
-                        }
-                        this.marginLeft = '0px';
-                        break;
-                    case 'ne':
-                    case 'e':
-                    case 'se':
-                    default:
-                        if (this.marginLeft == null) {
-                            this.marginLeft = this.xoffset + 'px';
-                        }
-                        this.marginRight = '0px';
-                        break;
-                }
-            }
-            this.xoffset = 0;
-        }
-        
-        if (this.yoffset >0) {
-            if (this.placement == 'outside') {
-                switch (this.location) {
-                    case 'sw':
-                    case 's':
-                    case 'se':
-                        if (this.marginTop == null) {
-                            this.marginTop = this.yoffset + 'px';
-                        }
-                        this.marginBottom = '0px';
-                        break;
-                    case 'ne':
-                    case 'n':
-                    case 'nw':
-                    default:
-                        if (this.marginBottom == null) {
-                            this.marginBottom = this.yoffset + 'px';
-                        }
-                        this.marginTop = '0px';
-                        break;
-                }
-            }
-            else if (this.placement == 'insideGrid') {
-                switch (this.location) {
-                    case 'sw':
-                    case 's':
-                    case 'se':
-                        if (this.marginBottom == null) {
-                            this.marginBottom = this.yoffset + 'px';
-                        }
-                        this.marginTop = '0px';
-                        break;
-                    case 'ne':
-                    case 'n':
-                    case 'nw':
-                    default:
-                        if (this.marginTop == null) {
-                            this.marginTop = this.yoffset + 'px';
-                        }
-                        this.marginBottom = '0px';
-                        break;
-                }
-            }
-            this.yoffset = 0;
-        }
-        
-        // TO-DO:
-        // Handle case where offsets are < 0.
-        //
-    };
-    
-    Legend.prototype.init = function() {
-        if ($.isFunction(this.renderer)) {
-            this.renderer = new this.renderer();  
-        }
-        this.renderer.init.call(this, this.rendererOptions);
-    };
-    
-    Legend.prototype.draw = function(offsets, plot) {
-        for (var i=0; i<$.jqplot.preDrawLegendHooks.length; i++){
-            $.jqplot.preDrawLegendHooks[i].call(this, offsets);
-        }
-        return this.renderer.draw.call(this, offsets, plot);
-    };
-    
-    Legend.prototype.pack = function(offsets) {
-        this.renderer.pack.call(this, offsets);
-    };
-
-    /**
-     * Class: Title
-     * Plot Title object.  Cannot be instantiated directly, but created
-     * by the Plot object.  Title properties can be set or overridden by the 
-     * options passed in from the user.
-     * 
-     * Parameters:
-     * text - text of the title.
-     */
-    function Title(text) {
-        $.jqplot.ElemContainer.call(this);
-        // Group: Properties
-        
-        // prop: text
-        // text of the title;
-        this.text = text;
-        // prop: show
-        // whether or not to show the title
-        this.show = true;
-        // prop: fontFamily
-        // css font-family spec for the text.
-        this.fontFamily;
-        // prop: fontSize
-        // css font-size spec for the text.
-        this.fontSize ;
-        // prop: textAlign
-        // css text-align spec for the text.
-        this.textAlign;
-        // prop: textColor
-        // css color spec for the text.
-        this.textColor;
-        // prop: renderer
-        // A class for creating a DOM element for the title,
-        // see <$.jqplot.DivTitleRenderer>.
-        this.renderer = $.jqplot.DivTitleRenderer;
-        // prop: rendererOptions
-        // renderer specific options passed to the renderer.
-        this.rendererOptions = {};   
-        // prop: escapeHtml
-        // True to escape special characters with their html entity equivalents
-        // in title text.  "<" becomes &lt; and so on, so html tags are not rendered.
-        this.escapeHtml = false;
-    }
-    
-    Title.prototype = new $.jqplot.ElemContainer();
-    Title.prototype.constructor = Title;
-    
-    Title.prototype.init = function() {
-        if ($.isFunction(this.renderer)) {
-            this.renderer = new this.renderer();  
-        }
-        this.renderer.init.call(this, this.rendererOptions);
-    };
-    
-    Title.prototype.draw = function(width) {
-        return this.renderer.draw.call(this, width);
-    };
-    
-    Title.prototype.pack = function() {
-        this.renderer.pack.call(this);
-    };
-
-
-    /**
-     * Class: Series
-     * An individual data series object.  Cannot be instantiated directly, but created
-     * by the Plot object.  Series properties can be set or overridden by the 
-     * options passed in from the user.
-     */
-    function Series(options) {
-        options = options || {};
-        $.jqplot.ElemContainer.call(this);
-        // Group: Properties
-        // Properties will be assigned from a series array at the top level of the
-        // options.  If you had two series and wanted to change the color and line
-        // width of the first and set the second to use the secondary y axis with
-        // no shadow and supply custom labels for each:
-        // > {
-        // >    series:[
-        // >        {color: '#ff4466', lineWidth: 5, label:'good line'},
-        // >        {yaxis: 'y2axis', shadow: false, label:'bad line'}
-        // >    ]
-        // > }
-
-        // prop: show
-        // whether or not to draw the series.
-        this.show = true;
-        // prop: xaxis
-        // which x axis to use with this series, either 'xaxis' or 'x2axis'.
-        this.xaxis = 'xaxis';
-        this._xaxis;
-        // prop: yaxis
-        // which y axis to use with this series, either 'yaxis' or 'y2axis'.
-        this.yaxis = 'yaxis';
-        this._yaxis;
-        this.gridBorderWidth = 2.0;
-        // prop: renderer
-        // A class of a renderer which will draw the series, 
-        // see <$.jqplot.LineRenderer>.
-        this.renderer = $.jqplot.LineRenderer;
-        // prop: rendererOptions
-        // Options to pass on to the renderer.
-        this.rendererOptions = {};
-        this.data = [];
-        this.gridData = [];
-        // prop: label
-        // Line label to use in the legend.
-        this.label = '';
-        // prop: showLabel
-        // true to show label for this series in the legend.
-        this.showLabel = true;
-        // prop: color
-        // css color spec for the series
-        this.color;
-        // prop: negativeColor
-        // css color spec used for filled (area) plots that are filled to zero and
-        // the "useNegativeColors" option is true.
-        this.negativeColor;
-        // prop: lineWidth
-        // width of the line in pixels.  May have different meanings depending on renderer.
-        this.lineWidth = 2.5;
-        // prop: lineJoin
-        // Canvas lineJoin style between segments of series.
-        this.lineJoin = 'round';
-        // prop: lineCap
-        // Canvas lineCap style at ends of line.
-        this.lineCap = 'round';
-        // prop: linePattern
-        // line pattern 'dashed', 'dotted', 'solid', some combination
-        // of '-' and '.' characters such as '.-.' or a numerical array like 
-        // [draw, skip, draw, skip, ...] such as [1, 10] to draw a dotted line, 
-        // [1, 10, 20, 10] to draw a dot-dash line, and so on.
-        this.linePattern = 'solid';
-        this.shadow = true;
-        // prop: shadowAngle
-        // Shadow angle in degrees
-        this.shadowAngle = 45;
-        // prop: shadowOffset
-        // Shadow offset from line in pixels
-        this.shadowOffset = 1.25;
-        // prop: shadowDepth
-        // Number of times shadow is stroked, each stroke offset shadowOffset from the last.
-        this.shadowDepth = 3;
-        // prop: shadowAlpha
-        // Alpha channel transparency of shadow.  0 = transparent.
-        this.shadowAlpha = '0.1';
-        // prop: breakOnNull
-        // Wether line segments should be be broken at null value.
-        // False will join point on either side of line.
-        this.breakOnNull = false;
-        // prop: markerRenderer
-        // A class of a renderer which will draw marker (e.g. circle, square, ...) at the data points,
-        // see <$.jqplot.MarkerRenderer>.
-        this.markerRenderer = $.jqplot.MarkerRenderer;
-        // prop: markerOptions
-        // renderer specific options to pass to the markerRenderer,
-        // see <$.jqplot.MarkerRenderer>.
-        this.markerOptions = {};
-        // prop: showLine
-        // whether to actually draw the line or not.  Series will still be renderered, even if no line is drawn.
-        this.showLine = true;
-        // prop: showMarker
-        // whether or not to show the markers at the data points.
-        this.showMarker = true;
-        // prop: index
-        // 0 based index of this series in the plot series array.
-        this.index;
-        // prop: fill
-        // true or false, whether to fill under lines or in bars.
-        // May not be implemented in all renderers.
-        this.fill = false;
-        // prop: fillColor
-        // CSS color spec to use for fill under line.  Defaults to line color.
-        this.fillColor;
-        // prop: fillAlpha
-        // Alpha transparency to apply to the fill under the line.
-        // Use this to adjust alpha separate from fill color.
-        this.fillAlpha;
-        // prop: fillAndStroke
-        // If true will stroke the line (with color this.color) as well as fill under it.
-        // Applies only when fill is true.
-        this.fillAndStroke = false;
-        // prop: disableStack
-        // true to not stack this series with other series in the plot.
-        // To render properly, non-stacked series must come after any stacked series
-        // in the plot's data series array.  So, the plot's data series array would look like:
-        // > [stackedSeries1, stackedSeries2, ..., nonStackedSeries1, nonStackedSeries2, ...]
-        // disableStack will put a gap in the stacking order of series, and subsequent
-        // stacked series will not fill down through the non-stacked series and will
-        // most likely not stack properly on top of the non-stacked series.
-        this.disableStack = false;
-        // _stack is set by the Plot if the plot is a stacked chart.
-        // will stack lines or bars on top of one another to build a "mountain" style chart.
-        // May not be implemented in all renderers.
-        this._stack = false;
-        // prop: neighborThreshold
-        // how close or far (in pixels) the cursor must be from a point marker to detect the point.
-        this.neighborThreshold = 4;
-        // prop: fillToZero
-        // true will force bar and filled series to fill toward zero on the fill Axis.
-        this.fillToZero = false;
-        // prop: fillToValue
-        // fill a filled series to this value on the fill axis.
-        // Works in conjunction with fillToZero, so that must be true.
-        this.fillToValue = 0;
-        // prop: fillAxis
-        // Either 'x' or 'y'.  Which axis to fill the line toward if fillToZero is true.
-        // 'y' means fill up/down to 0 on the y axis for this series.
-        this.fillAxis = 'y';
-        // prop: useNegativeColors
-        // true to color negative values differently in filled and bar charts.
-        this.useNegativeColors = true;
-        this._stackData = [];
-        // _plotData accounts for stacking.  If plots not stacked, _plotData and data are same.  If
-        // stacked, _plotData is accumulation of stacking data.
-        this._plotData = [];
-        // _plotValues hold the individual x and y values that will be plotted for this series.
-        this._plotValues = {x:[], y:[]};
-        // statistics about the intervals between data points.  Used for auto scaling.
-        this._intervals = {x:{}, y:{}};
-        // data from the previous series, for stacked charts.
-        this._prevPlotData = [];
-        this._prevGridData = [];
-        this._stackAxis = 'y';
-        this._primaryAxis = '_xaxis';
-        // give each series a canvas to draw on.  This should allow for redrawing speedups.
-        this.canvas = new $.jqplot.GenericCanvas();
-        this.shadowCanvas = new $.jqplot.GenericCanvas();
-        this.plugins = {};
-        // sum of y values in this series.
-        this._sumy = 0;
-        this._sumx = 0;
-        this._type = '';
-    }
-    
-    Series.prototype = new $.jqplot.ElemContainer();
-    Series.prototype.constructor = Series;
-    
-    Series.prototype.init = function(index, gridbw, plot) {
-        // weed out any null values in the data.
-        this.index = index;
-        this.gridBorderWidth = gridbw;
-        var d = this.data;
-        var temp = [], i, l;
-        for (i=0, l=d.length; i<l; i++) {
-            if (! this.breakOnNull) {
-                if (d[i] == null || d[i][0] == null || d[i][1] == null) {
-                    continue;
-                }
-                else {
-                    temp.push(d[i]);
-                }
-            }
-            else {
-                // TODO: figure out what to do with null values
-                // probably involve keeping nulls in data array
-                // and then updating renderers to break line
-                // when it hits null value.
-                // For now, just keep value.
-                temp.push(d[i]);
-            }
-        }
-        this.data = temp;
-
-        // parse the renderer options and apply default colors if not provided
-        // Set color even if not shown, so series don't change colors when other
-        // series on plot shown/hidden.
-        if (!this.color) {
-            this.color = plot.colorGenerator.get(this.index);
-        }
-        if (!this.negativeColor) {
-            this.negativeColor = plot.negativeColorGenerator.get(this.index);
-        }
-
-
-        if (!this.fillColor) {
-            this.fillColor = this.color;
-        }
-        if (this.fillAlpha) {
-            var comp = $.jqplot.normalize2rgb(this.fillColor);
-            var comp = $.jqplot.getColorComponents(comp);
-            this.fillColor = 'rgba('+comp[0]+','+comp[1]+','+comp[2]+','+this.fillAlpha+')';
-        }
-        if ($.isFunction(this.renderer)) {
-            this.renderer = new this.renderer();  
-        }
-        this.renderer.init.call(this, this.rendererOptions, plot);
-        this.markerRenderer = new this.markerRenderer();
-        if (!this.markerOptions.color) {
-            this.markerOptions.color = this.color;
-        }
-        if (this.markerOptions.show == null) {
-            this.markerOptions.show = this.showMarker;
-        }
-        this.showMarker = this.markerOptions.show;
-        // the markerRenderer is called within its own scope, don't want to overwrite series options!!
-        this.markerRenderer.init(this.markerOptions);
-    };
-    
-    // data - optional data point array to draw using this series renderer
-    // gridData - optional grid data point array to draw using this series renderer
-    // stackData - array of cumulative data for stacked plots.
-    Series.prototype.draw = function(sctx, opts, plot) {
-        var options = (opts == undefined) ? {} : opts;
-        sctx = (sctx == undefined) ? this.canvas._ctx : sctx;
-        
-        var j, data, gridData;
-        
-        // hooks get called even if series not shown
-        // we don't clear canvas here, it would wipe out all other series as well.
-        for (j=0; j<$.jqplot.preDrawSeriesHooks.length; j++) {
-            $.jqplot.preDrawSeriesHooks[j].call(this, sctx, options);
-        }
-        if (this.show) {
-            this.renderer.setGridData.call(this, plot);
-            if (!options.preventJqPlotSeriesDrawTrigger) {
-                $(sctx.canvas).trigger('jqplotSeriesDraw', [this.data, this.gridData]);
-            }
-            data = [];
-            if (options.data) {
-                data = options.data;
-            }
-            else if (!this._stack) {
-                data = this.data;
-            }
-            else {
-                data = this._plotData;
-            }
-            gridData = options.gridData || this.renderer.makeGridData.call(this, data, plot);
-
-            if (this._type === 'line' && this.renderer.smooth && this.renderer._smoothedData.length) {
-                gridData = this.renderer._smoothedData;
-            }
-
-            this.renderer.draw.call(this, sctx, gridData, options, plot);
-        }
-        
-        for (j=0; j<$.jqplot.postDrawSeriesHooks.length; j++) {
-            $.jqplot.postDrawSeriesHooks[j].call(this, sctx, options, plot);
-        }
-        
-        sctx = opts = plot = j = data = gridData = null;
-    };
-    
-    Series.prototype.drawShadow = function(sctx, opts, plot) {
-        var options = (opts == undefined) ? {} : opts;
-        sctx = (sctx == undefined) ? this.shadowCanvas._ctx : sctx;
-        
-        var j, data, gridData;
-        
-        // hooks get called even if series not shown
-        // we don't clear canvas here, it would wipe out all other series as well.
-        for (j=0; j<$.jqplot.preDrawSeriesShadowHooks.length; j++) {
-            $.jqplot.preDrawSeriesShadowHooks[j].call(this, sctx, options);
-        }
-        if (this.shadow) {
-            this.renderer.setGridData.call(this, plot);
-
-            data = [];
-            if (options.data) {
-                data = options.data;
-            }
-            else if (!this._stack) {
-                data = this.data;
-            }
-            else {
-                data = this._plotData;
-            }
-            gridData = options.gridData || this.renderer.makeGridData.call(this, data, plot);
-        
-            this.renderer.drawShadow.call(this, sctx, gridData, options, plot);
-        }
-        
-        for (j=0; j<$.jqplot.postDrawSeriesShadowHooks.length; j++) {
-            $.jqplot.postDrawSeriesShadowHooks[j].call(this, sctx, options);
-        }
-        
-        sctx = opts = plot = j = data = gridData = null;
-        
-    };
-    
-    // toggles series display on plot, e.g. show/hide series
-    Series.prototype.toggleDisplay = function(ev, callback) {
-        var s, speed;
-        if (ev.data.series) {
-            s = ev.data.series;
-        }
-        else {
-            s = this;
-        }
-
-        if (ev.data.speed) {
-            speed = ev.data.speed;
-        }
-        if (speed) {
-            // this can be tricky because series may not have a canvas element if replotting.
-            if (s.canvas._elem.is(':hidden') || !s.show) {
-                s.show = true;
-
-                s.canvas._elem.removeClass('jqplot-series-hidden');
-                if (s.shadowCanvas._elem) {
-                    s.shadowCanvas._elem.fadeIn(speed);
-                }
-                s.canvas._elem.fadeIn(speed, callback);
-                s.canvas._elem.nextAll('.jqplot-point-label.jqplot-series-'+s.index).fadeIn(speed);
-            }
-            else {
-                s.show = false;
-
-                s.canvas._elem.addClass('jqplot-series-hidden');
-                if (s.shadowCanvas._elem) {
-                    s.shadowCanvas._elem.fadeOut(speed);
-                }
-                s.canvas._elem.fadeOut(speed, callback);
-                s.canvas._elem.nextAll('.jqplot-point-label.jqplot-series-'+s.index).fadeOut(speed);
-            }
-        }
-        else {
-            // this can be tricky because series may not have a canvas element if replotting.
-            if (s.canvas._elem.is(':hidden') || !s.show) {
-                s.show = true;
-
-                s.canvas._elem.removeClass('jqplot-series-hidden');
-                if (s.shadowCanvas._elem) {
-                    s.shadowCanvas._elem.show();
-                }
-                s.canvas._elem.show(0, callback);
-                s.canvas._elem.nextAll('.jqplot-point-label.jqplot-series-'+s.index).show();
-            }
-            else {
-                s.show = false;
-
-                s.canvas._elem.addClass('jqplot-series-hidden');
-                if (s.shadowCanvas._elem) {
-                    s.shadowCanvas._elem.hide();
-                }
-                s.canvas._elem.hide(0, callback);
-                s.canvas._elem.nextAll('.jqplot-point-label.jqplot-series-'+s.index).hide();
-            }
-        }
-    };
-    
-
-
-    /**
-     * Class: Grid
-     * 
-     * Object representing the grid on which the plot is drawn.  The grid in this
-     * context is the area bounded by the axes, the area which will contain the series.
-     * Note, the series are drawn on their own canvas.
-     * The Grid object cannot be instantiated directly, but is created by the Plot object.  
-     * Grid properties can be set or overridden by the options passed in from the user.
-     */
-    function Grid() {
-        $.jqplot.ElemContainer.call(this);
-        // Group: Properties
-        
-        // prop: drawGridlines
-        // whether to draw the gridlines on the plot.
-        this.drawGridlines = true;
-        // prop: gridLineColor
-        // color of the grid lines.
-        this.gridLineColor = '#cccccc';
-        // prop: gridLineWidth
-        // width of the grid lines.
-        this.gridLineWidth = 1.0;
-        // prop: background
-        // css spec for the background color.
-        this.background = '#fffdf6';
-        // prop: borderColor
-        // css spec for the color of the grid border.
-        this.borderColor = '#999999';
-        // prop: borderWidth
-        // width of the border in pixels.
-        this.borderWidth = 2.0;
-        // prop: drawBorder
-        // True to draw border around grid.
-        this.drawBorder = true;
-        // prop: shadow
-        // whether to show a shadow behind the grid.
-        this.shadow = true;
-        // prop: shadowAngle
-        // shadow angle in degrees
-        this.shadowAngle = 45;
-        // prop: shadowOffset
-        // Offset of each shadow stroke from the border in pixels
-        this.shadowOffset = 1.5;
-        // prop: shadowWidth
-        // width of the stoke for the shadow
-        this.shadowWidth = 3;
-        // prop: shadowDepth
-        // Number of times shadow is stroked, each stroke offset shadowOffset from the last.
-        this.shadowDepth = 3;
-        // prop: shadowColor
-        // an optional css color spec for the shadow in 'rgba(n, n, n, n)' form
-        this.shadowColor = null;
-        // prop: shadowAlpha
-        // Alpha channel transparency of shadow.  0 = transparent.
-        this.shadowAlpha = '0.07';
-        this._left;
-        this._top;
-        this._right;
-        this._bottom;
-        this._width;
-        this._height;
-        this._axes = [];
-        // prop: renderer
-        // Instance of a renderer which will actually render the grid,
-        // see <$.jqplot.CanvasGridRenderer>.
-        this.renderer = $.jqplot.CanvasGridRenderer;
-        // prop: rendererOptions
-        // Options to pass on to the renderer,
-        // see <$.jqplot.CanvasGridRenderer>.
-        this.rendererOptions = {};
-        this._offsets = {top:null, bottom:null, left:null, right:null};
-    }
-    
-    Grid.prototype = new $.jqplot.ElemContainer();
-    Grid.prototype.constructor = Grid;
-    
-    Grid.prototype.init = function() {
-        if ($.isFunction(this.renderer)) {
-            this.renderer = new this.renderer();  
-        }
-        this.renderer.init.call(this, this.rendererOptions);
-    };
-    
-    Grid.prototype.createElement = function(offsets,plot) {
-        this._offsets = offsets;
-        return this.renderer.createElement.call(this, plot);
-    };
-    
-    Grid.prototype.draw = function() {
-        this.renderer.draw.call(this);
-    };
-    
-    $.jqplot.GenericCanvas = function() {
-        $.jqplot.ElemContainer.call(this);
-        this._ctx;  
-    };
-    
-    $.jqplot.GenericCanvas.prototype = new $.jqplot.ElemContainer();
-    $.jqplot.GenericCanvas.prototype.constructor = $.jqplot.GenericCanvas;
-    
-    $.jqplot.GenericCanvas.prototype.createElement = function(offsets, clss, plotDimensions, plot) {
-        this._offsets = offsets;
-        var klass = 'jqplot';
-        if (clss != undefined) {
-            klass = clss;
-        }
-        var elem;
-
-        elem = plot.canvasManager.getCanvas();
-        
-        // if new plotDimensions supplied, use them.
-        if (plotDimensions != null) {
-            this._plotDimensions = plotDimensions;
-        }
-        
-        elem.width = this._plotDimensions.width - this._offsets.left - this._offsets.right;
-        elem.height = this._plotDimensions.height - this._offsets.top - this._offsets.bottom;
-        this._elem = $(elem);
-        this._elem.css({ position: 'absolute', left: this._offsets.left, top: this._offsets.top });
-        
-        this._elem.addClass(klass);
-        
-        elem = plot.canvasManager.initCanvas(elem);
-        
-        elem = null;
-        return this._elem;
-    };
-    
-    $.jqplot.GenericCanvas.prototype.setContext = function() {
-        this._ctx = this._elem.get(0).getContext("2d");
-        return this._ctx;
-    };
-    
-    // Memory Leaks patch
-    $.jqplot.GenericCanvas.prototype.resetCanvas = function() {
-      if (this._elem) {
-        if ($.jqplot.use_excanvas && window.G_vmlCanvasManager.uninitElement !== undefined) {
-           window.G_vmlCanvasManager.uninitElement(this._elem.get(0));
-        }
-        
-        //this._elem.remove();
-        this._elem.emptyForce();
-      }
-      
-      this._ctx = null;
-    };
-    
-    $.jqplot.HooksManager = function () {
-        this.hooks =[];
-        this.args = [];
-    };
-    
-    $.jqplot.HooksManager.prototype.addOnce = function(fn, args) {
-        args = args || [];
-        var havehook = false;
-        for (var i=0, l=this.hooks.length; i<l; i++) {
-            if (this.hooks[i] == fn) {
-                havehook = true;
-            }
-        }
-        if (!havehook) {
-            this.hooks.push(fn);
-            this.args.push(args);
-        }
-    };
-    
-    $.jqplot.HooksManager.prototype.add = function(fn, args) {
-        args = args || [];
-        this.hooks.push(fn);
-        this.args.push(args);
-    };
-    
-    $.jqplot.EventListenerManager = function () {
-        this.hooks =[];
-    };
-    
-    $.jqplot.EventListenerManager.prototype.addOnce = function(ev, fn) {
-        var havehook = false, h, i;
-        for (var i=0, l=this.hooks.length; i<l; i++) {
-            h = this.hooks[i];
-            if (h[0] == ev && h[1] == fn) {
-                havehook = true;
-            }
-        }
-        if (!havehook) {
-            this.hooks.push([ev, fn]);
-        }
-    };
-    
-    $.jqplot.EventListenerManager.prototype.add = function(ev, fn) {
-        this.hooks.push([ev, fn]);
-    };
-
-
-    var _axisNames = ['yMidAxis', 'xaxis', 'yaxis', 'x2axis', 'y2axis', 'y3axis', 'y4axis', 'y5axis', 'y6axis', 'y7axis', 'y8axis', 'y9axis'];
-
-    /**
-     * Class: jqPlot
-     * Plot object returned by call to $.jqplot.  Handles parsing user options,
-     * creating sub objects (Axes, legend, title, series) and rendering the plot.
-     */
-    function jqPlot() {
-        // Group: Properties
-        // These properties are specified at the top of the options object
-        // like so:
-        // > {
-        // >     axesDefaults:{min:0},
-        // >     series:[{color:'#6633dd'}],
-        // >     title: 'A Plot'
-        // > }
-        //
-
-        // prop: animate
-        // True to animate the series on initial plot draw (renderer dependent).
-        // Actual animation functionality must be supported in the renderer.
-        this.animate = false;
-        // prop: animateReplot
-        // True to animate series after a call to the replot() method.
-        // Use with caution!  Replots can happen very frequently under
-        // certain circumstances (e.g. resizing, dragging points) and
-        // animation in these situations can cause problems.
-        this.animateReplot = false;
-        // prop: axes
-        // up to 4 axes are supported, each with its own options, 
-        // See <Axis> for axis specific options.
-        this.axes = {xaxis: new Axis('xaxis'), yaxis: new Axis('yaxis'), x2axis: new Axis('x2axis'), y2axis: new Axis('y2axis'), y3axis: new Axis('y3axis'), y4axis: new Axis('y4axis'), y5axis: new Axis('y5axis'), y6axis: new Axis('y6axis'), y7axis: new Axis('y7axis'), y8axis: new Axis('y8axis'), y9axis: new Axis('y9axis'), yMidAxis: new Axis('yMidAxis')};
-        this.baseCanvas = new $.jqplot.GenericCanvas();
-        // true to intercept right click events and fire a 'jqplotRightClick' event.
-        // this will also block the context menu.
-        this.captureRightClick = false;
-        // prop: data
-        // user's data.  Data should *NOT* be specified in the options object,
-        // but be passed in as the second argument to the $.jqplot() function.
-        // The data property is described here soley for reference. 
-        // The data should be in the form of an array of 2D or 1D arrays like
-        // > [ [[x1, y1], [x2, y2],...], [y1, y2, ...] ].
-        this.data = [];
-        // prop: dataRenderer
-        // A callable which can be used to preprocess data passed into the plot.
-        // Will be called with 3 arguments: the plot data, a reference to the plot,
-        // and the value of dataRendererOptions.
-        this.dataRenderer;
-        // prop: dataRendererOptions
-        // Options that will be passed to the dataRenderer.
-        // Can be of any type.
-        this.dataRendererOptions;
-        this.defaults = {
-            // prop: axesDefaults
-            // default options that will be applied to all axes.
-            // see <Axis> for axes options.
-            axesDefaults: {},
-            axes: {xaxis:{}, yaxis:{}, x2axis:{}, y2axis:{}, y3axis:{}, y4axis:{}, y5axis:{}, y6axis:{}, y7axis:{}, y8axis:{}, y9axis:{}, yMidAxis:{}},
-            // prop: seriesDefaults
-            // default options that will be applied to all series.
-            // see <Series> for series options.
-            seriesDefaults: {},
-            series:[]
-        };
-        // prop: defaultAxisStart
-        // 1-D data series are internally converted into 2-D [x,y] data point arrays
-        // by jqPlot.  This is the default starting value for the missing x or y value.
-        // The added data will be a monotonically increasing series (e.g. [1, 2, 3, ...])
-        // starting at this value.
-        this.defaultAxisStart = 1;
-        // this.doCustomEventBinding = true;
-        // prop: drawIfHidden
-        // True to execute the draw method even if the plot target is hidden.
-        // Generally, this should be false.  Most plot elements will not be sized/
-        // positioned correclty if renderered into a hidden container.  To render into
-        // a hidden container, call the replot method when the container is shown.
-        this.drawIfHidden = false;
-        this.eventCanvas = new $.jqplot.GenericCanvas();
-        // prop: fillBetween
-        // Fill between 2 line series in a plot.
-        // Options object:
-        // {
-        //    series1: first index (0 based) of series in fill
-        //    series2: second index (0 based) of series in fill
-        //    color: color of fill [default fillColor of series1]
-        //    baseSeries:  fill will be drawn below this series (0 based index)
-        //    fill: false to turn off fill [default true].
-        //  }
-        this.fillBetween = {
-            series1: null,
-            series2: null,
-            color: null,
-            baseSeries: 0,
-            fill: true
-        };
-        // prop; fontFamily
-        // css spec for the font-family attribute.  Default for the entire plot.
-        this.fontFamily;
-        // prop: fontSize
-        // css spec for the font-size attribute.  Default for the entire plot.
-        this.fontSize;
-        // prop: grid
-        // See <Grid> for grid specific options.
-        this.grid = new Grid();
-        // prop: legend
-        // see <$.jqplot.TableLegendRenderer>
-        this.legend = new Legend();
-        // prop: noDataIndicator
-        // Options to set up a mock plot with a data loading indicator if no data is specified.
-        this.noDataIndicator = {    
-            show: false,
-            indicator: 'Loading Data...',
-            axes: {
-                xaxis: {
-                    min: 0,
-                    max: 10,
-                    tickInterval: 2,
-                    show: true
-                },
-                yaxis: {
-                    min: 0,
-                    max: 12,
-                    tickInterval: 3,
-                    show: true
-                }
-            }
-        };
-        // prop: negativeSeriesColors 
-        // colors to use for portions of the line below zero.
-        this.negativeSeriesColors = $.jqplot.config.defaultNegativeColors;
-        // container to hold all of the merged options.  Convienence for plugins.
-        this.options = {};
-        this.previousSeriesStack = [];
-        // Namespace to hold plugins.  Generally non-renderer plugins add themselves to here.
-        this.plugins = {};
-        // prop: series
-        // Array of series object options.
-        // see <Series> for series specific options.
-        this.series = [];
-        // array of series indices. Keep track of order
-        // which series canvases are displayed, lowest
-        // to highest, back to front.
-        this.seriesStack = [];
-        // prop: seriesColors
-        // Ann array of CSS color specifications that will be applied, in order,
-        // to the series in the plot.  Colors will wrap around so, if their
-        // are more series than colors, colors will be reused starting at the
-        // beginning.  For pie charts, this specifies the colors of the slices.
-        this.seriesColors = $.jqplot.config.defaultColors;
-        // prop: sortData
-        // false to not sort the data passed in by the user.
-        // Many bar, stacked and other graphs as well as many plugins depend on
-        // having sorted data.
-        this.sortData = true;
-        // prop: stackSeries
-        // true or false, creates a stack or "mountain" plot.
-        // Not all series renderers may implement this option.
-        this.stackSeries = false;
-        // a shortcut for axis syncTicks options.  Not implemented yet.
-        this.syncXTicks = true;
-        // a shortcut for axis syncTicks options.  Not implemented yet.
-        this.syncYTicks = true;
-        // the jquery object for the dom target.
-        this.target = null; 
-        // The id of the dom element to render the plot into
-        this.targetId = null;
-        // prop textColor
-        // css spec for the css color attribute.  Default for the entire plot.
-        this.textColor;
-        // prop: title
-        // Title object.  See <Title> for specific options.  As a shortcut, you
-        // can specify the title option as just a string like: title: 'My Plot'
-        // and this will create a new title object with the specified text.
-        this.title = new Title();
-        // Count how many times the draw method has been called while the plot is visible.
-        // Mostly used to test if plot has never been dran (=0), has been successfully drawn
-        // into a visible container once (=1) or draw more than once into a visible container.
-        // Can use this in tests to see if plot has been visibly drawn at least one time.
-        // After plot has been visibly drawn once, it generally doesn't need redrawing if its
-        // container is hidden and shown.
-        this._drawCount = 0;
-        // sum of y values for all series in plot.
-        // used in mekko chart.
-        this._sumy = 0;
-        this._sumx = 0;
-        // array to hold the cumulative stacked series data.
-        // used to ajust the individual series data, which won't have access to other
-        // series data.
-        this._stackData = [];
-        // array that holds the data to be plotted. This will be the series data
-        // merged with the the appropriate data from _stackData according to the stackAxis.
-        this._plotData = [];
-        this._width = null;
-        this._height = null; 
-        this._plotDimensions = {height:null, width:null};
-        this._gridPadding = {top:null, right:null, bottom:null, left:null};
-        this._defaultGridPadding = {top:10, right:10, bottom:23, left:10};
-
-        this._addDomReference = $.jqplot.config.addDomReference;
-
-        this.preInitHooks = new $.jqplot.HooksManager();
-        this.postInitHooks = new $.jqplot.HooksManager();
-        this.preParseOptionsHooks = new $.jqplot.HooksManager();
-        this.postParseOptionsHooks = new $.jqplot.HooksManager();
-        this.preDrawHooks = new $.jqplot.HooksManager();
-        this.postDrawHooks = new $.jqplot.HooksManager();
-        this.preDrawSeriesHooks = new $.jqplot.HooksManager();
-        this.postDrawSeriesHooks = new $.jqplot.HooksManager();
-        this.preDrawLegendHooks = new $.jqplot.HooksManager();
-        this.addLegendRowHooks = new $.jqplot.HooksManager();
-        this.preSeriesInitHooks = new $.jqplot.HooksManager();
-        this.postSeriesInitHooks = new $.jqplot.HooksManager();
-        this.preParseSeriesOptionsHooks = new $.jqplot.HooksManager();
-        this.postParseSeriesOptionsHooks = new $.jqplot.HooksManager();
-        this.eventListenerHooks = new $.jqplot.EventListenerManager();
-        this.preDrawSeriesShadowHooks = new $.jqplot.HooksManager();
-        this.postDrawSeriesShadowHooks = new $.jqplot.HooksManager();
-        
-        this.colorGenerator = new $.jqplot.ColorGenerator();
-        this.negativeColorGenerator = new $.jqplot.ColorGenerator();
-
-        this.canvasManager = new $.jqplot.CanvasManager();
-
-        this.themeEngine = new $.jqplot.ThemeEngine();
-        
-        var seriesColorsIndex = 0;
-
-        // Group: methods
-        //
-        // method: init
-        // sets the plot target, checks data and applies user
-        // options to plot.
-        this.init = function(target, data, options) {
-            options = options || {};
-            for (var i=0; i<$.jqplot.preInitHooks.length; i++) {
-                $.jqplot.preInitHooks[i].call(this, target, data, options);
-            }
-
-            for (var i=0; i<this.preInitHooks.hooks.length; i++) {
-                this.preInitHooks.hooks[i].call(this, target, data, options);
-            }
-            
-            this.targetId = '#'+target;
-            this.target = $('#'+target);
-
-            //////
-            // Add a reference to plot
-            //////
-            if (this._addDomReference) {
-                this.target.data('jqplot', this);
-            }
-            // remove any error class that may be stuck on target.
-            this.target.removeClass('jqplot-error');
-            if (!this.target.get(0)) {
-                throw new Error("No plot target specified");
-            }
-            
-            // make sure the target is positioned by some means and set css
-            if (this.target.css('position') == 'static') {
-                this.target.css('position', 'relative');
-            }
-            if (!this.target.hasClass('jqplot-target')) {
-                this.target.addClass('jqplot-target');
-            }
-            
-            // if no height or width specified, use a default.
-            if (!this.target.height()) {
-                var h;
-                if (options && options.height) {
-                    h = parseInt(options.height, 10);
-                }
-                else if (this.target.attr('data-height')) {
-                    h = parseInt(this.target.attr('data-height'), 10);
-                }
-                else {
-                    h = parseInt($.jqplot.config.defaultHeight, 10);
-                }
-                this._height = h;
-                this.target.css('height', h+'px');
-            }
-            else {
-                this._height = h = this.target.height();
-            }
-            if (!this.target.width()) {
-                var w;
-                if (options && options.width) {
-                    w = parseInt(options.width, 10);
-                }
-                else if (this.target.attr('data-width')) {
-                    w = parseInt(this.target.attr('data-width'), 10);
-                }
-                else {
-                    w = parseInt($.jqplot.config.defaultWidth, 10);
-                }
-                this._width = w;
-                this.target.css('width', w+'px');
-            }
-            else {
-                this._width = w = this.target.width();
-            }
-
-            for (var i=0, l=_axisNames.length; i<l; i++) {
-                this.axes[_axisNames[i]] = new Axis(_axisNames[i]);
-            }
-            
-            this._plotDimensions.height = this._height;
-            this._plotDimensions.width = this._width;
-            this.grid._plotDimensions = this._plotDimensions;
-            this.title._plotDimensions = this._plotDimensions;
-            this.baseCanvas._plotDimensions = this._plotDimensions;
-            this.eventCanvas._plotDimensions = this._plotDimensions;
-            this.legend._plotDimensions = this._plotDimensions;
-            if (this._height <=0 || this._width <=0 || !this._height || !this._width) {
-                throw new Error("Canvas dimension not set");
-            }
-            
-            if (options.dataRenderer && $.isFunction(options.dataRenderer)) {
-                if (options.dataRendererOptions) {
-                    this.dataRendererOptions = options.dataRendererOptions;
-                }
-                this.dataRenderer = options.dataRenderer;
-                data = this.dataRenderer(data, this, this.dataRendererOptions);
-            }
-            
-            if (options.noDataIndicator && $.isPlainObject(options.noDataIndicator)) {
-                $.extend(true, this.noDataIndicator, options.noDataIndicator);
-            }
-            
-            if (data == null || $.isArray(data) == false || data.length == 0 || $.isArray(data[0]) == false || data[0].length == 0) {
-                
-                if (this.noDataIndicator.show == false) {
-                    throw new Error("No data specified");
-                }
-                
-                else {
-                    // have to be descructive here in order for plot to not try and render series.
-                    // This means that $.jqplot() will have to be called again when there is data.
-                    //delete options.series;
-                    
-                    for (var ax in this.noDataIndicator.axes) {
-                        for (var prop in this.noDataIndicator.axes[ax]) {
-                            this.axes[ax][prop] = this.noDataIndicator.axes[ax][prop];
-                        }
-                    }
-                    
-                    this.postDrawHooks.add(function() {
-                        var eh = this.eventCanvas.getHeight();
-                        var ew = this.eventCanvas.getWidth();
-                        var temp = $('<div class="jqplot-noData-container" style="position:absolute;"></div>');
-                        this.target.append(temp);
-                        temp.height(eh);
-                        temp.width(ew);
-                        temp.css('top', this.eventCanvas._offsets.top);
-                        temp.css('left', this.eventCanvas._offsets.left);
-                        
-                        var temp2 = $('<div class="jqplot-noData-contents" style="text-align:center; position:relative; margin-left:auto; margin-right:auto;"></div>');
-                        temp.append(temp2);
-                        temp2.html(this.noDataIndicator.indicator);
-                        var th = temp2.height();
-                        var tw = temp2.width();
-                        temp2.height(th);
-                        temp2.width(tw);
-                        temp2.css('top', (eh - th)/2 + 'px');
-                    });
-
-                }
-            }
-            
-            // make a copy of the data
-            this.data = $.extend(true, [], data);
-            
-            this.parseOptions(options);
-            
-            if (this.textColor) {
-                this.target.css('color', this.textColor);
-            }
-            if (this.fontFamily) {
-                this.target.css('font-family', this.fontFamily);
-            }
-            if (this.fontSize) {
-                this.target.css('font-size', this.fontSize);
-            }
-            
-            this.title.init();
-            this.legend.init();
-            this._sumy = 0;
-            this._sumx = 0;
-            this.computePlotData();
-            for (var i=0; i<this.series.length; i++) {
-                // set default stacking order for series canvases
-                this.seriesStack.push(i);
-                this.previousSeriesStack.push(i);
-                this.series[i].shadowCanvas._plotDimensions = this._plotDimensions;
-                this.series[i].canvas._plotDimensions = this._plotDimensions;
-                for (var j=0; j<$.jqplot.preSeriesInitHooks.length; j++) {
-                    $.jqplot.preSeriesInitHooks[j].call(this.series[i], target, this.data, this.options.seriesDefaults, this.options.series[i], this);
-                }
-                for (var j=0; j<this.preSeriesInitHooks.hooks.length; j++) {
-                    this.preSeriesInitHooks.hooks[j].call(this.series[i], target, this.data, this.options.seriesDefaults, this.options.series[i], this);
-                }
-                // this.populatePlotData(this.series[i], i);
-                this.series[i]._plotDimensions = this._plotDimensions;
-                this.series[i].init(i, this.grid.borderWidth, this);
-                for (var j=0; j<$.jqplot.postSeriesInitHooks.length; j++) {
-                    $.jqplot.postSeriesInitHooks[j].call(this.series[i], target, this.data, this.options.seriesDefaults, this.options.series[i], this);
-                }
-                for (var j=0; j<this.postSeriesInitHooks.hooks.length; j++) {
-                    this.postSeriesInitHooks.hooks[j].call(this.series[i], target, this.data, this.options.seriesDefaults, this.options.series[i], this);
-                }
-                this._sumy += this.series[i]._sumy;
-                this._sumx += this.series[i]._sumx;
-            }
-
-            var name,
-                axis;
-            for (var i=0, l=_axisNames.length; i<l; i++) {
-                name = _axisNames[i];
-                axis = this.axes[name];
-                axis._plotDimensions = this._plotDimensions;
-                axis.init();
-                if (this.axes[name].borderColor == null) {
-                    if (name.charAt(0) !== 'x' && axis.useSeriesColor === true && axis.show) {
-                        axis.borderColor = axis._series[0].color;
-                    }
-                    else {
-                        axis.borderColor = this.grid.borderColor;
-                    }
-                }
-            }
-            
-            if (this.sortData) {
-                sortData(this.series);
-            }
-            this.grid.init();
-            this.grid._axes = this.axes;
-            
-            this.legend._series = this.series;
-
-            for (var i=0; i<$.jqplot.postInitHooks.length; i++) {
-                $.jqplot.postInitHooks[i].call(this, target, this.data, options);
-            }
-
-            for (var i=0; i<this.postInitHooks.hooks.length; i++) {
-                this.postInitHooks.hooks[i].call(this, target, this.data, options);
-            }
-        };  
-        
-        // method: resetAxesScale
-        // Reset the specified axes min, max, numberTicks and tickInterval properties to null
-        // or reset these properties on all axes if no list of axes is provided.
-        //
-        // Parameters:
-        // axes - Boolean to reset or not reset all axes or an array or object of axis names to reset.
-        this.resetAxesScale = function(axes, options) {
-            var opts = options || {};
-            var ax = axes || this.axes;
-            if (ax === true) {
-                ax = this.axes;
-            }
-            if ($.isArray(ax)) {
-                for (var i = 0; i < ax.length; i++) {
-                    this.axes[ax[i]].resetScale(opts[ax[i]]);
-                }
-            }
-            else if (typeof(ax) === 'object') {
-                for (var name in ax) {
-                    this.axes[name].resetScale(opts[name]);
-                }
-            }
-        };
-        // method: reInitialize
-        // reinitialize plot for replotting.
-        // not called directly.
-        this.reInitialize = function (data, opts) {
-            // Plot should be visible and have a height and width.
-            // If plot doesn't have height and width for some
-            // reason, set it by other means.  Plot must not have
-            // a display:none attribute, however.
-
-            var options = $.extend(true, {}, this.options, opts);
-
-            var target = this.targetId.substr(1);
-            var tdata = (data == null) ? this.data : data;
-
-            for (var i=0; i<$.jqplot.preInitHooks.length; i++) {
-                $.jqplot.preInitHooks[i].call(this, target, tdata, options);
-            }
-
-            for (var i=0; i<this.preInitHooks.hooks.length; i++) {
-                this.preInitHooks.hooks[i].call(this, target, tdata, options);
-            }
-            
-            this._height = this.target.height();
-            this._width = this.target.width();
-            
-            if (this._height <=0 || this._width <=0 || !this._height || !this._width) {
-                throw new Error("Target dimension not set");
-            }
-            
-            this._plotDimensions.height = this._height;
-            this._plotDimensions.width = this._width;
-            this.grid._plotDimensions = this._plotDimensions;
-            this.title._plotDimensions = this._plotDimensions;
-            this.baseCanvas._plotDimensions = this._plotDimensions;
-            this.eventCanvas._plotDimensions = this._plotDimensions;
-            this.legend._plotDimensions = this._plotDimensions;
-
-            var name,
-                t, 
-                j, 
-                axis;
-
-            for (var i=0, l=_axisNames.length; i<l; i++) {
-                name = _axisNames[i];
-                axis = this.axes[name];
-
-                // Memory Leaks patch : clear ticks elements
-                t = axis._ticks;
-                for (var j = 0, tlen = t.length; j < tlen; j++) {
-                  var el = t[j]._elem;
-                  if (el) {
-                    // if canvas renderer
-                    if ($.jqplot.use_excanvas && window.G_vmlCanvasManager.uninitElement !== undefined) {
-                      window.G_vmlCanvasManager.uninitElement(el.get(0));
-                    }
-                    el.emptyForce();
-                    el = null;
-                    t._elem = null;
-                  }
-                }
-                t = null;
-
-                delete axis.ticks;
-                delete axis._ticks;
-                this.axes[name] = new Axis(name);
-                this.axes[name]._plotWidth = this._width;
-                this.axes[name]._plotHeight = this._height;
-            }
-            
-            if (data) {
-                if (options.dataRenderer && $.isFunction(options.dataRenderer)) {
-                    if (options.dataRendererOptions) {
-                        this.dataRendererOptions = options.dataRendererOptions;
-                    }
-                    this.dataRenderer = options.dataRenderer;
-                    data = this.dataRenderer(data, this, this.dataRendererOptions);
-                }
-                
-                // make a copy of the data
-                this.data = $.extend(true, [], data);
-            }
-
-            if (opts) {
-                this.parseOptions(options);
-            }
-            
-            this.title._plotWidth = this._width;
-            
-            if (this.textColor) {
-                this.target.css('color', this.textColor);
-            }
-            if (this.fontFamily) {
-                this.target.css('font-family', this.fontFamily);
-            }
-            if (this.fontSize) {
-                this.target.css('font-size', this.fontSize);
-            }
-
-            this.title.init();
-            this.legend.init();
-            this._sumy = 0;
-            this._sumx = 0;
-
-            this.seriesStack = [];
-            this.previousSeriesStack = [];
-
-            this.computePlotData();
-            for (var i=0, l=this.series.length; i<l; i++) {
-                // set default stacking order for series canvases
-                this.seriesStack.push(i);
-                this.previousSeriesStack.push(i);
-                this.series[i].shadowCanvas._plotDimensions = this._plotDimensions;
-                this.series[i].canvas._plotDimensions = this._plotDimensions;
-                for (var j=0; j<$.jqplot.preSeriesInitHooks.length; j++) {
-                    $.jqplot.preSeriesInitHooks[j].call(this.series[i], target, this.data, this.options.seriesDefaults, this.options.series[i], this);
-                }
-                for (var j=0; j<this.preSeriesInitHooks.hooks.length; j++) {
-                    this.preSeriesInitHooks.hooks[j].call(this.series[i], target, this.data, this.options.seriesDefaults, this.options.series[i], this);
-                }
-                // this.populatePlotData(this.series[i], i);
-                this.series[i]._plotDimensions = this._plotDimensions;
-                this.series[i].init(i, this.grid.borderWidth, this);
-                for (var j=0; j<$.jqplot.postSeriesInitHooks.length; j++) {
-                    $.jqplot.postSeriesInitHooks[j].call(this.series[i], target, this.data, this.options.seriesDefaults, this.options.series[i], this);
-                }
-                for (var j=0; j<this.postSeriesInitHooks.hooks.length; j++) {
-                    this.postSeriesInitHooks.hooks[j].call(this.series[i], target, this.data, this.options.seriesDefaults, this.options.series[i], this);
-                }
-                this._sumy += this.series[i]._sumy;
-                this._sumx += this.series[i]._sumx;
-            }
-
-            for (var i=0, l=_axisNames.length; i<l; i++) {
-                name = _axisNames[i];
-                axis = this.axes[name];
-
-                axis._plotDimensions = this._plotDimensions;
-                axis.init();
-                if (axis.borderColor == null) {
-                    if (name.charAt(0) !== 'x' && axis.useSeriesColor === true && axis.show) {
-                        axis.borderColor = axis._series[0].color;
-                    }
-                    else {
-                        axis.borderColor = this.grid.borderColor;
-                    }
-                }
-            }
-            
-            if (this.sortData) {
-                sortData(this.series);
-            }
-            this.grid.init();
-            this.grid._axes = this.axes;
-            
-            this.legend._series = this.series;
-
-            for (var i=0, l=$.jqplot.postInitHooks.length; i<l; i++) {
-                $.jqplot.postInitHooks[i].call(this, target, this.data, options);
-            }
-
-            for (var i=0, l=this.postInitHooks.hooks.length; i<l; i++) {
-                this.postInitHooks.hooks[i].call(this, target, this.data, options);
-            }
-        };
-
-
-
-        // method: quickInit
-        // 
-        // Quick reinitialization plot for replotting.
-        // Does not parse options ore recreate axes and series.
-        // not called directly.
-        this.quickInit = function () {
-            // Plot should be visible and have a height and width.
-            // If plot doesn't have height and width for some
-            // reason, set it by other means.  Plot must not have
-            // a display:none attribute, however.
-            
-            this._height = this.target.height();
-            this._width = this.target.width();
-            
-            if (this._height <=0 || this._width <=0 || !this._height || !this._width) {
-                throw new Error("Target dimension not set");
-            }
-            
-            this._plotDimensions.height = this._height;
-            this._plotDimensions.width = this._width;
-            this.grid._plotDimensions = this._plotDimensions;
-            this.title._plotDimensions = this._plotDimensions;
-            this.baseCanvas._plotDimensions = this._plotDimensions;
-            this.eventCanvas._plotDimensions = this._plotDimensions;
-            this.legend._plotDimensions = this._plotDimensions;
-            
-            for (var n in this.axes) {
-                this.axes[n]._plotWidth = this._width;
-                this.axes[n]._plotHeight = this._height;
-            }
-            
-            this.title._plotWidth = this._width;
-            
-            if (this.textColor) {
-                this.target.css('color', this.textColor);
-            }
-            if (this.fontFamily) {
-                this.target.css('font-family', this.fontFamily);
-            }
-            if (this.fontSize) {
-                this.target.css('font-size', this.fontSize);
-            }
-            
-            this._sumy = 0;
-            this._sumx = 0;
-            this.computePlotData();
-            for (var i=0; i<this.series.length; i++) {
-                // this.populatePlotData(this.series[i], i);
-                if (this.series[i]._type === 'line' && this.series[i].renderer.bands.show) {
-                    this.series[i].renderer.initBands.call(this.series[i], this.series[i].renderer.options, this);
-                }
-                this.series[i]._plotDimensions = this._plotDimensions;
-                this.series[i].canvas._plotDimensions = this._plotDimensions;
-                //this.series[i].init(i, this.grid.borderWidth);
-                this._sumy += this.series[i]._sumy;
-                this._sumx += this.series[i]._sumx;
-            }
-
-            var name;
-            
-            for (var j=0; j<12; j++) {
-                name = _axisNames[j];
-                // Memory Leaks patch : clear ticks elements
-                var t = this.axes[name]._ticks;
-                for (var i = 0; i < t.length; i++) {
-                  var el = t[i]._elem;
-                  if (el) {
-                    // if canvas renderer
-                    if ($.jqplot.use_excanvas && window.G_vmlCanvasManager.uninitElement !== undefined) {
-                      window.G_vmlCanvasManager.uninitElement(el.get(0));
-                    }
-                    el.emptyForce();
-                    el = null;
-                    t._elem = null;
-                  }
-                }
-                t = null;
-                
-                this.axes[name]._plotDimensions = this._plotDimensions;
-                this.axes[name]._ticks = [];
-                // this.axes[name].renderer.init.call(this.axes[name], {});
-            }
-            
-            if (this.sortData) {
-                sortData(this.series);
-            }
-            
-            this.grid._axes = this.axes;
-            
-            this.legend._series = this.series;
-        };
-        
-        // sort the series data in increasing order.
-        function sortData(series) {
-            var d, sd, pd, ppd, ret;
-            for (var i=0; i<series.length; i++) {
-                var check;
-                var bat = [series[i].data, series[i]._stackData, series[i]._plotData, series[i]._prevPlotData];
-                for (var n=0; n<4; n++) {
-                    check = true;
-                    d = bat[n];
-                    if (series[i]._stackAxis == 'x') {
-                        for (var j = 0; j < d.length; j++) {
-                            if (typeof(d[j][1]) != "number") {
-                                check = false;
-                                break;
-                            }
-                        }
-                        if (check) {
-                            d.sort(function(a,b) { return a[1] - b[1]; });
-                        }
-                    }
-                    else {
-                        for (var j = 0; j < d.length; j++) {
-                            if (typeof(d[j][0]) != "number") {
-                                check = false;
-                                break;
-                            }
-                        }
-                        if (check) {
-                            d.sort(function(a,b) { return a[0] - b[0]; });
-                        }
-                    }
-                }
-               
-            }
-        }
-
-        this.computePlotData = function() {
-            this._plotData = [];
-            this._stackData = [];
-            var series,
-                index,
-                l;
-
-
-            for (index=0, l=this.series.length; index<l; index++) {
-                series = this.series[index];
-                this._plotData.push([]);
-                this._stackData.push([]);
-                var cd = series.data;
-                this._plotData[index] = $.extend(true, [], cd);
-                this._stackData[index] = $.extend(true, [], cd);
-                series._plotData = this._plotData[index];
-                series._stackData = this._stackData[index];
-                var plotValues = {x:[], y:[]};
-
-                if (this.stackSeries && !series.disableStack) {
-                    series._stack = true;
-                    ///////////////////////////
-                    // have to check for nulls
-                    ///////////////////////////
-                    var sidx = (series._stackAxis === 'x') ? 0 : 1;
-
-                    for (var k=0, cdl=cd.length; k<cdl; k++) {
-                        var temp = cd[k][sidx];
-                        if (temp == null) {
-                            temp = 0;
-                        }
-                        this._plotData[index][k][sidx] = temp;
-                        this._stackData[index][k][sidx] = temp;
-
-                        if (index > 0) {
-                            for (var j=index; j--;) {
-                                var prevval = this._plotData[j][k][sidx];
-                                // only need to sum up the stack axis column of data
-                                // and only sum if it is of same sign.
-                                // if previous series isn't same sign, keep looking
-                                // at earlier series untill we find one of same sign.
-                                if (temp * prevval >= 0) {
-                                    this._plotData[index][k][sidx] += prevval;
-                                    this._stackData[index][k][sidx] += prevval;
-                                    break;
-                                } 
-                            }
-                        }
-                    }
-
-                }
-                else {
-                    for (var i=0; i<series.data.length; i++) {
-                        plotValues.x.push(series.data[i][0]);
-                        plotValues.y.push(series.data[i][1]);
-                    }
-                    this._stackData.push(series.data);
-                    this.series[index]._stackData = series.data;
-                    this._plotData.push(series.data);
-                    series._plotData = series.data;
-                    series._plotValues = plotValues;
-                }
-                if (index>0) {
-                    series._prevPlotData = this.series[index-1]._plotData;
-                }
-                series._sumy = 0;
-                series._sumx = 0;
-                for (i=series.data.length-1; i>-1; i--) {
-                    series._sumy += series.data[i][1];
-                    series._sumx += series.data[i][0];
-                }
-            }
-
-        };
-        
-        // populate the _stackData and _plotData arrays for the plot and the series.
-        this.populatePlotData = function(series, index) {
-            // if a stacked chart, compute the stacked data
-            this._plotData = [];
-            this._stackData = [];
-            series._stackData = [];
-            series._plotData = [];
-            var plotValues = {x:[], y:[]};
-            if (this.stackSeries && !series.disableStack) {
-                series._stack = true;
-                var sidx = (series._stackAxis === 'x') ? 0 : 1;
-                // var idx = sidx ? 0 : 1;
-                // push the current data into stackData
-                //this._stackData.push(this.series[i].data);
-                var temp = $.extend(true, [], series.data);
-                // create the data that will be plotted for this series
-                var plotdata = $.extend(true, [], series.data);
-                var tempx, tempy, dval, stackval, comparator;
-                // for first series, nothing to add to stackData.
-                for (var j=0; j<index; j++) {
-                    var cd = this.series[j].data;
-                    for (var k=0; k<cd.length; k++) {
-                        dval = cd[k];
-                        tempx = (dval[0] != null) ? dval[0] : 0;
-                        tempy = (dval[1] != null) ? dval[1] : 0;
-                        temp[k][0] += tempx;
-                        temp[k][1] += tempy;
-                        stackval = (sidx) ? tempy : tempx;
-                        // only need to sum up the stack axis column of data
-                        // and only sum if it is of same sign.
-                        if (series.data[k][sidx] * stackval >= 0) {
-                            plotdata[k][sidx] += stackval;
-                        }
-                    }
-                }
-                for (var i=0; i<plotdata.length; i++) {
-                    plotValues.x.push(plotdata[i][0]);
-                    plotValues.y.push(plotdata[i][1]);
-                }
-                this._plotData.push(plotdata);
-                this._stackData.push(temp);
-                series._stackData = temp;
-                series._plotData = plotdata;
-                series._plotValues = plotValues;
-            }
-            else {
-                for (var i=0; i<series.data.length; i++) {
-                    plotValues.x.push(series.data[i][0]);
-                    plotValues.y.push(series.data[i][1]);
-                }
-                this._stackData.push(series.data);
-                this.series[index]._stackData = series.data;
-                this._plotData.push(series.data);
-                series._plotData = series.data;
-                series._plotValues = plotValues;
-            }
-            if (index>0) {
-                series._prevPlotData = this.series[index-1]._plotData;
-            }
-            series._sumy = 0;
-            series._sumx = 0;
-            for (i=series.data.length-1; i>-1; i--) {
-                series._sumy += series.data[i][1];
-                series._sumx += series.data[i][0];
-            }
-        };
-        
-        // function to safely return colors from the color array and wrap around at the end.
-        this.getNextSeriesColor = (function(t) {
-            var idx = 0;
-            var sc = t.seriesColors;
-            
-            return function () { 
-                if (idx < sc.length) {
-                    return sc[idx++];
-                }
-                else {
-                    idx = 0;
-                    return sc[idx++];
-                }
-            };
-        })(this);
-    
-        this.parseOptions = function(options){
-            for (var i=0; i<this.preParseOptionsHooks.hooks.length; i++) {
-                this.preParseOptionsHooks.hooks[i].call(this, options);
-            }
-            for (var i=0; i<$.jqplot.preParseOptionsHooks.length; i++) {
-                $.jqplot.preParseOptionsHooks[i].call(this, options);
-            }
-            this.options = $.extend(true, {}, this.defaults, options);
-            var opts = this.options;
-            this.animate = opts.animate;
-            this.animateReplot = opts.animateReplot;
-            this.stackSeries = opts.stackSeries;
-            if ($.isPlainObject(opts.fillBetween)) {
-
-                var temp = ['series1', 'series2', 'color', 'baseSeries', 'fill'], 
-                    tempi;
-
-                for (var i=0, l=temp.length; i<l; i++) {
-                    tempi = temp[i];
-                    if (opts.fillBetween[tempi] != null) {
-                        this.fillBetween[tempi] = opts.fillBetween[tempi];
-                    }
-                }
-            }
-
-            if (opts.seriesColors) {
-                this.seriesColors = opts.seriesColors;
-            }
-            if (opts.negativeSeriesColors) {
-                this.negativeSeriesColors = opts.negativeSeriesColors;
-            }
-            if (opts.captureRightClick) {
-                this.captureRightClick = opts.captureRightClick;
-            }
-            this.defaultAxisStart = (options && options.defaultAxisStart != null) ? options.defaultAxisStart : this.defaultAxisStart;
-            this.colorGenerator.setColors(this.seriesColors);
-            this.negativeColorGenerator.setColors(this.negativeSeriesColors);
-            // var cg = new this.colorGenerator(this.seriesColors);
-            // var ncg = new this.colorGenerator(this.negativeSeriesColors);
-            // this._gridPadding = this.options.gridPadding;
-            $.extend(true, this._gridPadding, opts.gridPadding);
-            this.sortData = (opts.sortData != null) ? opts.sortData : this.sortData;
-            for (var i=0; i<12; i++) {
-                var n = _axisNames[i];
-                var axis = this.axes[n];
-                axis._options = $.extend(true, {}, opts.axesDefaults, opts.axes[n]);
-                $.extend(true, axis, opts.axesDefaults, opts.axes[n]);
-                axis._plotWidth = this._width;
-                axis._plotHeight = this._height;
-            }
-            // if (this.data.length == 0) {
-            //     this.data = [];
-            //     for (var i=0; i<this.options.series.length; i++) {
-            //         this.data.push(this.options.series.data);
-            //     }    
-            // }
-                
-            var normalizeData = function(data, dir, start) {
-                // return data as an array of point arrays,
-                // in form [[x1,y1...], [x2,y2...], ...]
-                var temp = [];
-                var i, l;
-                dir = dir || 'vertical';
-                if (!$.isArray(data[0])) {
-                    // we have a series of scalars.  One line with just y values.
-                    // turn the scalar list of data into a data array of form:
-                    // [[1, data[0]], [2, data[1]], ...]
-                    for (i=0, l=data.length; i<l; i++) {
-                        if (dir == 'vertical') {
-                            temp.push([start + i, data[i]]);   
-                        }
-                        else {
-                            temp.push([data[i], start+i]);
-                        }
-                    }
-                }            
-                else {
-                    // we have a properly formatted data series, copy it.
-                    $.extend(true, temp, data);
-                }
-                return temp;
-            };
-
-            var colorIndex = 0;
-            this.series = [];
-            for (var i=0; i<this.data.length; i++) {
-                var sopts = $.extend(true, {index: i}, {seriesColors:this.seriesColors, negativeSeriesColors:this.negativeSeriesColors}, this.options.seriesDefaults, this.options.series[i], {rendererOptions:{animation:{show: this.animate}}});
-                // pass in options in case something needs set prior to initialization.
-                var temp = new Series(sopts);
-                for (var j=0; j<$.jqplot.preParseSeriesOptionsHooks.length; j++) {
-                    $.jqplot.preParseSeriesOptionsHooks[j].call(temp, this.options.seriesDefaults, this.options.series[i]);
-                }
-                for (var j=0; j<this.preParseSeriesOptionsHooks.hooks.length; j++) {
-                    this.preParseSeriesOptionsHooks.hooks[j].call(temp, this.options.seriesDefaults, this.options.series[i]);
-                }
-                // Now go back and apply the options to the series.  Really should just do this during initializaiton, but don't want to
-                // mess up preParseSeriesOptionsHooks at this point.
-                $.extend(true, temp, sopts);
-                var dir = 'vertical';
-                if (temp.renderer === $.jqplot.BarRenderer && temp.rendererOptions && temp.rendererOptions.barDirection == 'horizontal') {
-                    dir = 'horizontal';
-                    temp._stackAxis = 'x';
-                    temp._primaryAxis = '_yaxis';
-                }
-                temp.data = normalizeData(this.data[i], dir, this.defaultAxisStart);
-                switch (temp.xaxis) {
-                    case 'xaxis':
-                        temp._xaxis = this.axes.xaxis;
-                        break;
-                    case 'x2axis':
-                        temp._xaxis = this.axes.x2axis;
-                        break;
-                    default:
-                        break;
-                }
-                temp._yaxis = this.axes[temp.yaxis];
-                temp._xaxis._series.push(temp);
-                temp._yaxis._series.push(temp);
-                if (temp.show) {
-                    temp._xaxis.show = true;
-                    temp._yaxis.show = true;
-                }
-                else {
-                    if (temp._xaxis.scaleToHiddenSeries) {
-                        temp._xaxis.show = true;
-                    }
-                    if (temp._yaxis.scaleToHiddenSeries) {
-                        temp._yaxis.show = true;
-                    }
-                }
-
-                // // parse the renderer options and apply default colors if not provided
-                // if (!temp.color && temp.show != false) {
-                //     temp.color = cg.next();
-                //     colorIndex = cg.getIndex() - 1;;
-                // }
-                // if (!temp.negativeColor && temp.show != false) {
-                //     temp.negativeColor = ncg.get(colorIndex);
-                //     ncg.setIndex(colorIndex);
-                // }
-                if (!temp.label) {
-                    temp.label = 'Series '+ (i+1).toString();
-                }
-                // temp.rendererOptions.show = temp.show;
-                // $.extend(true, temp.renderer, {color:this.seriesColors[i]}, this.rendererOptions);
-                this.series.push(temp);  
-                for (var j=0; j<$.jqplot.postParseSeriesOptionsHooks.length; j++) {
-                    $.jqplot.postParseSeriesOptionsHooks[j].call(this.series[i], this.options.seriesDefaults, this.options.series[i]);
-                }
-                for (var j=0; j<this.postParseSeriesOptionsHooks.hooks.length; j++) {
-                    this.postParseSeriesOptionsHooks.hooks[j].call(this.series[i], this.options.seriesDefaults, this.options.series[i]);
-                }
-            }
-            
-            // copy the grid and title options into this object.
-            $.extend(true, this.grid, this.options.grid);
-            // if axis border properties aren't set, set default.
-            for (var i=0, l=_axisNames.length; i<l; i++) {
-                var n = _axisNames[i];
-                var axis = this.axes[n];
-                if (axis.borderWidth == null) {
-                    axis.borderWidth =this.grid.borderWidth;
-                }
-            }
-            
-            if (typeof this.options.title == 'string') {
-                this.title.text = this.options.title;
-            }
-            else if (typeof this.options.title == 'object') {
-                $.extend(true, this.title, this.options.title);
-            }
-            this.title._plotWidth = this._width;
-            this.legend.setOptions(this.options.legend);
-            
-            for (var i=0; i<$.jqplot.postParseOptionsHooks.length; i++) {
-                $.jqplot.postParseOptionsHooks[i].call(this, options);
-            }
-            for (var i=0; i<this.postParseOptionsHooks.hooks.length; i++) {
-                this.postParseOptionsHooks.hooks[i].call(this, options);
-            }
-        };
-        
-        // method: destroy
-        // Releases all resources occupied by the plot
-        this.destroy = function() {
-            this.canvasManager.freeAllCanvases();
-            if (this.eventCanvas && this.eventCanvas._elem) {
-                this.eventCanvas._elem.unbind();
-            }
-            // Couple of posts on Stack Overflow indicate that empty() doesn't
-            // always cear up the dom and release memory.  Sometimes setting
-            // innerHTML property to null is needed.  Particularly on IE, may 
-            // have to directly set it to null, bypassing $.
-            this.target.empty();
-
-            this.target[0].innerHTML = '';
-        };
-        
-        // method: replot
-        // Does a reinitialization of the plot followed by
-        // a redraw.  Method could be used to interactively
-        // change plot characteristics and then replot.
-        //
-        // Parameters:
-        // options - Options used for replotting.
-        //
-        // Properties:
-        // clear - false to not clear (empty) the plot container before replotting (default: true).
-        // resetAxes - true to reset all axes min, max, numberTicks and tickInterval setting so axes will rescale themselves.
-        //             optionally pass in list of axes to reset (e.g. ['xaxis', 'y2axis']) (default: false).
-        this.replot = function(options) {
-            var opts =  options || {};
-            var data = opts.data || null;
-            var clear = (opts.clear === false) ? false : true;
-            var resetAxes = opts.resetAxes || false;
-            delete opts.data;
-            delete opts.clear;
-            delete opts.resetAxes;
-
-            this.target.trigger('jqplotPreReplot');
-            
-            if (clear) {
-                this.destroy();
-            }
-            // if have data or other options, full reinit.
-            // otherwise, quickinit.
-            if (data || !$.isEmptyObject(opts)) {
-                this.reInitialize(data, opts);
-            }
-            else {
-                this.quickInit();
-            }
-
-            if (resetAxes) {
-                this.resetAxesScale(resetAxes, opts.axes);
-            }
-            this.draw();
-            this.target.trigger('jqplotPostReplot');
-        };
-        
-        // method: redraw
-        // Empties the plot target div and redraws the plot.
-        // This enables plot data and properties to be changed
-        // and then to comletely clear the plot and redraw.
-        // redraw *will not* reinitialize any plot elements.
-        // That is, axes will not be autoscaled and defaults
-        // will not be reapplied to any plot elements.  redraw
-        // is used primarily with zooming. 
-        //
-        // Parameters:
-        // clear - false to not clear (empty) the plot container before redrawing (default: true).
-        this.redraw = function(clear) {
-            clear = (clear != null) ? clear : true;
-            this.target.trigger('jqplotPreRedraw');
-            if (clear) {
-                this.canvasManager.freeAllCanvases();
-                this.eventCanvas._elem.unbind();
-                // Dont think I bind any events to the target, this shouldn't be necessary.
-                // It will remove user's events.
-                // this.target.unbind();
-                this.target.empty();
-            }
-             for (var ax in this.axes) {
-                this.axes[ax]._ticks = [];
-            }
-            this.computePlotData();
-            // for (var i=0; i<this.series.length; i++) {
-            //     this.populatePlotData(this.series[i], i);
-            // }
-            this._sumy = 0;
-            this._sumx = 0;
-            for (var i=0, tsl = this.series.length; i<tsl; i++) {
-                this._sumy += this.series[i]._sumy;
-                this._sumx += this.series[i]._sumx;
-            }
-            this.draw();
-            this.target.trigger('jqplotPostRedraw');
-        };
-        
-        // method: draw
-        // Draws all elements of the plot into the container.
-        // Does not clear the container before drawing.
-        this.draw = function(){
-            if (this.drawIfHidden || this.target.is(':visible')) {
-                this.target.trigger('jqplotPreDraw');
-                var i,
-                    j,
-                    l,
-                    tempseries;
-                for (i=0, l=$.jqplot.preDrawHooks.length; i<l; i++) {
-                    $.jqplot.preDrawHooks[i].call(this);
-                }
-                for (i=0, l=this.preDrawHooks.hooks.length; i<l; i++) {
-                    this.preDrawHooks.hooks[i].apply(this, this.preDrawSeriesHooks.args[i]);
-                }
-                // create an underlying canvas to be used for special features.
-                this.target.append(this.baseCanvas.createElement({left:0, right:0, top:0, bottom:0}, 'jqplot-base-canvas', null, this));
-                this.baseCanvas.setContext();
-                this.target.append(this.title.draw());
-                this.title.pack({top:0, left:0});
-                
-                // make room  for the legend between the grid and the edge.
-                // pass a dummy offsets object and a reference to the plot.
-                var legendElem = this.legend.draw({}, this);
-                
-                var gridPadding = {top:0, left:0, bottom:0, right:0};
-                
-                if (this.legend.placement == "outsideGrid") {
-                    // temporarily append the legend to get dimensions
-                    this.target.append(legendElem);
-                    switch (this.legend.location) {
-                        case 'n':
-                            gridPadding.top += this.legend.getHeight();
-                            break;
-                        case 's':
-                            gridPadding.bottom += this.legend.getHeight();
-                            break;
-                        case 'ne':
-                        case 'e':
-                        case 'se':
-                            gridPadding.right += this.legend.getWidth();
-                            break;
-                        case 'nw':
-                        case 'w':
-                        case 'sw':
-                            gridPadding.left += this.legend.getWidth();
-                            break;
-                        default:  // same as 'ne'
-                            gridPadding.right += this.legend.getWidth();
-                            break;
-                    }
-                    legendElem = legendElem.detach();
-                }
-                
-                var ax = this.axes;
-                var name;
-                // draw the yMidAxis first, so xaxis of pyramid chart can adjust itself if needed.
-                for (i=0; i<12; i++) {
-                    name = _axisNames[i];
-                    this.target.append(ax[name].draw(this.baseCanvas._ctx, this));
-                    ax[name].set();
-                }
-                if (ax.yaxis.show) {
-                    gridPadding.left += ax.yaxis.getWidth();
-                }
-                var ra = ['y2axis', 'y3axis', 'y4axis', 'y5axis', 'y6axis', 'y7axis', 'y8axis', 'y9axis'];
-                var rapad = [0, 0, 0, 0, 0, 0, 0, 0];
-                var gpr = 0;
-                var n;
-                for (n=0; n<8; n++) {
-                    if (ax[ra[n]].show) {
-                        gpr += ax[ra[n]].getWidth();
-                        rapad[n] = gpr;
-                    }
-                }
-                gridPadding.right += gpr;
-                if (ax.x2axis.show) {
-                    gridPadding.top += ax.x2axis.getHeight();
-                }
-                if (this.title.show) {
-                    gridPadding.top += this.title.getHeight();
-                }
-                if (ax.xaxis.show) {
-                    gridPadding.bottom += ax.xaxis.getHeight();
-                }
-                
-                // end of gridPadding adjustments.
-
-                // if user passed in gridDimensions option, check against calculated gridPadding
-                if (this.options.gridDimensions && $.isPlainObject(this.options.gridDimensions)) {
-                    var gdw = parseInt(this.options.gridDimensions.width, 10) || 0;
-                    var gdh = parseInt(this.options.gridDimensions.height, 10) || 0;
-                    var widthAdj = (this._width - gridPadding.left - gridPadding.right - gdw)/2;
-                    var heightAdj = (this._height - gridPadding.top - gridPadding.bottom - gdh)/2;
-
-                    if (heightAdj >= 0 && widthAdj >= 0) {
-                        gridPadding.top += heightAdj;
-                        gridPadding.bottom += heightAdj;
-                        gridPadding.left += widthAdj;
-                        gridPadding.right += widthAdj;
-                    }
-                }
-                var arr = ['top', 'bottom', 'left', 'right'];
-                for (var n in arr) {
-                    if (this._gridPadding[arr[n]] == null && gridPadding[arr[n]] > 0) {
-                        this._gridPadding[arr[n]] = gridPadding[arr[n]];
-                    }
-                    else if (this._gridPadding[arr[n]] == null) {
-                        this._gridPadding[arr[n]] = this._defaultGridPadding[arr[n]];
-                    }
-                }
-                
-                var legendPadding = this._gridPadding;
-                
-                if (this.legend.placement === 'outsideGrid') {
-                    legendPadding = {top:this.title.getHeight(), left: 0, right: 0, bottom: 0};
-                    if (this.legend.location === 's') {
-                        legendPadding.left = this._gridPadding.left;
-                        legendPadding.right = this._gridPadding.right;
-                    }
-                }
-                
-                ax.xaxis.pack({position:'absolute', bottom:this._gridPadding.bottom - ax.xaxis.getHeight(), left:0, width:this._width}, {min:this._gridPadding.left, max:this._width - this._gridPadding.right});
-                ax.yaxis.pack({position:'absolute', top:0, left:this._gridPadding.left - ax.yaxis.getWidth(), height:this._height}, {min:this._height - this._gridPadding.bottom, max: this._gridPadding.top});
-                ax.x2axis.pack({position:'absolute', top:this._gridPadding.top - ax.x2axis.getHeight(), left:0, width:this._width}, {min:this._gridPadding.left, max:this._width - this._gridPadding.right});
-                for (i=8; i>0; i--) {
-                    ax[ra[i-1]].pack({position:'absolute', top:0, right:this._gridPadding.right - rapad[i-1]}, {min:this._height - this._gridPadding.bottom, max: this._gridPadding.top});
-                }
-                var ltemp = (this._width - this._gridPadding.left - this._gridPadding.right)/2.0 + this._gridPadding.left - ax.yMidAxis.getWidth()/2.0;
-                ax.yMidAxis.pack({position:'absolute', top:0, left:ltemp, zIndex:9, textAlign: 'center'}, {min:this._height - this._gridPadding.bottom, max: this._gridPadding.top});
-            
-                this.target.append(this.grid.createElement(this._gridPadding, this));
-                this.grid.draw();
-                
-                var series = this.series;
-                var seriesLength = series.length;
-                // put the shadow canvases behind the series canvases so shadows don't overlap on stacked bars.
-                for (i=0, l=seriesLength; i<l; i++) {
-                    // draw series in order of stacking.  This affects only
-                    // order in which canvases are added to dom.
-                    j = this.seriesStack[i];
-                    this.target.append(series[j].shadowCanvas.createElement(this._gridPadding, 'jqplot-series-shadowCanvas', null, this));
-                    series[j].shadowCanvas.setContext();
-                    series[j].shadowCanvas._elem.data('seriesIndex', j);
-                }
-                
-                for (i=0, l=seriesLength; i<l; i++) {
-                    // draw series in order of stacking.  This affects only
-                    // order in which canvases are added to dom.
-                    j = this.seriesStack[i];
-                    this.target.append(series[j].canvas.createElement(this._gridPadding, 'jqplot-series-canvas', null, this));
-                    series[j].canvas.setContext();
-                    series[j].canvas._elem.data('seriesIndex', j);
-                }
-                // Need to use filled canvas to capture events in IE.
-                // Also, canvas seems to block selection of other elements in document on FF.
-                this.target.append(this.eventCanvas.createElement(this._gridPadding, 'jqplot-event-canvas', null, this));
-                this.eventCanvas.setContext();
-                this.eventCanvas._ctx.fillStyle = 'rgba(0,0,0,0)';
-                this.eventCanvas._ctx.fillRect(0,0,this.eventCanvas._ctx.canvas.width, this.eventCanvas._ctx.canvas.height);
-            
-                // bind custom event handlers to regular events.
-                this.bindCustomEvents();
-            
-                // draw legend before series if the series needs to know the legend dimensions.
-                if (this.legend.preDraw) {  
-                    this.eventCanvas._elem.before(legendElem);
-                    this.legend.pack(legendPadding);
-                    if (this.legend._elem) {
-                        this.drawSeries({legendInfo:{location:this.legend.location, placement:this.legend.placement, width:this.legend.getWidth(), height:this.legend.getHeight(), xoffset:this.legend.xoffset, yoffset:this.legend.yoffset}});
-                    }
-                    else {
-                        this.drawSeries();
-                    }
-                }
-                else {  // draw series before legend
-                    this.drawSeries();
-                    if (seriesLength) {
-                        $(series[seriesLength-1].canvas._elem).after(legendElem);
-                    }
-                    this.legend.pack(legendPadding);                
-                }
-            
-                // register event listeners on the overlay canvas
-                for (var i=0, l=$.jqplot.eventListenerHooks.length; i<l; i++) {
-                    // in the handler, this will refer to the eventCanvas dom element.
-                    // make sure there are references back into plot objects.
-                    this.eventCanvas._elem.bind($.jqplot.eventListenerHooks[i][0], {plot:this}, $.jqplot.eventListenerHooks[i][1]);
-                }
-            
-                // register event listeners on the overlay canvas
-                for (var i=0, l=this.eventListenerHooks.hooks.length; i<l; i++) {
-                    // in the handler, this will refer to the eventCanvas dom element.
-                    // make sure there are references back into plot objects.
-                    this.eventCanvas._elem.bind(this.eventListenerHooks.hooks[i][0], {plot:this}, this.eventListenerHooks.hooks[i][1]);
-                }
-
-                var fb = this.fillBetween;
-                if (fb.fill && fb.series1 !== fb.series2 && fb.series1 < seriesLength && fb.series2 < seriesLength && series[fb.series1]._type === 'line' && series[fb.series2]._type === 'line') {
-                    this.doFillBetweenLines();
-                }
-
-                for (var i=0, l=$.jqplot.postDrawHooks.length; i<l; i++) {
-                    $.jqplot.postDrawHooks[i].call(this);
-                }
-
-                for (var i=0, l=this.postDrawHooks.hooks.length; i<l; i++) {
-                    this.postDrawHooks.hooks[i].apply(this, this.postDrawHooks.args[i]);
-                }
-            
-                if (this.target.is(':visible')) {
-                    this._drawCount += 1;
-                }
-
-                var temps, 
-                    tempr,
-                    sel,
-                    _els;
-                // ughh.  ideally would hide all series then show them.
-                for (i=0, l=seriesLength; i<l; i++) {
-                    temps = series[i];
-                    tempr = temps.renderer;
-                    sel = '.jqplot-point-label.jqplot-series-'+i;
-                    if (tempr.animation && tempr.animation._supported && tempr.animation.show && (this._drawCount < 2 || this.animateReplot)) {
-                        _els = this.target.find(sel);
-                        _els.stop(true, true).hide();
-                        temps.canvas._elem.stop(true, true).hide();
-                        temps.shadowCanvas._elem.stop(true, true).hide();
-                        temps.canvas._elem.jqplotEffect('blind', {mode: 'show', direction: tempr.animation.direction}, tempr.animation.speed);
-                        temps.shadowCanvas._elem.jqplotEffect('blind', {mode: 'show', direction: tempr.animation.direction}, tempr.animation.speed);
-                        _els.fadeIn(tempr.animation.speed*0.8);
-                    }
-                }
-                _els = null;
-            
-                this.target.trigger('jqplotPostDraw', [this]);
-            }
-        };
-
-        jqPlot.prototype.doFillBetweenLines = function () {
-            var fb = this.fillBetween;
-            var sid1 = fb.series1;
-            var sid2 = fb.series2;
-            // first series should always be lowest index
-            var id1 = (sid1 < sid2) ? sid1 : sid2;
-            var id2 = (sid2 >  sid1) ? sid2 : sid1;
-
-            var series1 = this.series[id1];
-            var series2 = this.series[id2];
-
-            if (series2.renderer.smooth) {
-                var tempgd = series2.renderer._smoothedData.slice(0).reverse();
-            }
-            else {
-                var tempgd = series2.gridData.slice(0).reverse();
-            }
-
-            if (series1.renderer.smooth) {
-                var gd = series1.renderer._smoothedData.concat(tempgd);
-            }
-            else {
-                var gd = series1.gridData.concat(tempgd);
-            }
-
-            var color = (fb.color !== null) ? fb.color : this.series[sid1].fillColor;
-            var baseSeries = (fb.baseSeries !== null) ? fb.baseSeries : id1;
-
-            // now apply a fill to the shape on the lower series shadow canvas,
-            // so it is behind both series.
-            var sr = this.series[baseSeries].renderer.shapeRenderer;
-            var opts = {fillStyle: color, fill: true, closePath: true};
-            sr.draw(series1.shadowCanvas._ctx, gd, opts);
-        };
-        
-        this.bindCustomEvents = function() {
-            this.eventCanvas._elem.bind('click', {plot:this}, this.onClick);
-            this.eventCanvas._elem.bind('dblclick', {plot:this}, this.onDblClick);
-            this.eventCanvas._elem.bind('mousedown', {plot:this}, this.onMouseDown);
-            this.eventCanvas._elem.bind('mousemove', {plot:this}, this.onMouseMove);
-            this.eventCanvas._elem.bind('mouseenter', {plot:this}, this.onMouseEnter);
-            this.eventCanvas._elem.bind('mouseleave', {plot:this}, this.onMouseLeave);
-            if (this.captureRightClick) {
-                this.eventCanvas._elem.bind('mouseup', {plot:this}, this.onRightClick);
-                this.eventCanvas._elem.get(0).oncontextmenu = function() {
-                    return false;
-                };
-            }
-            else {
-                this.eventCanvas._elem.bind('mouseup', {plot:this}, this.onMouseUp);
-            }
-        };
-        
-        function getEventPosition(ev) {
-            var plot = ev.data.plot;
-            var go = plot.eventCanvas._elem.offset();
-            var gridPos = {x:ev.pageX - go.left, y:ev.pageY - go.top};
-            var dataPos = {xaxis:null, yaxis:null, x2axis:null, y2axis:null, y3axis:null, y4axis:null, y5axis:null, y6axis:null, y7axis:null, y8axis:null, y9axis:null, yMidAxis:null};
-            var an = ['xaxis', 'yaxis', 'x2axis', 'y2axis', 'y3axis', 'y4axis', 'y5axis', 'y6axis', 'y7axis', 'y8axis', 'y9axis', 'yMidAxis'];
-            var ax = plot.axes;
-            var n, axis;
-            for (n=11; n>0; n--) {
-                axis = an[n-1];
-                if (ax[axis].show) {
-                    dataPos[axis] = ax[axis].series_p2u(gridPos[axis.charAt(0)]);
-                }
-            }
-
-            return {offsets:go, gridPos:gridPos, dataPos:dataPos};
-        }
-        
-        
-        // function to check if event location is over a area area
-        function checkIntersection(gridpos, plot) {
-            var series = plot.series;
-            var i, j, k, s, r, x, y, theta, sm, sa, minang, maxang;
-            var d0, d, p, pp, points, bw, hp;
-            var threshold, t;
-            for (k=plot.seriesStack.length-1; k>=0; k--) {
-                i = plot.seriesStack[k];
-                s = series[i];
-                hp = s._highlightThreshold;
-                switch (s.renderer.constructor) {
-                    case $.jqplot.BarRenderer:
-                        x = gridpos.x;
-                        y = gridpos.y;
-                        for (j=0; j<s._barPoints.length; j++) {
-                            points = s._barPoints[j];
-                            p = s.gridData[j];
-                            if (x>points[0][0] && x<points[2][0] && y>points[2][1] && y<points[0][1]) {
-                                return {seriesIndex:s.index, pointIndex:j, gridData:p, data:s.data[j], points:s._barPoints[j]};
-                            }
-                        }
-                        break;
-                    case $.jqplot.PyramidRenderer:
-                        x = gridpos.x;
-                        y = gridpos.y;
-                        for (j=0; j<s._barPoints.length; j++) {
-                            points = s._barPoints[j];
-                            p = s.gridData[j];
-                            if (x > points[0][0] + hp[0][0] && x < points[2][0] + hp[2][0] && y > points[2][1] && y < points[0][1]) {
-                                return {seriesIndex:s.index, pointIndex:j, gridData:p, data:s.data[j], points:s._barPoints[j]};
-                            }
-                        }
-                        break;
-                    
-                    case $.jqplot.DonutRenderer:
-                        sa = s.startAngle/180*Math.PI;
-                        x = gridpos.x - s._center[0];
-                        y = gridpos.y - s._center[1];
-                        r = Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2));
-                        if (x > 0 && -y >= 0) {
-                            theta = 2*Math.PI - Math.atan(-y/x);
-                        }
-                        else if (x > 0 && -y < 0) {
-                            theta = -Math.atan(-y/x);
-                        }
-                        else if (x < 0) {
-                            theta = Math.PI - Math.atan(-y/x);
-                        }
-                        else if (x == 0 && -y > 0) {
-                            theta = 3*Math.PI/2;
-                        }
-                        else if (x == 0 && -y < 0) {
-                            theta = Math.PI/2;
-                        }
-                        else if (x == 0 && y == 0) {
-                            theta = 0;
-                        }
-                        if (sa) {
-                            theta -= sa;
-                            if (theta < 0) {
-                                theta += 2*Math.PI;
-                            }
-                            else if (theta > 2*Math.PI) {
-                                theta -= 2*Math.PI;
-                            }
-                        }
-            
-                        sm = s.sliceMargin/180*Math.PI;
-                        if (r < s._radius && r > s._innerRadius) {
-                            for (j=0; j<s.gridData.length; j++) {
-                                minang = (j>0) ? s.gridData[j-1][1]+sm : sm;
-                                maxang = s.gridData[j][1];
-                                if (theta > minang && theta < maxang) {
-                                    return {seriesIndex:s.index, pointIndex:j, gridData:[gridpos.x,gridpos.y], data:s.data[j]};
-                                }
-                            }
-                        }
-                        break;
-                        
-                    case $.jqplot.PieRenderer:
-                        sa = s.startAngle/180*Math.PI;
-                        x = gridpos.x - s._center[0];
-                        y = gridpos.y - s._center[1];
-                        r = Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2));
-                        if (x > 0 && -y >= 0) {
-                            theta = 2*Math.PI - Math.atan(-y/x);
-                        }
-                        else if (x > 0 && -y < 0) {
-                            theta = -Math.atan(-y/x);
-                        }
-                        else if (x < 0) {
-                            theta = Math.PI - Math.atan(-y/x);
-                        }
-                        else if (x == 0 && -y > 0) {
-                            theta = 3*Math.PI/2;
-                        }
-                        else if (x == 0 && -y < 0) {
-                            theta = Math.PI/2;
-                        }
-                        else if (x == 0 && y == 0) {
-                            theta = 0;
-                        }
-                        if (sa) {
-                            theta -= sa;
-                            if (theta < 0) {
-                                theta += 2*Math.PI;
-                            }
-                            else if (theta > 2*Math.PI) {
-                                theta -= 2*Math.PI;
-                            }
-                        }
-            
-                        sm = s.sliceMargin/180*Math.PI;
-                        if (r < s._radius) {
-                            for (j=0; j<s.gridData.length; j++) {
-                                minang = (j>0) ? s.gridData[j-1][1]+sm : sm;
-                                maxang = s.gridData[j][1];
-                                if (theta > minang && theta < maxang) {
-                                    return {seriesIndex:s.index, pointIndex:j, gridData:[gridpos.x,gridpos.y], data:s.data[j]};
-                                }
-                            }
-                        }
-                        break;
-                        
-                    case $.jqplot.BubbleRenderer:
-                        x = gridpos.x;
-                        y = gridpos.y;
-                        var ret = null;
-                        
-                        if (s.show) {
-                            for (var j=0; j<s.gridData.length; j++) {
-                                p = s.gridData[j];
-                                d = Math.sqrt( (x-p[0]) * (x-p[0]) + (y-p[1]) * (y-p[1]) );
-                                if (d <= p[2] && (d <= d0 || d0 == null)) {
-                                   d0 = d;
-                                   ret = {seriesIndex: i, pointIndex:j, gridData:p, data:s.data[j]};
-                                }
-                            }
-                            if (ret != null) {
-                                return ret;
-                            }
-                        }
-                        break;
-                        
-                    case $.jqplot.FunnelRenderer:
-                        x = gridpos.x;
-                        y = gridpos.y;
-                        var v = s._vertices,
-                            vfirst = v[0],
-                            vlast = v[v.length-1],
-                            lex,
-                            rex,
-                            cv;
-    
-                        // equations of right and left sides, returns x, y values given height of section (y value and 2 points)
-    
-                        function findedge (l, p1 , p2) {
-                            var m = (p1[1] - p2[1])/(p1[0] - p2[0]);
-                            var b = p1[1] - m*p1[0];
-                            var y = l + p1[1];
-        
-                            return [(y - b)/m, y];
-                        }
-    
-                        // check each section
-                        lex = findedge(y, vfirst[0], vlast[3]);
-                        rex = findedge(y, vfirst[1], vlast[2]);
-                        for (j=0; j<v.length; j++) {
-                            cv = v[j];
-                            if (y >= cv[0][1] && y <= cv[3][1] && x >= lex[0] && x <= rex[0]) {
-                                return {seriesIndex:s.index, pointIndex:j, gridData:null, data:s.data[j]};
-                            }
-                        }         
-                        break;           
-                    
-                    case $.jqplot.LineRenderer:
-                        x = gridpos.x;
-                        y = gridpos.y;
-                        r = s.renderer;
-                        if (s.show) {
-                            if ((s.fill || (s.renderer.bands.show && s.renderer.bands.fill)) && (!plot.plugins.highlighter || !plot.plugins.highlighter.show)) {
-                                // first check if it is in bounding box
-                                var inside = false;
-                                if (x>s._boundingBox[0][0] && x<s._boundingBox[1][0] && y>s._boundingBox[1][1] && y<s._boundingBox[0][1]) { 
-                                    // now check the crossing number   
-                                    
-                                    var numPoints = s._areaPoints.length;
-                                    var ii;
-                                    var j = numPoints-1;
-
-                                    for(var ii=0; ii < numPoints; ii++) { 
-                                        var vertex1 = [s._areaPoints[ii][0], s._areaPoints[ii][1]];
-                                        var vertex2 = [s._areaPoints[j][0], s._areaPoints[j][1]];
-
-                                        if (vertex1[1] < y && vertex2[1] >= y || vertex2[1] < y && vertex1[1] >= y)     {
-                                            if (vertex1[0] + (y - vertex1[1]) / (vertex2[1] - vertex1[1]) * (vertex2[0] - vertex1[0]) < x) {
-                                                inside = !inside;
-                                            }
-                                        }
-
-                                        j = ii;
-                                    }        
-                                }
-                                if (inside) {
-                                    return {seriesIndex:i, pointIndex:null, gridData:s.gridData, data:s.data, points:s._areaPoints};
-                                }
-                                break;
-                                
-                            }
-
-                            else {
-                                t = s.markerRenderer.size/2+s.neighborThreshold;
-                                threshold = (t > 0) ? t : 0;
-                                for (var j=0; j<s.gridData.length; j++) {
-                                    p = s.gridData[j];
-                                    // neighbor looks different to OHLC chart.
-                                    if (r.constructor == $.jqplot.OHLCRenderer) {
-                                        if (r.candleStick) {
-                                            var yp = s._yaxis.series_u2p;
-                                            if (x >= p[0]-r._bodyWidth/2 && x <= p[0]+r._bodyWidth/2 && y >= yp(s.data[j][2]) && y <= yp(s.data[j][3])) {
-                                                return {seriesIndex: i, pointIndex:j, gridData:p, data:s.data[j]};
-                                            }
-                                        }
-                                        // if an open hi low close chart
-                                        else if (!r.hlc){
-                                            var yp = s._yaxis.series_u2p;
-                                            if (x >= p[0]-r._tickLength && x <= p[0]+r._tickLength && y >= yp(s.data[j][2]) && y <= yp(s.data[j][3])) {
-                                                return {seriesIndex: i, pointIndex:j, gridData:p, data:s.data[j]};
-                                            }
-                                        }
-                                        // a hi low close chart
-                                        else {
-                                            var yp = s._yaxis.series_u2p;
-                                            if (x >= p[0]-r._tickLength && x <= p[0]+r._tickLength && y >= yp(s.data[j][1]) && y <= yp(s.data[j][2])) {
-                                                return {seriesIndex: i, pointIndex:j, gridData:p, data:s.data[j]};
-                                            }
-                                        }
-                            
-                                    }
-                                    else if (p[0] != null && p[1] != null){
-                                        d = Math.sqrt( (x-p[0]) * (x-p[0]) + (y-p[1]) * (y-p[1]) );
-                                        if (d <= threshold && (d <= d0 || d0 == null)) {
-                                           d0 = d;
-                                           return {seriesIndex: i, pointIndex:j, gridData:p, data:s.data[j]};
-                                        }
-                                    }
-                                } 
-                            }
-                        }
-                        break;
-                        
-                    default:
-                        x = gridpos.x;
-                        y = gridpos.y;
-                        r = s.renderer;
-                        if (s.show) {
-                            t = s.markerRenderer.size/2+s.neighborThreshold;
-                            threshold = (t > 0) ? t : 0;
-                            for (var j=0; j<s.gridData.length; j++) {
-                                p = s.gridData[j];
-                                // neighbor looks different to OHLC chart.
-                                if (r.constructor == $.jqplot.OHLCRenderer) {
-                                    if (r.candleStick) {
-                                        var yp = s._yaxis.series_u2p;
-                                        if (x >= p[0]-r._bodyWidth/2 && x <= p[0]+r._bodyWidth/2 && y >= yp(s.data[j][2]) && y <= yp(s.data[j][3])) {
-                                            return {seriesIndex: i, pointIndex:j, gridData:p, data:s.data[j]};
-                                        }
-                                    }
-                                    // if an open hi low close chart
-                                    else if (!r.hlc){
-                                        var yp = s._yaxis.series_u2p;
-                                        if (x >= p[0]-r._tickLength && x <= p[0]+r._tickLength && y >= yp(s.data[j][2]) && y <= yp(s.data[j][3])) {
-                                            return {seriesIndex: i, pointIndex:j, gridData:p, data:s.data[j]};
-                                        }
-                                    }
-                                    // a hi low close chart
-                                    else {
-                                        var yp = s._yaxis.series_u2p;
-                                        if (x >= p[0]-r._tickLength && x <= p[0]+r._tickLength && y >= yp(s.data[j][1]) && y <= yp(s.data[j][2])) {
-                                            return {seriesIndex: i, pointIndex:j, gridData:p, data:s.data[j]};
-                                        }
-                                    }
-                            
-                                }
-                                else {
-                                    d = Math.sqrt( (x-p[0]) * (x-p[0]) + (y-p[1]) * (y-p[1]) );
-                                    if (d <= threshold && (d <= d0 || d0 == null)) {
-                                       d0 = d;
-                                       return {seriesIndex: i, pointIndex:j, gridData:p, data:s.data[j]};
-                                    }
-                                }
-                            } 
-                        }
-                        break;
-                }
-            }
-            
-            return null;
-        }
-        
-        
-        
-        this.onClick = function(ev) {
-            // Event passed in is normalized and will have data attribute.
-            // Event passed out is unnormalized.
-            var positions = getEventPosition(ev);
-            var p = ev.data.plot;
-            var neighbor = checkIntersection(positions.gridPos, p);
-            var evt = $.Event('jqplotClick');
-            evt.pageX = ev.pageX;
-            evt.pageY = ev.pageY;
-            $(this).trigger(evt, [positions.gridPos, positions.dataPos, neighbor, p]);
-        };
-        
-        this.onDblClick = function(ev) {
-            // Event passed in is normalized and will have data attribute.
-            // Event passed out is unnormalized.
-            var positions = getEventPosition(ev);
-            var p = ev.data.plot;
-            var neighbor = checkIntersection(positions.gridPos, p);
-            var evt = $.Event('jqplotDblClick');
-            evt.pageX = ev.pageX;
-            evt.pageY = ev.pageY;
-            $(this).trigger(evt, [positions.gridPos, positions.dataPos, neighbor, p]);
-        };
-        
-        this.onMouseDown = function(ev) {
-            var positions = getEventPosition(ev);
-            var p = ev.data.plot;
-            var neighbor = checkIntersection(positions.gridPos, p);
-            var evt = $.Event('jqplotMouseDown');
-            evt.pageX = ev.pageX;
-            evt.pageY = ev.pageY;
-            $(this).trigger(evt, [positions.gridPos, positions.dataPos, neighbor, p]);
-        };
-        
-        this.onMouseUp = function(ev) {
-            var positions = getEventPosition(ev);
-            var evt = $.Event('jqplotMouseUp');
-            evt.pageX = ev.pageX;
-            evt.pageY = ev.pageY;
-            $(this).trigger(evt, [positions.gridPos, positions.dataPos, null, ev.data.plot]);
-        };
-        
-        this.onRightClick = function(ev) {
-            var positions = getEventPosition(ev);
-            var p = ev.data.plot;
-            var neighbor = checkIntersection(positions.gridPos, p);
-            if (p.captureRightClick) {
-                if (ev.which == 3) {
-                var evt = $.Event('jqplotRightClick');
-                evt.pageX = ev.pageX;
-                evt.pageY = ev.pageY;
-                    $(this).trigger(evt, [positions.gridPos, positions.dataPos, neighbor, p]);
-                }
-                else {
-                var evt = $.Event('jqplotMouseUp');
-                evt.pageX = ev.pageX;
-                evt.pageY = ev.pageY;
-                    $(this).trigger(evt, [positions.gridPos, positions.dataPos, neighbor, p]);
-                }
-            }
-        };
-        
-        this.onMouseMove = function(ev) {
-            var positions = getEventPosition(ev);
-            var p = ev.data.plot;
-            var neighbor = checkIntersection(positions.gridPos, p);
-            var evt = $.Event('jqplotMouseMove');
-            evt.pageX = ev.pageX;
-            evt.pageY = ev.pageY;
-            $(this).trigger(evt, [positions.gridPos, positions.dataPos, neighbor, p]);
-        };
-        
-        this.onMouseEnter = function(ev) {
-            var positions = getEventPosition(ev);
-            var p = ev.data.plot;
-            var evt = $.Event('jqplotMouseEnter');
-            evt.pageX = ev.pageX;
-            evt.pageY = ev.pageY;
-            evt.relatedTarget = ev.relatedTarget;
-            $(this).trigger(evt, [positions.gridPos, positions.dataPos, null, p]);
-        };
-        
-        this.onMouseLeave = function(ev) {
-            var positions = getEventPosition(ev);
-            var p = ev.data.plot;
-            var evt = $.Event('jqplotMouseLeave');
-            evt.pageX = ev.pageX;
-            evt.pageY = ev.pageY;
-            evt.relatedTarget = ev.relatedTarget;
-            $(this).trigger(evt, [positions.gridPos, positions.dataPos, null, p]);
-        };
-        
-        // method: drawSeries
-        // Redraws all or just one series on the plot.  No axis scaling
-        // is performed and no other elements on the plot are redrawn.
-        // options is an options object to pass on to the series renderers.
-        // It can be an empty object {}.  idx is the series index
-        // to redraw if only one series is to be redrawn.
-        this.drawSeries = function(options, idx){
-            var i, series, ctx;
-            // if only one argument passed in and it is a number, use it ad idx.
-            idx = (typeof(options) === "number" && idx == null) ? options : idx;
-            options = (typeof(options) === "object") ? options : {};
-            // draw specified series
-            if (idx != undefined) {
-                series = this.series[idx];
-                ctx = series.shadowCanvas._ctx;
-                ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height);
-                series.drawShadow(ctx, options, this);
-                ctx = series.canvas._ctx;
-                ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height);
-                series.draw(ctx, options, this);
-                if (series.renderer.constructor == $.jqplot.BezierCurveRenderer) {
-                    if (idx < this.series.length - 1) {
-                        this.drawSeries(idx+1); 
-                    }
-                }
-            }
-            
-            else {
-                // if call series drawShadow method first, in case all series shadows
-                // should be drawn before any series.  This will ensure, like for 
-                // stacked bar plots, that shadows don't overlap series.
-                for (i=0; i<this.series.length; i++) {
-                    // first clear the canvas
-                    series = this.series[i];
-                    ctx = series.shadowCanvas._ctx;
-                    ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height);
-                    series.drawShadow(ctx, options, this);
-                    ctx = series.canvas._ctx;
-                    ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height);
-                    series.draw(ctx, options, this);
-                }
-            }
-            options = idx = i = series = ctx = null;
-        };
-        
-        // method: moveSeriesToFront
-        // This method requires jQuery 1.4+
-        // Moves the specified series canvas in front of all other series canvases.
-        // This effectively "draws" the specified series on top of all other series,
-        // although it is performed through DOM manipulation, no redrawing is performed.
-        //
-        // Parameters:
-        // idx - 0 based index of the series to move.  This will be the index of the series
-        // as it was first passed into the jqplot function.
-        this.moveSeriesToFront = function (idx) { 
-            idx = parseInt(idx, 10);
-            var stackIndex = $.inArray(idx, this.seriesStack);
-            // if already in front, return
-            if (stackIndex == -1) {
-                return;
-            }
-            if (stackIndex == this.seriesStack.length -1) {
-                this.previousSeriesStack = this.seriesStack.slice(0);
-                return;
-            }
-            var opidx = this.seriesStack[this.seriesStack.length -1];
-            var serelem = this.series[idx].canvas._elem.detach();
-            var shadelem = this.series[idx].shadowCanvas._elem.detach();
-            this.series[opidx].shadowCanvas._elem.after(shadelem);
-            this.series[opidx].canvas._elem.after(serelem);
-            this.previousSeriesStack = this.seriesStack.slice(0);
-            this.seriesStack.splice(stackIndex, 1);
-            this.seriesStack.push(idx);
-        };
-        
-        // method: moveSeriesToBack
-        // This method requires jQuery 1.4+
-        // Moves the specified series canvas behind all other series canvases.
-        //
-        // Parameters:
-        // idx - 0 based index of the series to move.  This will be the index of the series
-        // as it was first passed into the jqplot function.
-        this.moveSeriesToBack = function (idx) {
-            idx = parseInt(idx, 10);
-            var stackIndex = $.inArray(idx, this.seriesStack);
-            // if already in back, return
-            if (stackIndex == 0 || stackIndex == -1) {
-                return;
-            }
-            var opidx = this.seriesStack[0];
-            var serelem = this.series[idx].canvas._elem.detach();
-            var shadelem = this.series[idx].shadowCanvas._elem.detach();
-            this.series[opidx].shadowCanvas._elem.before(shadelem);
-            this.series[opidx].canvas._elem.before(serelem);
-            this.previousSeriesStack = this.seriesStack.slice(0);
-            this.seriesStack.splice(stackIndex, 1);
-            this.seriesStack.unshift(idx);
-        };
-        
-        // method: restorePreviousSeriesOrder
-        // This method requires jQuery 1.4+
-        // Restore the series canvas order to its previous state.
-        // Useful to put a series back where it belongs after moving
-        // it to the front.
-        this.restorePreviousSeriesOrder = function () {
-            var i, j, serelem, shadelem, temp, move, keep;
-            // if no change, return.
-            if (this.seriesStack == this.previousSeriesStack) {
-                return;
-            }
-            for (i=1; i<this.previousSeriesStack.length; i++) {
-                move = this.previousSeriesStack[i];
-                keep = this.previousSeriesStack[i-1];
-                serelem = this.series[move].canvas._elem.detach();
-                shadelem = this.series[move].shadowCanvas._elem.detach();
-                this.series[keep].shadowCanvas._elem.after(shadelem);
-                this.series[keep].canvas._elem.after(serelem);
-            }
-            temp = this.seriesStack.slice(0);
-            this.seriesStack = this.previousSeriesStack.slice(0);
-            this.previousSeriesStack = temp;
-        };
-        
-        // method: restoreOriginalSeriesOrder
-        // This method requires jQuery 1.4+
-        // Restore the series canvas order to its original order
-        // when the plot was created.
-        this.restoreOriginalSeriesOrder = function () {
-            var i, j, arr=[], serelem, shadelem;
-            for (i=0; i<this.series.length; i++) {
-                arr.push(i);
-            }
-            if (this.seriesStack == arr) {
-                return;
-            }
-            this.previousSeriesStack = this.seriesStack.slice(0);
-            this.seriesStack = arr;
-            for (i=1; i<this.seriesStack.length; i++) {
-                serelem = this.series[i].canvas._elem.detach();
-                shadelem = this.series[i].shadowCanvas._elem.detach();
-                this.series[i-1].shadowCanvas._elem.after(shadelem);
-                this.series[i-1].canvas._elem.after(serelem);
-            }
-        };
-        
-        this.activateTheme = function (name) {
-            this.themeEngine.activate(this, name);
-        };
-    }
-    
-    
-    // conpute a highlight color or array of highlight colors from given colors.
-    $.jqplot.computeHighlightColors  = function(colors) {
-        var ret;
-        if ($.isArray(colors)) {
-            ret = [];
-            for (var i=0; i<colors.length; i++){
-                var rgba = $.jqplot.getColorComponents(colors[i]);
-                var newrgb = [rgba[0], rgba[1], rgba[2]];
-                var sum = newrgb[0] + newrgb[1] + newrgb[2];
-                for (var j=0; j<3; j++) {
-                    // when darkening, lowest color component can be is 60.
-                    newrgb[j] = (sum > 660) ?  newrgb[j] * 0.85 : 0.73 * newrgb[j] + 90;
-                    newrgb[j] = parseInt(newrgb[j], 10);
-                    (newrgb[j] > 255) ? 255 : newrgb[j];
-                }
-                // newrgb[3] = (rgba[3] > 0.4) ? rgba[3] * 0.4 : rgba[3] * 1.5;
-                // newrgb[3] = (rgba[3] > 0.5) ? 0.8 * rgba[3] - .1 : rgba[3] + 0.2;
-                newrgb[3] = 0.3 + 0.35 * rgba[3];
-                ret.push('rgba('+newrgb[0]+','+newrgb[1]+','+newrgb[2]+','+newrgb[3]+')');
-            }
-        }
-        else {
-            var rgba = $.jqplot.getColorComponents(colors);
-            var newrgb = [rgba[0], rgba[1], rgba[2]];
-            var sum = newrgb[0] + newrgb[1] + newrgb[2];
-            for (var j=0; j<3; j++) {
-                // when darkening, lowest color component can be is 60.
-                // newrgb[j] = (sum > 570) ?  newrgb[j] * 0.8 : newrgb[j] + 0.3 * (255 - newrgb[j]);
-                // newrgb[j] = parseInt(newrgb[j], 10);
-                newrgb[j] = (sum > 660) ?  newrgb[j] * 0.85 : 0.73 * newrgb[j] + 90;
-                newrgb[j] = parseInt(newrgb[j], 10);
-                (newrgb[j] > 255) ? 255 : newrgb[j];
-            }
-            // newrgb[3] = (rgba[3] > 0.4) ? rgba[3] * 0.4 : rgba[3] * 1.5;
-            // newrgb[3] = (rgba[3] > 0.5) ? 0.8 * rgba[3] - .1 : rgba[3] + 0.2;
-            newrgb[3] = 0.3 + 0.35 * rgba[3];
-            ret = 'rgba('+newrgb[0]+','+newrgb[1]+','+newrgb[2]+','+newrgb[3]+')';
-        }
-        return ret;
-    };
-        
-   $.jqplot.ColorGenerator = function(colors) {
-        colors = colors || $.jqplot.config.defaultColors;
-        var idx = 0;
-        
-        this.next = function () { 
-            if (idx < colors.length) {
-                return colors[idx++];
-            }
-            else {
-                idx = 0;
-                return colors[idx++];
-            }
-        };
-        
-        this.previous = function () { 
-            if (idx > 0) {
-                return colors[idx--];
-            }
-            else {
-                idx = colors.length-1;
-                return colors[idx];
-            }
-        };
-        
-        // get a color by index without advancing pointer.
-        this.get = function(i) {
-            var idx = i - colors.length * Math.floor(i/colors.length);
-            return colors[idx];
-        };
-        
-        this.setColors = function(c) {
-            colors = c;
-        };
-        
-        this.reset = function() {
-            idx = 0;
-        };
-
-        this.getIndex = function() {
-            return idx;
-        };
-
-        this.setIndex = function(index) {
-            idx = index;
-        };
-    };
-
-    // convert a hex color string to rgb string.
-    // h - 3 or 6 character hex string, with or without leading #
-    // a - optional alpha
-    $.jqplot.hex2rgb = function(h, a) {
-        h = h.replace('#', '');
-        if (h.length == 3) {
-            h = h.charAt(0)+h.charAt(0)+h.charAt(1)+h.charAt(1)+h.charAt(2)+h.charAt(2);
-        }
-        var rgb;
-        rgb = 'rgba('+parseInt(h.slice(0,2), 16)+', '+parseInt(h.slice(2,4), 16)+', '+parseInt(h.slice(4,6), 16);
-        if (a) {
-            rgb += ', '+a;
-        }
-        rgb += ')';
-        return rgb;
-    };
-    
-    // convert an rgb color spec to a hex spec.  ignore any alpha specification.
-    $.jqplot.rgb2hex = function(s) {
-        var pat = /rgba?\( *([0-9]{1,3}\.?[0-9]*%?) *, *([0-9]{1,3}\.?[0-9]*%?) *, *([0-9]{1,3}\.?[0-9]*%?) *(?:, *[0-9.]*)?\)/;
-        var m = s.match(pat);
-        var h = '#';
-        for (var i=1; i<4; i++) {
-            var temp;
-            if (m[i].search(/%/) != -1) {
-                temp = parseInt(255*m[i]/100, 10).toString(16);
-                if (temp.length == 1) {
-                    temp = '0'+temp;
-                }
-            }
-            else {
-                temp = parseInt(m[i], 10).toString(16);
-                if (temp.length == 1) {
-                    temp = '0'+temp;
-                }
-            }
-            h += temp;
-        }
-        return h;
-    };
-    
-    // given a css color spec, return an rgb css color spec
-    $.jqplot.normalize2rgb = function(s, a) {
-        if (s.search(/^ *rgba?\(/) != -1) {
-            return s; 
-        }
-        else if (s.search(/^ *#?[0-9a-fA-F]?[0-9a-fA-F]/) != -1) {
-            return $.jqplot.hex2rgb(s, a);
-        }
-        else {
-            throw new Error('Invalid color spec');
-        }
-    };
-    
-    // extract the r, g, b, a color components out of a css color spec.
-    $.jqplot.getColorComponents = function(s) {
-        // check to see if a color keyword.
-        s = $.jqplot.colorKeywordMap[s] || s;
-        var rgb = $.jqplot.normalize2rgb(s);
-        var pat = /rgba?\( *([0-9]{1,3}\.?[0-9]*%?) *, *([0-9]{1,3}\.?[0-9]*%?) *, *([0-9]{1,3}\.?[0-9]*%?) *,? *([0-9.]* *)?\)/;
-        var m = rgb.match(pat);
-        var ret = [];
-        for (var i=1; i<4; i++) {
-            if (m[i].search(/%/) != -1) {
-                ret[i-1] = parseInt(255*m[i]/100, 10);
-            }
-            else {
-                ret[i-1] = parseInt(m[i], 10);
-            }
-        }
-        ret[3] = parseFloat(m[4]) ? parseFloat(m[4]) : 1.0;
-        return ret;
-    };
-    
-    $.jqplot.colorKeywordMap = {
-        aliceblue: 'rgb(240, 248, 255)',
-        antiquewhite: 'rgb(250, 235, 215)',
-        aqua: 'rgb( 0, 255, 255)',
-        aquamarine: 'rgb(127, 255, 212)',
-        azure: 'rgb(240, 255, 255)',
-        beige: 'rgb(245, 245, 220)',
-        bisque: 'rgb(255, 228, 196)',
-        black: 'rgb( 0, 0, 0)',
-        blanchedalmond: 'rgb(255, 235, 205)',
-        blue: 'rgb( 0, 0, 255)',
-        blueviolet: 'rgb(138, 43, 226)',
-        brown: 'rgb(165, 42, 42)',
-        burlywood: 'rgb(222, 184, 135)',
-        cadetblue: 'rgb( 95, 158, 160)',
-        chartreuse: 'rgb(127, 255, 0)',
-        chocolate: 'rgb(210, 105, 30)',
-        coral: 'rgb(255, 127, 80)',
-        cornflowerblue: 'rgb(100, 149, 237)',
-        cornsilk: 'rgb(255, 248, 220)',
-        crimson: 'rgb(220, 20, 60)',
-        cyan: 'rgb( 0, 255, 255)',
-        darkblue: 'rgb( 0, 0, 139)',
-        darkcyan: 'rgb( 0, 139, 139)',
-        darkgoldenrod: 'rgb(184, 134, 11)',
-        darkgray: 'rgb(169, 169, 169)',
-        darkgreen: 'rgb( 0, 100, 0)',
-        darkgrey: 'rgb(169, 169, 169)',
-        darkkhaki: 'rgb(189, 183, 107)',
-        darkmagenta: 'rgb(139, 0, 139)',
-        darkolivegreen: 'rgb( 85, 107, 47)',
-        darkorange: 'rgb(255, 140, 0)',
-        darkorchid: 'rgb(153, 50, 204)',
-        darkred: 'rgb(139, 0, 0)',
-        darksalmon: 'rgb(233, 150, 122)',
-        darkseagreen: 'rgb(143, 188, 143)',
-        darkslateblue: 'rgb( 72, 61, 139)',
-        darkslategray: 'rgb( 47, 79, 79)',
-        darkslategrey: 'rgb( 47, 79, 79)',
-        darkturquoise: 'rgb( 0, 206, 209)',
-        darkviolet: 'rgb(148, 0, 211)',
-        deeppink: 'rgb(255, 20, 147)',
-        deepskyblue: 'rgb( 0, 191, 255)',
-        dimgray: 'rgb(105, 105, 105)',
-        dimgrey: 'rgb(105, 105, 105)',
-        dodgerblue: 'rgb( 30, 144, 255)',
-        firebrick: 'rgb(178, 34, 34)',
-        floralwhite: 'rgb(255, 250, 240)',
-        forestgreen: 'rgb( 34, 139, 34)',
-        fuchsia: 'rgb(255, 0, 255)',
-        gainsboro: 'rgb(220, 220, 220)',
-        ghostwhite: 'rgb(248, 248, 255)',
-        gold: 'rgb(255, 215, 0)',
-        goldenrod: 'rgb(218, 165, 32)',
-        gray: 'rgb(128, 128, 128)',
-        grey: 'rgb(128, 128, 128)',
-        green: 'rgb( 0, 128, 0)',
-        greenyellow: 'rgb(173, 255, 47)',
-        honeydew: 'rgb(240, 255, 240)',
-        hotpink: 'rgb(255, 105, 180)',
-        indianred: 'rgb(205, 92, 92)',
-        indigo: 'rgb( 75, 0, 130)',
-        ivory: 'rgb(255, 255, 240)',
-        khaki: 'rgb(240, 230, 140)',
-        lavender: 'rgb(230, 230, 250)',
-        lavenderblush: 'rgb(255, 240, 245)',
-        lawngreen: 'rgb(124, 252, 0)',
-        lemonchiffon: 'rgb(255, 250, 205)',
-        lightblue: 'rgb(173, 216, 230)',
-        lightcoral: 'rgb(240, 128, 128)',
-        lightcyan: 'rgb(224, 255, 255)',
-        lightgoldenrodyellow: 'rgb(250, 250, 210)',
-        lightgray: 'rgb(211, 211, 211)',
-        lightgreen: 'rgb(144, 238, 144)',
-        lightgrey: 'rgb(211, 211, 211)',
-        lightpink: 'rgb(255, 182, 193)',
-        lightsalmon: 'rgb(255, 160, 122)',
-        lightseagreen: 'rgb( 32, 178, 170)',
-        lightskyblue: 'rgb(135, 206, 250)',
-        lightslategray: 'rgb(119, 136, 153)',
-        lightslategrey: 'rgb(119, 136, 153)',
-        lightsteelblue: 'rgb(176, 196, 222)',
-        lightyellow: 'rgb(255, 255, 224)',
-        lime: 'rgb( 0, 255, 0)',
-        limegreen: 'rgb( 50, 205, 50)',
-        linen: 'rgb(250, 240, 230)',
-        magenta: 'rgb(255, 0, 255)',
-        maroon: 'rgb(128, 0, 0)',
-        mediumaquamarine: 'rgb(102, 205, 170)',
-        mediumblue: 'rgb( 0, 0, 205)',
-        mediumorchid: 'rgb(186, 85, 211)',
-        mediumpurple: 'rgb(147, 112, 219)',
-        mediumseagreen: 'rgb( 60, 179, 113)',
-        mediumslateblue: 'rgb(123, 104, 238)',
-        mediumspringgreen: 'rgb( 0, 250, 154)',
-        mediumturquoise: 'rgb( 72, 209, 204)',
-        mediumvioletred: 'rgb(199, 21, 133)',
-        midnightblue: 'rgb( 25, 25, 112)',
-        mintcream: 'rgb(245, 255, 250)',
-        mistyrose: 'rgb(255, 228, 225)',
-        moccasin: 'rgb(255, 228, 181)',
-        navajowhite: 'rgb(255, 222, 173)',
-        navy: 'rgb( 0, 0, 128)',
-        oldlace: 'rgb(253, 245, 230)',
-        olive: 'rgb(128, 128, 0)',
-        olivedrab: 'rgb(107, 142, 35)',
-        orange: 'rgb(255, 165, 0)',
-        orangered: 'rgb(255, 69, 0)',
-        orchid: 'rgb(218, 112, 214)',
-        palegoldenrod: 'rgb(238, 232, 170)',
-        palegreen: 'rgb(152, 251, 152)',
-        paleturquoise: 'rgb(175, 238, 238)',
-        palevioletred: 'rgb(219, 112, 147)',
-        papayawhip: 'rgb(255, 239, 213)',
-        peachpuff: 'rgb(255, 218, 185)',
-        peru: 'rgb(205, 133, 63)',
-        pink: 'rgb(255, 192, 203)',
-        plum: 'rgb(221, 160, 221)',
-        powderblue: 'rgb(176, 224, 230)',
-        purple: 'rgb(128, 0, 128)',
-        red: 'rgb(255, 0, 0)',
-        rosybrown: 'rgb(188, 143, 143)',
-        royalblue: 'rgb( 65, 105, 225)',
-        saddlebrown: 'rgb(139, 69, 19)',
-        salmon: 'rgb(250, 128, 114)',
-        sandybrown: 'rgb(244, 164, 96)',
-        seagreen: 'rgb( 46, 139, 87)',
-        seashell: 'rgb(255, 245, 238)',
-        sienna: 'rgb(160, 82, 45)',
-        silver: 'rgb(192, 192, 192)',
-        skyblue: 'rgb(135, 206, 235)',
-        slateblue: 'rgb(106, 90, 205)',
-        slategray: 'rgb(112, 128, 144)',
-        slategrey: 'rgb(112, 128, 144)',
-        snow: 'rgb(255, 250, 250)',
-        springgreen: 'rgb( 0, 255, 127)',
-        steelblue: 'rgb( 70, 130, 180)',
-        tan: 'rgb(210, 180, 140)',
-        teal: 'rgb( 0, 128, 128)',
-        thistle: 'rgb(216, 191, 216)',
-        tomato: 'rgb(255, 99, 71)',
-        turquoise: 'rgb( 64, 224, 208)',
-        violet: 'rgb(238, 130, 238)',
-        wheat: 'rgb(245, 222, 179)',
-        white: 'rgb(255, 255, 255)',
-        whitesmoke: 'rgb(245, 245, 245)',
-        yellow: 'rgb(255, 255, 0)',
-        yellowgreen: 'rgb(154, 205, 50)'
-    };
-
-    
-
-
-    // class: $.jqplot.AxisLabelRenderer
-    // Renderer to place labels on the axes.
-    $.jqplot.AxisLabelRenderer = function(options) {
-        // Group: Properties
-        $.jqplot.ElemContainer.call(this);
-        // name of the axis associated with this tick
-        this.axis;
-        // prop: show
-        // whether or not to show the tick (mark and label).
-        this.show = true;
-        // prop: label
-        // The text or html for the label.
-        this.label = '';
-        this.fontFamily = null;
-        this.fontSize = null;
-        this.textColor = null;
-        this._elem;
-        // prop: escapeHTML
-        // true to escape HTML entities in the label.
-        this.escapeHTML = false;
-        
-        $.extend(true, this, options);
-    };
-    
-    $.jqplot.AxisLabelRenderer.prototype = new $.jqplot.ElemContainer();
-    $.jqplot.AxisLabelRenderer.prototype.constructor = $.jqplot.AxisLabelRenderer;
-    
-    $.jqplot.AxisLabelRenderer.prototype.init = function(options) {
-        $.extend(true, this, options);
-    };
-    
-    $.jqplot.AxisLabelRenderer.prototype.draw = function(ctx, plot) {
-        // Memory Leaks patch
-        if (this._elem) {
-            this._elem.emptyForce();
-            this._elem = null;
-        }
-
-        this._elem = $('<div style="position:absolute;" class="jqplot-'+this.axis+'-label"></div>');
-        
-        if (Number(this.label)) {
-            this._elem.css('white-space', 'nowrap');
-        }
-        
-        if (!this.escapeHTML) {
-            this._elem.html(this.label);
-        }
-        else {
-            this._elem.text(this.label);
-        }
-        if (this.fontFamily) {
-            this._elem.css('font-family', this.fontFamily);
-        }
-        if (this.fontSize) {
-            this._elem.css('font-size', this.fontSize);
-        }
-        if (this.textColor) {
-            this._elem.css('color', this.textColor);
-        }
-        
-        return this._elem;
-    };
-    
-    $.jqplot.AxisLabelRenderer.prototype.pack = function() {
-    };
-
-    // class: $.jqplot.AxisTickRenderer
-    // A "tick" object showing the value of a tick/gridline on the plot.
-    $.jqplot.AxisTickRenderer = function(options) {
-        // Group: Properties
-        $.jqplot.ElemContainer.call(this);
-        // prop: mark
-        // tick mark on the axis.  One of 'inside', 'outside', 'cross', '' or null.
-        this.mark = 'outside';
-        // name of the axis associated with this tick
-        this.axis;
-        // prop: showMark
-        // whether or not to show the mark on the axis.
-        this.showMark = true;
-        // prop: showGridline
-        // whether or not to draw the gridline on the grid at this tick.
-        this.showGridline = true;
-        // prop: isMinorTick
-        // if this is a minor tick.
-        this.isMinorTick = false;
-        // prop: size
-        // Length of the tick beyond the grid in pixels.
-        // DEPRECATED: This has been superceeded by markSize
-        this.size = 4;
-        // prop:  markSize
-        // Length of the tick marks in pixels.  For 'cross' style, length
-        // will be stoked above and below axis, so total length will be twice this.
-        this.markSize = 6;
-        // prop: show
-        // whether or not to show the tick (mark and label).
-        // Setting this to false requires more testing.  It is recommended
-        // to set showLabel and showMark to false instead.
-        this.show = true;
-        // prop: showLabel
-        // whether or not to show the label.
-        this.showLabel = true;
-        this.label = null;
-        this.value = null;
-        this._styles = {};
-        // prop: formatter
-        // A class of a formatter for the tick text.  sprintf by default.
-        this.formatter = $.jqplot.DefaultTickFormatter;
-        // prop: prefix
-        // String to prepend to the tick label.
-        // Prefix is prepended to the formatted tick label.
-        this.prefix = '';
-        // prop: suffix
-        // String to append to the tick label.
-        // Suffix is appended to the formatted tick label.
-        this.suffix = '';
-        // prop: formatString
-        // string passed to the formatter.
-        this.formatString = '';
-        // prop: fontFamily
-        // css spec for the font-family css attribute.
-        this.fontFamily;
-        // prop: fontSize
-        // css spec for the font-size css attribute.
-        this.fontSize;
-        // prop: textColor
-        // css spec for the color attribute.
-        this.textColor;
-        // prop: escapeHTML
-        // true to escape HTML entities in the label.
-        this.escapeHTML = false;
-        this._elem;
-        this._breakTick = false;
-        
-        $.extend(true, this, options);
-    };
-    
-    $.jqplot.AxisTickRenderer.prototype.init = function(options) {
-        $.extend(true, this, options);
-    };
-    
-    $.jqplot.AxisTickRenderer.prototype = new $.jqplot.ElemContainer();
-    $.jqplot.AxisTickRenderer.prototype.constructor = $.jqplot.AxisTickRenderer;
-    
-    $.jqplot.AxisTickRenderer.prototype.setTick = function(value, axisName, isMinor) {
-        this.value = value;
-        this.axis = axisName;
-        if (isMinor) {
-            this.isMinorTick = true;
-        }
-        return this;
-    };
-    
-    $.jqplot.AxisTickRenderer.prototype.draw = function() {
-        if (this.label === null) {
-            this.label = this.prefix + this.formatter(this.formatString, this.value) + this.suffix;
-        }
-        var style = {position: 'absolute'};
-        if (Number(this.label)) {
-            style['whitSpace'] = 'nowrap';
-        }
-        
-        // Memory Leaks patch
-        if (this._elem) {
-            this._elem.emptyForce();
-            this._elem = null;
-        }
-
-        this._elem = $(document.createElement('div'));
-        this._elem.addClass("jqplot-"+this.axis+"-tick");
-        
-        if (!this.escapeHTML) {
-            this._elem.html(this.label);
-        }
-        else {
-            this._elem.text(this.label);
-        }
-        
-        this._elem.css(style);
-
-        for (var s in this._styles) {
-            this._elem.css(s, this._styles[s]);
-        }
-        if (this.fontFamily) {
-            this._elem.css('font-family', this.fontFamily);
-        }
-        if (this.fontSize) {
-            this._elem.css('font-size', this.fontSize);
-        }
-        if (this.textColor) {
-            this._elem.css('color', this.textColor);
-        }
-        if (this._breakTick) {
-          this._elem.addClass('jqplot-breakTick');
-        }
-        
-        return this._elem;
-    };
-        
-    $.jqplot.DefaultTickFormatter = function (format, val) {
-        if (typeof val == 'number') {
-            if (!format) {
-                format = $.jqplot.config.defaultTickFormatString;
-            }
-            return $.jqplot.sprintf(format, val);
-        }
-        else {
-            return String(val);
-        }
-    };
-        
-    $.jqplot.PercentTickFormatter = function (format, val) {
-        if (typeof val == 'number') {
-            val = 100 * val;
-            if (!format) {
-                format = $.jqplot.config.defaultTickFormatString;
-            }
-            return $.jqplot.sprintf(format, val);
-        }
-        else {
-            return String(val);
-        }
-    };
-    
-    $.jqplot.AxisTickRenderer.prototype.pack = function() {
-    };
-     
-    // Class: $.jqplot.CanvasGridRenderer
-    // The default jqPlot grid renderer, creating a grid on a canvas element.
-    // The renderer has no additional options beyond the <Grid> class.
-    $.jqplot.CanvasGridRenderer = function(){
-        this.shadowRenderer = new $.jqplot.ShadowRenderer();
-    };
-    
-    // called with context of Grid object
-    $.jqplot.CanvasGridRenderer.prototype.init = function(options) {
-        this._ctx;
-        $.extend(true, this, options);
-        // set the shadow renderer options
-        var sopts = {lineJoin:'miter', lineCap:'round', fill:false, isarc:false, angle:this.shadowAngle, offset:this.shadowOffset, alpha:this.shadowAlpha, depth:this.shadowDepth, lineWidth:this.shadowWidth, closePath:false, strokeStyle:this.shadowColor};
-        this.renderer.shadowRenderer.init(sopts);
-    };
-    
-    // called with context of Grid.
-    $.jqplot.CanvasGridRenderer.prototype.createElement = function(plot) {
-        var elem;
-        // Memory Leaks patch
-        if (this._elem) {
-          if ($.jqplot.use_excanvas && window.G_vmlCanvasManager.uninitElement !== undefined) {
-            elem = this._elem.get(0);
-            window.G_vmlCanvasManager.uninitElement(elem);
-            elem = null;
-          }
-          
-          this._elem.emptyForce();
-          this._elem = null;
-        }
-      
-        elem = plot.canvasManager.getCanvas();
-
-        var w = this._plotDimensions.width;
-        var h = this._plotDimensions.height;
-        elem.width = w;
-        elem.height = h;
-        this._elem = $(elem);
-        this._elem.addClass('jqplot-grid-canvas');
-        this._elem.css({ position: 'absolute', left: 0, top: 0 });
-        
-        elem = plot.canvasManager.initCanvas(elem);
-
-        this._top = this._offsets.top;
-        this._bottom = h - this._offsets.bottom;
-        this._left = this._offsets.left;
-        this._right = w - this._offsets.right;
-        this._width = this._right - this._left;
-        this._height = this._bottom - this._top;
-        // avoid memory leak
-        elem = null;
-        return this._elem;
-    };
-    
-    $.jqplot.CanvasGridRenderer.prototype.draw = function() {
-        this._ctx = this._elem.get(0).getContext("2d");
-        var ctx = this._ctx;
-        var axes = this._axes;
-        // Add the grid onto the grid canvas.  This is the bottom most layer.
-        ctx.save();
-        ctx.clearRect(0, 0, this._plotDimensions.width, this._plotDimensions.height);
-        ctx.fillStyle = this.backgroundColor || this.background;
-        ctx.fillRect(this._left, this._top, this._width, this._height);
-        
-        ctx.save();
-        ctx.lineJoin = 'miter';
-        ctx.lineCap = 'butt';
-        ctx.lineWidth = this.gridLineWidth;
-        ctx.strokeStyle = this.gridLineColor;
-        var b, e, s, m;
-        var ax = ['xaxis', 'yaxis', 'x2axis', 'y2axis'];
-        for (var i=4; i>0; i--) {
-            var name = ax[i-1];
-            var axis = axes[name];
-            var ticks = axis._ticks;
-            var numticks = ticks.length;
-            if (axis.show) {
-                if (axis.drawBaseline) {
-                    var bopts = {};
-                    if (axis.baselineWidth !== null) {
-                        bopts.lineWidth = axis.baselineWidth;
-                    }
-                    if (axis.baselineColor !== null) {
-                        bopts.strokeStyle = axis.baselineColor;
-                    }
-                    switch (name) {
-                        case 'xaxis':
-                            drawLine (this._left, this._bottom, this._right, this._bottom, bopts);
-                            break;
-                        case 'yaxis':
-                            drawLine (this._left, this._bottom, this._left, this._top, bopts);
-                            break;
-                        case 'x2axis':
-                            drawLine (this._left, this._bottom, this._right, this._bottom, bopts);
-                            break;
-                        case 'y2axis':
-                            drawLine (this._right, this._bottom, this._right, this._top, bopts);
-                            break;
-                    }
-                }
-                for (var j=numticks; j>0; j--) {
-                    var t = ticks[j-1];
-                    if (t.show) {
-                        var pos = Math.round(axis.u2p(t.value)) + 0.5;
-                        switch (name) {
-                            case 'xaxis':
-                                // draw the grid line if we should
-                                if (t.showGridline && this.drawGridlines && ((!t.isMinorTick && axis.drawMajorGridlines) || (t.isMinorTick && axis.drawMinorGridlines)) ) {
-                                    drawLine(pos, this._top, pos, this._bottom);
-                                }
-                                // draw the mark
-                                if (t.showMark && t.mark && ((!t.isMinorTick && axis.drawMajorTickMarks) || (t.isMinorTick && axis.drawMinorTickMarks)) ) {
-                                    s = t.markSize;
-                                    m = t.mark;
-                                    var pos = Math.round(axis.u2p(t.value)) + 0.5;
-                                    switch (m) {
-                                        case 'outside':
-                                            b = this._bottom;
-                                            e = this._bottom+s;
-                                            break;
-                                        case 'inside':
-                                            b = this._bottom-s;
-                                            e = this._bottom;
-                                            break;
-                                        case 'cross':
-                                            b = this._bottom-s;
-                                            e = this._bottom+s;
-                                            break;
-                                        default:
-                                            b = this._bottom;
-                                            e = this._bottom+s;
-                                            break;
-                                    }
-                                    // draw the shadow
-                                    if (this.shadow) {
-                                        this.renderer.shadowRenderer.draw(ctx, [[pos,b],[pos,e]], {lineCap:'butt', lineWidth:this.gridLineWidth, offset:this.gridLineWidth*0.75, depth:2, fill:false, closePath:false});
-                                    }
-                                    // draw the line
-                                    drawLine(pos, b, pos, e);
-                                }
-                                break;
-                            case 'yaxis':
-                                // draw the grid line
-                                if (t.showGridline && this.drawGridlines && ((!t.isMinorTick && axis.drawMajorGridlines) || (t.isMinorTick && axis.drawMinorGridlines)) ) {
-                                    drawLine(this._right, pos, this._left, pos);
-                                }
-                                // draw the mark
-                                if (t.showMark && t.mark && ((!t.isMinorTick && axis.drawMajorTickMarks) || (t.isMinorTick && axis.drawMinorTickMarks)) ) {
-                                    s = t.markSize;
-                                    m = t.mark;
-                                    var pos = Math.round(axis.u2p(t.value)) + 0.5;
-                                    switch (m) {
-                                        case 'outside':
-                                            b = this._left-s;
-                                            e = this._left;
-                                            break;
-                                        case 'inside':
-                                            b = this._left;
-                                            e = this._left+s;
-                                            break;
-                                        case 'cross':
-                                            b = this._left-s;
-                                            e = this._left+s;
-                                            break;
-                                        default:
-                                            b = this._left-s;
-                                            e = this._left;
-                                            break;
-                                            }
-                                    // draw the shadow
-                                    if (this.shadow) {
-                                        this.renderer.shadowRenderer.draw(ctx, [[b, pos], [e, pos]], {lineCap:'butt', lineWidth:this.gridLineWidth*1.5, offset:this.gridLineWidth*0.75, fill:false, closePath:false});
-                                    }
-                                    drawLine(b, pos, e, pos, {strokeStyle:axis.borderColor});
-                                }
-                                break;
-                            case 'x2axis':
-                                // draw the grid line
-                                if (t.showGridline && this.drawGridlines && ((!t.isMinorTick && axis.drawMajorGridlines) || (t.isMinorTick && axis.drawMinorGridlines)) ) {
-                                    drawLine(pos, this._bottom, pos, this._top);
-                                }
-                                // draw the mark
-                                if (t.showMark && t.mark && ((!t.isMinorTick && axis.drawMajorTickMarks) || (t.isMinorTick && axis.drawMinorTickMarks)) ) {
-                                    s = t.markSize;
-                                    m = t.mark;
-                                    var pos = Math.round(axis.u2p(t.value)) + 0.5;
-                                    switch (m) {
-                                        case 'outside':
-                                            b = this._top-s;
-                                            e = this._top;
-                                            break;
-                                        case 'inside':
-                                            b = this._top;
-                                            e = this._top+s;
-                                            break;
-                                        case 'cross':
-                                            b = this._top-s;
-                                            e = this._top+s;
-                                            break;
-                                        default:
-                                            b = this._top-s;
-                                            e = this._top;
-                                            break;
-                                            }
-                                    // draw the shadow
-                                    if (this.shadow) {
-                                        this.renderer.shadowRenderer.draw(ctx, [[pos,b],[pos,e]], {lineCap:'butt', lineWidth:this.gridLineWidth, offset:this.gridLineWidth*0.75, depth:2, fill:false, closePath:false});
-                                    }
-                                    drawLine(pos, b, pos, e);
-                                }
-                                break;
-                            case 'y2axis':
-                                // draw the grid line
-                                if (t.showGridline && this.drawGridlines && ((!t.isMinorTick && axis.drawMajorGridlines) || (t.isMinorTick && axis.drawMinorGridlines)) ) {
-                                    drawLine(this._left, pos, this._right, pos);
-                                }
-                                // draw the mark
-                                if (t.showMark && t.mark && ((!t.isMinorTick && axis.drawMajorTickMarks) || (t.isMinorTick && axis.drawMinorTickMarks)) ) {
-                                    s = t.markSize;
-                                    m = t.mark;
-                                    var pos = Math.round(axis.u2p(t.value)) + 0.5;
-                                    switch (m) {
-                                        case 'outside':
-                                            b = this._right;
-                                            e = this._right+s;
-                                            break;
-                                        case 'inside':
-                                            b = this._right-s;
-                                            e = this._right;
-                                            break;
-                                        case 'cross':
-                                            b = this._right-s;
-                                            e = this._right+s;
-                                            break;
-                                        default:
-                                            b = this._right;
-                                            e = this._right+s;
-                                            break;
-                                            }
-                                    // draw the shadow
-                                    if (this.shadow) {
-                                        this.renderer.shadowRenderer.draw(ctx, [[b, pos], [e, pos]], {lineCap:'butt', lineWidth:this.gridLineWidth*1.5, offset:this.gridLineWidth*0.75, fill:false, closePath:false});
-                                    }
-                                    drawLine(b, pos, e, pos, {strokeStyle:axis.borderColor});
-                                }
-                                break;
-                            default:
-                                break;
-                        }
-                    }
-                }
-                t = null;
-            }
-            axis = null;
-            ticks = null;
-        }
-        // Now draw grid lines for additional y axes
-        //////
-        // TO DO: handle yMidAxis
-        //////
-        ax = ['y3axis', 'y4axis', 'y5axis', 'y6axis', 'y7axis', 'y8axis', 'y9axis', 'yMidAxis'];
-        for (var i=7; i>0; i--) {
-            var axis = axes[ax[i-1]];
-            var ticks = axis._ticks;
-            if (axis.show) {
-                var tn = ticks[axis.numberTicks-1];
-                var t0 = ticks[0];
-                var left = axis.getLeft();
-                var points = [[left, tn.getTop() + tn.getHeight()/2], [left, t0.getTop() + t0.getHeight()/2 + 1.0]];
-                // draw the shadow
-                if (this.shadow) {
-                    this.renderer.shadowRenderer.draw(ctx, points, {lineCap:'butt', fill:false, closePath:false});
-                }
-                // draw the line
-                drawLine(points[0][0], points[0][1], points[1][0], points[1][1], {lineCap:'butt', strokeStyle:axis.borderColor, lineWidth:axis.borderWidth});
-                // draw the tick marks
-                for (var j=ticks.length; j>0; j--) {
-                    var t = ticks[j-1];
-                    s = t.markSize;
-                    m = t.mark;
-                    var pos = Math.round(axis.u2p(t.value)) + 0.5;
-                    if (t.showMark && t.mark) {
-                        switch (m) {
-                            case 'outside':
-                                b = left;
-                                e = left+s;
-                                break;
-                            case 'inside':
-                                b = left-s;
-                                e = left;
-                                break;
-                            case 'cross':
-                                b = left-s;
-                                e = left+s;
-                                break;
-                            default:
-                                b = left;
-                                e = left+s;
-                                break;
-                        }
-                        points = [[b,pos], [e,pos]];
-                        // draw the shadow
-                        if (this.shadow) {
-                            this.renderer.shadowRenderer.draw(ctx, points, {lineCap:'butt', lineWidth:this.gridLineWidth*1.5, offset:this.gridLineWidth*0.75, fill:false, closePath:false});
-                        }
-                        // draw the line
-                        drawLine(b, pos, e, pos, {strokeStyle:axis.borderColor});
-                    }
-                    t = null;
-                }
-                t0 = null;
-            }
-            axis = null;
-            ticks =  null;
-        }
-        
-        ctx.restore();
-        
-        function drawLine(bx, by, ex, ey, opts) {
-            ctx.save();
-            opts = opts || {};
-            if (opts.lineWidth == null || opts.lineWidth != 0){
-                $.extend(true, ctx, opts);
-                ctx.beginPath();
-                ctx.moveTo(bx, by);
-                ctx.lineTo(ex, ey);
-                ctx.stroke();
-                ctx.restore();
-            }
-        }
-        
-        if (this.shadow) {
-            var points = [[this._left, this._bottom], [this._right, this._bottom], [this._right, this._top]];
-            this.renderer.shadowRenderer.draw(ctx, points);
-        }
-        // Now draw border around grid.  Use axis border definitions. start at
-        // upper left and go clockwise.
-        if (this.borderWidth != 0 && this.drawBorder) {
-            drawLine (this._left, this._top, this._right, this._top, {lineCap:'round', strokeStyle:axes.x2axis.borderColor, lineWidth:axes.x2axis.borderWidth});
-            drawLine (this._right, this._top, this._right, this._bottom, {lineCap:'round', strokeStyle:axes.y2axis.borderColor, lineWidth:axes.y2axis.borderWidth});
-            drawLine (this._right, this._bottom, this._left, this._bottom, {lineCap:'round', strokeStyle:axes.xaxis.borderColor, lineWidth:axes.xaxis.borderWidth});
-            drawLine (this._left, this._bottom, this._left, this._top, {lineCap:'round', strokeStyle:axes.yaxis.borderColor, lineWidth:axes.yaxis.borderWidth});
-        }
-        // ctx.lineWidth = this.borderWidth;
-        // ctx.strokeStyle = this.borderColor;
-        // ctx.strokeRect(this._left, this._top, this._width, this._height);
-        
-        ctx.restore();
-        ctx =  null;
-        axes = null;
-    };
-    // Class: $.jqplot.DivTitleRenderer
-    // The default title renderer for jqPlot.  This class has no options beyond the <Title> class. 
-    $.jqplot.DivTitleRenderer = function() {
-    };
-    
-    $.jqplot.DivTitleRenderer.prototype.init = function(options) {
-        $.extend(true, this, options);
-    };
-    
-    $.jqplot.DivTitleRenderer.prototype.draw = function() {
-        // Memory Leaks patch
-        if (this._elem) {
-            this._elem.emptyForce();
-            this._elem = null;
-        }
-
-        var r = this.renderer;
-        var elem = document.createElement('div');
-        this._elem = $(elem);
-        this._elem.addClass('jqplot-title');
-
-        if (!this.text) {
-            this.show = false;
-            this._elem.height(0);
-            this._elem.width(0);
-        }
-        else if (this.text) {
-            var color;
-            if (this.color) {
-                color = this.color;
-            }
-            else if (this.textColor) {
-                color = this.textColor;
-            }
-
-            // don't trust that a stylesheet is present, set the position.
-            var styles = {position:'absolute', top:'0px', left:'0px'};
-
-            if (this._plotWidth) {
-                styles['width'] = this._plotWidth+'px';
-            }
-            if (this.fontSize) {
-                styles['fontSize'] = this.fontSize;
-            }
-            if (typeof this.textAlign === 'string') {
-                styles['textAlign'] = this.textAlign;
-            }
-            else {
-                styles['textAlign'] = 'center';
-            }
-            if (color) {
-                styles['color'] = color;
-            }
-            if (this.paddingBottom) {
-                styles['paddingBottom'] = this.paddingBottom;
-            }
-            if (this.fontFamily) {
-                styles['fontFamily'] = this.fontFamily;
-            }
-
-            this._elem.css(styles);
-            if (this.escapeHtml) {
-                this._elem.text(this.text);
-            }
-            else {
-                this._elem.html(this.text);
-            }
-
-
-            // styletext += (this._plotWidth) ? 'width:'+this._plotWidth+'px;' : '';
-            // styletext += (this.fontSize) ? 'font-size:'+this.fontSize+';' : '';
-            // styletext += (this.textAlign) ? 'text-align:'+this.textAlign+';' : 'text-align:center;';
-            // styletext += (color) ? 'color:'+color+';' : '';
-            // styletext += (this.paddingBottom) ? 'padding-bottom:'+this.paddingBottom+';' : '';
-            // this._elem = $('<div class="jqplot-title" style="'+styletext+'">'+this.text+'</div>');
-            // if (this.fontFamily) {
-            //     this._elem.css('font-family', this.fontFamily);
-            // }
-        }
-
-        elem = null;
-        
-        return this._elem;
-    };
-    
-    $.jqplot.DivTitleRenderer.prototype.pack = function() {
-        // nothing to do here
-    };
-  
-
-    var dotlen = 0.1;
-
-    $.jqplot.LinePattern = function (ctx, pattern) {
-
-        var defaultLinePatterns = {
-            dotted: [ dotlen, $.jqplot.config.dotGapLength ],
-            dashed: [ $.jqplot.config.dashLength, $.jqplot.config.gapLength ],
-            solid: null
-        };
-
-        if (typeof pattern === 'string') {
-            if (pattern[0] === '.' || pattern[0] === '-') {
-                var s = pattern;
-                pattern = [];
-                for (var i=0, imax=s.length; i<imax; i++) {
-                    if (s[i] === '.') {
-                        pattern.push( dotlen );
-                    }
-                    else if (s[i] === '-') {
-                        pattern.push( $.jqplot.config.dashLength );
-                    }
-                    else {
-                        continue;
-                    }
-                    pattern.push( $.jqplot.config.gapLength );
-                }
-            }
-            else {
-                pattern = defaultLinePatterns[pattern];
-            }
-        }
-
-        if (!(pattern && pattern.length)) {
-            return ctx;
-        }
-
-        var patternIndex = 0;
-        var patternDistance = pattern[0];
-        var px = 0;
-        var py = 0;
-        var pathx0 = 0;
-        var pathy0 = 0;
-
-        var moveTo = function (x, y) {
-            ctx.moveTo( x, y );
-            px = x;
-            py = y;
-            pathx0 = x;
-            pathy0 = y;
-        };
-
-        var lineTo = function (x, y) {
-            var scale = ctx.lineWidth;
-            var dx = x - px;
-            var dy = y - py;
-            var dist = Math.sqrt(dx*dx+dy*dy);
-            if ((dist > 0) && (scale > 0)) {
-                dx /= dist;
-                dy /= dist;
-                while (true) {
-                    var dp = scale * patternDistance;
-                    if (dp < dist) {
-                        px += dp * dx;
-                        py += dp * dy;
-                        if ((patternIndex & 1) == 0) {
-                            ctx.lineTo( px, py );
-                        }
-                        else {
-                            ctx.moveTo( px, py );
-                        }
-                        dist -= dp;
-                        patternIndex++;
-                        if (patternIndex >= pattern.length) {
-                            patternIndex = 0;
-                        }
-                        patternDistance = pattern[patternIndex];
-                    }
-                    else {
-                        px = x;
-                        py = y;
-                        if ((patternIndex & 1) == 0) {
-                            ctx.lineTo( px, py );
-                        }
-                        else {
-                            ctx.moveTo( px, py );
-                        }
-                        patternDistance -= dist / scale;
-                        break;
-                    }
-                }
-            }
-        };
-
-        var beginPath = function () {
-            ctx.beginPath();
-        };
-
-        var closePath = function () {
-            lineTo( pathx0, pathy0 );
-        };
-
-        return {
-            moveTo: moveTo,
-            lineTo: lineTo,
-            beginPath: beginPath,
-            closePath: closePath
-        };
-    };
-
-    // Class: $.jqplot.LineRenderer
-    // The default line renderer for jqPlot, this class has no options beyond the <Series> class.
-    // Draws series as a line.
-    $.jqplot.LineRenderer = function(){
-        this.shapeRenderer = new $.jqplot.ShapeRenderer();
-        this.shadowRenderer = new $.jqplot.ShadowRenderer();
-    };
-    
-    // called with scope of series.
-    $.jqplot.LineRenderer.prototype.init = function(options, plot) {
-        // Group: Properties
-        //
-        options = options || {};
-        this._type='line';
-        this.renderer.animation = {
-            show: false,
-            direction: 'left',
-            speed: 2500,
-            _supported: true
-        };
-        // prop: smooth
-        // True to draw a smoothed (interpolated) line through the data points
-        // with automatically computed number of smoothing points.
-        // Set to an integer number > 2 to specify number of smoothing points
-        // to use between each data point.
-        this.renderer.smooth = false;  // true or a number > 2 for smoothing.
-        this.renderer.tension = null; // null to auto compute or a number typically > 6.  Fewer points requires higher tension.
-        // prop: constrainSmoothing
-        // True to use a more accurate smoothing algorithm that will
-        // not overshoot any data points.  False to allow overshoot but
-        // produce a smoother looking line.
-        this.renderer.constrainSmoothing = true;
-        // this is smoothed data in grid coordinates, like gridData
-        this.renderer._smoothedData = [];
-        // this is smoothed data in plot units (plot coordinates), like plotData.
-        this.renderer._smoothedPlotData = [];
-        this.renderer._hiBandGridData = [];
-        this.renderer._lowBandGridData = [];
-        this.renderer._hiBandSmoothedData = [];
-        this.renderer._lowBandSmoothedData = [];
-
-        // prop: bandData
-        // Data used to draw error bands or confidence intervals above/below a line.
-        //
-        // bandData can be input in 3 forms.  jqPlot will figure out which is the
-        // low band line and which is the high band line for all forms:
-        // 
-        // A 2 dimensional array like [[yl1, yl2, ...], [yu1, yu2, ...]] where
-        // [yl1, yl2, ...] are y values of the lower line and
-        // [yu1, yu2, ...] are y values of the upper line.
-        // In this case there must be the same number of y data points as data points
-        // in the series and the bands will inherit the x values of the series.
-        //
-        // A 2 dimensional array like [[[xl1, yl1], [xl2, yl2], ...], [[xh1, yh1], [xh2, yh2], ...]]
-        // where [xl1, yl1] are x,y data points for the lower line and
-        // [xh1, yh1] are x,y data points for the high line.
-        // x values do not have to correspond to the x values of the series and can
-        // be of any arbitrary length.
-        //
-        // Can be of form [[yl1, yu1], [yl2, yu2], [yl3, yu3], ...] where
-        // there must be 3 or more arrays and there must be the same number of arrays
-        // as there are data points in the series.  In this case, 
-        // [yl1, yu1] specifies the lower and upper y values for the 1st
-        // data point and so on.  The bands will inherit the x
-        // values from the series.
-        this.renderer.bandData = [];
-
-        // Group: bands
-        // Banding around line, e.g error bands or confidence intervals.
-        this.renderer.bands = {
-            // prop: show
-            // true to show the bands.  If bandData or interval is
-            // supplied, show will be set to true by default.
-            show: false,
-            hiData: [],
-            lowData: [],
-            // prop: color
-            // color of lines at top and bottom of bands [default: series color].
-            color: this.color,
-            // prop: showLines
-            // True to show lines at top and bottom of bands [default: false].
-            showLines: false,
-            // prop: fill
-            // True to fill area between bands [default: true].
-            fill: true,
-            // prop: fillColor
-            // css color spec for filled area.  [default: series color].
-            fillColor: null,
-            _min: null,
-            _max: null,
-            // prop: interval
-            // User specified interval above and below line for bands [default: '3%''].
-            // Can be a value like 3 or a string like '3%' 
-            // or an upper/lower array like [1, -2] or ['2%', '-1.5%']
-            interval: '3%'
-        };
-
-
-        var lopts = {highlightMouseOver: options.highlightMouseOver, highlightMouseDown: options.highlightMouseDown, highlightColor: options.highlightColor};
-        
-        delete (options.highlightMouseOver);
-        delete (options.highlightMouseDown);
-        delete (options.highlightColor);
-        
-        $.extend(true, this.renderer, options);
-
-        this.renderer.options = options;
-
-        // if we are given some band data, and bands aren't explicity set to false in options, turn them on.
-        if (this.renderer.bandData.length > 1 && (!options.bands || options.bands.show == null)) {
-            this.renderer.bands.show = true;
-        }
-
-        // if we are given an interval, and bands aren't explicity set to false in options, turn them on.
-        else if (options.bands && options.bands.show == null && options.bands.interval != null) {
-            this.renderer.bands.show = true;
-        }
-
-        // if plot is filled, turn off bands.
-        if (this.fill) {
-            this.renderer.bands.show = false;
-        }
-
-        if (this.renderer.bands.show) {
-            this.renderer.initBands.call(this, this.renderer.options, plot);
-        }
-
-
-        // smoothing is not compatible with stacked lines, disable
-        if (this._stack) {
-            this.renderer.smooth = false;
-        }
-
-        // set the shape renderer options
-        var opts = {lineJoin:this.lineJoin, lineCap:this.lineCap, fill:this.fill, isarc:false, strokeStyle:this.color, fillStyle:this.fillColor, lineWidth:this.lineWidth, linePattern:this.linePattern, closePath:this.fill};
-        this.renderer.shapeRenderer.init(opts);
-
-        var shadow_offset = options.shadowOffset;
-        // set the shadow renderer options
-        if (shadow_offset == null) {
-            // scale the shadowOffset to the width of the line.
-            if (this.lineWidth > 2.5) {
-                shadow_offset = 1.25 * (1 + (Math.atan((this.lineWidth/2.5))/0.785398163 - 1)*0.6);
-                // var shadow_offset = this.shadowOffset;
-            }
-            // for skinny lines, don't make such a big shadow.
-            else {
-                shadow_offset = 1.25 * Math.atan((this.lineWidth/2.5))/0.785398163;
-            }
-        }
-        
-        var sopts = {lineJoin:this.lineJoin, lineCap:this.lineCap, fill:this.fill, isarc:false, angle:this.shadowAngle, offset:shadow_offset, alpha:this.shadowAlpha, depth:this.shadowDepth, lineWidth:this.lineWidth, linePattern:this.linePattern, closePath:this.fill};
-        this.renderer.shadowRenderer.init(sopts);
-        this._areaPoints = [];
-        this._boundingBox = [[],[]];
-        
-        if (!this.isTrendline && this.fill || this.renderer.bands.show) {
-            // Group: Properties
-            //        
-            // prop: highlightMouseOver
-            // True to highlight area on a filled plot when moused over.
-            // This must be false to enable highlightMouseDown to highlight when clicking on an area on a filled plot.
-            this.highlightMouseOver = true;
-            // prop: highlightMouseDown
-            // True to highlight when a mouse button is pressed over an area on a filled plot.
-            // This will be disabled if highlightMouseOver is true.
-            this.highlightMouseDown = false;
-            // prop: highlightColor
-            // color to use when highlighting an area on a filled plot.
-            this.highlightColor = null;
-            // if user has passed in highlightMouseDown option and not set highlightMouseOver, disable highlightMouseOver
-            if (lopts.highlightMouseDown && lopts.highlightMouseOver == null) {
-                lopts.highlightMouseOver = false;
-            }
-        
-            $.extend(true, this, {highlightMouseOver: lopts.highlightMouseOver, highlightMouseDown: lopts.highlightMouseDown, highlightColor: lopts.highlightColor});
-            
-            if (!this.highlightColor) {
-                var fc = (this.renderer.bands.show) ? this.renderer.bands.fillColor : this.fillColor;
-                this.highlightColor = $.jqplot.computeHighlightColors(fc);
-            }
-            // turn off (disable) the highlighter plugin
-            if (this.highlighter) {
-                this.highlighter.show = false;
-            }
-        }
-        
-        if (!this.isTrendline && plot) {
-            plot.plugins.lineRenderer = {};
-            plot.postInitHooks.addOnce(postInit);
-            plot.postDrawHooks.addOnce(postPlotDraw);
-            plot.eventListenerHooks.addOnce('jqplotMouseMove', handleMove);
-            plot.eventListenerHooks.addOnce('jqplotMouseDown', handleMouseDown);
-            plot.eventListenerHooks.addOnce('jqplotMouseUp', handleMouseUp);
-            plot.eventListenerHooks.addOnce('jqplotClick', handleClick);
-            plot.eventListenerHooks.addOnce('jqplotRightClick', handleRightClick);
-        }
-
-    };
-
-    $.jqplot.LineRenderer.prototype.initBands = function(options, plot) {
-        // use bandData if no data specified in bands option
-        //var bd = this.renderer.bandData;
-        var bd = options.bandData || [];
-        var bands = this.renderer.bands;
-        bands.hiData = [];
-        bands.lowData = [];
-        var data = this.data;
-        bands._max = null;
-        bands._min = null;
-        // If 2 arrays, and each array greater than 2 elements, assume it is hi and low data bands of y values.
-        if (bd.length == 2) {
-            // Do we have an array of x,y values?
-            // like [[[1,1], [2,4], [3,3]], [[1,3], [2,6], [3,5]]]
-            if ($.isArray(bd[0][0])) {
-                // since an arbitrary array of points, spin through all of them to determine max and min lines.
-
-                var p;
-                var bdminidx = 0, bdmaxidx = 0;
-                for (var i = 0, l = bd[0].length; i<l; i++) {
-                    p = bd[0][i];
-                    if ((p[1] != null && p[1] > bands._max) || bands._max == null) {
-                        bands._max = p[1];
-                    }
-                    if ((p[1] != null && p[1] < bands._min) || bands._min == null) {
-                        bands._min = p[1];
-                    }
-                }
-                for (var i = 0, l = bd[1].length; i<l; i++) {
-                    p = bd[1][i];
-                    if ((p[1] != null && p[1] > bands._max) || bands._max == null) {
-                        bands._max = p[1];
-                        bdmaxidx = 1;
-                    }
-                    if ((p[1] != null && p[1] < bands._min) || bands._min == null) {
-                        bands._min = p[1];
-                        bdminidx = 1;
-                    }
-                }
-
-                if (bdmaxidx === bdminidx) {
-                    bands.show = false;
-                }
-
-                bands.hiData = bd[bdmaxidx];
-                bands.lowData = bd[bdminidx];
-            }
-            // else data is arrays of y values
-            // like [[1,4,3], [3,6,5]]
-            // must have same number of band data points as points in series
-            else if (bd[0].length === data.length && bd[1].length === data.length) {
-                var hi = (bd[0][0] > bd[1][0]) ? 0 : 1;
-                var low = (hi) ? 0 : 1;
-                for (var i=0, l=data.length; i < l; i++) {
-                    bands.hiData.push([data[i][0], bd[hi][i]]);
-                    bands.lowData.push([data[i][0], bd[low][i]]);
-                }
-            }
-
-            // we don't have proper data array, don't show bands.
-            else {
-                bands.show = false;
-            }
-        }
-
-        // if more than 2 arrays, have arrays of [ylow, yhi] values.
-        // note, can't distinguish case of [[ylow, yhi], [ylow, yhi]] from [[ylow, ylow], [yhi, yhi]]
-        // this is assumed to be of the latter form.
-        else if (bd.length > 2 && !$.isArray(bd[0][0])) {
-            var hi = (bd[0][0] > bd[0][1]) ? 0 : 1;
-            var low = (hi) ? 0 : 1;
-            for (var i=0, l=bd.length; i<l; i++) {
-                bands.hiData.push([data[i][0], bd[i][hi]]);
-                bands.lowData.push([data[i][0], bd[i][low]]);
-            }
-        }
-
-        // don't have proper data, auto calculate
-        else {
-            var intrv = bands.interval;
-            var a = null;
-            var b = null;
-            var afunc = null;
-            var bfunc = null;
-
-            if ($.isArray(intrv)) {
-                a = intrv[0];
-                b = intrv[1];
-            }
-            else {
-                a = intrv;
-            }
-
-            if (isNaN(a)) {
-                // we have a string
-                if (a.charAt(a.length - 1) === '%') {
-                    afunc = 'multiply';
-                    a = parseFloat(a)/100 + 1;
-                }
-            }
-
-            else {
-                a = parseFloat(a);
-                afunc = 'add';
-            }
-
-            if (b !== null && isNaN(b)) {
-                // we have a string
-                if (b.charAt(b.length - 1) === '%') {
-                    bfunc = 'multiply';
-                    b = parseFloat(b)/100 + 1;
-                }
-            }
-
-            else if (b !== null) {
-                b = parseFloat(b);
-                bfunc = 'add';
-            }
-
-            if (a !== null) {
-                if (b === null) {
-                    b = -a;
-                    bfunc = afunc;
-                    if (bfunc === 'multiply') {
-                        b += 2;
-                    }
-                }
-
-                // make sure a always applies to hi band.
-                if (a < b) {
-                    var temp = a;
-                    a = b;
-                    b = temp;
-                    temp = afunc;
-                    afunc = bfunc;
-                    bfunc = temp;
-                }
-
-                for (var i=0, l = data.length; i < l; i++) {
-                    switch (afunc) {
-                        case 'add':
-                            bands.hiData.push([data[i][0], data[i][1] + a]);
-                            break;
-                        case 'multiply':
-                            bands.hiData.push([data[i][0], data[i][1] * a]);
-                            break;
-                    }
-                    switch (bfunc) {
-                        case 'add':
-                            bands.lowData.push([data[i][0], data[i][1] + b]);
-                            break;
-                        case 'multiply':
-                            bands.lowData.push([data[i][0], data[i][1] * b]);
-                            break;
-                    }
-                }
-            }
-
-            else {
-                bands.show = false;
-            }
-        }
-
-        var hd = bands.hiData;
-        var ld = bands.lowData;
-        for (var i = 0, l = hd.length; i<l; i++) {
-            if ((hd[i][1] != null && hd[i][1] > bands._max) || bands._max == null) {
-                bands._max = hd[i][1];
-            }
-        }
-        for (var i = 0, l = ld.length; i<l; i++) {
-            if ((ld[i][1] != null && ld[i][1] < bands._min) || bands._min == null) {
-                bands._min = ld[i][1];
-            }
-        }
-
-        // one last check for proper data
-        // these don't apply any more since allowing arbitrary x,y values
-        // if (bands.hiData.length != bands.lowData.length) {
-        //     bands.show = false;
-        // }
-
-        // if (bands.hiData.length != this.data.length) {
-        //     bands.show = false;
-        // }
-
-        if (bands.fillColor === null) {
-            var c = $.jqplot.getColorComponents(bands.color);
-            // now adjust alpha to differentiate fill
-            c[3] = c[3] * 0.5;
-            bands.fillColor = 'rgba(' + c[0] +', '+ c[1] +', '+ c[2] +', '+ c[3] + ')';
-        }
-    };
-
-    function getSteps (d, f) {
-        return (3.4182054+f) * Math.pow(d, -0.3534992);
-    }
-
-    function computeSteps (d1, d2) {
-        var s = Math.sqrt(Math.pow((d2[0]- d1[0]), 2) + Math.pow ((d2[1] - d1[1]), 2));
-        return 5.7648 * Math.log(s) + 7.4456;
-    }
-
-    function tanh (x) {
-        var a = (Math.exp(2*x) - 1) / (Math.exp(2*x) + 1);
-        return a;
-    }
-
-    //////////
-    // computeConstrainedSmoothedData
-    // An implementation of the constrained cubic spline interpolation
-    // method as presented in:
-    //
-    // Kruger, CJC, Constrained Cubic Spine Interpolation for Chemical Engineering Applications
-    // http://www.korf.co.uk/spline.pdf
-    //
-    // The implementation below borrows heavily from the sample Visual Basic
-    // implementation by CJC Kruger found in http://www.korf.co.uk/spline.xls
-    //
-    /////////
-
-    // called with scope of series
-    function computeConstrainedSmoothedData (gd) {
-        var smooth = this.renderer.smooth;
-        var dim = this.canvas.getWidth();
-        var xp = this._xaxis.series_p2u;
-        var yp = this._yaxis.series_p2u; 
-        var steps =null;
-        var _steps = null;
-        var dist = gd.length/dim;
-        var _smoothedData = [];
-        var _smoothedPlotData = [];
-
-        if (!isNaN(parseFloat(smooth))) {
-            steps = parseFloat(smooth);
-        }
-        else {
-            steps = getSteps(dist, 0.5);
-        }
-
-        var yy = [];
-        var xx = [];
-
-        for (var i=0, l = gd.length; i<l; i++) {
-            yy.push(gd[i][1]);
-            xx.push(gd[i][0]);
-        }
-
-        function dxx(x1, x0) {
-            if (x1 - x0 == 0) {
-                return Math.pow(10,10);
-            }
-            else {
-                return x1 - x0;
-            }
-        }
-
-        var A, B, C, D;
-        // loop through each line segment.  Have # points - 1 line segments.  Nmber segments starting at 1.
-        var nmax = gd.length - 1;
-        for (var num = 1, gdl = gd.length; num<gdl; num++) {
-            var gxx = [];
-            var ggxx = [];
-            // point at each end of segment.
-            for (var j = 0; j < 2; j++) {
-                var i = num - 1 + j; // point number, 0 to # points.
-
-                if (i == 0 || i == nmax) {
-                    gxx[j] = Math.pow(10, 10);
-                }
-                else if (yy[i+1] - yy[i] == 0 || yy[i] - yy[i-1] == 0) {
-                    gxx[j] = 0;
-                }
-                else if (((xx[i+1] - xx[i]) / (yy[i+1] - yy[i]) + (xx[i] - xx[i-1]) / (yy[i] - yy[i-1])) == 0 ) {
-                    gxx[j] = 0;
-                }
-                else if ( (yy[i+1] - yy[i]) * (yy[i] - yy[i-1]) < 0 ) {
-                    gxx[j] = 0;
-                }
-
-                else {
-                    gxx[j] = 2 / (dxx(xx[i + 1], xx[i]) / (yy[i + 1] - yy[i]) + dxx(xx[i], xx[i - 1]) / (yy[i] - yy[i - 1]));
-                }
-            }
-
-            // Reset first derivative (slope) at first and last point
-            if (num == 1) {
-                // First point has 0 2nd derivative
-                gxx[0] = 3 / 2 * (yy[1] - yy[0]) / dxx(xx[1], xx[0]) - gxx[1] / 2;
-            }
-            else if (num == nmax) {
-                // Last point has 0 2nd derivative
-                gxx[1] = 3 / 2 * (yy[nmax] - yy[nmax - 1]) / dxx(xx[nmax], xx[nmax - 1]) - gxx[0] / 2;
-            }   
-
-            // Calc second derivative at points
-            ggxx[0] = -2 * (gxx[1] + 2 * gxx[0]) / dxx(xx[num], xx[num - 1]) + 6 * (yy[num] - yy[num - 1]) / Math.pow(dxx(xx[num], xx[num - 1]), 2);
-            ggxx[1] = 2 * (2 * gxx[1] + gxx[0]) / dxx(xx[num], xx[num - 1]) - 6 * (yy[num] - yy[num - 1]) / Math.pow(dxx(xx[num], xx[num - 1]), 2);
-
-            // Calc constants for cubic interpolation
-            D = 1 / 6 * (ggxx[1] - ggxx[0]) / dxx(xx[num], xx[num - 1]);
-            C = 1 / 2 * (xx[num] * ggxx[0] - xx[num - 1] * ggxx[1]) / dxx(xx[num], xx[num - 1]);
-            B = (yy[num] - yy[num - 1] - C * (Math.pow(xx[num], 2) - Math.pow(xx[num - 1], 2)) - D * (Math.pow(xx[num], 3) - Math.pow(xx[num - 1], 3))) / dxx(xx[num], xx[num - 1]);
-            A = yy[num - 1] - B * xx[num - 1] - C * Math.pow(xx[num - 1], 2) - D * Math.pow(xx[num - 1], 3);
-
-            var increment = (xx[num] - xx[num - 1]) / steps;
-            var temp, tempx;
-
-            for (var j = 0, l = steps; j < l; j++) {
-                temp = [];
-                tempx = xx[num - 1] + j * increment;
-                temp.push(tempx);
-                temp.push(A + B * tempx + C * Math.pow(tempx, 2) + D * Math.pow(tempx, 3));
-                _smoothedData.push(temp);
-                _smoothedPlotData.push([xp(temp[0]), yp(temp[1])]);
-            }
-        }
-
-        _smoothedData.push(gd[i]);
-        _smoothedPlotData.push([xp(gd[i][0]), yp(gd[i][1])]);
-
-        return [_smoothedData, _smoothedPlotData];
-    }
-
-    ///////
-    // computeHermiteSmoothedData
-    // A hermite spline smoothing of the plot data.
-    // This implementation is derived from the one posted
-    // by krypin on the jqplot-users mailing list:
-    //
-    // http://groups.google.com/group/jqplot-users/browse_thread/thread/748be6a445723cea?pli=1
-    //
-    // with a blog post:
-    //
-    // http://blog.statscollector.com/a-plugin-renderer-for-jqplot-to-draw-a-hermite-spline/
-    //
-    // and download of the original plugin:
-    //
-    // http://blog.statscollector.com/wp-content/uploads/2010/02/jqplot.hermiteSplineRenderer.js
-    //////////
-
-    // called with scope of series
-    function computeHermiteSmoothedData (gd) {
-        var smooth = this.renderer.smooth;
-        var tension = this.renderer.tension;
-        var dim = this.canvas.getWidth();
-        var xp = this._xaxis.series_p2u;
-        var yp = this._yaxis.series_p2u; 
-        var steps =null;
-        var _steps = null;
-        var a = null;
-        var a1 = null;
-        var a2 = null;
-        var slope = null;
-        var slope2 = null;
-        var temp = null;
-        var t, s, h1, h2, h3, h4;
-        var TiX, TiY, Ti1X, Ti1Y;
-        var pX, pY, p;
-        var sd = [];
-        var spd = [];
-        var dist = gd.length/dim;
-        var min, max, stretch, scale, shift;
-        var _smoothedData = [];
-        var _smoothedPlotData = [];
-        if (!isNaN(parseFloat(smooth))) {
-            steps = parseFloat(smooth);
-        }
-        else {
-            steps = getSteps(dist, 0.5);
-        }
-        if (!isNaN(parseFloat(tension))) {
-            tension = parseFloat(tension);
-        }
-
-        for (var i=0, l = gd.length-1; i < l; i++) {
-
-            if (tension === null) {
-                slope = Math.abs((gd[i+1][1] - gd[i][1]) / (gd[i+1][0] - gd[i][0]));
-
-                min = 0.3;
-                max = 0.6;
-                stretch = (max - min)/2.0;
-                scale = 2.5;
-                shift = -1.4;
-
-                temp = slope/scale + shift;
-
-                a1 = stretch * tanh(temp) - stretch * tanh(shift) + min;
-
-                // if have both left and right line segments, will use  minimum tension. 
-                if (i > 0) {
-                    slope2 = Math.abs((gd[i][1] - gd[i-1][1]) / (gd[i][0] - gd[i-1][0]));
-                }
-                temp = slope2/scale + shift;
-
-                a2 = stretch * tanh(temp) - stretch * tanh(shift) + min;
-
-                a = (a1 + a2)/2.0;
-
-            }
-            else {
-                a = tension;
-            }
-            for (t=0; t < steps; t++) {
-                s = t / steps;
-                h1 = (1 + 2*s)*Math.pow((1-s),2);
-                h2 = s*Math.pow((1-s),2);
-                h3 = Math.pow(s,2)*(3-2*s);
-                h4 = Math.pow(s,2)*(s-1);     
-                
-                if (gd[i-1]) {  
-                    TiX = a * (gd[i+1][0] - gd[i-1][0]); 
-                    TiY = a * (gd[i+1][1] - gd[i-1][1]);
-                } else {
-                    TiX = a * (gd[i+1][0] - gd[i][0]); 
-                    TiY = a * (gd[i+1][1] - gd[i][1]);                                  
-                }
-                if (gd[i+2]) {  
-                    Ti1X = a * (gd[i+2][0] - gd[i][0]); 
-                    Ti1Y = a * (gd[i+2][1] - gd[i][1]);
-                } else {
-                    Ti1X = a * (gd[i+1][0] - gd[i][0]); 
-                    Ti1Y = a * (gd[i+1][1] - gd[i][1]);                                 
-                }
-                
-                pX = h1*gd[i][0] + h3*gd[i+1][0] + h2*TiX + h4*Ti1X;
-                pY = h1*gd[i][1] + h3*gd[i+1][1] + h2*TiY + h4*Ti1Y;
-                p = [pX, pY];
-
-                _smoothedData.push(p);
-                _smoothedPlotData.push([xp(pX), yp(pY)]);
-            }
-        }
-        _smoothedData.push(gd[l]);
-        _smoothedPlotData.push([xp(gd[l][0]), yp(gd[l][1])]);
-
-        return [_smoothedData, _smoothedPlotData];
-    }
-    
-    // setGridData
-    // converts the user data values to grid coordinates and stores them
-    // in the gridData array.
-    // Called with scope of a series.
-    $.jqplot.LineRenderer.prototype.setGridData = function(plot) {
-        // recalculate the grid data
-        var xp = this._xaxis.series_u2p;
-        var yp = this._yaxis.series_u2p;
-        var data = this._plotData;
-        var pdata = this._prevPlotData;
-        this.gridData = [];
-        this._prevGridData = [];
-        this.renderer._smoothedData = [];
-        this.renderer._smoothedPlotData = [];
-        this.renderer._hiBandGridData = [];
-        this.renderer._lowBandGridData = [];
-        this.renderer._hiBandSmoothedData = [];
-        this.renderer._lowBandSmoothedData = [];
-        var bands = this.renderer.bands;
-        var hasNull = false;
-        for (var i=0, l=data.length; i < l; i++) {
-            // if not a line series or if no nulls in data, push the converted point onto the array.
-            if (data[i][0] != null && data[i][1] != null) {
-                this.gridData.push([xp.call(this._xaxis, data[i][0]), yp.call(this._yaxis, data[i][1])]);
-            }
-            // else if there is a null, preserve it.
-            else if (data[i][0] == null) {
-                hasNull = true;
-                this.gridData.push([null, yp.call(this._yaxis, data[i][1])]);
-            }
-            else if (data[i][1] == null) {
-                hasNull = true;
-                this.gridData.push([xp.call(this._xaxis, data[i][0]), null]);
-            }
-            // if not a line series or if no nulls in data, push the converted point onto the array.
-            if (pdata[i] != null && pdata[i][0] != null && pdata[i][1] != null) {
-                this._prevGridData.push([xp.call(this._xaxis, pdata[i][0]), yp.call(this._yaxis, pdata[i][1])]);
-            }
-            // else if there is a null, preserve it.
-            else if (pdata[i] != null && pdata[i][0] == null) {
-                this._prevGridData.push([null, yp.call(this._yaxis, pdata[i][1])]);
-            }  
-            else if (pdata[i] != null && pdata[i][0] != null && pdata[i][1] == null) {
-                this._prevGridData.push([xp.call(this._xaxis, pdata[i][0]), null]);
-            }
-        }
-
-        // don't do smoothing or bands on broken lines.
-        if (hasNull) {
-            this.renderer.smooth = false;
-            if (this._type === 'line') {
-                bands.show = false;
-            }
-        }
-
-        if (this._type === 'line' && bands.show) {
-            for (var i=0, l=bands.hiData.length; i<l; i++) {
-                this.renderer._hiBandGridData.push([xp.call(this._xaxis, bands.hiData[i][0]), yp.call(this._yaxis, bands.hiData[i][1])]);
-            }
-            for (var i=0, l=bands.lowData.length; i<l; i++) {
-                this.renderer._lowBandGridData.push([xp.call(this._xaxis, bands.lowData[i][0]), yp.call(this._yaxis, bands.lowData[i][1])]);
-            }
-        }
-
-        // calculate smoothed data if enough points and no nulls
-        if (this._type === 'line' && this.renderer.smooth && this.gridData.length > 2) {
-            var ret;
-            if (this.renderer.constrainSmoothing) {
-                ret = computeConstrainedSmoothedData.call(this, this.gridData);
-                this.renderer._smoothedData = ret[0];
-                this.renderer._smoothedPlotData = ret[1];
-
-                if (bands.show) {
-                    ret = computeConstrainedSmoothedData.call(this, this.renderer._hiBandGridData);
-                    this.renderer._hiBandSmoothedData = ret[0];
-                    ret = computeConstrainedSmoothedData.call(this, this.renderer._lowBandGridData);
-                    this.renderer._lowBandSmoothedData = ret[0];
-                }
-
-                ret = null;
-            }
-            else {
-                ret = computeHermiteSmoothedData.call(this, this.gridData);
-                this.renderer._smoothedData = ret[0];
-                this.renderer._smoothedPlotData = ret[1];
-
-                if (bands.show) {
-                    ret = computeHermiteSmoothedData.call(this, this.renderer._hiBandGridData);
-                    this.renderer._hiBandSmoothedData = ret[0];
-                    ret = computeHermiteSmoothedData.call(this, this.renderer._lowBandGridData);
-                    this.renderer._lowBandSmoothedData = ret[0];
-                }
-
-                ret = null;
-            }
-        }
-    };
-    
-    // makeGridData
-    // converts any arbitrary data values to grid coordinates and
-    // returns them.  This method exists so that plugins can use a series'
-    // linerenderer to generate grid data points without overwriting the
-    // grid data associated with that series.
-    // Called with scope of a series.
-    $.jqplot.LineRenderer.prototype.makeGridData = function(data, plot) {
-        // recalculate the grid data
-        var xp = this._xaxis.series_u2p;
-        var yp = this._yaxis.series_u2p;
-        var gd = [];
-        var pgd = [];
-        this.renderer._smoothedData = [];
-        this.renderer._smoothedPlotData = [];
-        this.renderer._hiBandGridData = [];
-        this.renderer._lowBandGridData = [];
-        this.renderer._hiBandSmoothedData = [];
-        this.renderer._lowBandSmoothedData = [];
-        var bands = this.renderer.bands;
-        var hasNull = false;
-        for (var i=0; i<data.length; i++) {
-            // if not a line series or if no nulls in data, push the converted point onto the array.
-            if (data[i][0] != null && data[i][1] != null) {
-                gd.push([xp.call(this._xaxis, data[i][0]), yp.call(this._yaxis, data[i][1])]);
-            }
-            // else if there is a null, preserve it.
-            else if (data[i][0] == null) {
-                hasNull = true;
-                gd.push([null, yp.call(this._yaxis, data[i][1])]);
-            }
-            else if (data[i][1] == null) {
-                hasNull = true;
-                gd.push([xp.call(this._xaxis, data[i][0]), null]);
-            }
-        }
-
-        // don't do smoothing or bands on broken lines.
-        if (hasNull) {
-            this.renderer.smooth = false;
-            if (this._type === 'line') {
-                bands.show = false;
-            }
-        }
-
-        if (this._type === 'line' && bands.show) {
-            for (var i=0, l=bands.hiData.length; i<l; i++) {
-                this.renderer._hiBandGridData.push([xp.call(this._xaxis, bands.hiData[i][0]), yp.call(this._yaxis, bands.hiData[i][1])]);
-            }
-            for (var i=0, l=bands.lowData.length; i<l; i++) {
-                this.renderer._lowBandGridData.push([xp.call(this._xaxis, bands.lowData[i][0]), yp.call(this._yaxis, bands.lowData[i][1])]);
-            }
-        }
-
-        if (this._type === 'line' && this.renderer.smooth && gd.length > 2) {
-            var ret;
-            if (this.renderer.constrainSmoothing) {
-                ret = computeConstrainedSmoothedData.call(this, gd);
-                this.renderer._smoothedData = ret[0];
-                this.renderer._smoothedPlotData = ret[1];
-
-                if (bands.show) {
-                    ret = computeConstrainedSmoothedData.call(this, this.renderer._hiBandGridData);
-                    this.renderer._hiBandSmoothedData = ret[0];
-                    ret = computeConstrainedSmoothedData.call(this, this.renderer._lowBandGridData);
-                    this.renderer._lowBandSmoothedData = ret[0];
-                }
-
-                ret = null;
-            }
-            else {
-                ret = computeHermiteSmoothedData.call(this, gd);
-                this.renderer._smoothedData = ret[0];
-                this.renderer._smoothedPlotData = ret[1];
-
-                if (bands.show) {
-                    ret = computeHermiteSmoothedData.call(this, this.renderer._hiBandGridData);
-                    this.renderer._hiBandSmoothedData = ret[0];
-                    ret = computeHermiteSmoothedData.call(this, this.renderer._lowBandGridData);
-                    this.renderer._lowBandSmoothedData = ret[0];
-                }
-
-                ret = null;
-            }
-        }
-        return gd;
-    };
-    
-
-    // called within scope of series.
-    $.jqplot.LineRenderer.prototype.draw = function(ctx, gd, options, plot) {
-        var i;
-        // get a copy of the options, so we don't modify the original object.
-        var opts = $.extend(true, {}, options);
-        var shadow = (opts.shadow != undefined) ? opts.shadow : this.shadow;
-        var showLine = (opts.showLine != undefined) ? opts.showLine : this.showLine;
-        var fill = (opts.fill != undefined) ? opts.fill : this.fill;
-        var fillAndStroke = (opts.fillAndStroke != undefined) ? opts.fillAndStroke : this.fillAndStroke;
-        var xmin, ymin, xmax, ymax;
-        ctx.save();
-        if (gd.length) {
-            if (showLine) {
-                // if we fill, we'll have to add points to close the curve.
-                if (fill) {
-                    if (this.fillToZero) { 
-                        // have to break line up into shapes at axis crossings
-                        var negativeColor = this.negativeColor;
-                        if (! this.useNegativeColors) {
-                            negativeColor = opts.fillStyle;
-                        }
-                        var isnegative = false;
-                        var posfs = opts.fillStyle;
-                    
-                        // if stoking line as well as filling, get a copy of line data.
-                        if (fillAndStroke) {
-                            var fasgd = gd.slice(0);
-                        }
-                        // if not stacked, fill down to axis
-                        if (this.index == 0 || !this._stack) {
-                        
-                            var tempgd = [];
-                            var pd = (this.renderer.smooth) ? this.renderer._smoothedPlotData : this._plotData;
-                            this._areaPoints = [];
-                            var pyzero = this._yaxis.series_u2p(this.fillToValue);
-                            var pxzero = this._xaxis.series_u2p(this.fillToValue);
-
-                            opts.closePath = true;
-                            
-                            if (this.fillAxis == 'y') {
-                                tempgd.push([gd[0][0], pyzero]);
-                                this._areaPoints.push([gd[0][0], pyzero]);
-                                
-                                for (var i=0; i<gd.length-1; i++) {
-                                    tempgd.push(gd[i]);
-                                    this._areaPoints.push(gd[i]);
-                                    // do we have an axis crossing?
-                                    if (pd[i][1] * pd[i+1][1] <= 0) {
-                                        if (pd[i][1] < 0) {
-                                            isnegative = true;
-                                            opts.fillStyle = negativeColor;
-                                        }
-                                        else {
-                                            isnegative = false;
-                                            opts.fillStyle = posfs;
-                                        }
-                                        
-                                        var xintercept = gd[i][0] + (gd[i+1][0] - gd[i][0]) * (pyzero-gd[i][1])/(gd[i+1][1] - gd[i][1]);
-                                        tempgd.push([xintercept, pyzero]);
-                                        this._areaPoints.push([xintercept, pyzero]);
-                                        // now draw this shape and shadow.
-                                        if (shadow) {
-                                            this.renderer.shadowRenderer.draw(ctx, tempgd, opts);
-                                        }
-                                        this.renderer.shapeRenderer.draw(ctx, tempgd, opts);
-                                        // now empty temp array and continue
-                                        tempgd = [[xintercept, pyzero]];
-                                        // this._areaPoints = [[xintercept, pyzero]];
-                                    }   
-                                }
-                                if (pd[gd.length-1][1] < 0) {
-                                    isnegative = true;
-                                    opts.fillStyle = negativeColor;
-                                }
-                                else {
-                                    isnegative = false;
-                                    opts.fillStyle = posfs;
-                                }
-                                tempgd.push(gd[gd.length-1]);
-                                this._areaPoints.push(gd[gd.length-1]);
-                                tempgd.push([gd[gd.length-1][0], pyzero]); 
-                                this._areaPoints.push([gd[gd.length-1][0], pyzero]); 
-                            }
-                            // now draw the last area.
-                            if (shadow) {
-                                this.renderer.shadowRenderer.draw(ctx, tempgd, opts);
-                            }
-                            this.renderer.shapeRenderer.draw(ctx, tempgd, opts);
-                            
-                            
-                            // var gridymin = this._yaxis.series_u2p(0);
-                            // // IE doesn't return new length on unshift
-                            // gd.unshift([gd[0][0], gridymin]);
-                            // len = gd.length;
-                            // gd.push([gd[len - 1][0], gridymin]);                   
-                        }
-                        // if stacked, fill to line below 
-                        else {
-                            var prev = this._prevGridData;
-                            for (var i=prev.length; i>0; i--) {
-                                gd.push(prev[i-1]);
-                                // this._areaPoints.push(prev[i-1]);
-                            }
-                            if (shadow) {
-                                this.renderer.shadowRenderer.draw(ctx, gd, opts);
-                            }
-                            this._areaPoints = gd;
-                            this.renderer.shapeRenderer.draw(ctx, gd, opts);
-                        }
-                    }
-                    /////////////////////////
-                    // Not filled to zero
-                    ////////////////////////
-                    else {                    
-                        // if stoking line as well as filling, get a copy of line data.
-                        if (fillAndStroke) {
-                            var fasgd = gd.slice(0);
-                        }
-                        // if not stacked, fill down to axis
-                        if (this.index == 0 || !this._stack) {
-                            // var gridymin = this._yaxis.series_u2p(this._yaxis.min) - this.gridBorderWidth / 2;
-                            var gridymin = ctx.canvas.height;
-                            // IE doesn't return new length on unshift
-                            gd.unshift([gd[0][0], gridymin]);
-                            var len = gd.length;
-                            gd.push([gd[len - 1][0], gridymin]);                   
-                        }
-                        // if stacked, fill to line below 
-                        else {
-                            var prev = this._prevGridData;
-                            for (var i=prev.length; i>0; i--) {
-                                gd.push(prev[i-1]);
-                            }
-                        }
-                        this._areaPoints = gd;
-                        
-                        if (shadow) {
-                            this.renderer.shadowRenderer.draw(ctx, gd, opts);
-                        }
-            
-                        this.renderer.shapeRenderer.draw(ctx, gd, opts);                        
-                    }
-                    if (fillAndStroke) {
-                        var fasopts = $.extend(true, {}, opts, {fill:false, closePath:false});
-                        this.renderer.shapeRenderer.draw(ctx, fasgd, fasopts);
-                        //////////
-                        // TODO: figure out some way to do shadows nicely
-                        // if (shadow) {
-                        //     this.renderer.shadowRenderer.draw(ctx, fasgd, fasopts);
-                        // }
-                        // now draw the markers
-                        if (this.markerRenderer.show) {
-                            if (this.renderer.smooth) {
-                                fasgd = this.gridData;
-                            }
-                            for (i=0; i<fasgd.length; i++) {
-                                this.markerRenderer.draw(fasgd[i][0], fasgd[i][1], ctx, opts.markerOptions);
-                            }
-                        }
-                    }
-                }
-                else {
-
-                    if (this.renderer.bands.show) {
-                        var bdat;
-                        var bopts = $.extend(true, {}, opts);
-                        if (this.renderer.bands.showLines) {
-                            bdat = (this.renderer.smooth) ? this.renderer._hiBandSmoothedData : this.renderer._hiBandGridData;
-                            this.renderer.shapeRenderer.draw(ctx, bdat, opts);
-                            bdat = (this.renderer.smooth) ? this.renderer._lowBandSmoothedData : this.renderer._lowBandGridData;
-                            this.renderer.shapeRenderer.draw(ctx, bdat, bopts);
-                        }
-
-                        if (this.renderer.bands.fill) {
-                            if (this.renderer.smooth) {
-                                bdat = this.renderer._hiBandSmoothedData.concat(this.renderer._lowBandSmoothedData.reverse());
-                            }
-                            else {
-                                bdat = this.renderer._hiBandGridData.concat(this.renderer._lowBandGridData.reverse());
-                            }
-                            this._areaPoints = bdat;
-                            bopts.closePath = true;
-                            bopts.fill = true;
-                            bopts.fillStyle = this.renderer.bands.fillColor;
-                            this.renderer.shapeRenderer.draw(ctx, bdat, bopts);
-                        }
-                    }
-
-                    if (shadow) {
-                        this.renderer.shadowRenderer.draw(ctx, gd, opts);
-                    }
-    
-                    this.renderer.shapeRenderer.draw(ctx, gd, opts);
-                }
-            }
-            // calculate the bounding box
-            var xmin = xmax = ymin = ymax = null;
-            for (i=0; i<this._areaPoints.length; i++) {
-                var p = this._areaPoints[i];
-                if (xmin > p[0] || xmin == null) {
-                    xmin = p[0];
-                }
-                if (ymax < p[1] || ymax == null) {
-                    ymax = p[1];
-                }
-                if (xmax < p[0] || xmax == null) {
-                    xmax = p[0];
-                }
-                if (ymin > p[1] || ymin == null) {
-                    ymin = p[1];
-                }
-            }
-
-            if (this.type === 'line' && this.renderer.bands.show) {
-                ymax = this._yaxis.series_u2p(this.renderer.bands._min);
-                ymin = this._yaxis.series_u2p(this.renderer.bands._max);
-            }
-
-            this._boundingBox = [[xmin, ymax], [xmax, ymin]];
-        
-            // now draw the markers
-            if (this.markerRenderer.show && !fill) {
-                if (this.renderer.smooth) {
-                    gd = this.gridData;
-                }
-                for (i=0; i<gd.length; i++) {
-                    if (gd[i][0] != null && gd[i][1] != null) {
-                        this.markerRenderer.draw(gd[i][0], gd[i][1], ctx, opts.markerOptions);
-                    }
-                }
-            }
-        }
-        
-        ctx.restore();
-    };  
-    
-    $.jqplot.LineRenderer.prototype.drawShadow = function(ctx, gd, options) {
-        // This is a no-op, shadows drawn with lines.
-    };
-    
-    // called with scope of plot.
-    // make sure to not leave anything highlighted.
-    function postInit(target, data, options) {
-        for (var i=0; i<this.series.length; i++) {
-            if (this.series[i].renderer.constructor == $.jqplot.LineRenderer) {
-                // don't allow mouseover and mousedown at same time.
-                if (this.series[i].highlightMouseOver) {
-                    this.series[i].highlightMouseDown = false;
-                }
-            }
-        }
-    }  
-    
-    // called within context of plot
-    // create a canvas which we can draw on.
-    // insert it before the eventCanvas, so eventCanvas will still capture events.
-    function postPlotDraw() {
-        // Memory Leaks patch    
-        if (this.plugins.lineRenderer && this.plugins.lineRenderer.highlightCanvas) {
-          this.plugins.lineRenderer.highlightCanvas.resetCanvas();
-          this.plugins.lineRenderer.highlightCanvas = null;
-        }
-        
-        this.plugins.lineRenderer.highlightedSeriesIndex = null;
-        this.plugins.lineRenderer.highlightCanvas = new $.jqplot.GenericCanvas();
-        
-        this.eventCanvas._elem.before(this.plugins.lineRenderer.highlightCanvas.createElement(this._gridPadding, 'jqplot-lineRenderer-highlight-canvas', this._plotDimensions, this));
-        this.plugins.lineRenderer.highlightCanvas.setContext();
-        this.eventCanvas._elem.bind('mouseleave', {plot:this}, function (ev) { unhighlight(ev.data.plot); });
-    } 
-    
-    function highlight (plot, sidx, pidx, points) {
-        var s = plot.series[sidx];
-        var canvas = plot.plugins.lineRenderer.highlightCanvas;
-        canvas._ctx.clearRect(0,0,canvas._ctx.canvas.width, canvas._ctx.canvas.height);
-        s._highlightedPoint = pidx;
-        plot.plugins.lineRenderer.highlightedSeriesIndex = sidx;
-        var opts = {fillStyle: s.highlightColor};
-        if (s.type === 'line' && s.renderer.bands.show) {
-            opts.fill = true;
-            opts.closePath = true;
-        }
-        s.renderer.shapeRenderer.draw(canvas._ctx, points, opts);
-        canvas = null;
-    }
-    
-    function unhighlight (plot) {
-        var canvas = plot.plugins.lineRenderer.highlightCanvas;
-        canvas._ctx.clearRect(0,0, canvas._ctx.canvas.width, canvas._ctx.canvas.height);
-        for (var i=0; i<plot.series.length; i++) {
-            plot.series[i]._highlightedPoint = null;
-        }
-        plot.plugins.lineRenderer.highlightedSeriesIndex = null;
-        plot.target.trigger('jqplotDataUnhighlight');
-        canvas = null;
-    }
-    
-    
-    function handleMove(ev, gridpos, datapos, neighbor, plot) {
-        if (neighbor) {
-            var ins = [neighbor.seriesIndex, neighbor.pointIndex, neighbor.data];
-            var evt1 = jQuery.Event('jqplotDataMouseOver');
-            evt1.pageX = ev.pageX;
-            evt1.pageY = ev.pageY;
-            plot.target.trigger(evt1, ins);
-            if (plot.series[ins[0]].highlightMouseOver && !(ins[0] == plot.plugins.lineRenderer.highlightedSeriesIndex)) {
-                var evt = jQuery.Event('jqplotDataHighlight');
-                evt.which = ev.which;
-                evt.pageX = ev.pageX;
-                evt.pageY = ev.pageY;
-                plot.target.trigger(evt, ins);
-                highlight (plot, neighbor.seriesIndex, neighbor.pointIndex, neighbor.points);
-            }
-        }
-        else if (neighbor == null) {
-            unhighlight (plot);
-        }
-    }
-    
-    function handleMouseDown(ev, gridpos, datapos, neighbor, plot) {
-        if (neighbor) {
-            var ins = [neighbor.seriesIndex, neighbor.pointIndex, neighbor.data];
-            if (plot.series[ins[0]].highlightMouseDown && !(ins[0] == plot.plugins.lineRenderer.highlightedSeriesIndex)) {
-                var evt = jQuery.Event('jqplotDataHighlight');
-                evt.which = ev.which;
-                evt.pageX = ev.pageX;
-                evt.pageY = ev.pageY;
-                plot.target.trigger(evt, ins);
-                highlight (plot, neighbor.seriesIndex, neighbor.pointIndex, neighbor.points);
-            }
-        }
-        else if (neighbor == null) {
-            unhighlight (plot);
-        }
-    }
-    
-    function handleMouseUp(ev, gridpos, datapos, neighbor, plot) {
-        var idx = plot.plugins.lineRenderer.highlightedSeriesIndex;
-        if (idx != null && plot.series[idx].highlightMouseDown) {
-            unhighlight(plot);
-        }
-    }
-    
-    function handleClick(ev, gridpos, datapos, neighbor, plot) {
-        if (neighbor) {
-            var ins = [neighbor.seriesIndex, neighbor.pointIndex, neighbor.data];
-            var evt = jQuery.Event('jqplotDataClick');
-            evt.which = ev.which;
-            evt.pageX = ev.pageX;
-            evt.pageY = ev.pageY;
-            plot.target.trigger(evt, ins);
-        }
-    }
-    
-    function handleRightClick(ev, gridpos, datapos, neighbor, plot) {
-        if (neighbor) {
-            var ins = [neighbor.seriesIndex, neighbor.pointIndex, neighbor.data];
-            var idx = plot.plugins.lineRenderer.highlightedSeriesIndex;
-            if (idx != null && plot.series[idx].highlightMouseDown) {
-                unhighlight(plot);
-            }
-            var evt = jQuery.Event('jqplotDataRightClick');
-            evt.which = ev.which;
-            evt.pageX = ev.pageX;
-            evt.pageY = ev.pageY;
-            plot.target.trigger(evt, ins);
-        }
-    }
-    
-    
-    // class: $.jqplot.LinearAxisRenderer
-    // The default jqPlot axis renderer, creating a numeric axis.
-    $.jqplot.LinearAxisRenderer = function() {
-    };
-    
-    // called with scope of axis object.
-    $.jqplot.LinearAxisRenderer.prototype.init = function(options){
-        // prop: breakPoints
-        // EXPERIMENTAL!! Use at your own risk!
-        // Works only with linear axes and the default tick renderer.
-        // Array of [start, stop] points to create a broken axis.
-        // Broken axes have a "jump" in them, which is an immediate 
-        // transition from a smaller value to a larger value.
-        // Currently, axis ticks MUST be manually assigned if using breakPoints
-        // by using the axis ticks array option.
-        this.breakPoints = null;
-        // prop: breakTickLabel
-        // Label to use at the axis break if breakPoints are specified.
-        this.breakTickLabel = "&asymp;";
-        // prop: drawBaseline
-        // True to draw the axis baseline.
-        this.drawBaseline = true;
-        // prop: baselineWidth
-        // width of the baseline in pixels.
-        this.baselineWidth = null;
-        // prop: baselineColor
-        // CSS color spec for the baseline.
-        this.baselineColor = null;
-        // prop: forceTickAt0
-        // This will ensure that there is always a tick mark at 0.
-        // If data range is strictly positive or negative,
-        // this will force 0 to be inside the axis bounds unless
-        // the appropriate axis pad (pad, padMin or padMax) is set
-        // to 0, then this will force an axis min or max value at 0.
-        // This has know effect when any of the following options
-        // are set:  autoscale, min, max, numberTicks or tickInterval.
-        this.forceTickAt0 = false;
-        // prop: forceTickAt100
-        // This will ensure that there is always a tick mark at 100.
-        // If data range is strictly above or below 100,
-        // this will force 100 to be inside the axis bounds unless
-        // the appropriate axis pad (pad, padMin or padMax) is set
-        // to 0, then this will force an axis min or max value at 100.
-        // This has know effect when any of the following options
-        // are set:  autoscale, min, max, numberTicks or tickInterval.
-        this.forceTickAt100 = false;
-        // prop: tickInset
-        // Controls the amount to inset the first and last ticks from 
-        // the edges of the grid, in multiples of the tick interval.
-        // 0 is no inset, 0.5 is one half a tick interval, 1 is a full
-        // tick interval, etc.
-        this.tickInset = 0;
-        // prop: minorTicks
-        // Number of ticks to add between "major" ticks.
-        // Major ticks are ticks supplied by user or auto computed.
-        // Minor ticks cannot be created by user.
-        this.minorTicks = 0;
-        // prop: alignTicks
-        // true to align tick marks across opposed axes
-        // such as from the y2axis to yaxis.
-        this.alignTicks = false;
-        this._autoFormatString = '';
-        this._overrideFormatString = false;
-        this._scalefact = 1.0;
-        $.extend(true, this, options);
-        if (this.breakPoints) {
-            if (!$.isArray(this.breakPoints)) {
-                this.breakPoints = null;
-            }
-            else if (this.breakPoints.length < 2 || this.breakPoints[1] <= this.breakPoints[0]) {
-                this.breakPoints = null;
-            }
-        }
-        if (this.numberTicks != null && this.numberTicks < 2) {
-            this.numberTicks = 2;
-        }
-        this.resetDataBounds();
-    };
-    
-    // called with scope of axis
-    $.jqplot.LinearAxisRenderer.prototype.draw = function(ctx, plot) {
-        if (this.show) {
-            // populate the axis label and value properties.
-            // createTicks is a method on the renderer, but
-            // call it within the scope of the axis.
-            this.renderer.createTicks.call(this, plot);
-            // fill a div with axes labels in the right direction.
-            // Need to pregenerate each axis to get its bounds and
-            // position it and the labels correctly on the plot.
-            var dim=0;
-            var temp;
-            // Added for theming.
-            if (this._elem) {
-                // Memory Leaks patch
-                //this._elem.empty();
-                this._elem.emptyForce();
-                this._elem = null;
-            }
-            
-            this._elem = $(document.createElement('div'));
-            this._elem.addClass('jqplot-axis jqplot-'+this.name);
-            this._elem.css('position', 'absolute');
-
-            
-            if (this.name == 'xaxis' || this.name == 'x2axis') {
-                this._elem.width(this._plotDimensions.width);
-            }
-            else {
-                this._elem.height(this._plotDimensions.height);
-            }
-            
-            // create a _label object.
-            this.labelOptions.axis = this.name;
-            this._label = new this.labelRenderer(this.labelOptions);
-            if (this._label.show) {
-                var elem = this._label.draw(ctx, plot);
-                elem.appendTo(this._elem);
-                elem = null;
-            }
-    
-            var t = this._ticks;
-            var tick;
-            for (var i=0; i<t.length; i++) {
-                tick = t[i];
-                if (tick.show && tick.showLabel && (!tick.isMinorTick || this.showMinorTicks)) {
-                    this._elem.append(tick.draw(ctx, plot));
-                }
-            }
-            tick = null;
-            t = null;
-        }
-        return this._elem;
-    };
-    
-    // called with scope of an axis
-    $.jqplot.LinearAxisRenderer.prototype.reset = function() {
-        this.min = this._options.min;
-        this.max = this._options.max;
-        this.tickInterval = this._options.tickInterval;
-        this.numberTicks = this._options.numberTicks;
-        this._autoFormatString = '';
-        if (this._overrideFormatString && this.tickOptions && this.tickOptions.formatString) {
-            this.tickOptions.formatString = '';
-        }
-
-        // this._ticks = this.__ticks;
-    };
-    
-    // called with scope of axis
-    $.jqplot.LinearAxisRenderer.prototype.set = function() { 
-        var dim = 0;
-        var temp;
-        var w = 0;
-        var h = 0;
-        var lshow = (this._label == null) ? false : this._label.show;
-        if (this.show) {
-            var t = this._ticks;
-            var tick;
-            for (var i=0; i<t.length; i++) {
-                tick = t[i];
-                if (!tick._breakTick && tick.show && tick.showLabel && (!tick.isMinorTick || this.showMinorTicks)) {
-                    if (this.name == 'xaxis' || this.name == 'x2axis') {
-                        temp = tick._elem.outerHeight(true);
-                    }
-                    else {
-                        temp = tick._elem.outerWidth(true);
-                    }
-                    if (temp > dim) {
-                        dim = temp;
-                    }
-                }
-            }
-            tick = null;
-            t = null;
-            
-            if (lshow) {
-                w = this._label._elem.outerWidth(true);
-                h = this._label._elem.outerHeight(true); 
-            }
-            if (this.name == 'xaxis') {
-                dim = dim + h;
-                this._elem.css({'height':dim+'px', left:'0px', bottom:'0px'});
-            }
-            else if (this.name == 'x2axis') {
-                dim = dim + h;
-                this._elem.css({'height':dim+'px', left:'0px', top:'0px'});
-            }
-            else if (this.name == 'yaxis') {
-                dim = dim + w;
-                this._elem.css({'width':dim+'px', left:'0px', top:'0px'});
-                if (lshow && this._label.constructor == $.jqplot.AxisLabelRenderer) {
-                    this._label._elem.css('width', w+'px');
-                }
-            }
-            else {
-                dim = dim + w;
-                this._elem.css({'width':dim+'px', right:'0px', top:'0px'});
-                if (lshow && this._label.constructor == $.jqplot.AxisLabelRenderer) {
-                    this._label._elem.css('width', w+'px');
-                }
-            }
-        }  
-    };    
-    
-    // called with scope of axis
-    $.jqplot.LinearAxisRenderer.prototype.createTicks = function(plot) {
-        // we're are operating on an axis here
-        var ticks = this._ticks;
-        var userTicks = this.ticks;
-        var name = this.name;
-        // databounds were set on axis initialization.
-        var db = this._dataBounds;
-        var dim = (this.name.charAt(0) === 'x') ? this._plotDimensions.width : this._plotDimensions.height;
-        var interval;
-        var min, max;
-        var pos1, pos2;
-        var tt, i;
-        // get a copy of user's settings for min/max.
-        var userMin = this.min;
-        var userMax = this.max;
-        var userNT = this.numberTicks;
-        var userTI = this.tickInterval;
-
-        var threshold = 30;
-        this._scalefact =  (Math.max(dim, threshold+1) - threshold)/300.0;
-        
-        // if we already have ticks, use them.
-        // ticks must be in order of increasing value.
-        
-        if (userTicks.length) {
-            // ticks could be 1D or 2D array of [val, val, ,,,] or [[val, label], [val, label], ...] or mixed
-            for (i=0; i<userTicks.length; i++){
-                var ut = userTicks[i];
-                var t = new this.tickRenderer(this.tickOptions);
-                if ($.isArray(ut)) {
-                    t.value = ut[0];
-                    if (this.breakPoints) {
-                        if (ut[0] == this.breakPoints[0]) {
-                            t.label = this.breakTickLabel;
-                            t._breakTick = true;
-                            t.showGridline = false;
-                            t.showMark = false;
-                        }
-                        else if (ut[0] > this.breakPoints[0] && ut[0] <= this.breakPoints[1]) {
-                            t.show = false;
-                            t.showGridline = false;
-                            t.label = ut[1];
-                        }
-                        else {
-                            t.label = ut[1];
-                        }
-                    }
-                    else {
-                        t.label = ut[1];
-                    }
-                    t.setTick(ut[0], this.name);
-                    this._ticks.push(t);
-                }
-
-                else if ($.isPlainObject(ut)) {
-                    $.extend(true, t, ut);
-                    t.axis = this.name;
-                    this._ticks.push(t);
-                }
-                
-                else {
-                    t.value = ut;
-                    if (this.breakPoints) {
-                        if (ut == this.breakPoints[0]) {
-                            t.label = this.breakTickLabel;
-                            t._breakTick = true;
-                            t.showGridline = false;
-                            t.showMark = false;
-                        }
-                        else if (ut > this.breakPoints[0] && ut <= this.breakPoints[1]) {
-                            t.show = false;
-                            t.showGridline = false;
-                        }
-                    }
-                    t.setTick(ut, this.name);
-                    this._ticks.push(t);
-                }
-            }
-            this.numberTicks = userTicks.length;
-            this.min = this._ticks[0].value;
-            this.max = this._ticks[this.numberTicks-1].value;
-            this.tickInterval = (this.max - this.min) / (this.numberTicks - 1);
-        }
-        
-        // we don't have any ticks yet, let's make some!
-        else {
-            if (name == 'xaxis' || name == 'x2axis') {
-                dim = this._plotDimensions.width;
-            }
-            else {
-                dim = this._plotDimensions.height;
-            }
-
-            var _numberTicks = this.numberTicks;
-
-            // if aligning this axis, use number of ticks from previous axis.
-            // Do I need to reset somehow if alignTicks is changed and then graph is replotted??
-            if (this.alignTicks) {
-                if (this.name === 'x2axis' && plot.axes.xaxis.show) {
-                    _numberTicks = plot.axes.xaxis.numberTicks;
-                }
-                else if (this.name.charAt(0) === 'y' && this.name !== 'yaxis' && this.name !== 'yMidAxis' && plot.axes.yaxis.show) {
-                    _numberTicks = plot.axes.yaxis.numberTicks;
-                }
-            }
-        
-            min = ((this.min != null) ? this.min : db.min);
-            max = ((this.max != null) ? this.max : db.max);
-
-            var range = max - min;
-            var rmin, rmax;
-            var temp;
-
-            if (this.tickOptions == null || !this.tickOptions.formatString) {
-                this._overrideFormatString = true;
-            }
-
-            // Doing complete autoscaling
-            if (this.min == null || this.max == null && this.tickInterval == null && !this.autoscale) {
-                // Check if user must have tick at 0 or 100 and ensure they are in range.
-                // The autoscaling algorithm will always place ticks at 0 and 100 if they are in range.
-                if (this.forceTickAt0) {
-                    if (min > 0) {
-                        min = 0;
-                    }
-                    if (max < 0) {
-                        max = 0;
-                    }
-                }
-
-                if (this.forceTickAt100) {
-                    if (min > 100) {
-                        min = 100;
-                    }
-                    if (max < 100) {
-                        max = 100;
-                    }
-                }
-
-                var keepMin = false,
-                    keepMax = false;
-
-                if (this.min != null) {
-                    keepMin = true;
-                }
-
-                else if (this.max != null) {
-                    keepMax = true;
-                }
-
-                // var threshold = 30;
-                // var tdim = Math.max(dim, threshold+1);
-                // this._scalefact =  (tdim-threshold)/300.0;
-                var ret = $.jqplot.LinearTickGenerator(min, max, this._scalefact, _numberTicks, keepMin, keepMax); 
-                // calculate a padded max and min, points should be less than these
-                // so that they aren't too close to the edges of the plot.
-                // User can adjust how much padding is allowed with pad, padMin and PadMax options. 
-                // If min or max is set, don't pad that end of axis.
-                var tumin = (this.min != null) ? min : min + range*(this.padMin - 1);
-                var tumax = (this.max != null) ? max : max - range*(this.padMax - 1);
-
-                // if they're equal, we shouldn't have to do anything, right?
-                // if (min <=tumin || max >= tumax) {
-                if (min <tumin || max > tumax) {
-                    tumin = (this.min != null) ? min : min - range*(this.padMin - 1);
-                    tumax = (this.max != null) ? max : max + range*(this.padMax - 1);
-                    ret = $.jqplot.LinearTickGenerator(tumin, tumax, this._scalefact, _numberTicks, keepMin, keepMax);
-                }
-
-                this.min = ret[0];
-                this.max = ret[1];
-                // if numberTicks specified, it should return the same.
-                this.numberTicks = ret[2];
-                this._autoFormatString = ret[3];
-                this.tickInterval = ret[4];
-            }
-
-            // User has specified some axis scale related option, can use auto algorithm
-            else {
-                
-                // if min and max are same, space them out a bit
-                if (min == max) {
-                    var adj = 0.05;
-                    if (min > 0) {
-                        adj = Math.max(Math.log(min)/Math.LN10, 0.05);
-                    }
-                    min -= adj;
-                    max += adj;
-                }
-                
-                // autoscale.  Can't autoscale if min or max is supplied.
-                // Will use numberTicks and tickInterval if supplied.  Ticks
-                // across multiple axes may not line up depending on how
-                // bars are to be plotted.
-                if (this.autoscale && this.min == null && this.max == null) {
-                    var rrange, ti, margin;
-                    var forceMinZero = false;
-                    var forceZeroLine = false;
-                    var intervals = {min:null, max:null, average:null, stddev:null};
-                    // if any series are bars, or if any are fill to zero, and if this
-                    // is the axis to fill toward, check to see if we can start axis at zero.
-                    for (var i=0; i<this._series.length; i++) {
-                        var s = this._series[i];
-                        var faname = (s.fillAxis == 'x') ? s._xaxis.name : s._yaxis.name;
-                        // check to see if this is the fill axis
-                        if (this.name == faname) {
-                            var vals = s._plotValues[s.fillAxis];
-                            var vmin = vals[0];
-                            var vmax = vals[0];
-                            for (var j=1; j<vals.length; j++) {
-                                if (vals[j] < vmin) {
-                                    vmin = vals[j];
-                                }
-                                else if (vals[j] > vmax) {
-                                    vmax = vals[j];
-                                }
-                            }
-                            var dp = (vmax - vmin) / vmax;
-                            // is this sries a bar?
-                            if (s.renderer.constructor == $.jqplot.BarRenderer) {
-                                // if no negative values and could also check range.
-                                if (vmin >= 0 && (s.fillToZero || dp > 0.1)) {
-                                    forceMinZero = true;
-                                }
-                                else {
-                                    forceMinZero = false;
-                                    if (s.fill && s.fillToZero && vmin < 0 && vmax > 0) {
-                                        forceZeroLine = true;
-                                    }
-                                    else {
-                                        forceZeroLine = false;
-                                    }
-                                }
-                            }
-                            
-                            // if not a bar and filling, use appropriate method.
-                            else if (s.fill) {
-                                if (vmin >= 0 && (s.fillToZero || dp > 0.1)) {
-                                    forceMinZero = true;
-                                }
-                                else if (vmin < 0 && vmax > 0 && s.fillToZero) {
-                                    forceMinZero = false;
-                                    forceZeroLine = true;
-                                }
-                                else {
-                                    forceMinZero = false;
-                                    forceZeroLine = false;
-                                }
-                            }
-                            
-                            // if not a bar and not filling, only change existing state
-                            // if it doesn't make sense
-                            else if (vmin < 0) {
-                                forceMinZero = false;
-                            }
-                        }
-                    }
-                    
-                    // check if we need make axis min at 0.
-                    if (forceMinZero) {
-                        // compute number of ticks
-                        this.numberTicks = 2 + Math.ceil((dim-(this.tickSpacing-1))/this.tickSpacing);
-                        this.min = 0;
-                        userMin = 0;
-                        // what order is this range?
-                        // what tick interval does that give us?
-                        ti = max/(this.numberTicks-1);
-                        temp = Math.pow(10, Math.abs(Math.floor(Math.log(ti)/Math.LN10)));
-                        if (ti/temp == parseInt(ti/temp, 10)) {
-                            ti += temp;
-                        }
-                        this.tickInterval = Math.ceil(ti/temp) * temp;
-                        this.max = this.tickInterval * (this.numberTicks - 1);
-                    }
-                    
-                    // check if we need to make sure there is a tick at 0.
-                    else if (forceZeroLine) {
-                        // compute number of ticks
-                        this.numberTicks = 2 + Math.ceil((dim-(this.tickSpacing-1))/this.tickSpacing);
-                        var ntmin = Math.ceil(Math.abs(min)/range*(this.numberTicks-1));
-                        var ntmax = this.numberTicks - 1  - ntmin;
-                        ti = Math.max(Math.abs(min/ntmin), Math.abs(max/ntmax));
-                        temp = Math.pow(10, Math.abs(Math.floor(Math.log(ti)/Math.LN10)));
-                        this.tickInterval = Math.ceil(ti/temp) * temp;
-                        this.max = this.tickInterval * ntmax;
-                        this.min = -this.tickInterval * ntmin;
-                    }
-                    
-                    // if nothing else, do autoscaling which will try to line up ticks across axes.
-                    else {  
-                        if (this.numberTicks == null){
-                            if (this.tickInterval) {
-                                this.numberTicks = 3 + Math.ceil(range / this.tickInterval);
-                            }
-                            else {
-                                this.numberTicks = 2 + Math.ceil((dim-(this.tickSpacing-1))/this.tickSpacing);
-                            }
-                        }
-                
-                        if (this.tickInterval == null) {
-                            // get a tick interval
-                            ti = range/(this.numberTicks - 1);
-
-                            if (ti < 1) {
-                                temp = Math.pow(10, Math.abs(Math.floor(Math.log(ti)/Math.LN10)));
-                            }
-                            else {
-                                temp = 1;
-                            }
-                            this.tickInterval = Math.ceil(ti*temp*this.pad)/temp;
-                        }
-                        else {
-                            temp = 1 / this.tickInterval;
-                        }
-                        
-                        // try to compute a nicer, more even tick interval
-                        // temp = Math.pow(10, Math.floor(Math.log(ti)/Math.LN10));
-                        // this.tickInterval = Math.ceil(ti/temp) * temp;
-                        rrange = this.tickInterval * (this.numberTicks - 1);
-                        margin = (rrange - range)/2;
-           
-                        if (this.min == null) {
-                            this.min = Math.floor(temp*(min-margin))/temp;
-                        }
-                        if (this.max == null) {
-                            this.max = this.min + rrange;
-                        }
-                    }
-
-                    // Compute a somewhat decent format string if it is needed.
-                    // get precision of interval and determine a format string.
-                    var sf = $.jqplot.getSignificantFigures(this.tickInterval);
-
-                    var fstr;
-
-                    // if we have only a whole number, use integer formatting
-                    if (sf.digitsLeft >= sf.significantDigits) {
-                        fstr = '%d';
-                    }
-
-                    else {
-                        var temp = Math.max(0, 5 - sf.digitsLeft);
-                        temp = Math.min(temp, sf.digitsRight);
-                        fstr = '%.'+ temp + 'f';
-                    }
-
-                    this._autoFormatString = fstr;
-                }
-                
-                // Use the default algorithm which pads each axis to make the chart
-                // centered nicely on the grid.
-                else {
-
-                    rmin = (this.min != null) ? this.min : min - range*(this.padMin - 1);
-                    rmax = (this.max != null) ? this.max : max + range*(this.padMax - 1);
-                    range = rmax - rmin;
-        
-                    if (this.numberTicks == null){
-                        // if tickInterval is specified by user, we will ignore computed maximum.
-                        // max will be equal or greater to fit even # of ticks.
-                        if (this.tickInterval != null) {
-                            this.numberTicks = Math.ceil((rmax - rmin)/this.tickInterval)+1;
-                        }
-                        else if (dim > 100) {
-                            this.numberTicks = parseInt(3+(dim-100)/75, 10);
-                        }
-                        else {
-                            this.numberTicks = 2;
-                        }
-                    }
-                
-                    if (this.tickInterval == null) {
-                        this.tickInterval = range / (this.numberTicks-1);
-                    }
-                    
-                    if (this.max == null) {
-                        rmax = rmin + this.tickInterval*(this.numberTicks - 1);
-                    }        
-                    if (this.min == null) {
-                        rmin = rmax - this.tickInterval*(this.numberTicks - 1);
-                    }
-
-                    // get precision of interval and determine a format string.
-                    var sf = $.jqplot.getSignificantFigures(this.tickInterval);
-
-                    var fstr;
-
-                    // if we have only a whole number, use integer formatting
-                    if (sf.digitsLeft >= sf.significantDigits) {
-                        fstr = '%d';
-                    }
-
-                    else {
-                        var temp = Math.max(0, 5 - sf.digitsLeft);
-                        temp = Math.min(temp, sf.digitsRight);
-                        fstr = '%.'+ temp + 'f';
-                    }
-
-
-                    this._autoFormatString = fstr;
-
-                    this.min = rmin;
-                    this.max = rmax;
-                }
-                
-                if (this.renderer.constructor == $.jqplot.LinearAxisRenderer && this._autoFormatString == '') {
-                    // fix for misleading tick display with small range and low precision.
-                    range = this.max - this.min;
-                    // figure out precision
-                    var temptick = new this.tickRenderer(this.tickOptions);
-                    // use the tick formatString or, the default.
-                    var fs = temptick.formatString || $.jqplot.config.defaultTickFormatString; 
-                    var fs = fs.match($.jqplot.sprintf.regex)[0];
-                    var precision = 0;
-                    if (fs) {
-                        if (fs.search(/[fFeEgGpP]/) > -1) {
-                            var m = fs.match(/\%\.(\d{0,})?[eEfFgGpP]/);
-                            if (m) {
-                                precision = parseInt(m[1], 10);
-                            }
-                            else {
-                                precision = 6;
-                            }
-                        }
-                        else if (fs.search(/[di]/) > -1) {
-                            precision = 0;
-                        }
-                        // fact will be <= 1;
-                        var fact = Math.pow(10, -precision);
-                        if (this.tickInterval < fact) {
-                            // need to correct underrange
-                            if (userNT == null && userTI == null) {
-                                this.tickInterval = fact;
-                                if (userMax == null && userMin == null) {
-                                    // this.min = Math.floor((this._dataBounds.min - this.tickInterval)/fact) * fact;
-                                    this.min = Math.floor(this._dataBounds.min/fact) * fact;
-                                    if (this.min == this._dataBounds.min) {
-                                        this.min = this._dataBounds.min - this.tickInterval;
-                                    }
-                                    // this.max = Math.ceil((this._dataBounds.max + this.tickInterval)/fact) * fact;
-                                    this.max = Math.ceil(this._dataBounds.max/fact) * fact;
-                                    if (this.max == this._dataBounds.max) {
-                                        this.max = this._dataBounds.max + this.tickInterval;
-                                    }
-                                    var n = (this.max - this.min)/this.tickInterval;
-                                    n = n.toFixed(11);
-                                    n = Math.ceil(n);
-                                    this.numberTicks = n + 1;
-                                }
-                                else if (userMax == null) {
-                                    // add one tick for top of range.
-                                    var n = (this._dataBounds.max - this.min) / this.tickInterval;
-                                    n = n.toFixed(11);
-                                    this.numberTicks = Math.ceil(n) + 2;
-                                    this.max = this.min + this.tickInterval * (this.numberTicks-1);
-                                }
-                                else if (userMin == null) {
-                                    // add one tick for bottom of range.
-                                    var n = (this.max - this._dataBounds.min) / this.tickInterval;
-                                    n = n.toFixed(11);
-                                    this.numberTicks = Math.ceil(n) + 2;
-                                    this.min = this.max - this.tickInterval * (this.numberTicks-1);
-                                }
-                                else {
-                                    // calculate a number of ticks so max is within axis scale
-                                    this.numberTicks = Math.ceil((userMax - userMin)/this.tickInterval) + 1;
-                                    // if user's min and max don't fit evenly in ticks, adjust.
-                                    // This takes care of cases such as user min set to 0, max set to 3.5 but tick
-                                    // format string set to %d (integer ticks)
-                                    this.min =  Math.floor(userMin*Math.pow(10, precision))/Math.pow(10, precision);
-                                    this.max =  Math.ceil(userMax*Math.pow(10, precision))/Math.pow(10, precision);
-                                    // this.max = this.min + this.tickInterval*(this.numberTicks-1);
-                                    this.numberTicks = Math.ceil((this.max - this.min)/this.tickInterval) + 1;
-                                }
-                            }
-                        }
-                    }
-                }
-                
-            }
-            
-            if (this._overrideFormatString && this._autoFormatString != '') {
-                this.tickOptions = this.tickOptions || {};
-                this.tickOptions.formatString = this._autoFormatString;
-            }
-
-            var t, to;
-            for (var i=0; i<this.numberTicks; i++){
-                tt = this.min + i * this.tickInterval;
-                t = new this.tickRenderer(this.tickOptions);
-                // var t = new $.jqplot.AxisTickRenderer(this.tickOptions);
-
-                t.setTick(tt, this.name);
-                this._ticks.push(t);
-
-                if (i < this.numberTicks - 1) {
-                    for (var j=0; j<this.minorTicks; j++) {
-                        tt += this.tickInterval/(this.minorTicks+1);
-                        to = $.extend(true, {}, this.tickOptions, {name:this.name, value:tt, label:'', isMinorTick:true});
-                        t = new this.tickRenderer(to);
-                        this._ticks.push(t);
-                    }
-                }
-                t = null;
-            }
-        }
-
-        if (this.tickInset) {
-            this.min = this.min - this.tickInset * this.tickInterval;
-            this.max = this.max + this.tickInset * this.tickInterval;
-        }
-
-        ticks = null;
-    };
-    
-    // Used to reset just the values of the ticks and then repack, which will
-    // recalculate the positioning functions.  It is assuemd that the 
-    // number of ticks is the same and the values of the new array are at the
-    // proper interval.
-    // This method needs to be called with the scope of an axis object, like:
-    //
-    // > plot.axes.yaxis.renderer.resetTickValues.call(plot.axes.yaxis, yarr);
-    //
-    $.jqplot.LinearAxisRenderer.prototype.resetTickValues = function(opts) {
-        if ($.isArray(opts) && opts.length == this._ticks.length) {
-            var t;
-            for (var i=0; i<opts.length; i++) {
-                t = this._ticks[i];
-                t.value = opts[i];
-                t.label = t.formatter(t.formatString, opts[i]);
-                t.label = t.prefix + t.label;
-                t._elem.html(t.label);
-            }
-            t = null;
-            this.min = $.jqplot.arrayMin(opts);
-            this.max = $.jqplot.arrayMax(opts);
-            this.pack();
-        }
-        // Not implemented yet.
-        // else if ($.isPlainObject(opts)) {
-        // 
-        // }
-    };
-    
-    // called with scope of axis
-    $.jqplot.LinearAxisRenderer.prototype.pack = function(pos, offsets) {
-        // Add defaults for repacking from resetTickValues function.
-        pos = pos || {};
-        offsets = offsets || this._offsets;
-        
-        var ticks = this._ticks;
-        var max = this.max;
-        var min = this.min;
-        var offmax = offsets.max;
-        var offmin = offsets.min;
-        var lshow = (this._label == null) ? false : this._label.show;
-        
-        for (var p in pos) {
-            this._elem.css(p, pos[p]);
-        }
-        
-        this._offsets = offsets;
-        // pixellength will be + for x axes and - for y axes becasue pixels always measured from top left.
-        var pixellength = offmax - offmin;
-        var unitlength = max - min;
-        
-        // point to unit and unit to point conversions references to Plot DOM element top left corner.
-        if (this.breakPoints) {
-            unitlength = unitlength - this.breakPoints[1] + this.breakPoints[0];
-            
-            this.p2u = function(p){
-                return (p - offmin) * unitlength / pixellength + min;
-            };
-        
-            this.u2p = function(u){
-                if (u > this.breakPoints[0] && u < this.breakPoints[1]){
-                    u = this.breakPoints[0];
-                }
-                if (u <= this.breakPoints[0]) {
-                    return (u - min) * pixellength / unitlength + offmin;
-                }
-                else {
-                    return (u - this.breakPoints[1] + this.breakPoints[0] - min) * pixellength / unitlength + offmin;
-                }
-            };
-                
-            if (this.name.charAt(0) == 'x'){
-                this.series_u2p = function(u){
-                    if (u > this.breakPoints[0] && u < this.breakPoints[1]){
-                        u = this.breakPoints[0];
-                    }
-                    if (u <= this.breakPoints[0]) {
-                        return (u - min) * pixellength / unitlength;
-                    }
-                    else {
-                        return (u - this.breakPoints[1] + this.breakPoints[0] - min) * pixellength / unitlength;
-                    }
-                };
-                this.series_p2u = function(p){
-                    return p * unitlength / pixellength + min;
-                };
-            }
-        
-            else {
-                this.series_u2p = function(u){
-                    if (u > this.breakPoints[0] && u < this.breakPoints[1]){
-                        u = this.breakPoints[0];
-                    }
-                    if (u >= this.breakPoints[1]) {
-                        return (u - max) * pixellength / unitlength;
-                    }
-                    else {
-                        return (u + this.breakPoints[1] - this.breakPoints[0] - max) * pixellength / unitlength;
-                    }
-                };
-                this.series_p2u = function(p){
-                    return p * unitlength / pixellength + max;
-                };
-            }
-        }
-        else {
-            this.p2u = function(p){
-                return (p - offmin) * unitlength / pixellength + min;
-            };
-        
-            this.u2p = function(u){
-                return (u - min) * pixellength / unitlength + offmin;
-            };
-                
-            if (this.name == 'xaxis' || this.name == 'x2axis'){
-                this.series_u2p = function(u){
-                    return (u - min) * pixellength / unitlength;
-                };
-                this.series_p2u = function(p){
-                    return p * unitlength / pixellength + min;
-                };
-            }
-        
-            else {
-                this.series_u2p = function(u){
-                    return (u - max) * pixellength / unitlength;
-                };
-                this.series_p2u = function(p){
-                    return p * unitlength / pixellength + max;
-                };
-            }
-        }
-        
-        if (this.show) {
-            if (this.name == 'xaxis' || this.name == 'x2axis') {
-                for (var i=0; i<ticks.length; i++) {
-                    var t = ticks[i];
-                    if (t.show && t.showLabel) {
-                        var shim;
-                        
-                        if (t.constructor == $.jqplot.CanvasAxisTickRenderer && t.angle) {
-                            // will need to adjust auto positioning based on which axis this is.
-                            var temp = (this.name == 'xaxis') ? 1 : -1;
-                            switch (t.labelPosition) {
-                                case 'auto':
-                                    // position at end
-                                    if (temp * t.angle < 0) {
-                                        shim = -t.getWidth() + t._textRenderer.height * Math.sin(-t._textRenderer.angle) / 2;
-                                    }
-                                    // position at start
-                                    else {
-                                        shim = -t._textRenderer.height * Math.sin(t._textRenderer.angle) / 2;
-                                    }
-                                    break;
-                                case 'end':
-                                    shim = -t.getWidth() + t._textRenderer.height * Math.sin(-t._textRenderer.angle) / 2;
-                                    break;
-                                case 'start':
-                                    shim = -t._textRenderer.height * Math.sin(t._textRenderer.angle) / 2;
-                                    break;
-                                case 'middle':
-                                    shim = -t.getWidth()/2 + t._textRenderer.height * Math.sin(-t._textRenderer.angle) / 2;
-                                    break;
-                                default:
-                                    shim = -t.getWidth()/2 + t._textRenderer.height * Math.sin(-t._textRenderer.angle) / 2;
-                                    break;
-                            }
-                        }
-                        else {
-                            shim = -t.getWidth()/2;
-                        }
-                        var val = this.u2p(t.value) + shim + 'px';
-                        t._elem.css('left', val);
-                        t.pack();
-                    }
-                }
-                if (lshow) {
-                    var w = this._label._elem.outerWidth(true);
-                    this._label._elem.css('left', offmin + pixellength/2 - w/2 + 'px');
-                    if (this.name == 'xaxis') {
-                        this._label._elem.css('bottom', '0px');
-                    }
-                    else {
-                        this._label._elem.css('top', '0px');
-                    }
-                    this._label.pack();
-                }
-            }
-            else {
-                for (var i=0; i<ticks.length; i++) {
-                    var t = ticks[i];
-                    if (t.show && t.showLabel) {                        
-                        var shim;
-                        if (t.constructor == $.jqplot.CanvasAxisTickRenderer && t.angle) {
-                            // will need to adjust auto positioning based on which axis this is.
-                            var temp = (this.name == 'yaxis') ? 1 : -1;
-                            switch (t.labelPosition) {
-                                case 'auto':
-                                    // position at end
-                                case 'end':
-                                    if (temp * t.angle < 0) {
-                                        shim = -t._textRenderer.height * Math.cos(-t._textRenderer.angle) / 2;
-                                    }
-                                    else {
-                                        shim = -t.getHeight() + t._textRenderer.height * Math.cos(t._textRenderer.angle) / 2;
-                                    }
-                                    break;
-                                case 'start':
-                                    if (t.angle > 0) {
-                                        shim = -t._textRenderer.height * Math.cos(-t._textRenderer.angle) / 2;
-                                    }
-                                    else {
-                                        shim = -t.getHeight() + t._textRenderer.height * Math.cos(t._textRenderer.angle) / 2;
-                                    }
-                                    break;
-                                case 'middle':
-                                    // if (t.angle > 0) {
-                                    //     shim = -t.getHeight()/2 + t._textRenderer.height * Math.sin(-t._textRenderer.angle) / 2;
-                                    // }
-                                    // else {
-                                    //     shim = -t.getHeight()/2 - t._textRenderer.height * Math.sin(t._textRenderer.angle) / 2;
-                                    // }
-                                    shim = -t.getHeight()/2;
-                                    break;
-                                default:
-                                    shim = -t.getHeight()/2;
-                                    break;
-                            }
-                        }
-                        else {
-                            shim = -t.getHeight()/2;
-                        }
-                        
-                        var val = this.u2p(t.value) + shim + 'px';
-                        t._elem.css('top', val);
-                        t.pack();
-                    }
-                }
-                if (lshow) {
-                    var h = this._label._elem.outerHeight(true);
-                    this._label._elem.css('top', offmax - pixellength/2 - h/2 + 'px');
-                    if (this.name == 'yaxis') {
-                        this._label._elem.css('left', '0px');
-                    }
-                    else {
-                        this._label._elem.css('right', '0px');
-                    }   
-                    this._label.pack();
-                }
-            }
-        }
-
-        ticks = null;
-    };
-
-
-    /**
-    * The following code was generaously given to me a while back by Scott Prahl.
-    * He did a good job at computing axes min, max and number of ticks for the 
-    * case where the user has not set any scale related parameters (tickInterval,
-    * numberTicks, min or max).  I had ignored this use case for a long time,
-    * focusing on the more difficult case where user has set some option controlling
-    * tick generation.  Anyway, about time I got this into jqPlot.
-    * Thanks Scott!!
-    */
-    
-    /**
-    * Copyright (c) 2010 Scott Prahl
-    * The next three routines are currently available for use in all personal 
-    * or commercial projects under both the MIT and GPL version 2.0 licenses. 
-    * This means that you can choose the license that best suits your project 
-    * and use it accordingly. 
-    */
-
-    // A good format string depends on the interval. If the interval is greater 
-    // than 1 then there is no need to show any decimal digits. If it is < 1.0, then
-    // use the magnitude of the interval to determine the number of digits to show.
-    function bestFormatString (interval)
-    {
-        var fstr;
-        interval = Math.abs(interval);
-        if (interval >= 10) {
-            fstr = '%d';
-        }
-
-        else if (interval > 1) {
-            if (interval === parseInt(interval, 10)) {
-                fstr = '%d';
-            }
-            else {
-                fstr = '%.1f';
-            }
-        }
-
-        else {
-            var expv = -Math.floor(Math.log(interval)/Math.LN10);
-            fstr = '%.' + expv + 'f';
-        }
-        
-        return fstr; 
-    }
-
-    var _factors = [0.1, 0.2, 0.3, 0.4, 0.5, 0.8, 1, 2, 3, 4, 5];
-
-    var _getLowerFactor = function(f) {
-        var i = _factors.indexOf(f);
-        if (i > 0) {
-            return _factors[i-1];
-        }
-        else {
-            return _factors[_factors.length - 1] / 100;
-        }
-    };
-
-    var _getHigherFactor = function(f) {
-        var i = _factors.indexOf(f);
-        if (i < _factors.length-1) {
-            return _factors[i+1];
-        }
-        else {
-            return _factors[0] * 100;
-        }
-    };
-
-    // Given a fixed minimum and maximum and a target number ot ticks
-    // figure out the best interval and 
-    // return min, max, number ticks, format string and tick interval
-    function bestConstrainedInterval(min, max, nttarget) {
-        // run through possible number to ticks and see which interval is best
-        var low = Math.floor(nttarget/2);
-        var hi = Math.ceil(nttarget*1.5);
-        var badness = Number.MAX_VALUE;
-        var r = (max - min);
-        var temp;
-        var sd;
-        var bestNT;
-        var gsf = $.jqplot.getSignificantFigures;
-        var fsd;
-        var fs;
-        var currentNT;
-        var bestPrec;
-
-        for (var i=0, l=hi-low+1; i<l; i++) {
-            currentNT = low + i;
-            temp = r/(currentNT-1);
-            sd = gsf(temp);
-
-            temp = Math.abs(nttarget - currentNT) + sd.digitsRight;
-            if (temp < badness) {
-                badness = temp;
-                bestNT = currentNT;
-                bestPrec = sd.digitsRight;
-            }
-            else if (temp === badness) {
-                // let nicer ticks trump number ot ticks
-                if (sd.digitsRight < bestPrec) {
-                    bestNT = currentNT;
-                    bestPrec = sd.digitsRight;
-                }
-            }
-
-        }
-
-        fsd = Math.max(bestPrec, Math.max(gsf(min).digitsRight, gsf(max).digitsRight));
-        if (fsd === 0) {
-            fs = '%d';
-        }
-        else {
-            fs = '%.' + fsd + 'f';
-        }
-        temp = r / (bestNT - 1);
-        // min, max, number ticks, format string, tick interval
-        return [min, max, bestNT, fs, temp];
-    }
-
-    // This will return an interval of form 2 * 10^n, 5 * 10^n or 10 * 10^n
-    // it is based soley on the range and number of ticks.  So if user specifies
-    // number of ticks, use this.
-    function bestInterval(range, numberTicks) {
-        numberTicks = numberTicks || 7;
-        var minimum = range / (numberTicks - 1);
-        var magnitude = Math.pow(10, Math.floor(Math.log(minimum) / Math.LN10));
-        var residual = minimum / magnitude;
-        var interval;
-        // "nicest" ranges are 1, 2, 5 or powers of these.
-        // for magnitudes below 1, only allow these. 
-        if (magnitude < 1) {
-            if (residual > 5) {
-                interval = 10 * magnitude;
-            }
-            else if (residual > 2) {
-                interval = 5 * magnitude;
-            }
-            else if (residual > 1) {
-                interval = 2 * magnitude;
-            }
-            else {
-                interval = magnitude;
-            }
-        }
-        // for large ranges (whole integers), allow intervals like 3, 4 or powers of these.
-        // this helps a lot with poor choices for number of ticks. 
-        else {
-            if (residual > 5) {
-                interval = 10 * magnitude;
-            }
-            else if (residual > 4) {
-                interval = 5 * magnitude;
-            }
-            else if (residual > 3) {
-                interval = 4 * magnitude;
-            }
-            else if (residual > 2) {
-                interval = 3 * magnitude;
-            }
-            else if (residual > 1) {
-                interval = 2 * magnitude;
-            }
-            else {
-                interval = magnitude;
-            }
-        }
-
-        return interval;
-    }
-
-    // This will return an interval of form 2 * 10^n, 5 * 10^n or 10 * 10^n
-    // it is based soley on the range of data, number of ticks must be computed later.
-    function bestLinearInterval(range, scalefact) {
-        scalefact = scalefact || 1;
-        var expv = Math.floor(Math.log(range)/Math.LN10);
-        var magnitude = Math.pow(10, expv);
-        // 0 < f < 10
-        var f = range / magnitude;
-        var fact;
-        // for large plots, scalefact will decrease f and increase number of ticks.
-        // for small plots, scalefact will increase f and decrease number of ticks.
-        f = f/scalefact;
-
-        // for large plots, smaller interval, more ticks.
-        if (f<=0.38) {
-            fact = 0.1;
-        }
-        else if (f<=1.6) {
-            fact = 0.2;
-        }
-        else if (f<=4.0) {
-            fact = 0.5;
-        }
-        else if (f<=8.0) {
-            fact = 1.0;
-        }
-        // for very small plots, larger interval, less ticks in number ticks
-        else if (f<=16.0) {
-            fact = 2;
-        }
-        else {
-            fact = 5;
-        } 
-
-        return fact*magnitude; 
-    }
-
-    function bestLinearComponents(range, scalefact) {
-        var expv = Math.floor(Math.log(range)/Math.LN10);
-        var magnitude = Math.pow(10, expv);
-        // 0 < f < 10
-        var f = range / magnitude;
-        var interval;
-        var fact;
-        // for large plots, scalefact will decrease f and increase number of ticks.
-        // for small plots, scalefact will increase f and decrease number of ticks.
-        f = f/scalefact;
-
-        // for large plots, smaller interval, more ticks.
-        if (f<=0.38) {
-            fact = 0.1;
-        }
-        else if (f<=1.6) {
-            fact = 0.2;
-        }
-        else if (f<=4.0) {
-            fact = 0.5;
-        }
-        else if (f<=8.0) {
-            fact = 1.0;
-        }
-        // for very small plots, larger interval, less ticks in number ticks
-        else if (f<=16.0) {
-            fact = 2;
-        }
-        // else if (f<=20.0) {
-        //     fact = 3;
-        // }
-        // else if (f<=24.0) {
-        //     fact = 4;
-        // }
-        else {
-            fact = 5;
-        } 
-
-        interval = fact * magnitude;
-
-        return [interval, fact, magnitude];
-    }
-
-    // Given the min and max for a dataset, return suitable endpoints
-    // for the graphing, a good number for the number of ticks, and a
-    // format string so that extraneous digits are not displayed.
-    // returned is an array containing [min, max, nTicks, format]
-    $.jqplot.LinearTickGenerator = function(axis_min, axis_max, scalefact, numberTicks, keepMin, keepMax) {
-        // Set to preserve EITHER min OR max.
-        // If min is preserved, max must be free.
-        keepMin = (keepMin === null) ? false : keepMin;
-        keepMax = (keepMax === null || keepMin) ? false : keepMax;
-        // if endpoints are equal try to include zero otherwise include one
-        if (axis_min === axis_max) {
-            axis_max = (axis_max) ? 0 : 1;
-        }
-
-        scalefact = scalefact || 1.0;
-
-        // make sure range is positive
-        if (axis_max < axis_min) {
-            var a = axis_max;
-            axis_max = axis_min;
-            axis_min = a;
-        }
-
-        var r = [];
-        var ss = bestLinearInterval(axis_max - axis_min, scalefact);
-
-        var gsf = $.jqplot.getSignificantFigures;
-        
-        if (numberTicks == null) {
-
-            // Figure out the axis min, max and number of ticks
-            // the min and max will be some multiple of the tick interval,
-            // 1*10^n, 2*10^n or 5*10^n.  This gaurantees that, if the
-            // axis min is negative, 0 will be a tick.
-            if (!keepMin && !keepMax) {
-                r[0] = Math.floor(axis_min / ss) * ss;  // min
-                r[1] = Math.ceil(axis_max / ss) * ss;   // max
-                r[2] = Math.round((r[1]-r[0])/ss+1.0);  // number of ticks
-                r[3] = bestFormatString(ss);            // format string
-                r[4] = ss;                              // tick Interval
-            }
-
-            else if (keepMin) {
-                r[0] = axis_min;                                        // min
-                r[2] = Math.ceil((axis_max - axis_min) / ss + 1.0);     // number of ticks
-                r[1] = axis_min + (r[2] - 1) * ss;                      // max
-                var digitsMin = gsf(axis_min).digitsRight;
-                var digitsSS = gsf(ss).digitsRight;
-                if (digitsMin < digitsSS) {
-                    r[3] = bestFormatString(ss);                        // format string
-                }
-                else {
-                    r[3] = '%.' + digitsMin + 'f';
-                }
-                r[4] = ss;                                              // tick Interval
-            }
-
-            else if (keepMax) {
-                r[1] = axis_max;                                        // max
-                r[2] = Math.ceil((axis_max - axis_min) / ss + 1.0);     // number of ticks
-                r[0] = axis_max - (r[2] - 1) * ss;                      // min
-                var digitsMax = gsf(axis_max).digitsRight;
-                var digitsSS = gsf(ss).digitsRight;
-                if (digitsMax < digitsSS) {
-                    r[3] = bestFormatString(ss);                        // format string
-                }
-                else {
-                    r[3] = '%.' + digitsMax + 'f';
-                }
-                r[4] = ss;                                              // tick Interval
-            }
-        }
-
-        else {
-            var tempr = [];
-
-            // Figure out the axis min, max and number of ticks
-            // the min and max will be some multiple of the tick interval,
-            // 1*10^n, 2*10^n or 5*10^n.  This gaurantees that, if the
-            // axis min is negative, 0 will be a tick.
-            tempr[0] = Math.floor(axis_min / ss) * ss;  // min
-            tempr[1] = Math.ceil(axis_max / ss) * ss;   // max
-            tempr[2] = Math.round((tempr[1]-tempr[0])/ss+1.0);    // number of ticks
-            tempr[3] = bestFormatString(ss);            // format string
-            tempr[4] = ss;                              // tick Interval
-
-            // first, see if we happen to get the right number of ticks
-            if (tempr[2] === numberTicks) {
-                r = tempr;
-            }
-
-            else {
-
-                var newti = bestInterval(tempr[1] - tempr[0], numberTicks);
-
-                r[0] = tempr[0];                        // min
-                r[2] = numberTicks;                     // number of ticks
-                r[4] = newti;                           // tick interval
-                r[3] = bestFormatString(newti);         // format string
-                r[1] = r[0] + (r[2] - 1) * r[4];        // max
-            }
-        }
-
-        return r;
-    };
-
-    $.jqplot.LinearTickGenerator.bestLinearInterval = bestLinearInterval;
-    $.jqplot.LinearTickGenerator.bestInterval = bestInterval;
-    $.jqplot.LinearTickGenerator.bestLinearComponents = bestLinearComponents;
-    $.jqplot.LinearTickGenerator.bestConstrainedInterval = bestConstrainedInterval;
-
-
-    // class: $.jqplot.MarkerRenderer
-    // The default jqPlot marker renderer, rendering the points on the line.
-    $.jqplot.MarkerRenderer = function(options){
-        // Group: Properties
-        
-        // prop: show
-        // whether or not to show the marker.
-        this.show = true;
-        // prop: style
-        // One of diamond, circle, square, x, plus, dash, filledDiamond, filledCircle, filledSquare
-        this.style = 'filledCircle';
-        // prop: lineWidth
-        // size of the line for non-filled markers.
-        this.lineWidth = 2;
-        // prop: size
-        // Size of the marker (diameter or circle, length of edge of square, etc.)
-        this.size = 9.0;
-        // prop: color
-        // color of marker.  Will be set to color of series by default on init.
-        this.color = '#666666';
-        // prop: shadow
-        // whether or not to draw a shadow on the line
-        this.shadow = true;
-        // prop: shadowAngle
-        // Shadow angle in degrees
-        this.shadowAngle = 45;
-        // prop: shadowOffset
-        // Shadow offset from line in pixels
-        this.shadowOffset = 1;
-        // prop: shadowDepth
-        // Number of times shadow is stroked, each stroke offset shadowOffset from the last.
-        this.shadowDepth = 3;
-        // prop: shadowAlpha
-        // Alpha channel transparency of shadow.  0 = transparent.
-        this.shadowAlpha = '0.07';
-        // prop: shadowRenderer
-        // Renderer that will draws the shadows on the marker.
-        this.shadowRenderer = new $.jqplot.ShadowRenderer();
-        // prop: shapeRenderer
-        // Renderer that will draw the marker.
-        this.shapeRenderer = new $.jqplot.ShapeRenderer();
-        
-        $.extend(true, this, options);
-    };
-    
-    $.jqplot.MarkerRenderer.prototype.init = function(options) {
-        $.extend(true, this, options);
-        var sdopt = {angle:this.shadowAngle, offset:this.shadowOffset, alpha:this.shadowAlpha, lineWidth:this.lineWidth, depth:this.shadowDepth, closePath:true};
-        if (this.style.indexOf('filled') != -1) {
-            sdopt.fill = true;
-        }
-        if (this.style.indexOf('ircle') != -1) {
-            sdopt.isarc = true;
-            sdopt.closePath = false;
-        }
-        this.shadowRenderer.init(sdopt);
-        
-        var shopt = {fill:false, isarc:false, strokeStyle:this.color, fillStyle:this.color, lineWidth:this.lineWidth, closePath:true};
-        if (this.style.indexOf('filled') != -1) {
-            shopt.fill = true;
-        }
-        if (this.style.indexOf('ircle') != -1) {
-            shopt.isarc = true;
-            shopt.closePath = false;
-        }
-        this.shapeRenderer.init(shopt);
-    };
-    
-    $.jqplot.MarkerRenderer.prototype.drawDiamond = function(x, y, ctx, fill, options) {
-        var stretch = 1.2;
-        var dx = this.size/2/stretch;
-        var dy = this.size/2*stretch;
-        var points = [[x-dx, y], [x, y+dy], [x+dx, y], [x, y-dy]];
-        if (this.shadow) {
-            this.shadowRenderer.draw(ctx, points);
-        }
-        this.shapeRenderer.draw(ctx, points, options);
-    };
-    
-    $.jqplot.MarkerRenderer.prototype.drawPlus = function(x, y, ctx, fill, options) {
-        var stretch = 1.0;
-        var dx = this.size/2*stretch;
-        var dy = this.size/2*stretch;
-        var points1 = [[x, y-dy], [x, y+dy]];
-        var points2 = [[x+dx, y], [x-dx, y]];
-        var opts = $.extend(true, {}, this.options, {closePath:false});
-        if (this.shadow) {
-            this.shadowRenderer.draw(ctx, points1, {closePath:false});
-            this.shadowRenderer.draw(ctx, points2, {closePath:false});
-        }
-        this.shapeRenderer.draw(ctx, points1, opts);
-        this.shapeRenderer.draw(ctx, points2, opts);
-    };
-    
-    $.jqplot.MarkerRenderer.prototype.drawX = function(x, y, ctx, fill, options) {
-        var stretch = 1.0;
-        var dx = this.size/2*stretch;
-        var dy = this.size/2*stretch;
-        var opts = $.extend(true, {}, this.options, {closePath:false});
-        var points1 = [[x-dx, y-dy], [x+dx, y+dy]];
-        var points2 = [[x-dx, y+dy], [x+dx, y-dy]];
-        if (this.shadow) {
-            this.shadowRenderer.draw(ctx, points1, {closePath:false});
-            this.shadowRenderer.draw(ctx, points2, {closePath:false});
-        }
-        this.shapeRenderer.draw(ctx, points1, opts);
-        this.shapeRenderer.draw(ctx, points2, opts);
-    };
-    
-    $.jqplot.MarkerRenderer.prototype.drawDash = function(x, y, ctx, fill, options) {
-        var stretch = 1.0;
-        var dx = this.size/2*stretch;
-        var dy = this.size/2*stretch;
-        var points = [[x-dx, y], [x+dx, y]];
-        if (this.shadow) {
-            this.shadowRenderer.draw(ctx, points);
-        }
-        this.shapeRenderer.draw(ctx, points, options);
-    };
-    
-    $.jqplot.MarkerRenderer.prototype.drawLine = function(p1, p2, ctx, fill, options) {
-        var points = [p1, p2];
-        if (this.shadow) {
-            this.shadowRenderer.draw(ctx, points);
-        }
-        this.shapeRenderer.draw(ctx, points, options);
-    };
-    
-    $.jqplot.MarkerRenderer.prototype.drawSquare = function(x, y, ctx, fill, options) {
-        var stretch = 1.0;
-        var dx = this.size/2/stretch;
-        var dy = this.size/2*stretch;
-        var points = [[x-dx, y-dy], [x-dx, y+dy], [x+dx, y+dy], [x+dx, y-dy]];
-        if (this.shadow) {
-            this.shadowRenderer.draw(ctx, points);
-        }
-        this.shapeRenderer.draw(ctx, points, options);
-    };
-    
-    $.jqplot.MarkerRenderer.prototype.drawCircle = function(x, y, ctx, fill, options) {
-        var radius = this.size/2;
-        var end = 2*Math.PI;
-        var points = [x, y, radius, 0, end, true];
-        if (this.shadow) {
-            this.shadowRenderer.draw(ctx, points);
-        }
-        this.shapeRenderer.draw(ctx, points, options);
-    };
-    
-    $.jqplot.MarkerRenderer.prototype.draw = function(x, y, ctx, options) {
-        options = options || {};
-        // hack here b/c shape renderer uses canvas based color style options
-        // and marker uses css style names.
-        if (options.show == null || options.show != false) {
-            if (options.color && !options.fillStyle) {
-                options.fillStyle = options.color;
-            }
-            if (options.color && !options.strokeStyle) {
-                options.strokeStyle = options.color;
-            }
-            switch (this.style) {
-                case 'diamond':
-                    this.drawDiamond(x,y,ctx, false, options);
-                    break;
-                case 'filledDiamond':
-                    this.drawDiamond(x,y,ctx, true, options);
-                    break;
-                case 'circle':
-                    this.drawCircle(x,y,ctx, false, options);
-                    break;
-                case 'filledCircle':
-                    this.drawCircle(x,y,ctx, true, options);
-                    break;
-                case 'square':
-                    this.drawSquare(x,y,ctx, false, options);
-                    break;
-                case 'filledSquare':
-                    this.drawSquare(x,y,ctx, true, options);
-                    break;
-                case 'x':
-                    this.drawX(x,y,ctx, true, options);
-                    break;
-                case 'plus':
-                    this.drawPlus(x,y,ctx, true, options);
-                    break;
-                case 'dash':
-                    this.drawDash(x,y,ctx, true, options);
-                    break;
-                case 'line':
-                    this.drawLine(x, y, ctx, false, options);
-                    break;
-                default:
-                    this.drawDiamond(x,y,ctx, false, options);
-                    break;
-            }
-        }
-    };
-    
-    // class: $.jqplot.shadowRenderer
-    // The default jqPlot shadow renderer, rendering shadows behind shapes.
-    $.jqplot.ShadowRenderer = function(options){ 
-        // Group: Properties
-        
-        // prop: angle
-        // Angle of the shadow in degrees.  Measured counter-clockwise from the x axis.
-        this.angle = 45;
-        // prop: offset
-        // Pixel offset at the given shadow angle of each shadow stroke from the last stroke.
-        this.offset = 1;
-        // prop: alpha
-        // alpha transparency of shadow stroke.
-        this.alpha = 0.07;
-        // prop: lineWidth
-        // width of the shadow line stroke.
-        this.lineWidth = 1.5;
-        // prop: lineJoin
-        // How line segments of the shadow are joined.
-        this.lineJoin = 'miter';
-        // prop: lineCap
-        // how ends of the shadow line are rendered.
-        this.lineCap = 'round';
-        // prop; closePath
-        // whether line path segment is closed upon itself.
-        this.closePath = false;
-        // prop: fill
-        // whether to fill the shape.
-        this.fill = false;
-        // prop: depth
-        // how many times the shadow is stroked.  Each stroke will be offset by offset at angle degrees.
-        this.depth = 3;
-        this.strokeStyle = 'rgba(0,0,0,0.1)';
-        // prop: isarc
-        // whether the shadow is an arc or not.
-        this.isarc = false;
-        
-        $.extend(true, this, options);
-    };
-    
-    $.jqplot.ShadowRenderer.prototype.init = function(options) {
-        $.extend(true, this, options);
-    };
-    
-    // function: draw
-    // draws an transparent black (i.e. gray) shadow.
-    //
-    // ctx - canvas drawing context
-    // points - array of points or [x, y, radius, start angle (rad), end angle (rad)]
-    $.jqplot.ShadowRenderer.prototype.draw = function(ctx, points, options) {
-        ctx.save();
-        var opts = (options != null) ? options : {};
-        var fill = (opts.fill != null) ? opts.fill : this.fill;
-        var fillRect = (opts.fillRect != null) ? opts.fillRect : this.fillRect;
-        var closePath = (opts.closePath != null) ? opts.closePath : this.closePath;
-        var offset = (opts.offset != null) ? opts.offset : this.offset;
-        var alpha = (opts.alpha != null) ? opts.alpha : this.alpha;
-        var depth = (opts.depth != null) ? opts.depth : this.depth;
-        var isarc = (opts.isarc != null) ? opts.isarc : this.isarc;
-        var linePattern = (opts.linePattern != null) ? opts.linePattern : this.linePattern;
-        ctx.lineWidth = (opts.lineWidth != null) ? opts.lineWidth : this.lineWidth;
-        ctx.lineJoin = (opts.lineJoin != null) ? opts.lineJoin : this.lineJoin;
-        ctx.lineCap = (opts.lineCap != null) ? opts.lineCap : this.lineCap;
-        ctx.strokeStyle = opts.strokeStyle || this.strokeStyle || 'rgba(0,0,0,'+alpha+')';
-        ctx.fillStyle = opts.fillStyle || this.fillStyle || 'rgba(0,0,0,'+alpha+')';
-        for (var j=0; j<depth; j++) {
-            var ctxPattern = $.jqplot.LinePattern(ctx, linePattern);
-            ctx.translate(Math.cos(this.angle*Math.PI/180)*offset, Math.sin(this.angle*Math.PI/180)*offset);
-            ctxPattern.beginPath();
-            if (isarc) {
-                ctx.arc(points[0], points[1], points[2], points[3], points[4], true);                
-            }
-            else if (fillRect) {
-                if (fillRect) {
-                    ctx.fillRect(points[0], points[1], points[2], points[3]);
-                }
-            }
-            else if (points && points.length){
-                var move = true;
-                for (var i=0; i<points.length; i++) {
-                    // skip to the first non-null point and move to it.
-                    if (points[i][0] != null && points[i][1] != null) {
-                        if (move) {
-                            ctxPattern.moveTo(points[i][0], points[i][1]);
-                            move = false;
-                        }
-                        else {
-                            ctxPattern.lineTo(points[i][0], points[i][1]);
-                        }
-                    }
-                    else {
-                        move = true;
-                    }
-                }
-                
-            }
-            if (closePath) {
-                ctxPattern.closePath();
-            }
-            if (fill) {
-                ctx.fill();
-            }
-            else {
-                ctx.stroke();
-            }
-        }
-        ctx.restore();
-    };
-    
-    // class: $.jqplot.shapeRenderer
-    // The default jqPlot shape renderer.  Given a set of points will
-    // plot them and either stroke a line (fill = false) or fill them (fill = true).
-    // If a filled shape is desired, closePath = true must also be set to close
-    // the shape.
-    $.jqplot.ShapeRenderer = function(options){
-        
-        this.lineWidth = 1.5;
-        // prop: linePattern
-        // line pattern 'dashed', 'dotted', 'solid', some combination
-        // of '-' and '.' characters such as '.-.' or a numerical array like 
-        // [draw, skip, draw, skip, ...] such as [1, 10] to draw a dotted line, 
-        // [1, 10, 20, 10] to draw a dot-dash line, and so on.
-        this.linePattern = 'solid';
-        // prop: lineJoin
-        // How line segments of the shadow are joined.
-        this.lineJoin = 'miter';
-        // prop: lineCap
-        // how ends of the shadow line are rendered.
-        this.lineCap = 'round';
-        // prop; closePath
-        // whether line path segment is closed upon itself.
-        this.closePath = false;
-        // prop: fill
-        // whether to fill the shape.
-        this.fill = false;
-        // prop: isarc
-        // whether the shadow is an arc or not.
-        this.isarc = false;
-        // prop: fillRect
-        // true to draw shape as a filled rectangle.
-        this.fillRect = false;
-        // prop: strokeRect
-        // true to draw shape as a stroked rectangle.
-        this.strokeRect = false;
-        // prop: clearRect
-        // true to cear a rectangle.
-        this.clearRect = false;
-        // prop: strokeStyle
-        // css color spec for the stoke style
-        this.strokeStyle = '#999999';
-        // prop: fillStyle
-        // css color spec for the fill style.
-        this.fillStyle = '#999999'; 
-        
-        $.extend(true, this, options);
-    };
-    
-    $.jqplot.ShapeRenderer.prototype.init = function(options) {
-        $.extend(true, this, options);
-    };
-    
-    // function: draw
-    // draws the shape.
-    //
-    // ctx - canvas drawing context
-    // points - array of points for shapes or 
-    // [x, y, width, height] for rectangles or
-    // [x, y, radius, start angle (rad), end angle (rad)] for circles and arcs.
-    $.jqplot.ShapeRenderer.prototype.draw = function(ctx, points, options) {
-        ctx.save();
-        var opts = (options != null) ? options : {};
-        var fill = (opts.fill != null) ? opts.fill : this.fill;
-        var closePath = (opts.closePath != null) ? opts.closePath : this.closePath;
-        var fillRect = (opts.fillRect != null) ? opts.fillRect : this.fillRect;
-        var strokeRect = (opts.strokeRect != null) ? opts.strokeRect : this.strokeRect;
-        var clearRect = (opts.clearRect != null) ? opts.clearRect : this.clearRect;
-        var isarc = (opts.isarc != null) ? opts.isarc : this.isarc;
-        var linePattern = (opts.linePattern != null) ? opts.linePattern : this.linePattern;
-        var ctxPattern = $.jqplot.LinePattern(ctx, linePattern);
-        ctx.lineWidth = opts.lineWidth || this.lineWidth;
-        ctx.lineJoin = opts.lineJoin || this.lineJoin;
-        ctx.lineCap = opts.lineCap || this.lineCap;
-        ctx.strokeStyle = (opts.strokeStyle || opts.color) || this.strokeStyle;
-        ctx.fillStyle = opts.fillStyle || this.fillStyle;
-        ctx.beginPath();
-        if (isarc) {
-            ctx.arc(points[0], points[1], points[2], points[3], points[4], true);   
-            if (closePath) {
-                ctx.closePath();
-            }
-            if (fill) {
-                ctx.fill();
-            }
-            else {
-                ctx.stroke();
-            }
-            ctx.restore();
-            return;
-        }
-        else if (clearRect) {
-            ctx.clearRect(points[0], points[1], points[2], points[3]);
-            ctx.restore();
-            return;
-        }
-        else if (fillRect || strokeRect) {
-            if (fillRect) {
-                ctx.fillRect(points[0], points[1], points[2], points[3]);
-            }
-            if (strokeRect) {
-                ctx.strokeRect(points[0], points[1], points[2], points[3]);
-                ctx.restore();
-                return;
-            }
-        }
-        else if (points && points.length){
-            var move = true;
-            for (var i=0; i<points.length; i++) {
-                // skip to the first non-null point and move to it.
-                if (points[i][0] != null && points[i][1] != null) {
-                    if (move) {
-                        ctxPattern.moveTo(points[i][0], points[i][1]);
-                        move = false;
-                    }
-                    else {
-                        ctxPattern.lineTo(points[i][0], points[i][1]);
-                    }
-                }
-                else {
-                    move = true;
-                }
-            }
-            if (closePath) {
-                ctxPattern.closePath();
-            }
-            if (fill) {
-                ctx.fill();
-            }
-            else {
-                ctx.stroke();
-            }
-        }
-        ctx.restore();
-    };
-    
-    // class $.jqplot.TableLegendRenderer
-    // The default legend renderer for jqPlot.
-    $.jqplot.TableLegendRenderer = function(){
-        //
-    };
-    
-    $.jqplot.TableLegendRenderer.prototype.init = function(options) {
-        $.extend(true, this, options);
-    };
-        
-    $.jqplot.TableLegendRenderer.prototype.addrow = function (label, color, pad, reverse) {
-        var rs = (pad) ? this.rowSpacing+'px' : '0px';
-        var tr;
-        var td;
-        var elem;
-        var div0;
-        var div1;
-        elem = document.createElement('tr');
-        tr = $(elem);
-        tr.addClass('jqplot-table-legend');
-        elem = null;
-
-        if (reverse){
-            tr.prependTo(this._elem);
-        }
-
-        else{
-            tr.appendTo(this._elem);
-        }
-
-        if (this.showSwatches) {
-            td = $(document.createElement('td'));
-            td.addClass('jqplot-table-legend jqplot-table-legend-swatch');
-            td.css({textAlign: 'center', paddingTop: rs});
-
-            div0 = $(document.createElement('div'));
-            div0.addClass('jqplot-table-legend-swatch-outline');
-            div1 = $(document.createElement('div'));
-            div1.addClass('jqplot-table-legend-swatch');
-            div1.css({backgroundColor: color, borderColor: color});
-
-            tr.append(td.append(div0.append(div1)));
-
-            // $('<td class="jqplot-table-legend" style="text-align:center;padding-top:'+rs+';">'+
-            // '<div><div class="jqplot-table-legend-swatch" style="background-color:'+color+';border-color:'+color+';"></div>'+
-            // '</div></td>').appendTo(tr);
-        }
-        if (this.showLabels) {
-            td = $(document.createElement('td'));
-            td.addClass('jqplot-table-legend jqplot-table-legend-label');
-            td.css('paddingTop', rs);
-            tr.append(td);
-
-            // elem = $('<td class="jqplot-table-legend" style="padding-top:'+rs+';"></td>');
-            // elem.appendTo(tr);
-            if (this.escapeHtml) {
-                td.text(label);
-            }
-            else {
-                td.html(label);
-            }
-        }
-        td = null;
-        div0 = null;
-        div1 = null;
-        tr = null;
-        elem = null;
-    };
-    
-    // called with scope of legend
-    $.jqplot.TableLegendRenderer.prototype.draw = function() {
-        if (this._elem) {
-            this._elem.emptyForce();
-            this._elem = null;
-        }
-
-        if (this.show) {
-            var series = this._series;
-            // make a table.  one line label per row.
-            var elem = document.createElement('table');
-            this._elem = $(elem);
-            this._elem.addClass('jqplot-table-legend');
-
-            var ss = {position:'absolute'};
-            if (this.background) {
-                ss['background'] = this.background;
-            }
-            if (this.border) {
-                ss['border'] = this.border;
-            }
-            if (this.fontSize) {
-                ss['fontSize'] = this.fontSize;
-            }
-            if (this.fontFamily) {
-                ss['fontFamily'] = this.fontFamily;
-            }
-            if (this.textColor) {
-                ss['textColor'] = this.textColor;
-            }
-            if (this.marginTop != null) {
-                ss['marginTop'] = this.marginTop;
-            }
-            if (this.marginBottom != null) {
-                ss['marginBottom'] = this.marginBottom;
-            }
-            if (this.marginLeft != null) {
-                ss['marginLeft'] = this.marginLeft;
-            }
-            if (this.marginRight != null) {
-                ss['marginRight'] = this.marginRight;
-            }
-            
-        
-            var pad = false, 
-                reverse = false,
-                s;
-            for (var i = 0; i< series.length; i++) {
-                s = series[i];
-                if (s._stack || s.renderer.constructor == $.jqplot.BezierCurveRenderer){
-                    reverse = true;
-                }
-                if (s.show && s.showLabel) {
-                    var lt = this.labels[i] || s.label.toString();
-                    if (lt) {
-                        var color = s.color;
-                        if (reverse && i < series.length - 1){
-                            pad = true;
-                        }
-                        else if (reverse && i == series.length - 1){
-                            pad = false;
-                        }
-                        this.renderer.addrow.call(this, lt, color, pad, reverse);
-                        pad = true;
-                    }
-                    // let plugins add more rows to legend.  Used by trend line plugin.
-                    for (var j=0; j<$.jqplot.addLegendRowHooks.length; j++) {
-                        var item = $.jqplot.addLegendRowHooks[j].call(this, s);
-                        if (item) {
-                            this.renderer.addrow.call(this, item.label, item.color, pad);
-                            pad = true;
-                        } 
-                    }
-                    lt = null;
-                }
-            }
-        }
-        return this._elem;
-    };
-    
-    $.jqplot.TableLegendRenderer.prototype.pack = function(offsets) {
-        if (this.show) {       
-            if (this.placement == 'insideGrid') {
-                switch (this.location) {
-                    case 'nw':
-                        var a = offsets.left;
-                        var b = offsets.top;
-                        this._elem.css('left', a);
-                        this._elem.css('top', b);
-                        break;
-                    case 'n':
-                        var a = (offsets.left + (this._plotDimensions.width - offsets.right))/2 - this.getWidth()/2;
-                        var b = offsets.top;
-                        this._elem.css('left', a);
-                        this._elem.css('top', b);
-                        break;
-                    case 'ne':
-                        var a = offsets.right;
-                        var b = offsets.top;
-                        this._elem.css({right:a, top:b});
-                        break;
-                    case 'e':
-                        var a = offsets.right;
-                        var b = (offsets.top + (this._plotDimensions.height - offsets.bottom))/2 - this.getHeight()/2;
-                        this._elem.css({right:a, top:b});
-                        break;
-                    case 'se':
-                        var a = offsets.right;
-                        var b = offsets.bottom;
-                        this._elem.css({right:a, bottom:b});
-                        break;
-                    case 's':
-                        var a = (offsets.left + (this._plotDimensions.width - offsets.right))/2 - this.getWidth()/2;
-                        var b = offsets.bottom;
-                        this._elem.css({left:a, bottom:b});
-                        break;
-                    case 'sw':
-                        var a = offsets.left;
-                        var b = offsets.bottom;
-                        this._elem.css({left:a, bottom:b});
-                        break;
-                    case 'w':
-                        var a = offsets.left;
-                        var b = (offsets.top + (this._plotDimensions.height - offsets.bottom))/2 - this.getHeight()/2;
-                        this._elem.css({left:a, top:b});
-                        break;
-                    default:  // same as 'se'
-                        var a = offsets.right;
-                        var b = offsets.bottom;
-                        this._elem.css({right:a, bottom:b});
-                        break;
-                }
-                
-            }
-            else if (this.placement == 'outside'){
-                switch (this.location) {
-                    case 'nw':
-                        var a = this._plotDimensions.width - offsets.left;
-                        var b = offsets.top;
-                        this._elem.css('right', a);
-                        this._elem.css('top', b);
-                        break;
-                    case 'n':
-                        var a = (offsets.left + (this._plotDimensions.width - offsets.right))/2 - this.getWidth()/2;
-                        var b = this._plotDimensions.height - offsets.top;
-                        this._elem.css('left', a);
-                        this._elem.css('bottom', b);
-                        break;
-                    case 'ne':
-                        var a = this._plotDimensions.width - offsets.right;
-                        var b = offsets.top;
-                        this._elem.css({left:a, top:b});
-                        break;
-                    case 'e':
-                        var a = this._plotDimensions.width - offsets.right;
-                        var b = (offsets.top + (this._plotDimensions.height - offsets.bottom))/2 - this.getHeight()/2;
-                        this._elem.css({left:a, top:b});
-                        break;
-                    case 'se':
-                        var a = this._plotDimensions.width - offsets.right;
-                        var b = offsets.bottom;
-                        this._elem.css({left:a, bottom:b});
-                        break;
-                    case 's':
-                        var a = (offsets.left + (this._plotDimensions.width - offsets.right))/2 - this.getWidth()/2;
-                        var b = this._plotDimensions.height - offsets.bottom;
-                        this._elem.css({left:a, top:b});
-                        break;
-                    case 'sw':
-                        var a = this._plotDimensions.width - offsets.left;
-                        var b = offsets.bottom;
-                        this._elem.css({right:a, bottom:b});
-                        break;
-                    case 'w':
-                        var a = this._plotDimensions.width - offsets.left;
-                        var b = (offsets.top + (this._plotDimensions.height - offsets.bottom))/2 - this.getHeight()/2;
-                        this._elem.css({right:a, top:b});
-                        break;
-                    default:  // same as 'se'
-                        var a = offsets.right;
-                        var b = offsets.bottom;
-                        this._elem.css({right:a, bottom:b});
-                        break;
-                }
-            }
-            else {
-                switch (this.location) {
-                    case 'nw':
-                        this._elem.css({left:0, top:offsets.top});
-                        break;
-                    case 'n':
-                        var a = (offsets.left + (this._plotDimensions.width - offsets.right))/2 - this.getWidth()/2;
-                        this._elem.css({left: a, top:offsets.top});
-                        break;
-                    case 'ne':
-                        this._elem.css({right:0, top:offsets.top});
-                        break;
-                    case 'e':
-                        var b = (offsets.top + (this._plotDimensions.height - offsets.bottom))/2 - this.getHeight()/2;
-                        this._elem.css({right:offsets.right, top:b});
-                        break;
-                    case 'se':
-                        this._elem.css({right:offsets.right, bottom:offsets.bottom});
-                        break;
-                    case 's':
-                        var a = (offsets.left + (this._plotDimensions.width - offsets.right))/2 - this.getWidth()/2;
-                        this._elem.css({left: a, bottom:offsets.bottom});
-                        break;
-                    case 'sw':
-                        this._elem.css({left:offsets.left, bottom:offsets.bottom});
-                        break;
-                    case 'w':
-                        var b = (offsets.top + (this._plotDimensions.height - offsets.bottom))/2 - this.getHeight()/2;
-                        this._elem.css({left:offsets.left, top:b});
-                        break;
-                    default:  // same as 'se'
-                        this._elem.css({right:offsets.right, bottom:offsets.bottom});
-                        break;
-                }
-            }
-        } 
-    };
-
-    /**
-     * Class: $.jqplot.ThemeEngine
-     * Theme Engine provides a programatic way to change some of the  more
-     * common jqplot styling options such as fonts, colors and grid options.
-     * A theme engine instance is created with each plot.  The theme engine
-     * manages a collection of themes which can be modified, added to, or 
-     * applied to the plot.
-     * 
-     * The themeEngine class is not instantiated directly.
-     * When a plot is initialized, the current plot options are scanned
-     * an a default theme named "Default" is created.  This theme is
-     * used as the basis for other themes added to the theme engine and
-     * is always available.
-     * 
-     * A theme is a simple javascript object with styling parameters for
-     * various entities of the plot.  A theme has the form:
-     * 
-     * 
-     * > {
-     * >     _name:f "Default",
-     * >     target: {
-     * >         backgroundColor: "transparent"
-     * >     },
-     * >     legend: {
-     * >         textColor: null,
-     * >         fontFamily: null,
-     * >         fontSize: null,
-     * >         border: null,
-     * >         background: null
-     * >     },
-     * >     title: {
-     * >         textColor: "rgb(102, 102, 102)",
-     * >         fontFamily: "'Trebuchet MS',Arial,Helvetica,sans-serif",
-     * >         fontSize: "19.2px",
-     * >         textAlign: "center"
-     * >     },
-     * >     seriesStyles: {},
-     * >     series: [{
-     * >         color: "#4bb2c5",
-     * >         lineWidth: 2.5,
-     * >         linePattern: "solid",
-     * >         shadow: true,
-     * >         fillColor: "#4bb2c5",
-     * >         showMarker: true,
-     * >         markerOptions: {
-     * >             color: "#4bb2c5",
-     * >             show: true,
-     * >             style: 'filledCircle',
-     * >             lineWidth: 1.5,
-     * >             size: 4,
-     * >             shadow: true
-     * >         }
-     * >     }],
-     * >     grid: {
-     * >         drawGridlines: true,
-     * >         gridLineColor: "#cccccc",
-     * >         gridLineWidth: 1,
-     * >         backgroundColor: "#fffdf6",
-     * >         borderColor: "#999999",
-     * >         borderWidth: 2,
-     * >         shadow: true
-     * >     },
-     * >     axesStyles: {
-     * >         label: {},
-     * >         ticks: {}
-     * >     },
-     * >     axes: {
-     * >         xaxis: {
-     * >             borderColor: "#999999",
-     * >             borderWidth: 2,
-     * >             ticks: {
-     * >                 show: true,
-     * >                 showGridline: true,
-     * >                 showLabel: true,
-     * >                 showMark: true,
-     * >                 size: 4,
-     * >                 textColor: "",
-     * >                 whiteSpace: "nowrap",
-     * >                 fontSize: "12px",
-     * >                 fontFamily: "'Trebuchet MS',Arial,Helvetica,sans-serif"
-     * >             },
-     * >             label: {
-     * >                 textColor: "rgb(102, 102, 102)",
-     * >                 whiteSpace: "normal",
-     * >                 fontSize: "14.6667px",
-     * >                 fontFamily: "'Trebuchet MS',Arial,Helvetica,sans-serif",
-     * >                 fontWeight: "400"
-     * >             }
-     * >         },
-     * >         yaxis: {
-     * >             borderColor: "#999999",
-     * >             borderWidth: 2,
-     * >             ticks: {
-     * >                 show: true,
-     * >                 showGridline: true,
-     * >                 showLabel: true,
-     * >                 showMark: true,
-     * >                 size: 4,
-     * >                 textColor: "",
-     * >                 whiteSpace: "nowrap",
-     * >                 fontSize: "12px",
-     * >                 fontFamily: "'Trebuchet MS',Arial,Helvetica,sans-serif"
-     * >             },
-     * >             label: {
-     * >                 textColor: null,
-     * >                 whiteSpace: null,
-     * >                 fontSize: null,
-     * >                 fontFamily: null,
-     * >                 fontWeight: null
-     * >             }
-     * >         },
-     * >         x2axis: {...
-     * >         },
-     * >         ...
-     * >         y9axis: {...
-     * >         }
-     * >     }
-     * > }
-     * 
-     * "seriesStyles" is a style object that will be applied to all series in the plot.
-     * It will forcibly override any styles applied on the individual series.  "axesStyles" is
-     * a style object that will be applied to all axes in the plot.  It will also forcibly
-     * override any styles on the individual axes.
-     * 
-     * The example shown above has series options for a line series.  Options for other
-     * series types are shown below:
-     * 
-     * Bar Series:
-     * 
-     * > {
-     * >     color: "#4bb2c5",
-     * >     seriesColors: ["#4bb2c5", "#EAA228", "#c5b47f", "#579575", "#839557", "#958c12", "#953579", "#4b5de4", "#d8b83f", "#ff5800", "#0085cc", "#c747a3", "#cddf54", "#FBD178", "#26B4E3", "#bd70c7"],
-     * >     lineWidth: 2.5,
-     * >     shadow: true,
-     * >     barPadding: 2,
-     * >     barMargin: 10,
-     * >     barWidth: 15.09375,
-     * >     highlightColors: ["rgb(129,201,214)", "rgb(129,201,214)", "rgb(129,201,214)", "rgb(129,201,214)", "rgb(129,201,214)", "rgb(129,201,214)", "rgb(129,201,214)", "rgb(129,201,214)"]
-     * > }
-     * 
-     * Pie Series:
-     * 
-     * > {
-     * >     seriesColors: ["#4bb2c5", "#EAA228", "#c5b47f", "#579575", "#839557", "#958c12", "#953579", "#4b5de4", "#d8b83f", "#ff5800", "#0085cc", "#c747a3", "#cddf54", "#FBD178", "#26B4E3", "#bd70c7"],
-     * >     padding: 20,
-     * >     sliceMargin: 0,
-     * >     fill: true,
-     * >     shadow: true,
-     * >     startAngle: 0,
-     * >     lineWidth: 2.5,
-     * >     highlightColors: ["rgb(129,201,214)", "rgb(240,189,104)", "rgb(214,202,165)", "rgb(137,180,158)", "rgb(168,180,137)", "rgb(180,174,89)", "rgb(180,113,161)", "rgb(129,141,236)", "rgb(227,205,120)", "rgb(255,138,76)", "rgb(76,169,219)", "rgb(215,126,190)", "rgb(220,232,135)", "rgb(200,167,96)", "rgb(103,202,235)", "rgb(208,154,215)"]
-     * > }
-     * 
-     * Funnel Series:
-     * 
-     * > {
-     * >     color: "#4bb2c5",
-     * >     lineWidth: 2,
-     * >     shadow: true,
-     * >     padding: {
-     * >         top: 20,
-     * >         right: 20,
-     * >         bottom: 20,
-     * >         left: 20
-     * >     },
-     * >     sectionMargin: 6,
-     * >     seriesColors: ["#4bb2c5", "#EAA228", "#c5b47f", "#579575", "#839557", "#958c12", "#953579", "#4b5de4", "#d8b83f", "#ff5800", "#0085cc", "#c747a3", "#cddf54", "#FBD178", "#26B4E3", "#bd70c7"],
-     * >     highlightColors: ["rgb(147,208,220)", "rgb(242,199,126)", "rgb(220,210,178)", "rgb(154,191,172)", "rgb(180,191,154)", "rgb(191,186,112)", "rgb(191,133,174)", "rgb(147,157,238)", "rgb(231,212,139)", "rgb(255,154,102)", "rgb(102,181,224)", "rgb(221,144,199)", "rgb(225,235,152)", "rgb(200,167,96)", "rgb(124,210,238)", "rgb(215,169,221)"]
-     * > }
-     * 
-     */
-    $.jqplot.ThemeEngine = function(){
-        // Group: Properties
-        //
-        // prop: themes
-        // hash of themes managed by the theme engine.  
-        // Indexed by theme name.
-        this.themes = {};
-        // prop: activeTheme
-        // Pointer to currently active theme
-        this.activeTheme=null;
-        
-    };
-    
-    // called with scope of plot
-    $.jqplot.ThemeEngine.prototype.init = function() {
-        // get the Default theme from the current plot settings.
-        var th = new $.jqplot.Theme({_name:'Default'});
-        var n, i, nn;
-        
-        for (n in th.target) {
-            if (n == "textColor") {
-                th.target[n] = this.target.css('color');
-            }
-            else {
-                th.target[n] = this.target.css(n);
-            }
-        }
-        
-        if (this.title.show && this.title._elem) {
-            for (n in th.title) {
-                if (n == "textColor") {
-                    th.title[n] = this.title._elem.css('color');
-                }
-                else {
-                    th.title[n] = this.title._elem.css(n);
-                }
-            }
-        }
-        
-        for (n in th.grid) {
-            th.grid[n] = this.grid[n];
-        }
-        if (th.grid.backgroundColor == null && this.grid.background != null) {
-            th.grid.backgroundColor = this.grid.background;
-        }
-        if (this.legend.show && this.legend._elem) {
-            for (n in th.legend) {
-                if (n == 'textColor') {
-                    th.legend[n] = this.legend._elem.css('color');
-                }
-                else {
-                    th.legend[n] = this.legend._elem.css(n);
-                }
-            }
-        }
-        var s;
-        
-        for (i=0; i<this.series.length; i++) {
-            s = this.series[i];
-            if (s.renderer.constructor == $.jqplot.LineRenderer) {
-                th.series.push(new LineSeriesProperties());
-            }
-            else if (s.renderer.constructor == $.jqplot.BarRenderer) {
-                th.series.push(new BarSeriesProperties());
-            }
-            else if (s.renderer.constructor == $.jqplot.PieRenderer) {
-                th.series.push(new PieSeriesProperties());
-            }
-            else if (s.renderer.constructor == $.jqplot.DonutRenderer) {
-                th.series.push(new DonutSeriesProperties());
-            }
-            else if (s.renderer.constructor == $.jqplot.FunnelRenderer) {
-                th.series.push(new FunnelSeriesProperties());
-            }
-            else if (s.renderer.constructor == $.jqplot.MeterGaugeRenderer) {
-                th.series.push(new MeterSeriesProperties());
-            }
-            else {
-                th.series.push({});
-            }
-            for (n in th.series[i]) {
-                th.series[i][n] = s[n];
-            }
-        }
-        var a, ax;
-        for (n in this.axes) {
-            ax = this.axes[n];
-            a = th.axes[n] = new AxisProperties();
-            a.borderColor = ax.borderColor;
-            a.borderWidth = ax.borderWidth;
-            if (ax._ticks && ax._ticks[0]) {
-                for (nn in a.ticks) {
-                    if (ax._ticks[0].hasOwnProperty(nn)) {
-                        a.ticks[nn] = ax._ticks[0][nn];
-                    }
-                    else if (ax._ticks[0]._elem){
-                        a.ticks[nn] = ax._ticks[0]._elem.css(nn);
-                    }
-                }
-            }
-            if (ax._label && ax._label.show) {
-                for (nn in a.label) {
-                    // a.label[nn] = ax._label._elem.css(nn);
-                    if (ax._label[nn]) {
-                        a.label[nn] = ax._label[nn];
-                    }
-                    else if (ax._label._elem){
-                        if (nn == 'textColor') {
-                            a.label[nn] = ax._label._elem.css('color');
-                        }
-                        else {
-                            a.label[nn] = ax._label._elem.css(nn);
-                        }
-                    }
-                }
-            }
-        }
-        this.themeEngine._add(th);
-        this.themeEngine.activeTheme  = this.themeEngine.themes[th._name];
-    };
-    /**
-     * Group: methods
-     * 
-     * method: get
-     * 
-     * Get and return the named theme or the active theme if no name given.
-     * 
-     * parameter:
-     * 
-     * name - name of theme to get.
-     * 
-     * returns:
-     * 
-     * Theme instance of given name.
-     */   
-    $.jqplot.ThemeEngine.prototype.get = function(name) {
-        if (!name) {
-            // return the active theme
-            return this.activeTheme;
-        }
-        else {
-            return this.themes[name];
-        }
-    };
-    
-    function numericalOrder(a,b) { return a-b; }
-    
-    /**
-     * method: getThemeNames
-     * 
-     * Return the list of theme names in this manager in alpha-numerical order.
-     * 
-     * parameter:
-     * 
-     * None
-     * 
-     * returns:
-     * 
-     * A the list of theme names in this manager in alpha-numerical order.
-     */       
-    $.jqplot.ThemeEngine.prototype.getThemeNames = function() {
-        var tn = [];
-        for (var n in this.themes) {
-            tn.push(n);
-        }
-        return tn.sort(numericalOrder);
-    };
-
-    /**
-     * method: getThemes
-     * 
-     * Return a list of themes in alpha-numerical order by name.
-     * 
-     * parameter:
-     * 
-     * None
-     * 
-     * returns:
-     * 
-     * A list of themes in alpha-numerical order by name.
-     */ 
-    $.jqplot.ThemeEngine.prototype.getThemes = function() {
-        var tn = [];
-        var themes = [];
-        for (var n in this.themes) {
-            tn.push(n);
-        }
-        tn.sort(numericalOrder);
-        for (var i=0; i<tn.length; i++) {
-            themes.push(this.themes[tn[i]]);
-        }
-        return themes;
-    };
-    
-    $.jqplot.ThemeEngine.prototype.activate = function(plot, name) {
-        // sometimes need to redraw whole plot.
-        var redrawPlot = false;
-        if (!name && this.activeTheme && this.activeTheme._name) {
-            name = this.activeTheme._name;
-        }
-        if (!this.themes.hasOwnProperty(name)) {
-            throw new Error("No theme of that name");
-        }
-        else {
-            var th = this.themes[name];
-            this.activeTheme = th;
-            var val, checkBorderColor = false, checkBorderWidth = false;
-            var arr = ['xaxis', 'x2axis', 'yaxis', 'y2axis'];
-            
-            for (i=0; i<arr.length; i++) {
-                var ax = arr[i];
-                if (th.axesStyles.borderColor != null) {
-                    plot.axes[ax].borderColor = th.axesStyles.borderColor;
-                }
-                if (th.axesStyles.borderWidth != null) {
-                    plot.axes[ax].borderWidth = th.axesStyles.borderWidth;
-                }
-            }
-            
-            for (var axname in plot.axes) {
-                var axis = plot.axes[axname];
-                if (axis.show) {
-                    var thaxis = th.axes[axname] || {};
-                    var thaxstyle = th.axesStyles;
-                    var thax = $.jqplot.extend(true, {}, thaxis, thaxstyle);
-                    val = (th.axesStyles.borderColor != null) ? th.axesStyles.borderColor : thax.borderColor;
-                    if (thax.borderColor != null) {
-                        axis.borderColor = thax.borderColor;
-                        redrawPlot = true;
-                    }
-                    val = (th.axesStyles.borderWidth != null) ? th.axesStyles.borderWidth : thax.borderWidth;
-                    if (thax.borderWidth != null) {
-                        axis.borderWidth = thax.borderWidth;
-                        redrawPlot = true;
-                    }
-                    if (axis._ticks && axis._ticks[0]) {
-                        for (var nn in thax.ticks) {
-                            // val = null;
-                            // if (th.axesStyles.ticks && th.axesStyles.ticks[nn] != null) {
-                            //     val = th.axesStyles.ticks[nn];
-                            // }
-                            // else if (thax.ticks[nn] != null){
-                            //     val = thax.ticks[nn]
-                            // }
-                            val = thax.ticks[nn];
-                            if (val != null) {
-                                axis.tickOptions[nn] = val;
-                                axis._ticks = [];
-                                redrawPlot = true;
-                            }
-                        }
-                    }
-                    if (axis._label && axis._label.show) {
-                        for (var nn in thax.label) {
-                            // val = null;
-                            // if (th.axesStyles.label && th.axesStyles.label[nn] != null) {
-                            //     val = th.axesStyles.label[nn];
-                            // }
-                            // else if (thax.label && thax.label[nn] != null){
-                            //     val = thax.label[nn]
-                            // }
-                            val = thax.label[nn];
-                            if (val != null) {
-                                axis.labelOptions[nn] = val;
-                                redrawPlot = true;
-                            }
-                        }
-                    }
-                    
-                }
-            }            
-            
-            for (var n in th.grid) {
-                if (th.grid[n] != null) {
-                    plot.grid[n] = th.grid[n];
-                }
-            }
-            if (!redrawPlot) {
-                plot.grid.draw();
-            }
-            
-            if (plot.legend.show) { 
-                for (n in th.legend) {
-                    if (th.legend[n] != null) {
-                        plot.legend[n] = th.legend[n];
-                    }
-                }
-            }
-            if (plot.title.show) {
-                for (n in th.title) {
-                    if (th.title[n] != null) {
-                        plot.title[n] = th.title[n];
-                    }
-                }
-            }
-            
-            var i;
-            for (i=0; i<th.series.length; i++) {
-                var opts = {};
-                var redrawSeries = false;
-                for (n in th.series[i]) {
-                    val = (th.seriesStyles[n] != null) ? th.seriesStyles[n] : th.series[i][n];
-                    if (val != null) {
-                        opts[n] = val;
-                        if (n == 'color') {
-                            plot.series[i].renderer.shapeRenderer.fillStyle = val;
-                            plot.series[i].renderer.shapeRenderer.strokeStyle = val;
-                            plot.series[i][n] = val;
-                        }
-                        else if ((n == 'lineWidth') || (n == 'linePattern')) {
-                            plot.series[i].renderer.shapeRenderer[n] = val;
-                            plot.series[i][n] = val;
-                        }
-                        else if (n == 'markerOptions') {
-                            merge (plot.series[i].markerOptions, val);
-                            merge (plot.series[i].markerRenderer, val);
-                        }
-                        else {
-                            plot.series[i][n] = val;
-                        }
-                        redrawPlot = true;
-                    }
-                }
-            }
-            
-            if (redrawPlot) {
-                plot.target.empty();
-                plot.draw();
-            }
-            
-            for (n in th.target) {
-                if (th.target[n] != null) {
-                    plot.target.css(n, th.target[n]);
-                }
-            }
-        }
-        
-    };
-    
-    $.jqplot.ThemeEngine.prototype._add = function(theme, name) {
-        if (name) {
-            theme._name = name;
-        }
-        if (!theme._name) {
-            theme._name = Date.parse(new Date());
-        }
-        if (!this.themes.hasOwnProperty(theme._name)) {
-            this.themes[theme._name] = theme;
-        }
-        else {
-            throw new Error("jqplot.ThemeEngine Error: Theme already in use");
-        }
-    };
-    
-    // method remove
-    // Delete the named theme, return true on success, false on failure.
-    
-
-    /**
-     * method: remove
-     * 
-     * Remove the given theme from the themeEngine.
-     * 
-     * parameters:
-     * 
-     * name - name of the theme to remove.
-     * 
-     * returns:
-     * 
-     * true on success, false on failure.
-     */
-    $.jqplot.ThemeEngine.prototype.remove = function(name) {
-        if (name == 'Default') {
-            return false;
-        }
-        return delete this.themes[name];
-    };
-
-    /**
-     * method: newTheme
-     * 
-     * Create a new theme based on the default theme, adding it the themeEngine.
-     * 
-     * parameters:
-     * 
-     * name - name of the new theme.
-     * obj - optional object of styles to be applied to this new theme.
-     * 
-     * returns:
-     * 
-     * new Theme object.
-     */
-    $.jqplot.ThemeEngine.prototype.newTheme = function(name, obj) {
-        if (typeof(name) == 'object') {
-            obj = obj || name;
-            name = null;
-        }
-        if (obj && obj._name) {
-            name = obj._name;
-        }
-        else {
-            name = name || Date.parse(new Date());
-        }
-        // var th = new $.jqplot.Theme(name);
-        var th = this.copy(this.themes['Default']._name, name);
-        $.jqplot.extend(th, obj);
-        return th;
-    };
-    
-    // function clone(obj) {
-    //     return eval(obj.toSource());
-    // }
-    
-    function clone(obj){
-        if(obj == null || typeof(obj) != 'object'){
-            return obj;
-        }
-    
-        var temp = new obj.constructor();
-        for(var key in obj){
-            temp[key] = clone(obj[key]);
-        }   
-        return temp;
-    }
-    
-    $.jqplot.clone = clone;
-    
-    function merge(obj1, obj2) {
-        if (obj2 ==  null || typeof(obj2) != 'object') {
-            return;
-        }
-        for (var key in obj2) {
-            if (key == 'highlightColors') {
-                obj1[key] = clone(obj2[key]);
-            }
-            if (obj2[key] != null && typeof(obj2[key]) == 'object') {
-                if (!obj1.hasOwnProperty(key)) {
-                    obj1[key] = {};
-                }
-                merge(obj1[key], obj2[key]);
-            }
-            else {
-                obj1[key] = obj2[key];
-            }
-        }
-    }
-    
-    $.jqplot.merge = merge;
-    
-        // Use the jQuery 1.3.2 extend function since behaviour in jQuery 1.4 seems problematic
-    $.jqplot.extend = function() {
-        // copy reference to target object
-        var target = arguments[0] || {}, i = 1, length = arguments.length, deep = false, options;
-
-        // Handle a deep copy situation
-        if ( typeof target === "boolean" ) {
-            deep = target;
-            target = arguments[1] || {};
-            // skip the boolean and the target
-            i = 2;
-        }
-
-        // Handle case when target is a string or something (possible in deep copy)
-        if ( typeof target !== "object" && !toString.call(target) === "[object Function]" ) {
-            target = {};
-        }
-
-        for ( ; i < length; i++ ){
-            // Only deal with non-null/undefined values
-            if ( (options = arguments[ i ]) != null ) {
-                // Extend the base object
-                for ( var name in options ) {
-                    var src = target[ name ], copy = options[ name ];
-
-                    // Prevent never-ending loop
-                    if ( target === copy ) {
-                        continue;
-                    }
-
-                    // Recurse if we're merging object values
-                    if ( deep && copy && typeof copy === "object" && !copy.nodeType ) {
-                        target[ name ] = $.jqplot.extend( deep, 
-                            // Never move original objects, clone them
-                            src || ( copy.length != null ? [ ] : { } )
-                        , copy );
-                    }
-                    // Don't bring in undefined values
-                    else if ( copy !== undefined ) {
-                        target[ name ] = copy;
-                    }
-                }
-            }
-        }
-        // Return the modified object
-        return target;
-    };
-
-    /**
-     * method: rename
-     * 
-     * Rename a theme.
-     * 
-     * parameters:
-     * 
-     * oldName - current name of the theme.
-     * newName - desired name of the theme.
-     * 
-     * returns:
-     * 
-     * new Theme object.
-     */
-    $.jqplot.ThemeEngine.prototype.rename = function (oldName, newName) {
-        if (oldName == 'Default' || newName == 'Default') {
-            throw new Error ("jqplot.ThemeEngine Error: Cannot rename from/to Default");
-        }
-        if (this.themes.hasOwnProperty(newName)) {
-            throw new Error ("jqplot.ThemeEngine Error: New name already in use.");
-        }
-        else if (this.themes.hasOwnProperty(oldName)) {
-            var th = this.copy (oldName, newName);
-            this.remove(oldName);
-            return th;
-        }
-        throw new Error("jqplot.ThemeEngine Error: Old name or new name invalid");
-    };
-
-    /**
-     * method: copy
-     * 
-     * Create a copy of an existing theme in the themeEngine, adding it the themeEngine.
-     * 
-     * parameters:
-     * 
-     * sourceName - name of the existing theme.
-     * targetName - name of the copy.
-     * obj - optional object of style parameter to apply to the new theme.
-     * 
-     * returns:
-     * 
-     * new Theme object.
-     */
-    $.jqplot.ThemeEngine.prototype.copy = function (sourceName, targetName, obj) {
-        if (targetName == 'Default') {
-            throw new Error ("jqplot.ThemeEngine Error: Cannot copy over Default theme");
-        }
-        if (!this.themes.hasOwnProperty(sourceName)) {
-            var s = "jqplot.ThemeEngine Error: Source name invalid";
-            throw new Error(s);
-        }
-        if (this.themes.hasOwnProperty(targetName)) {
-            var s = "jqplot.ThemeEngine Error: Target name invalid";
-            throw new Error(s);
-        }
-        else {
-            var th = clone(this.themes[sourceName]);
-            th._name = targetName;
-            $.jqplot.extend(true, th, obj);
-            this._add(th);
-            return th;
-        }
-    };
-    
-    
-    $.jqplot.Theme = function(name, obj) {
-        if (typeof(name) == 'object') {
-            obj = obj || name;
-            name = null;
-        }
-        name = name || Date.parse(new Date());
-        this._name = name;
-        this.target = {
-            backgroundColor: null
-        };
-        this.legend = {
-            textColor: null,
-            fontFamily: null,
-            fontSize: null,
-            border: null,
-            background: null
-        };
-        this.title = {
-            textColor: null,
-            fontFamily: null,
-            fontSize: null,
-            textAlign: null
-        };
-        this.seriesStyles = {};
-        this.series = [];
-        this.grid = {
-            drawGridlines: null,
-            gridLineColor: null,
-            gridLineWidth: null,
-            backgroundColor: null,
-            borderColor: null,
-            borderWidth: null,
-            shadow: null
-        };
-        this.axesStyles = {label:{}, ticks:{}};
-        this.axes = {};
-        if (typeof(obj) == 'string') {
-            this._name = obj;
-        }
-        else if(typeof(obj) == 'object') {
-            $.jqplot.extend(true, this, obj);
-        }
-    };
-    
-    var AxisProperties = function() {
-        this.borderColor = null;
-        this.borderWidth = null;
-        this.ticks = new AxisTicks();
-        this.label = new AxisLabel();
-    };
-    
-    var AxisTicks = function() {
-        this.show = null;
-        this.showGridline = null;
-        this.showLabel = null;
-        this.showMark = null;
-        this.size = null;
-        this.textColor = null;
-        this.whiteSpace = null;
-        this.fontSize = null;
-        this.fontFamily = null;
-    };
-    
-    var AxisLabel = function() {
-        this.textColor = null;
-        this.whiteSpace = null;
-        this.fontSize = null;
-        this.fontFamily = null;
-        this.fontWeight = null;
-    };
-    
-    var LineSeriesProperties = function() {
-        this.color=null;
-        this.lineWidth=null;
-        this.linePattern=null;
-        this.shadow=null;
-        this.fillColor=null;
-        this.showMarker=null;
-        this.markerOptions = new MarkerOptions();
-    };
-    
-    var MarkerOptions = function() {
-        this.show = null;
-        this.style = null;
-        this.lineWidth = null;
-        this.size = null;
-        this.color = null;
-        this.shadow = null;
-    };
-    
-    var BarSeriesProperties = function() {
-        this.color=null;
-        this.seriesColors=null;
-        this.lineWidth=null;
-        this.shadow=null;
-        this.barPadding=null;
-        this.barMargin=null;
-        this.barWidth=null;
-        this.highlightColors=null;
-    };
-    
-    var PieSeriesProperties = function() {
-        this.seriesColors=null;
-        this.padding=null;
-        this.sliceMargin=null;
-        this.fill=null;
-        this.shadow=null;
-        this.startAngle=null;
-        this.lineWidth=null;
-        this.highlightColors=null;
-    };
-    
-    var DonutSeriesProperties = function() {
-        this.seriesColors=null;
-        this.padding=null;
-        this.sliceMargin=null;
-        this.fill=null;
-        this.shadow=null;
-        this.startAngle=null;
-        this.lineWidth=null;
-        this.innerDiameter=null;
-        this.thickness=null;
-        this.ringMargin=null;
-        this.highlightColors=null;
-    };
-    
-    var FunnelSeriesProperties = function() {
-        this.color=null;
-        this.lineWidth=null;
-        this.shadow=null;
-        this.padding=null;
-        this.sectionMargin=null;
-        this.seriesColors=null;
-        this.highlightColors=null;
-    };
-    
-    var MeterSeriesProperties = function() {
-        this.padding=null;
-        this.backgroundColor=null;
-        this.ringColor=null;
-        this.tickColor=null;
-        this.ringWidth=null;
-        this.intervalColors=null;
-        this.intervalInnerRadius=null;
-        this.intervalOuterRadius=null;
-        this.hubRadius=null;
-        this.needleThickness=null;
-        this.needlePad=null;
-    };
-        
-
-
-
-    $.fn.jqplotChildText = function() {
-        return $(this).contents().filter(function() {
-            return this.nodeType == 3;  // Node.TEXT_NODE not defined in I7
-        }).text();
-    };
-
-    // Returns font style as abbreviation for "font" property.
-    $.fn.jqplotGetComputedFontStyle = function() {
-        var css = window.getComputedStyle ?  window.getComputedStyle(this[0], "") : this[0].currentStyle;
-        var attrs = css['font-style'] ? ['font-style', 'font-weight', 'font-size', 'font-family'] : ['fontStyle', 'fontWeight', 'fontSize', 'fontFamily'];
-        var style = [];
-
-        for (var i=0 ; i < attrs.length; ++i) {
-            var attr = String(css[attrs[i]]);
-
-            if (attr && attr != 'normal') {
-                style.push(attr);
-            }
-        }
-        return style.join(' ');
-    };
-
-    /**
-     * Namespace: $.fn
-     * jQuery namespace to attach functions to jQuery elements.
-     *  
-     */
-
-    $.fn.jqplotToImageCanvas = function(options) {
-
-        options = options || {};
-        var x_offset = (options.x_offset == null) ? 0 : options.x_offset;
-        var y_offset = (options.y_offset == null) ? 0 : options.y_offset;
-        var backgroundColor = (options.backgroundColor == null) ? 'rgb(255,255,255)' : options.backgroundColor;
-
-        if ($(this).width() == 0 || $(this).height() == 0) {
-            return null;
-        }
-
-        // excanvas and hence IE < 9 do not support toDataURL and cannot export images.
-        if ($.jqplot.use_excanvas) {
-            return null;
-        }
-        
-        var newCanvas = document.createElement("canvas");
-        var h = $(this).outerHeight(true);
-        var w = $(this).outerWidth(true);
-        var offs = $(this).offset();
-        var plotleft = offs.left;
-        var plottop = offs.top;
-        var transx = 0, transy = 0;
-
-        // have to check if any elements are hanging outside of plot area before rendering,
-        // since changing width of canvas will erase canvas.
-
-        var clses = ['jqplot-table-legend', 'jqplot-xaxis-tick', 'jqplot-x2axis-tick', 'jqplot-yaxis-tick', 'jqplot-y2axis-tick', 'jqplot-y3axis-tick', 
-        'jqplot-y4axis-tick', 'jqplot-y5axis-tick', 'jqplot-y6axis-tick', 'jqplot-y7axis-tick', 'jqplot-y8axis-tick', 'jqplot-y9axis-tick',
-        'jqplot-xaxis-label', 'jqplot-x2axis-label', 'jqplot-yaxis-label', 'jqplot-y2axis-label', 'jqplot-y3axis-label', 'jqplot-y4axis-label', 
-        'jqplot-y5axis-label', 'jqplot-y6axis-label', 'jqplot-y7axis-label', 'jqplot-y8axis-label', 'jqplot-y9axis-label' ];
-
-        var temptop, templeft, tempbottom, tempright;
-
-        for (var i = 0; i < clses.length; i++) {
-            $(this).find('.'+clses[i]).each(function() {
-                temptop = $(this).offset().top - plottop;
-                templeft = $(this).offset().left - plotleft;
-                tempright = templeft + $(this).outerWidth(true) + transx;
-                tempbottom = temptop + $(this).outerHeight(true) + transy;
-                if (templeft < -transx) {
-                    w = w - transx - templeft;
-                    transx = -templeft;
-                }
-                if (temptop < -transy) {
-                    h = h - transy - temptop;
-                    transy = - temptop;
-                }
-                if (tempright > w) {
-                    w = tempright;
-                }
-                if (tempbottom > h) {
-                    h =  tempbottom;
-                }
-            });
-        }
-
-        newCanvas.width = w + Number(x_offset);
-        newCanvas.height = h + Number(y_offset);
-
-        var newContext = newCanvas.getContext("2d"); 
-
-        newContext.save();
-        newContext.fillStyle = backgroundColor;
-        newContext.fillRect(0,0, newCanvas.width, newCanvas.height);
-        newContext.restore();
-
-        newContext.translate(transx, transy);
-        newContext.textAlign = 'left';
-        newContext.textBaseline = 'top';
-
-        function getLineheight(el) {
-            var lineheight = parseInt($(el).css('line-height'), 10);
-
-            if (isNaN(lineheight)) {
-                lineheight = parseInt($(el).css('font-size'), 10) * 1.2;
-            }
-            return lineheight;
-        }
-
-        function writeWrappedText (el, context, text, left, top, canvasWidth) {
-            var lineheight = getLineheight(el);
-            var tagwidth = $(el).innerWidth();
-            var tagheight = $(el).innerHeight();
-            var words = text.split(/\s+/);
-            var wl = words.length;
-            var w = '';
-            var breaks = [];
-            var temptop = top;
-            var templeft = left;
-
-            for (var i=0; i<wl; i++) {
-                w += words[i];
-                if (context.measureText(w).width > tagwidth) {
-                    breaks.push(i);
-                    w = '';
-                    i--;
-                }   
-            }
-            if (breaks.length === 0) {
-                // center text if necessary
-                if ($(el).css('textAlign') === 'center') {
-                    templeft = left + (canvasWidth - context.measureText(w).width)/2  - transx;
-                }
-                context.fillText(text, templeft, top);
-            }
-            else {
-                w = words.slice(0, breaks[0]).join(' ');
-                // center text if necessary
-                if ($(el).css('textAlign') === 'center') {
-                    templeft = left + (canvasWidth - context.measureText(w).width)/2  - transx;
-                }
-                context.fillText(w, templeft, temptop);
-                temptop += lineheight;
-                for (var i=1, l=breaks.length; i<l; i++) {
-                    w = words.slice(breaks[i-1], breaks[i]).join(' ');
-                    // center text if necessary
-                    if ($(el).css('textAlign') === 'center') {
-                        templeft = left + (canvasWidth - context.measureText(w).width)/2  - transx;
-                    }
-                    context.fillText(w, templeft, temptop);
-                    temptop += lineheight;
-                }
-                w = words.slice(breaks[i-1], words.length).join(' ');
-                // center text if necessary
-                if ($(el).css('textAlign') === 'center') {
-                    templeft = left + (canvasWidth - context.measureText(w).width)/2  - transx;
-                }
-                context.fillText(w, templeft, temptop);
-            }
-
-        }
-
-        function _jqpToImage(el, x_offset, y_offset) {
-            var tagname = el.tagName.toLowerCase();
-            var p = $(el).position();
-            var css = window.getComputedStyle ?  window.getComputedStyle(el, "") : el.currentStyle; // for IE < 9
-            var left = x_offset + p.left + parseInt(css.marginLeft, 10) + parseInt(css.borderLeftWidth, 10) + parseInt(css.paddingLeft, 10);
-            var top = y_offset + p.top + parseInt(css.marginTop, 10) + parseInt(css.borderTopWidth, 10)+ parseInt(css.paddingTop, 10);
-            var w = newCanvas.width;
-            // var left = x_offset + p.left + $(el).css('marginLeft') + $(el).css('borderLeftWidth') 
-
-            // somehow in here, for divs within divs, the width of the inner div should be used instead of the canvas.
-
-            if ((tagname == 'div' || tagname == 'span') && !$(el).hasClass('jqplot-highlighter-tooltip')) {
-                $(el).children().each(function() {
-                    _jqpToImage(this, left, top);
-                });
-                var text = $(el).jqplotChildText();
-
-                if (text) {
-                    newContext.font = $(el).jqplotGetComputedFontStyle();
-                    newContext.fillStyle = $(el).css('color');
-
-                    writeWrappedText(el, newContext, text, left, top, w);
-                }
-            }
-
-            // handle the standard table legend
-
-            else if (tagname === 'table' && $(el).hasClass('jqplot-table-legend')) {
-                newContext.strokeStyle = $(el).css('border-top-color');
-                newContext.fillStyle = $(el).css('background-color');
-                newContext.fillRect(left, top, $(el).innerWidth(), $(el).innerHeight());
-                if (parseInt($(el).css('border-top-width'), 10) > 0) {
-                    newContext.strokeRect(left, top, $(el).innerWidth(), $(el).innerHeight());
-                }
-
-                // find all the swatches
-                $(el).find('div.jqplot-table-legend-swatch-outline').each(function() {
-                    // get the first div and stroke it
-                    var elem = $(this);
-                    newContext.strokeStyle = elem.css('border-top-color');
-                    var l = left + elem.position().left;
-                    var t = top + elem.position().top;
-                    newContext.strokeRect(l, t, elem.innerWidth(), elem.innerHeight());
-
-                    // now fill the swatch
-                    
-                    l += parseInt(elem.css('padding-left'), 10);
-                    t += parseInt(elem.css('padding-top'), 10);
-                    var h = elem.innerHeight() - 2 * parseInt(elem.css('padding-top'), 10);
-                    var w = elem.innerWidth() - 2 * parseInt(elem.css('padding-left'), 10);
-
-                    var swatch = elem.children('div.jqplot-table-legend-swatch');
-                    newContext.fillStyle = swatch.css('background-color');
-                    newContext.fillRect(l, t, w, h);
-                });
-
-                // now add text
-
-                $(el).find('td.jqplot-table-legend-label').each(function(){
-                    var elem = $(this);
-                    var l = left + elem.position().left;
-                    var t = top + elem.position().top + parseInt(elem.css('padding-top'), 10);
-                    newContext.font = elem.jqplotGetComputedFontStyle();
-                    newContext.fillStyle = elem.css('color');
-                    writeWrappedText(elem, newContext, elem.text(), l, t, w);
-                });
-
-                var elem = null;
-            }
-
-            else if (tagname == 'canvas') {
-                newContext.drawImage(el, left, top);
-            }
-        }
-        $(this).children().each(function() {
-            _jqpToImage(this, x_offset, y_offset);
-        });
-        return newCanvas;
-    };
-
-    // return the raw image data string.
-    // Should work on canvas supporting browsers.
-    $.fn.jqplotToImageStr = function(options) {
-        var imgCanvas = $(this).jqplotToImageCanvas(options);
-        if (imgCanvas) {
-            return imgCanvas.toDataURL("image/png");
-        }
-        else {
-            return null;
-        }
-    };
-
-    // return a DOM <img> element and return it.
-    // Should work on canvas supporting browsers.
-    $.fn.jqplotToImageElem = function(options) {
-        var elem = document.createElement("img");
-        var str = $(this).jqplotToImageStr(options);
-        elem.src = str;
-        return elem;
-    };
-
-    // return a string for an <img> element and return it.
-    // Should work on canvas supporting browsers.
-    $.fn.jqplotToImageElemStr = function(options) {
-        var str = '<img src='+$(this).jqplotToImageStr(options)+' />';
-        return str;
-    };
-
-    // Not guaranteed to work, even on canvas supporting browsers due to 
-    // limitations with location.href and browser support.
-    $.fn.jqplotSaveImage = function() {
-        var imgData = $(this).jqplotToImageStr({});
-        if (imgData) {
-            window.location.href = imgData.replace("image/png", "image/octet-stream");
-        }
-
-    };
-
-    // Not guaranteed to work, even on canvas supporting browsers due to
-    // limitations with window.open and arbitrary data.
-    $.fn.jqplotViewImage = function() {
-        var imgStr = $(this).jqplotToImageElemStr({});
-        var imgData = $(this).jqplotToImageStr({});
-        if (imgStr) {
-            var w = window.open('');
-            w.document.open("image/png");
-            w.document.write(imgStr);
-            w.document.close();
-            w = null;
-        }
-    };
-    
-
-
-
-    /** 
-     * @description
-     * <p>Object with extended date parsing and formatting capabilities.
-     * This library borrows many concepts and ideas from the Date Instance 
-     * Methods by Ken Snyder along with some parts of Ken's actual code.</p>
-     *
-     * <p>jsDate takes a different approach by not extending the built-in 
-     * Date Object, improving date parsing, allowing for multiple formatting 
-     * syntaxes and multiple and more easily expandable localization.</p>
-     * 
-     * @author Chris Leonello
-     * @date #date#
-     * @version #VERSION#
-     * @copyright (c) 2010-2013 Chris Leonello
-     * jsDate is currently available for use in all personal or commercial projects 
-     * under both the MIT and GPL version 2.0 licenses. This means that you can 
-     * choose the license that best suits your project and use it accordingly.
-     * 
-     * <p>Ken's original Date Instance Methods and copyright notice:</p>
-     * <pre>
-     * Ken Snyder (ken d snyder at gmail dot com)
-     * 2008-09-10
-     * version 2.0.2 (http://kendsnyder.com/sandbox/date/)     
-     * Creative Commons Attribution License 3.0 (http://creativecommons.org/licenses/by/3.0/)
-     * </pre>
-     * 
-     * @class
-     * @name jsDate
-     * @param  {String | Number | Array | Date&nbsp;Object | Options&nbsp;Object} arguments Optional arguments, either a parsable date/time string,
-     * a JavaScript timestamp, an array of numbers of form [year, month, day, hours, minutes, seconds, milliseconds],
-     * a Date object, or an options object of form {syntax: "perl", date:some Date} where all options are optional.
-     */
-     
-    var jsDate = function () {
-    
-        this.syntax = jsDate.config.syntax;
-        this._type = "jsDate";
-        this.proxy = new Date();
-        this.options = {};
-        this.locale = jsDate.regional.getLocale();
-        this.formatString = '';
-        this.defaultCentury = jsDate.config.defaultCentury;
-
-        switch ( arguments.length ) {
-            case 0:
-                break;
-            case 1:
-                // other objects either won't have a _type property or,
-                // if they do, it shouldn't be set to "jsDate", so
-                // assume it is an options argument.
-                if (get_type(arguments[0]) == "[object Object]" && arguments[0]._type != "jsDate") {
-                    var opts = this.options = arguments[0];
-                    this.syntax = opts.syntax || this.syntax;
-                    this.defaultCentury = opts.defaultCentury || this.defaultCentury;
-                    this.proxy = jsDate.createDate(opts.date);
-                }
-                else {
-                    this.proxy = jsDate.createDate(arguments[0]);
-                }
-                break;
-            default:
-                var a = [];
-                for ( var i=0; i<arguments.length; i++ ) {
-                    a.push(arguments[i]);
-                }
-                // this should be the current date/time?
-                this.proxy = new Date();
-                this.proxy.setFullYear.apply( this.proxy, a.slice(0,3) );
-                if ( a.slice(3).length ) {
-                    this.proxy.setHours.apply( this.proxy, a.slice(3) );
-                }
-                break;
-        }
-    };
-    
-    /**
-     * @namespace Configuration options that will be used as defaults for all instances on the page.
-     * @property {String} defaultLocale The default locale to use [en].
-     * @property {String} syntax The default syntax to use [perl].
-     * @property {Number} defaultCentury The default centry for 2 digit dates.
-     */
-    jsDate.config = {
-        defaultLocale: 'en',
-        syntax: 'perl',
-        defaultCentury: 1900
-    };
-        
-    /**
-     * Add an arbitrary amount to the currently stored date
-     * 
-     * @param {Number} number      
-     * @param {String} unit
-     * @returns {jsDate}       
-     */
-     
-    jsDate.prototype.add = function(number, unit) {
-        var factor = multipliers[unit] || multipliers.day;
-        if (typeof factor == 'number') {
-            this.proxy.setTime(this.proxy.getTime() + (factor * number));
-        } else {
-            factor.add(this, number);
-        }
-        return this;
-    };
-        
-    /**
-     * Create a new jqplot.date object with the same date
-     * 
-     * @returns {jsDate}
-     */  
-     
-    jsDate.prototype.clone = function() {
-            return new jsDate(this.proxy.getTime());
-    };
-
-    /**
-     * Get the UTC TimeZone Offset of this date in milliseconds.
-     *
-     * @returns {Number}
-     */
-
-    jsDate.prototype.getUtcOffset = function() {
-        return this.proxy.getTimezoneOffset() * 60000;
-    };
-
-    /**
-     * Find the difference between this jsDate and another date.
-     * 
-     * @param {String| Number| Array| jsDate&nbsp;Object| Date&nbsp;Object} dateObj
-     * @param {String} unit
-     * @param {Boolean} allowDecimal
-     * @returns {Number} Number of units difference between dates.
-     */
-     
-    jsDate.prototype.diff = function(dateObj, unit, allowDecimal) {
-        // ensure we have a Date object
-        dateObj = new jsDate(dateObj);
-        if (dateObj === null) {
-            return null;
-        }
-        // get the multiplying factor integer or factor function
-        var factor = multipliers[unit] || multipliers.day;
-        if (typeof factor == 'number') {
-            // multiply
-            var unitDiff = (this.proxy.getTime() - dateObj.proxy.getTime()) / factor;
-        } else {
-            // run function
-            var unitDiff = factor.diff(this.proxy, dateObj.proxy);
-        }
-        // if decimals are not allowed, round toward zero
-        return (allowDecimal ? unitDiff : Math[unitDiff > 0 ? 'floor' : 'ceil'](unitDiff));          
-    };
-    
-    /**
-     * Get the abbreviated name of the current week day
-     * 
-     * @returns {String}
-     */   
-     
-    jsDate.prototype.getAbbrDayName = function() {
-        return jsDate.regional[this.locale]["dayNamesShort"][this.proxy.getDay()];
-    };
-    
-    /**
-     * Get the abbreviated name of the current month
-     * 
-     * @returns {String}
-     */
-     
-    jsDate.prototype.getAbbrMonthName = function() {
-        return jsDate.regional[this.locale]["monthNamesShort"][this.proxy.getMonth()];
-    };
-    
-    /**
-     * Get UPPER CASE AM or PM for the current time
-     * 
-     * @returns {String}
-     */
-     
-    jsDate.prototype.getAMPM = function() {
-        return this.proxy.getHours() >= 12 ? 'PM' : 'AM';
-    };
-    
-    /**
-     * Get lower case am or pm for the current time
-     * 
-     * @returns {String}
-     */
-     
-    jsDate.prototype.getAmPm = function() {
-        return this.proxy.getHours() >= 12 ? 'pm' : 'am';
-    };
-    
-    /**
-     * Get the century (19 for 20th Century)
-     *
-     * @returns {Integer} Century (19 for 20th century).
-     */
-    jsDate.prototype.getCentury = function() { 
-        return parseInt(this.proxy.getFullYear()/100, 10);
-    };
-    
-    /**
-     * Implements Date functionality
-     */
-    jsDate.prototype.getDate = function() {
-        return this.proxy.getDate();
-    };
-    
-    /**
-     * Implements Date functionality
-     */
-    jsDate.prototype.getDay = function() {
-        return this.proxy.getDay();
-    };
-    
-    /**
-     * Get the Day of week 1 (Monday) thru 7 (Sunday)
-     * 
-     * @returns {Integer} Day of week 1 (Monday) thru 7 (Sunday)
-     */
-    jsDate.prototype.getDayOfWeek = function() { 
-        var dow = this.proxy.getDay(); 
-        return dow===0?7:dow; 
-    };
-    
-    /**
-     * Get the day of the year
-     * 
-     * @returns {Integer} 1 - 366, day of the year
-     */
-    jsDate.prototype.getDayOfYear = function() {
-        var d = this.proxy;
-        var ms = d - new Date('' + d.getFullYear() + '/1/1 GMT');
-        ms += d.getTimezoneOffset()*60000;
-        d = null;
-        return parseInt(ms/60000/60/24, 10)+1;
-    };
-    
-    /**
-     * Get the name of the current week day
-     * 
-     * @returns {String}
-     */  
-     
-    jsDate.prototype.getDayName = function() {
-        return jsDate.regional[this.locale]["dayNames"][this.proxy.getDay()];
-    };
-    
-    /**
-     * Get the week number of the given year, starting with the first Sunday as the first week
-     * @returns {Integer} Week number (13 for the 13th full week of the year).
-     */
-    jsDate.prototype.getFullWeekOfYear = function() {
-        var d = this.proxy;
-        var doy = this.getDayOfYear();
-        var rdow = 6-d.getDay();
-        var woy = parseInt((doy+rdow)/7, 10);
-        return woy;
-    };
-    
-    /**
-     * Implements Date functionality
-     */
-    jsDate.prototype.getFullYear = function() {
-        return this.proxy.getFullYear();
-    };
-    
-    /**
-     * Get the GMT offset in hours and minutes (e.g. +06:30)
-     * 
-     * @returns {String}
-     */
-     
-    jsDate.prototype.getGmtOffset = function() {
-        // divide the minutes offset by 60
-        var hours = this.proxy.getTimezoneOffset() / 60;
-        // decide if we are ahead of or behind GMT
-        var prefix = hours < 0 ? '+' : '-';
-        // remove the negative sign if any
-        hours = Math.abs(hours);
-        // add the +/- to the padded number of hours to : to the padded minutes
-        return prefix + addZeros(Math.floor(hours), 2) + ':' + addZeros((hours % 1) * 60, 2);
-    };
-    
-    /**
-     * Implements Date functionality
-     */
-    jsDate.prototype.getHours = function() {
-        return this.proxy.getHours();
-    };
-    
-    /**
-     * Get the current hour on a 12-hour scheme
-     * 
-     * @returns {Integer}
-     */
-     
-    jsDate.prototype.getHours12  = function() {
-        var hours = this.proxy.getHours();
-        return hours > 12 ? hours - 12 : (hours == 0 ? 12 : hours);
-    };
-    
-    
-    jsDate.prototype.getIsoWeek = function() {
-        var d = this.proxy;
-        var woy = this.getWeekOfYear();
-        var dow1_1 = (new Date('' + d.getFullYear() + '/1/1')).getDay();
-        // First week is 01 and not 00 as in the case of %U and %W,
-        // so we add 1 to the final result except if day 1 of the year
-        // is a Monday (then %W returns 01).
-        // We also need to subtract 1 if the day 1 of the year is 
-        // Friday-Sunday, so the resulting equation becomes:
-        var idow = woy + (dow1_1 > 4 || dow1_1 <= 1 ? 0 : 1);
-        if(idow == 53 && (new Date('' + d.getFullYear() + '/12/31')).getDay() < 4)
-        {
-            idow = 1;
-        }
-        else if(idow === 0)
-        {
-            d = new jsDate(new Date('' + (d.getFullYear()-1) + '/12/31'));
-            idow = d.getIsoWeek();
-        }
-        d = null;
-        return idow;
-    };
-    
-    /**
-     * Implements Date functionality
-     */
-    jsDate.prototype.getMilliseconds = function() {
-        return this.proxy.getMilliseconds();
-    };
-    
-    /**
-     * Implements Date functionality
-     */
-    jsDate.prototype.getMinutes = function() {
-        return this.proxy.getMinutes();
-    };
-    
-    /**
-     * Implements Date functionality
-     */
-    jsDate.prototype.getMonth = function() {
-        return this.proxy.getMonth();
-    };
-    
-    /**
-     * Get the name of the current month
-     * 
-     * @returns {String}
-     */
-     
-    jsDate.prototype.getMonthName = function() {
-        return jsDate.regional[this.locale]["monthNames"][this.proxy.getMonth()];
-    };
-    
-    /**
-     * Get the number of the current month, 1-12
-     * 
-     * @returns {Integer}
-     */
-     
-    jsDate.prototype.getMonthNumber = function() {
-        return this.proxy.getMonth() + 1;
-    };
-    
-    /**
-     * Implements Date functionality
-     */
-    jsDate.prototype.getSeconds = function() {
-        return this.proxy.getSeconds();
-    };
-    
-    /**
-     * Return a proper two-digit year integer
-     * 
-     * @returns {Integer}
-     */
-     
-    jsDate.prototype.getShortYear = function() {
-        return this.proxy.getYear() % 100;
-    };
-    
-    /**
-     * Implements Date functionality
-     */
-    jsDate.prototype.getTime = function() {
-        return this.proxy.getTime();
-    };
-    
-    /**
-     * Get the timezone abbreviation
-     *
-     * @returns {String} Abbreviation for the timezone
-     */
-    jsDate.prototype.getTimezoneAbbr = function() {
-        return this.proxy.toString().replace(/^.*\(([^)]+)\)$/, '$1'); 
-    };
-    
-    /**
-     * Get the browser-reported name for the current timezone (e.g. MDT, Mountain Daylight Time)
-     * 
-     * @returns {String}
-     */
-    jsDate.prototype.getTimezoneName = function() {
-        var match = /(?:\((.+)\)$| ([A-Z]{3}) )/.exec(this.toString());
-        return match[1] || match[2] || 'GMT' + this.getGmtOffset();
-    }; 
-    
-    /**
-     * Implements Date functionality
-     */
-    jsDate.prototype.getTimezoneOffset = function() {
-        return this.proxy.getTimezoneOffset();
-    };
-    
-    
-    /**
-     * Get the week number of the given year, starting with the first Monday as the first week
-     * @returns {Integer} Week number (13 for the 13th week of the year).
-     */
-    jsDate.prototype.getWeekOfYear = function() {
-        var doy = this.getDayOfYear();
-        var rdow = 7 - this.getDayOfWeek();
-        var woy = parseInt((doy+rdow)/7, 10);
-        return woy;
-    };
-    
-    /**
-     * Get the current date as a Unix timestamp
-     * 
-     * @returns {Integer}
-     */
-     
-    jsDate.prototype.getUnix = function() {
-        return Math.round(this.proxy.getTime() / 1000, 0);
-    }; 
-    
-    /**
-     * Implements Date functionality
-     */
-    jsDate.prototype.getYear = function() {
-        return this.proxy.getYear();
-    };
-    
-    /**
-     * Return a date one day ahead (or any other unit)
-     * 
-     * @param {String} unit Optional, year | month | day | week | hour | minute | second | millisecond
-     * @returns {jsDate}
-     */
-     
-    jsDate.prototype.next = function(unit) {
-        unit = unit || 'day';
-        return this.clone().add(1, unit);
-    };
-    
-    /**
-     * Set the jsDate instance to a new date.
-     *
-     * @param  {String | Number | Array | Date Object | jsDate Object | Options Object} arguments Optional arguments, 
-     * either a parsable date/time string,
-     * a JavaScript timestamp, an array of numbers of form [year, month, day, hours, minutes, seconds, milliseconds],
-     * a Date object, jsDate Object or an options object of form {syntax: "perl", date:some Date} where all options are optional.
-     */
-    jsDate.prototype.set = function() {
-        switch ( arguments.length ) {
-            case 0:
-                this.proxy = new Date();
-                break;
-            case 1:
-                // other objects either won't have a _type property or,
-                // if they do, it shouldn't be set to "jsDate", so
-                // assume it is an options argument.
-                if (get_type(arguments[0]) == "[object Object]" && arguments[0]._type != "jsDate") {
-                    var opts = this.options = arguments[0];
-                    this.syntax = opts.syntax || this.syntax;
-                    this.defaultCentury = opts.defaultCentury || this.defaultCentury;
-                    this.proxy = jsDate.createDate(opts.date);
-                }
-                else {
-                    this.proxy = jsDate.createDate(arguments[0]);
-                }
-                break;
-            default:
-                var a = [];
-                for ( var i=0; i<arguments.length; i++ ) {
-                    a.push(arguments[i]);
-                }
-                // this should be the current date/time
-                this.proxy = new Date();
-                this.proxy.setFullYear.apply( this.proxy, a.slice(0,3) );
-                if ( a.slice(3).length ) {
-                    this.proxy.setHours.apply( this.proxy, a.slice(3) );
-                }
-                break;
-        }
-        return this;
-    };
-    
-    /**
-     * Sets the day of the month for a specified date according to local time.
-     * @param {Integer} dayValue An integer from 1 to 31, representing the day of the month. 
-     */
-    jsDate.prototype.setDate = function(n) {
-        this.proxy.setDate(n);
-        return this;
-    };
-    
-    /**
-     * Sets the full year for a specified date according to local time.
-     * @param {Integer} yearValue The numeric value of the year, for example, 1995.  
-     * @param {Integer} monthValue Optional, between 0 and 11 representing the months January through December.  
-     * @param {Integer} dayValue Optional, between 1 and 31 representing the day of the month. If you specify the dayValue parameter, you must also specify the monthValue. 
-     */
-    jsDate.prototype.setFullYear = function() {
-        this.proxy.setFullYear.apply(this.proxy, arguments);
-        return this;
-    };
-    
-    /**
-     * Sets the hours for a specified date according to local time.
-     * 
-     * @param {Integer} hoursValue An integer between 0 and 23, representing the hour.  
-     * @param {Integer} minutesValue Optional, An integer between 0 and 59, representing the minutes.  
-     * @param {Integer} secondsValue Optional, An integer between 0 and 59, representing the seconds. 
-     * If you specify the secondsValue parameter, you must also specify the minutesValue.  
-     * @param {Integer} msValue Optional, A number between 0 and 999, representing the milliseconds. 
-     * If you specify the msValue parameter, you must also specify the minutesValue and secondsValue. 
-     */
-    jsDate.prototype.setHours = function() {
-        this.proxy.setHours.apply(this.proxy, arguments);
-        return this;
-    };
-    
-    /**
-     * Implements Date functionality
-     */ 
-    jsDate.prototype.setMilliseconds = function(n) {
-        this.proxy.setMilliseconds(n);
-        return this;
-    };
-    
-    /**
-     * Implements Date functionality
-     */ 
-    jsDate.prototype.setMinutes = function() {
-        this.proxy.setMinutes.apply(this.proxy, arguments);
-        return this;
-    };
-    
-    /**
-     * Implements Date functionality
-     */ 
-    jsDate.prototype.setMonth = function() {
-        this.proxy.setMonth.apply(this.proxy, arguments);
-        return this;
-    };
-    
-    /**
-     * Implements Date functionality
-     */ 
-    jsDate.prototype.setSeconds = function() {
-        this.proxy.setSeconds.apply(this.proxy, arguments);
-        return this;
-    };
-    
-    /**
-     * Implements Date functionality
-     */ 
-    jsDate.prototype.setTime = function(n) {
-        this.proxy.setTime(n);
-        return this;
-    };
-    
-    /**
-     * Implements Date functionality
-     */ 
-    jsDate.prototype.setYear = function() {
-        this.proxy.setYear.apply(this.proxy, arguments);
-        return this;
-    };
-    
-    /**
-     * Provide a formatted string representation of this date.
-     * 
-     * @param {String} formatString A format string.  
-     * See: {@link jsDate.formats}.
-     * @returns {String} Date String.
-     */
-            
-    jsDate.prototype.strftime = function(formatString) {
-        formatString = formatString || this.formatString || jsDate.regional[this.locale]['formatString'];
-        return jsDate.strftime(this, formatString, this.syntax);
-    };
-        
-    /**
-     * Return a String representation of this jsDate object.
-     * @returns {String} Date string.
-     */
-    
-    jsDate.prototype.toString = function() {
-        return this.proxy.toString();
-    };
-        
-    /**
-     * Convert the current date to an 8-digit integer (%Y%m%d)
-     * 
-     * @returns {Integer}
-     */
-     
-    jsDate.prototype.toYmdInt = function() {
-        return (this.proxy.getFullYear() * 10000) + (this.getMonthNumber() * 100) + this.proxy.getDate();
-    };
-    
-    /**
-     * @namespace Holds localizations for month/day names.
-     * <p>jsDate attempts to detect locale when loaded and defaults to 'en'.
-     * If a localization is detected which is not available, jsDate defaults to 'en'.
-     * Additional localizations can be added after jsDate loads.  After adding a localization,
-     * call the jsDate.regional.getLocale() method.  Currently, en, fr and de are defined.</p>
-     * 
-     * <p>Localizations must be an object and have the following properties defined:  monthNames, monthNamesShort, dayNames, dayNamesShort and Localizations are added like:</p>
-     * <pre class="code">
-     * jsDate.regional['en'] = {
-     * monthNames      : 'January February March April May June July August September October November December'.split(' '),
-     * monthNamesShort : 'Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec'.split(' '),
-     * dayNames        : 'Sunday Monday Tuesday Wednesday Thursday Friday Saturday'.split(' '),
-     * dayNamesShort   : 'Sun Mon Tue Wed Thu Fri Sat'.split(' ')
-     * };
-     * </pre>
-     * <p>After adding localizations, call <code>jsDate.regional.getLocale();</code> to update the locale setting with the
-     * new localizations.</p>
-     */
-     
-    jsDate.regional = {
-        'en': {
-            monthNames: ['January','February','March','April','May','June','July','August','September','October','November','December'],
-            monthNamesShort: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun','Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
-            dayNames: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],
-            dayNamesShort: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],
-            formatString: '%Y-%m-%d %H:%M:%S'
-        },
-        
-        'fr': {
-            monthNames: ['Janvier','Février','Mars','Avril','Mai','Juin','Juillet','Août','Septembre','Octobre','Novembre','Décembre'],
-            monthNamesShort: ['Jan','Fév','Mar','Avr','Mai','Jun','Jul','Aoû','Sep','Oct','Nov','Déc'],
-            dayNames: ['Dimanche','Lundi','Mardi','Mercredi','Jeudi','Vendredi','Samedi'],
-            dayNamesShort: ['Dim','Lun','Mar','Mer','Jeu','Ven','Sam'],
-            formatString: '%Y-%m-%d %H:%M:%S'
-        },
-        
-        'de': {
-            monthNames: ['Januar','Februar','März','April','Mai','Juni','Juli','August','September','Oktober','November','Dezember'],
-            monthNamesShort: ['Jan','Feb','Mär','Apr','Mai','Jun','Jul','Aug','Sep','Okt','Nov','Dez'],
-            dayNames: ['Sonntag','Montag','Dienstag','Mittwoch','Donnerstag','Freitag','Samstag'],
-            dayNamesShort: ['So','Mo','Di','Mi','Do','Fr','Sa'],
-            formatString: '%Y-%m-%d %H:%M:%S'
-        },
-        
-        'es': {
-            monthNames: ['Enero','Febrero','Marzo','Abril','Mayo','Junio', 'Julio','Agosto','Septiembre','Octubre','Noviembre','Diciembre'],
-            monthNamesShort: ['Ene','Feb','Mar','Abr','May','Jun', 'Jul','Ago','Sep','Oct','Nov','Dic'],
-            dayNames: ['Domingo','Lunes','Martes','Mi&eacute;rcoles','Jueves','Viernes','S&aacute;bado'],
-            dayNamesShort: ['Dom','Lun','Mar','Mi&eacute;','Juv','Vie','S&aacute;b'],
-            formatString: '%Y-%m-%d %H:%M:%S'
-        },
-        
-        'ru': {
-            monthNames: ['Январь','Февраль','Март','Апрель','Май','Июнь','Июль','Август','Сентябрь','Октябрь','Ноябрь','Декабрь'],
-            monthNamesShort: ['Янв','Фев','Мар','Апр','Май','Июн','Июл','Авг','Сен','Окт','Ноя','Дек'],
-            dayNames: ['воскресенье','понедельник','вторник','среда','четверг','пятница','суббота'],
-            dayNamesShort: ['вск','пнд','втр','срд','чтв','птн','сбт'],
-            formatString: '%Y-%m-%d %H:%M:%S'
-        },
-        
-        'ar': {
-            monthNames: ['كانون الثاني', 'شباط', 'آذار', 'نيسان', 'آذار', 'حزيران','تموز', 'آب', 'أيلول',   'تشرين الأول', 'تشرين الثاني', 'كانون الأول'],
-            monthNamesShort: ['1','2','3','4','5','6','7','8','9','10','11','12'],
-            dayNames: ['السبت', 'الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة'],
-            dayNamesShort: ['سبت', 'أحد', 'اثنين', 'ثلاثاء', 'أربعاء', 'خميس', 'جمعة'],
-            formatString: '%Y-%m-%d %H:%M:%S'
-        },
-        
-        'pt': {
-            monthNames: ['Janeiro','Fevereiro','Mar&ccedil;o','Abril','Maio','Junho','Julho','Agosto','Setembro','Outubro','Novembro','Dezembro'],
-            monthNamesShort: ['Jan','Fev','Mar','Abr','Mai','Jun','Jul','Ago','Set','Out','Nov','Dez'],
-            dayNames: ['Domingo','Segunda-feira','Ter&ccedil;a-feira','Quarta-feira','Quinta-feira','Sexta-feira','S&aacute;bado'],
-            dayNamesShort: ['Dom','Seg','Ter','Qua','Qui','Sex','S&aacute;b'],
-            formatString: '%Y-%m-%d %H:%M:%S'   
-        },
-        
-        'pt-BR': {
-            monthNames: ['Janeiro','Fevereiro','Mar&ccedil;o','Abril','Maio','Junho', 'Julho','Agosto','Setembro','Outubro','Novembro','Dezembro'],
-            monthNamesShort: ['Jan','Fev','Mar','Abr','Mai','Jun','Jul','Ago','Set','Out','Nov','Dez'],
-            dayNames: ['Domingo','Segunda-feira','Ter&ccedil;a-feira','Quarta-feira','Quinta-feira','Sexta-feira','S&aacute;bado'],
-            dayNamesShort: ['Dom','Seg','Ter','Qua','Qui','Sex','S&aacute;b'],
-            formatString: '%Y-%m-%d %H:%M:%S'
-        },
-        
-        'pl': {
-            monthNames: ['Styczeń','Luty','Marzec','Kwiecień','Maj','Czerwiec','Lipiec','Sierpień','Wrzesień','Październik','Listopad','Grudzień'],
-            monthNamesShort: ['Sty', 'Lut', 'Mar', 'Kwi', 'Maj', 'Cze','Lip', 'Sie', 'Wrz', 'Paź', 'Lis', 'Gru'],
-            dayNames: ['Niedziela', 'Poniedziałek', 'Wtorek', 'Środa', 'Czwartek', 'Piątek', 'Sobota'],
-            dayNamesShort: ['Ni', 'Pn', 'Wt', 'Śr', 'Cz', 'Pt', 'Sb'],
-            formatString: '%Y-%m-%d %H:%M:%S'
-        },
-
-        'nl': {
-            monthNames: ['Januari','Februari','Maart','April','Mei','Juni','July','Augustus','September','Oktober','November','December'],
-            monthNamesShort: ['Jan','Feb','Mar','Apr','Mei','Jun','Jul','Aug','Sep','Okt','Nov','Dec'],
-            dayNames:','['Zondag','Maandag','Dinsdag','Woensdag','Donderdag','Vrijdag','Zaterdag'],
-            dayNamesShort: ['Zo','Ma','Di','Wo','Do','Vr','Za'],
-            formatString: '%Y-%m-%d %H:%M:%S'
-        },
-
-        'sv': {
-            monthNames: ['januari','februari','mars','april','maj','juni','juli','augusti','september','oktober','november','december'],
-          monthNamesShort: ['jan','feb','mar','apr','maj','jun','jul','aug','sep','okt','nov','dec'],
-            dayNames: ['söndag','måndag','tisdag','onsdag','torsdag','fredag','lördag'],
-            dayNamesShort: ['sön','mån','tis','ons','tor','fre','lör'],
-            formatString: '%Y-%m-%d %H:%M:%S'
-        }
-    
-    };
-    
-    // Set english variants to 'en'
-    jsDate.regional['en-US'] = jsDate.regional['en-GB'] = jsDate.regional['en'];
-    
-    /**
-     * Try to determine the users locale based on the lang attribute of the html page.  Defaults to 'en'
-     * if it cannot figure out a locale of if the locale does not have a localization defined.
-     * @returns {String} locale
-     */
-     
-    jsDate.regional.getLocale = function () {
-        var l = jsDate.config.defaultLocale;
-        
-        if ( document && document.getElementsByTagName('html') && document.getElementsByTagName('html')[0].lang ) {
-            l = document.getElementsByTagName('html')[0].lang;
-            if (!jsDate.regional.hasOwnProperty(l)) {
-                l = jsDate.config.defaultLocale;
-            }
-        }
-        
-        return l;
-    };
-    
-    // ms in day
-    var day = 24 * 60 * 60 * 1000;
-    
-    // padd a number with zeros
-    var addZeros = function(num, digits) {
-        num = String(num);
-        var i = digits - num.length;
-        var s = String(Math.pow(10, i)).slice(1);
-        return s.concat(num);
-    };
-
-    // representations used for calculating differences between dates.
-    // This borrows heavily from Ken Snyder's work.
-    var multipliers = {
-        millisecond: 1,
-        second: 1000,
-        minute: 60 * 1000,
-        hour: 60 * 60 * 1000,
-        day: day,
-        week: 7 * day,
-        month: {
-            // add a number of months
-            add: function(d, number) {
-                // add any years needed (increments of 12)
-                multipliers.year.add(d, Math[number > 0 ? 'floor' : 'ceil'](number / 12));
-                // ensure that we properly wrap betwen December and January
-                // 11 % 12 = 11
-                // 12 % 12 = 0
-                var prevMonth = d.getMonth() + (number % 12);
-                if (prevMonth == 12) {
-                    prevMonth = 0;
-                    d.setYear(d.getFullYear() + 1);
-                } else if (prevMonth == -1) {
-                    prevMonth = 11;
-                    d.setYear(d.getFullYear() - 1);
-                }
-                d.setMonth(prevMonth);
-            },
-            // get the number of months between two Date objects (decimal to the nearest day)
-            diff: function(d1, d2) {
-                // get the number of years
-                var diffYears = d1.getFullYear() - d2.getFullYear();
-                // get the number of remaining months
-                var diffMonths = d1.getMonth() - d2.getMonth() + (diffYears * 12);
-                // get the number of remaining days
-                var diffDays = d1.getDate() - d2.getDate();
-                // return the month difference with the days difference as a decimal
-                return diffMonths + (diffDays / 30);
-            }
-        },
-        year: {
-            // add a number of years
-            add: function(d, number) {
-                d.setYear(d.getFullYear() + Math[number > 0 ? 'floor' : 'ceil'](number));
-            },
-            // get the number of years between two Date objects (decimal to the nearest day)
-            diff: function(d1, d2) {
-                return multipliers.month.diff(d1, d2) / 12;
-            }
-        }        
-    };
-    //
-    // Alias each multiplier with an 's' to allow 'year' and 'years' for example.
-    // This comes from Ken Snyders work.
-    //
-    for (var unit in multipliers) {
-        if (unit.substring(unit.length - 1) != 's') { // IE will iterate newly added properties :|
-            multipliers[unit + 's'] = multipliers[unit];
-        }
-    }
-    
-    //
-    // take a jsDate instance and a format code and return the formatted value.
-    // This is a somewhat modified version of Ken Snyder's method.
-    //
-    var format = function(d, code, syntax) {
-        // if shorcut codes are used, recursively expand those.
-        if (jsDate.formats[syntax]["shortcuts"][code]) {
-            return jsDate.strftime(d, jsDate.formats[syntax]["shortcuts"][code], syntax);
-        } else {
-            // get the format code function and addZeros() argument
-            var getter = (jsDate.formats[syntax]["codes"][code] || '').split('.');
-            var nbr = d['get' + getter[0]] ? d['get' + getter[0]]() : '';
-            if (getter[1]) {
-                nbr = addZeros(nbr, getter[1]);
-            }
-            return nbr;
-        }       
-    };
-    
-    /**
-     * @static
-     * Static function for convert a date to a string according to a given format.  Also acts as namespace for strftime format codes.
-     * <p>strftime formatting can be accomplished without creating a jsDate object by calling jsDate.strftime():</p>
-     * <pre class="code">
-     * var formattedDate = jsDate.strftime('Feb 8, 2006 8:48:32', '%Y-%m-%d %H:%M:%S');
-     * </pre>
-     * @param {String | Number | Array | jsDate&nbsp;Object | Date&nbsp;Object} date A parsable date string, JavaScript time stamp, Array of form [year, month, day, hours, minutes, seconds, milliseconds], jsDate Object or Date object.
-     * @param {String} formatString String with embedded date formatting codes.  
-     * See: {@link jsDate.formats}. 
-     * @param {String} syntax Optional syntax to use [default perl].
-     * @param {String} locale Optional locale to use.
-     * @returns {String} Formatted representation of the date.
-    */
-    //
-    // Logic as implemented here is very similar to Ken Snyder's Date Instance Methods.
-    //
-    jsDate.strftime = function(d, formatString, syntax, locale) {
-        var syn = 'perl';
-        var loc = jsDate.regional.getLocale();
-        
-        // check if syntax and locale are available or reversed
-        if (syntax && jsDate.formats.hasOwnProperty(syntax)) {
-            syn = syntax;
-        }
-        else if (syntax && jsDate.regional.hasOwnProperty(syntax)) {
-            loc = syntax;
-        }
-        
-        if (locale && jsDate.formats.hasOwnProperty(locale)) {
-            syn = locale;
-        }
-        else if (locale && jsDate.regional.hasOwnProperty(locale)) {
-            loc = locale;
-        }
-        
-        if (get_type(d) != "[object Object]" || d._type != "jsDate") {
-            d = new jsDate(d);
-            d.locale = loc;
-        }
-        if (!formatString) {
-            formatString = d.formatString || jsDate.regional[loc]['formatString'];
-        }
-        // default the format string to year-month-day
-        var source = formatString || '%Y-%m-%d', 
-            result = '', 
-            match;
-        // replace each format code
-        while (source.length > 0) {
-            if (match = source.match(jsDate.formats[syn].codes.matcher)) {
-                result += source.slice(0, match.index);
-                result += (match[1] || '') + format(d, match[2], syn);
-                source = source.slice(match.index + match[0].length);
-            } else {
-                result += source;
-                source = '';
-            }
-        }
-        return result;
-    };
-    
-    /**
-     * @namespace
-     * Namespace to hold format codes and format shortcuts.  "perl" and "php" format codes 
-     * and shortcuts are defined by default.  Additional codes and shortcuts can be
-     * added like:
-     * 
-     * <pre class="code">
-     * jsDate.formats["perl"] = {
-     *     "codes": {
-     *         matcher: /someregex/,
-     *         Y: "fullYear",  // name of "get" method without the "get",
-     *         ...,            // more codes
-     *     },
-     *     "shortcuts": {
-     *         F: '%Y-%m-%d',
-     *         ...,            // more shortcuts
-     *     }
-     * };
-     * </pre>
-     * 
-     * <p>Additionally, ISO and SQL shortcuts are defined and can be accesses via:
-     * <code>jsDate.formats.ISO</code> and <code>jsDate.formats.SQL</code>
-     */
-    
-    jsDate.formats = {
-        ISO:'%Y-%m-%dT%H:%M:%S.%N%G',
-        SQL:'%Y-%m-%d %H:%M:%S'
-    };
-    
-    /**
-     * Perl format codes and shortcuts for strftime.
-     * 
-     * A hash (object) of codes where each code must be an array where the first member is 
-     * the name of a Date.prototype or jsDate.prototype function to call
-     * and optionally a second member indicating the number to pass to addZeros()
-     * 
-     * <p>The following format codes are defined:</p>
-     * 
-     * <pre class="code">
-     * Code    Result                    Description
-     * == Years ==           
-     * %Y      2008                      Four-digit year
-     * %y      08                        Two-digit year
-     * 
-     * == Months ==          
-     * %m      09                        Two-digit month
-     * %#m     9                         One or two-digit month
-     * %B      September                 Full month name
-     * %b      Sep                       Abbreviated month name
-     * 
-     * == Days ==            
-     * %d      05                        Two-digit day of month
-     * %#d     5                         One or two-digit day of month
-     * %e      5                         One or two-digit day of month
-     * %A      Sunday                    Full name of the day of the week
-     * %a      Sun                       Abbreviated name of the day of the week
-     * %w      0                         Number of the day of the week (0 = Sunday, 6 = Saturday)
-     * 
-     * == Hours ==           
-     * %H      23                        Hours in 24-hour format (two digits)
-     * %#H     3                         Hours in 24-hour integer format (one or two digits)
-     * %I      11                        Hours in 12-hour format (two digits)
-     * %#I     3                         Hours in 12-hour integer format (one or two digits)
-     * %p      PM                        AM or PM
-     * 
-     * == Minutes ==         
-     * %M      09                        Minutes (two digits)
-     * %#M     9                         Minutes (one or two digits)
-     * 
-     * == Seconds ==         
-     * %S      02                        Seconds (two digits)
-     * %#S     2                         Seconds (one or two digits)
-     * %s      1206567625723             Unix timestamp (Seconds past 1970-01-01 00:00:00)
-     * 
-     * == Milliseconds ==    
-     * %N      008                       Milliseconds (three digits)
-     * %#N     8                         Milliseconds (one to three digits)
-     * 
-     * == Timezone ==        
-     * %O      360                       difference in minutes between local time and GMT
-     * %Z      Mountain Standard Time    Name of timezone as reported by browser
-     * %G      06:00                     Hours and minutes between GMT
-     * 
-     * == Shortcuts ==       
-     * %F      2008-03-26                %Y-%m-%d
-     * %T      05:06:30                  %H:%M:%S
-     * %X      05:06:30                  %H:%M:%S
-     * %x      03/26/08                  %m/%d/%y
-     * %D      03/26/08                  %m/%d/%y
-     * %#c     Wed Mar 26 15:31:00 2008  %a %b %e %H:%M:%S %Y
-     * %v      3-Sep-2008                %e-%b-%Y
-     * %R      15:31                     %H:%M
-     * %r      03:31:00 PM               %I:%M:%S %p
-     * 
-     * == Characters ==      
-     * %n      \n                        Newline
-     * %t      \t                        Tab
-     * %%      %                         Percent Symbol
-     * </pre>
-     * 
-     * <p>Formatting shortcuts that will be translated into their longer version.
-     * Be sure that format shortcuts do not refer to themselves: this will cause an infinite loop.</p>
-     * 
-     * <p>Format codes and format shortcuts can be redefined after the jsDate
-     * module is imported.</p>
-     * 
-     * <p>Note that if you redefine the whole hash (object), you must supply a "matcher"
-     * regex for the parser.  The default matcher is:</p>
-     * 
-     * <code>/()%(#?(%|[a-z]))/i</code>
-     * 
-     * <p>which corresponds to the Perl syntax used by default.</p>
-     * 
-     * <p>By customizing the matcher and format codes, nearly any strftime functionality is possible.</p>
-     */
-     
-    jsDate.formats.perl = {
-        codes: {
-            //
-            // 2-part regex matcher for format codes
-            //
-            // first match must be the character before the code (to account for escaping)
-            // second match must be the format code character(s)
-            //
-            matcher: /()%(#?(%|[a-z]))/i,
-            // year
-            Y: 'FullYear',
-            y: 'ShortYear.2',
-            // month
-            m: 'MonthNumber.2',
-            '#m': 'MonthNumber',
-            B: 'MonthName',
-            b: 'AbbrMonthName',
-            // day
-            d: 'Date.2',
-            '#d': 'Date',
-            e: 'Date',
-            A: 'DayName',
-            a: 'AbbrDayName',
-            w: 'Day',
-            // hours
-            H: 'Hours.2',
-            '#H': 'Hours',
-            I: 'Hours12.2',
-            '#I': 'Hours12',
-            p: 'AMPM',
-            // minutes
-            M: 'Minutes.2',
-            '#M': 'Minutes',
-            // seconds
-            S: 'Seconds.2',
-            '#S': 'Seconds',
-            s: 'Unix',
-            // milliseconds
-            N: 'Milliseconds.3',
-            '#N': 'Milliseconds',
-            // timezone
-            O: 'TimezoneOffset',
-            Z: 'TimezoneName',
-            G: 'GmtOffset'  
-        },
-        
-        shortcuts: {
-            // date
-            F: '%Y-%m-%d',
-            // time
-            T: '%H:%M:%S',
-            X: '%H:%M:%S',
-            // local format date
-            x: '%m/%d/%y',
-            D: '%m/%d/%y',
-            // local format extended
-            '#c': '%a %b %e %H:%M:%S %Y',
-            // local format short
-            v: '%e-%b-%Y',
-            R: '%H:%M',
-            r: '%I:%M:%S %p',
-            // tab and newline
-            t: '\t',
-            n: '\n',
-            '%': '%'
-        }
-    };
-    
-    /**
-     * PHP format codes and shortcuts for strftime.
-     * 
-     * A hash (object) of codes where each code must be an array where the first member is 
-     * the name of a Date.prototype or jsDate.prototype function to call
-     * and optionally a second member indicating the number to pass to addZeros()
-     * 
-     * <p>The following format codes are defined:</p>
-     * 
-     * <pre class="code">
-     * Code    Result                    Description
-     * === Days ===        
-     * %a      Sun through Sat           An abbreviated textual representation of the day
-     * %A      Sunday - Saturday         A full textual representation of the day
-     * %d      01 to 31                  Two-digit day of the month (with leading zeros)
-     * %e      1 to 31                   Day of the month, with a space preceding single digits.
-     * %j      001 to 366                Day of the year, 3 digits with leading zeros
-     * %u      1 - 7 (Mon - Sun)         ISO-8601 numeric representation of the day of the week
-     * %w      0 - 6 (Sun - Sat)         Numeric representation of the day of the week
-     *                                  
-     * === Week ===                     
-     * %U      13                        Full Week number, starting with the first Sunday as the first week
-     * %V      01 through 53             ISO-8601:1988 week number, starting with the first week of the year 
-     *                                   with at least 4 weekdays, with Monday being the start of the week
-     * %W      46                        A numeric representation of the week of the year, 
-     *                                   starting with the first Monday as the first week
-     * === Month ===                    
-     * %b      Jan through Dec           Abbreviated month name, based on the locale
-     * %B      January - December        Full month name, based on the locale
-     * %h      Jan through Dec           Abbreviated month name, based on the locale (an alias of %b)
-     * %m      01 - 12 (Jan - Dec)       Two digit representation of the month
-     * 
-     * === Year ===                     
-     * %C      19                        Two digit century (year/100, truncated to an integer)
-     * %y      09 for 2009               Two digit year
-     * %Y      2038                      Four digit year
-     * 
-     * === Time ===                     
-     * %H      00 through 23             Two digit representation of the hour in 24-hour format
-     * %I      01 through 12             Two digit representation of the hour in 12-hour format
-     * %l      1 through 12              Hour in 12-hour format, with a space preceeding single digits
-     * %M      00 through 59             Two digit representation of the minute
-     * %p      AM/PM                     UPPER-CASE 'AM' or 'PM' based on the given time
-     * %P      am/pm                     lower-case 'am' or 'pm' based on the given time
-     * %r      09:34:17 PM               Same as %I:%M:%S %p
-     * %R      00:35                     Same as %H:%M
-     * %S      00 through 59             Two digit representation of the second
-     * %T      21:34:17                  Same as %H:%M:%S
-     * %X      03:59:16                  Preferred time representation based on locale, without the date
-     * %z      -0500 or EST              Either the time zone offset from UTC or the abbreviation
-     * %Z      -0500 or EST              The time zone offset/abbreviation option NOT given by %z
-     * 
-     * === Time and Date ===            
-     * %D      02/05/09                  Same as %m/%d/%y
-     * %F      2009-02-05                Same as %Y-%m-%d (commonly used in database datestamps)
-     * %s      305815200                 Unix Epoch Time timestamp (same as the time() function)
-     * %x      02/05/09                  Preferred date representation, without the time
-     * 
-     * === Miscellaneous ===            
-     * %n        ---                     A newline character (\n)
-     * %t        ---                     A Tab character (\t)
-     * %%        ---                     A literal percentage character (%)
-     * </pre>
-     */
-    jsDate.formats.php = {
-        codes: {
-            //
-            // 2-part regex matcher for format codes
-            //
-            // first match must be the character before the code (to account for escaping)
-            // second match must be the format code character(s)
-            //
-            matcher: /()%((%|[a-z]))/i,
-            // day
-            a: 'AbbrDayName',
-            A: 'DayName',
-            d: 'Date.2',
-            e: 'Date',
-            j: 'DayOfYear.3',
-            u: 'DayOfWeek',
-            w: 'Day',
-            // week
-            U: 'FullWeekOfYear.2',
-            V: 'IsoWeek.2',
-            W: 'WeekOfYear.2',
-            // month
-            b: 'AbbrMonthName',
-            B: 'MonthName',
-            m: 'MonthNumber.2',
-            h: 'AbbrMonthName',
-            // year
-            C: 'Century.2',
-            y: 'ShortYear.2',
-            Y: 'FullYear',
-            // time
-            H: 'Hours.2',
-            I: 'Hours12.2',
-            l: 'Hours12',
-            p: 'AMPM',
-            P: 'AmPm',
-            M: 'Minutes.2',
-            S: 'Seconds.2',
-            s: 'Unix',
-            O: 'TimezoneOffset',
-            z: 'GmtOffset',
-            Z: 'TimezoneAbbr'
-        },
-        
-        shortcuts: {
-            D: '%m/%d/%y',
-            F: '%Y-%m-%d',
-            T: '%H:%M:%S',
-            X: '%H:%M:%S',
-            x: '%m/%d/%y',
-            R: '%H:%M',
-            r: '%I:%M:%S %p',
-            t: '\t',
-            n: '\n',
-            '%': '%'
-        }
-    };   
-    //
-    // Conceptually, the logic implemented here is similar to Ken Snyder's Date Instance Methods.
-    // I use his idea of a set of parsers which can be regular expressions or functions,
-    // iterating through those, and then seeing if Date.parse() will create a date.
-    // The parser expressions and functions are a little different and some bugs have been
-    // worked out.  Also, a lot of "pre-parsing" is done to fix implementation
-    // variations of Date.parse() between browsers.
-    //
-    jsDate.createDate = function(date) {
-        // if passing in multiple arguments, try Date constructor
-        if (date == null) {
-            return new Date();
-        }
-        // If the passed value is already a date object, return it
-        if (date instanceof Date) {
-            return date;
-        }
-        // if (typeof date == 'number') return new Date(date * 1000);
-        // If the passed value is an integer, interpret it as a javascript timestamp
-        if (typeof date == 'number') {
-            return new Date(date);
-        }
-        
-        // Before passing strings into Date.parse(), have to normalize them for certain conditions.
-        // If strings are not formatted staccording to the EcmaScript spec, results from Date parse will be implementation dependent.  
-        // 
-        // For example: 
-        //  * FF and Opera assume 2 digit dates are pre y2k, Chome assumes <50 is pre y2k, 50+ is 21st century.  
-        //  * Chrome will correctly parse '1984-1-25' into localtime, FF and Opera will not parse.
-        //  * Both FF, Chrome and Opera will parse '1984/1/25' into localtime.
-        
-        // remove leading and trailing spaces
-        var parsable = String(date).replace(/^\s*(.+)\s*$/g, '$1');
-        
-        // replace dahses (-) with slashes (/) in dates like n[nnn]/n[n]/n[nnn]
-        parsable = parsable.replace(/^([0-9]{1,4})-([0-9]{1,2})-([0-9]{1,4})/, "$1/$2/$3");
-        
-        /////////
-        // Need to check for '15-Dec-09' also.
-        // FF will not parse, but Chrome will.
-        // Chrome will set date to 2009 as well.
-        /////////
-        
-        // first check for 'dd-mmm-yyyy' or 'dd/mmm/yyyy' like '15-Dec-2010'
-        parsable = parsable.replace(/^(3[01]|[0-2]?\d)[-\/]([a-z]{3,})[-\/](\d{4})/i, "$1 $2 $3");
-        
-        // Now check for 'dd-mmm-yy' or 'dd/mmm/yy' and normalize years to default century.
-        var match = parsable.match(/^(3[01]|[0-2]?\d)[-\/]([a-z]{3,})[-\/](\d{2})\D*/i);
-        if (match && match.length > 3) {
-            var m3 = parseFloat(match[3]);
-            var ny = jsDate.config.defaultCentury + m3;
-            ny = String(ny);
-            
-            // now replace 2 digit year with 4 digit year
-            parsable = parsable.replace(/^(3[01]|[0-2]?\d)[-\/]([a-z]{3,})[-\/](\d{2})\D*/i, match[1] +' '+ match[2] +' '+ ny);
-            
-        }
-        
-        // Check for '1/19/70 8:14PM'
-        // where starts with mm/dd/yy or yy/mm/dd and have something after
-        // Check if 1st postiion is greater than 31, assume it is year.
-        // Assme all 2 digit years are 1900's.
-        // Finally, change them into US style mm/dd/yyyy representations.
-        match = parsable.match(/^([0-9]{1,2})[-\/]([0-9]{1,2})[-\/]([0-9]{1,2})[^0-9]/);
-        
-        function h1(parsable, match) {
-            var m1 = parseFloat(match[1]);
-            var m2 = parseFloat(match[2]);
-            var m3 = parseFloat(match[3]);
-            var cent = jsDate.config.defaultCentury;
-            var ny, nd, nm, str;
-            
-            if (m1 > 31) { // first number is a year
-                nd = m3;
-                nm = m2;
-                ny = cent + m1;
-            }
-            
-            else { // last number is the year
-                nd = m2;
-                nm = m1;
-                ny = cent + m3;
-            }
-            
-            str = nm+'/'+nd+'/'+ny;
-            
-            // now replace 2 digit year with 4 digit year
-            return  parsable.replace(/^([0-9]{1,2})[-\/]([0-9]{1,2})[-\/]([0-9]{1,2})/, str);
-        
-        }
-        
-        if (match && match.length > 3) {
-            parsable = h1(parsable, match);
-        }
-        
-        // Now check for '1/19/70' with nothing after and do as above
-        var match = parsable.match(/^([0-9]{1,2})[-\/]([0-9]{1,2})[-\/]([0-9]{1,2})$/);
-        
-        if (match && match.length > 3) {
-            parsable = h1(parsable, match);
-        }
-                
-        
-        var i = 0;
-        var length = jsDate.matchers.length;
-        var pattern,
-            ms,
-            current = parsable,
-            obj;
-        while (i < length) {
-            ms = Date.parse(current);
-            if (!isNaN(ms)) {
-                return new Date(ms);
-            }
-            pattern = jsDate.matchers[i];
-            if (typeof pattern == 'function') {
-                obj = pattern.call(jsDate, current);
-                if (obj instanceof Date) {
-                    return obj;
-                }
-            } else {
-                current = parsable.replace(pattern[0], pattern[1]);
-            }
-            i++;
-        }
-        return NaN;
-    };
-    
-
-    /**
-     * @static
-     * Handy static utility function to return the number of days in a given month.
-     * @param {Integer} year Year
-     * @param {Integer} month Month (1-12)
-     * @returns {Integer} Number of days in the month.
-    */
-    //
-    // handy utility method Borrowed right from Ken Snyder's Date Instance Mehtods.
-    // 
-    jsDate.daysInMonth = function(year, month) {
-        if (month == 2) {
-            return new Date(year, 1, 29).getDate() == 29 ? 29 : 28;
-        }
-        return [undefined,31,undefined,31,30,31,30,31,31,30,31,30,31][month];
-    };
-
-
-    //
-    // An Array of regular expressions or functions that will attempt to match the date string.
-    // Functions are called with scope of a jsDate instance.
-    //
-    jsDate.matchers = [
-        // convert dd.mmm.yyyy to mm/dd/yyyy (world date to US date).
-        [/(3[01]|[0-2]\d)\s*\.\s*(1[0-2]|0\d)\s*\.\s*([1-9]\d{3})/, '$2/$1/$3'],
-        // convert yyyy-mm-dd to mm/dd/yyyy (ISO date to US date).
-        [/([1-9]\d{3})\s*-\s*(1[0-2]|0\d)\s*-\s*(3[01]|[0-2]\d)/, '$2/$3/$1'],
-        // Handle 12 hour or 24 hour time with milliseconds am/pm and optional date part.
-        function(str) { 
-            var match = str.match(/^(?:(.+)\s+)?([012]?\d)(?:\s*\:\s*(\d\d))?(?:\s*\:\s*(\d\d(\.\d*)?))?\s*(am|pm)?\s*$/i);
-            //                   opt. date      hour       opt. minute     opt. second       opt. msec   opt. am or pm
-            if (match) {
-                if (match[1]) {
-                    var d = this.createDate(match[1]);
-                    if (isNaN(d)) {
-                        return;
-                    }
-                } else {
-                    var d = new Date();
-                    d.setMilliseconds(0);
-                }
-                var hour = parseFloat(match[2]);
-                if (match[6]) {
-                    hour = match[6].toLowerCase() == 'am' ? (hour == 12 ? 0 : hour) : (hour == 12 ? 12 : hour + 12);
-                }
-                d.setHours(hour, parseInt(match[3] || 0, 10), parseInt(match[4] || 0, 10), ((parseFloat(match[5] || 0)) || 0)*1000);
-                return d;
-            }
-            else {
-                return str;
-            }
-        },
-        // Handle ISO timestamp with time zone.
-        function(str) {
-            var match = str.match(/^(?:(.+))[T|\s+]([012]\d)(?:\:(\d\d))(?:\:(\d\d))(?:\.\d+)([\+\-]\d\d\:\d\d)$/i);
-            if (match) {
-                if (match[1]) {
-                    var d = this.createDate(match[1]);
-                    if (isNaN(d)) {
-                        return;
-                    }
-                } else {
-                    var d = new Date();
-                    d.setMilliseconds(0);
-                }
-                var hour = parseFloat(match[2]);
-                d.setHours(hour, parseInt(match[3], 10), parseInt(match[4], 10), parseFloat(match[5])*1000);
-                return d;
-            }
-            else {
-                    return str;
-            }
-        },
-        // Try to match ambiguous strings like 12/8/22.
-        // Use FF date assumption that 2 digit years are 20th century (i.e. 1900's).
-        // This may be redundant with pre processing of date already performed.
-        function(str) {
-            var match = str.match(/^([0-3]?\d)\s*[-\/.\s]{1}\s*([a-zA-Z]{3,9})\s*[-\/.\s]{1}\s*([0-3]?\d)$/);
-            if (match) {
-                var d = new Date();
-                var cent = jsDate.config.defaultCentury;
-                var m1 = parseFloat(match[1]);
-                var m3 = parseFloat(match[3]);
-                var ny, nd, nm;
-                if (m1 > 31) { // first number is a year
-                    nd = m3;
-                    ny = cent + m1;
-                }
-                
-                else { // last number is the year
-                    nd = m1;
-                    ny = cent + m3;
-                }
-                
-                var nm = inArray(match[2], jsDate.regional[jsDate.regional.getLocale()]["monthNamesShort"]);
-                
-                if (nm == -1) {
-                    nm = inArray(match[2], jsDate.regional[jsDate.regional.getLocale()]["monthNames"]);
-                }
-            
-                d.setFullYear(ny, nm, nd);
-                d.setHours(0,0,0,0);
-                return d;
-            }
-            
-            else {
-                return str;
-            }
-        }      
-    ];
-
-    //
-    // I think John Reisig published this method on his blog, ejohn.
-    //
-    function inArray( elem, array ) {
-        if ( array.indexOf ) {
-            return array.indexOf( elem );
-        }
-
-        for ( var i = 0, length = array.length; i < length; i++ ) {
-            if ( array[ i ] === elem ) {
-                return i;
-            }
-        }
-
-        return -1;
-    }
-    
-    //
-    // Thanks to Kangax, Christian Sciberras and Stack Overflow for this method.
-    //
-    function get_type(thing){
-        if(thing===null) return "[object Null]"; // special case
-        return Object.prototype.toString.call(thing);
-    }
-    
-    $.jsDate = jsDate;
-
-      
-    /**
-     * JavaScript printf/sprintf functions.
-     * 
-     * This code has been adapted from the publicly available sprintf methods
-     * by Ash Searle. His original header follows:
-     *
-     *     This code is unrestricted: you are free to use it however you like.
-     *     
-     *     The functions should work as expected, performing left or right alignment,
-     *     truncating strings, outputting numbers with a required precision etc.
-     *
-     *     For complex cases, these functions follow the Perl implementations of
-     *     (s)printf, allowing arguments to be passed out-of-order, and to set the
-     *     precision or length of the output based on arguments instead of fixed
-     *     numbers.
-     *
-     *     See http://perldoc.perl.org/functions/sprintf.html for more information.
-     *
-     *     Implemented:
-     *     - zero and space-padding
-     *     - right and left-alignment,
-     *     - base X prefix (binary, octal and hex)
-     *     - positive number prefix
-     *     - (minimum) width
-     *     - precision / truncation / maximum width
-     *     - out of order arguments
-     *
-     *     Not implemented (yet):
-     *     - vector flag
-     *     - size (bytes, words, long-words etc.)
-     *     
-     *     Will not implement:
-     *     - %n or %p (no pass-by-reference in JavaScript)
-     *
-     *     @version 2007.04.27
-     *     @author Ash Searle 
-     * 
-     * You can see the original work and comments on his blog:
-     * http://hexmen.com/blog/2007/03/printf-sprintf/
-     * http://hexmen.com/js/sprintf.js
-     */
-     
-     /**
-      * @Modifications 2009.05.26
-      * @author Chris Leonello
-      * 
-      * Added %p %P specifier
-      * Acts like %g or %G but will not add more significant digits to the output than present in the input.
-      * Example:
-      * Format: '%.3p', Input: 0.012, Output: 0.012
-      * Format: '%.3g', Input: 0.012, Output: 0.0120
-      * Format: '%.4p', Input: 12.0, Output: 12.0
-      * Format: '%.4g', Input: 12.0, Output: 12.00
-      * Format: '%.4p', Input: 4.321e-5, Output: 4.321e-5
-      * Format: '%.4g', Input: 4.321e-5, Output: 4.3210e-5
-      * 
-      * Example:
-      * >>> $.jqplot.sprintf('%.2f, %d', 23.3452, 43.23)
-      * "23.35, 43"
-      * >>> $.jqplot.sprintf("no value: %n, decimal with thousands separator: %'d", 23.3452, 433524)
-      * "no value: , decimal with thousands separator: 433,524"
-      */
-    $.jqplot.sprintf = function() {
-        function pad(str, len, chr, leftJustify) {
-            var padding = (str.length >= len) ? '' : Array(1 + len - str.length >>> 0).join(chr);
-            return leftJustify ? str + padding : padding + str;
-
-        }
-
-        function thousand_separate(value) {
-            var value_str = new String(value);
-            for (var i=10; i>0; i--) {
-                if (value_str == (value_str = value_str.replace(/^(\d+)(\d{3})/, "$1"+$.jqplot.sprintf.thousandsSeparator+"$2"))) break;
-            }
-            return value_str; 
-        }
-
-        function justify(value, prefix, leftJustify, minWidth, zeroPad, htmlSpace) {
-            var diff = minWidth - value.length;
-            if (diff > 0) {
-                var spchar = ' ';
-                if (htmlSpace) { spchar = '&nbsp;'; }
-                if (leftJustify || !zeroPad) {
-                    value = pad(value, minWidth, spchar, leftJustify);
-                } else {
-                    value = value.slice(0, prefix.length) + pad('', diff, '0', true) + value.slice(prefix.length);
-                }
-            }
-            return value;
-        }
-
-        function formatBaseX(value, base, prefix, leftJustify, minWidth, precision, zeroPad, htmlSpace) {
-            // Note: casts negative numbers to positive ones
-            var number = value >>> 0;
-            prefix = prefix && number && {'2': '0b', '8': '0', '16': '0x'}[base] || '';
-            value = prefix + pad(number.toString(base), precision || 0, '0', false);
-            return justify(value, prefix, leftJustify, minWidth, zeroPad, htmlSpace);
-        }
-
-        function formatString(value, leftJustify, minWidth, precision, zeroPad, htmlSpace) {
-            if (precision != null) {
-                value = value.slice(0, precision);
-            }
-            return justify(value, '', leftJustify, minWidth, zeroPad, htmlSpace);
-        }
-
-        var a = arguments, i = 0, format = a[i++];
-
-        return format.replace($.jqplot.sprintf.regex, function(substring, valueIndex, flags, minWidth, _, precision, type) {
-            if (substring == '%%') { return '%'; }
-
-            // parse flags
-            var leftJustify = false, positivePrefix = '', zeroPad = false, prefixBaseX = false, htmlSpace = false, thousandSeparation = false;
-            for (var j = 0; flags && j < flags.length; j++) switch (flags.charAt(j)) {
-                case ' ': positivePrefix = ' '; break;
-                case '+': positivePrefix = '+'; break;
-                case '-': leftJustify = true; break;
-                case '0': zeroPad = true; break;
-                case '#': prefixBaseX = true; break;
-                case '&': htmlSpace = true; break;
-                case '\'': thousandSeparation = true; break;
-            }
-
-            // parameters may be null, undefined, empty-string or real valued
-            // we want to ignore null, undefined and empty-string values
-
-            if (!minWidth) {
-                minWidth = 0;
-            } 
-            else if (minWidth == '*') {
-                minWidth = +a[i++];
-            } 
-            else if (minWidth.charAt(0) == '*') {
-                minWidth = +a[minWidth.slice(1, -1)];
-            } 
-            else {
-                minWidth = +minWidth;
-            }
-
-            // Note: undocumented perl feature:
-            if (minWidth < 0) {
-                minWidth = -minWidth;
-                leftJustify = true;
-            }
-
-            if (!isFinite(minWidth)) {
-                throw new Error('$.jqplot.sprintf: (minimum-)width must be finite');
-            }
-
-            if (!precision) {
-                precision = 'fFeE'.indexOf(type) > -1 ? 6 : (type == 'd') ? 0 : void(0);
-            } 
-            else if (precision == '*') {
-                precision = +a[i++];
-            } 
-            else if (precision.charAt(0) == '*') {
-                precision = +a[precision.slice(1, -1)];
-            } 
-            else {
-                precision = +precision;
-            }
-
-            // grab value using valueIndex if required?
-            var value = valueIndex ? a[valueIndex.slice(0, -1)] : a[i++];
-
-            switch (type) {
-            case 's': {
-                if (value == null) {
-                    return '';
-                }
-                return formatString(String(value), leftJustify, minWidth, precision, zeroPad, htmlSpace);
-            }
-            case 'c': return formatString(String.fromCharCode(+value), leftJustify, minWidth, precision, zeroPad, htmlSpace);
-            case 'b': return formatBaseX(value, 2, prefixBaseX, leftJustify, minWidth, precision, zeroPad,htmlSpace);
-            case 'o': return formatBaseX(value, 8, prefixBaseX, leftJustify, minWidth, precision, zeroPad, htmlSpace);
-            case 'x': return formatBaseX(value, 16, prefixBaseX, leftJustify, minWidth, precision, zeroPad, htmlSpace);
-            case 'X': return formatBaseX(value, 16, prefixBaseX, leftJustify, minWidth, precision, zeroPad, htmlSpace).toUpperCase();
-            case 'u': return formatBaseX(value, 10, prefixBaseX, leftJustify, minWidth, precision, zeroPad, htmlSpace);
-            case 'i': {
-              var number = parseInt(+value, 10);
-              if (isNaN(number)) {
-                return '';
-              }
-              var prefix = number < 0 ? '-' : positivePrefix;
-              var number_str = thousandSeparation ? thousand_separate(String(Math.abs(number))): String(Math.abs(number));
-              value = prefix + pad(number_str, precision, '0', false);
-              //value = prefix + pad(String(Math.abs(number)), precision, '0', false);
-              return justify(value, prefix, leftJustify, minWidth, zeroPad, htmlSpace);
-                  }
-            case 'd': {
-              var number = Math.round(+value);
-              if (isNaN(number)) {
-                return '';
-              }
-              var prefix = number < 0 ? '-' : positivePrefix;
-              var number_str = thousandSeparation ? thousand_separate(String(Math.abs(number))): String(Math.abs(number));
-              value = prefix + pad(number_str, precision, '0', false);
-              return justify(value, prefix, leftJustify, minWidth, zeroPad, htmlSpace);
-                  }
-            case 'e':
-            case 'E':
-            case 'f':
-            case 'F':
-            case 'g':
-            case 'G':
-                      {
-                      var number = +value;
-                      if (isNaN(number)) {
-                          return '';
-                      }
-                      var prefix = number < 0 ? '-' : positivePrefix;
-                      var method = ['toExponential', 'toFixed', 'toPrecision']['efg'.indexOf(type.toLowerCase())];
-                      var textTransform = ['toString', 'toUpperCase']['eEfFgG'.indexOf(type) % 2];
-                      var number_str = Math.abs(number)[method](precision);
-                      
-                      // Apply the decimal mark properly by splitting the number by the
-                      //   decimalMark, applying thousands separator, and then placing it
-                      //   back in.
-                      var parts = number_str.toString().split('.');
-                      parts[0] = thousandSeparation ? thousand_separate(parts[0]) : parts[0];
-                      number_str = parts.join($.jqplot.sprintf.decimalMark);
-                      
-                      value = prefix + number_str;
-                      var justified = justify(value, prefix, leftJustify, minWidth, zeroPad, htmlSpace)[textTransform]();
-                      
-                      return justified;
-                  }
-            case 'p':
-            case 'P':
-            {
-                // make sure number is a number
-                var number = +value;
-                if (isNaN(number)) {
-                    return '';
-                }
-                var prefix = number < 0 ? '-' : positivePrefix;
-
-                var parts = String(Number(Math.abs(number)).toExponential()).split(/e|E/);
-                var sd = (parts[0].indexOf('.') != -1) ? parts[0].length - 1 : String(number).length;
-                var zeros = (parts[1] < 0) ? -parts[1] - 1 : 0;
-                
-                if (Math.abs(number) < 1) {
-                    if (sd + zeros  <= precision) {
-                        value = prefix + Math.abs(number).toPrecision(sd);
-                    }
-                    else {
-                        if (sd  <= precision - 1) {
-                            value = prefix + Math.abs(number).toExponential(sd-1);
-                        }
-                        else {
-                            value = prefix + Math.abs(number).toExponential(precision-1);
-                        }
-                    }
-                }
-                else {
-                    var prec = (sd <= precision) ? sd : precision;
-                    value = prefix + Math.abs(number).toPrecision(prec);
-                }
-                var textTransform = ['toString', 'toUpperCase']['pP'.indexOf(type) % 2];
-                return justify(value, prefix, leftJustify, minWidth, zeroPad, htmlSpace)[textTransform]();
-            }
-            case 'n': return '';
-            default: return substring;
-            }
-        });
-    };
-
-    $.jqplot.sprintf.thousandsSeparator = ',';
-    // Specifies the decimal mark for floating point values. By default a period '.'
-    // is used. If you change this value to for example a comma be sure to also
-    // change the thousands separator or else this won't work since a simple String
-    // replace is used (replacing all periods with the mark specified here).
-    $.jqplot.sprintf.decimalMark = '.';
-    
-    $.jqplot.sprintf.regex = /%%|%(\d+\$)?([-+#0&\' ]*)(\*\d+\$|\*|\d+)?(\.(\*\d+\$|\*|\d+))?([nAscboxXuidfegpEGP])/g;
-
-    $.jqplot.getSignificantFigures = function(number) {
-        var parts = String(Number(Math.abs(number)).toExponential()).split(/e|E/);
-        // total significant digits
-        var sd = (parts[0].indexOf('.') != -1) ? parts[0].length - 1 : parts[0].length;
-        var zeros = (parts[1] < 0) ? -parts[1] - 1 : 0;
-        // exponent
-        var expn = parseInt(parts[1], 10);
-        // digits to the left of the decimal place
-        var dleft = (expn + 1 > 0) ? expn + 1 : 0;
-        // digits to the right of the decimal place
-        var dright = (sd <= dleft) ? 0 : sd - expn - 1;
-        return {significantDigits: sd, digitsLeft: dleft, digitsRight: dright, zeros: zeros, exponent: expn} ;
-    };
-
-    $.jqplot.getPrecision = function(number) {
-        return $.jqplot.getSignificantFigures(number).digitsRight;
-    };
-
-  
-
-
-    var backCompat = $.uiBackCompat !== false;
-
-    $.jqplot.effects = {
-        effect: {}
-    };
-
-    // prefix used for storing data on .data()
-    var dataSpace = "jqplot.storage.";
-
-    /******************************************************************************/
-    /*********************************** EFFECTS **********************************/
-    /******************************************************************************/
-
-    $.extend( $.jqplot.effects, {
-        version: "1.9pre",
-
-        // Saves a set of properties in a data storage
-        save: function( element, set ) {
-            for( var i=0; i < set.length; i++ ) {
-                if ( set[ i ] !== null ) {
-                    element.data( dataSpace + set[ i ], element[ 0 ].style[ set[ i ] ] );
-                }
-            }
-        },
-
-        // Restores a set of previously saved properties from a data storage
-        restore: function( element, set ) {
-            for( var i=0; i < set.length; i++ ) {
-                if ( set[ i ] !== null ) {
-                    element.css( set[ i ], element.data( dataSpace + set[ i ] ) );
-                }
-            }
-        },
-
-        setMode: function( el, mode ) {
-            if (mode === "toggle") {
-                mode = el.is( ":hidden" ) ? "show" : "hide";
-            }
-            return mode;
-        },
-
-        // Wraps the element around a wrapper that copies position properties
-        createWrapper: function( element ) {
-
-            // if the element is already wrapped, return it
-            if ( element.parent().is( ".ui-effects-wrapper" )) {
-                return element.parent();
-            }
-
-            // wrap the element
-            var props = {
-                    width: element.outerWidth(true),
-                    height: element.outerHeight(true),
-                    "float": element.css( "float" )
-                },
-                wrapper = $( "<div></div>" )
-                    .addClass( "ui-effects-wrapper" )
-                    .css({
-                        fontSize: "100%",
-                        background: "transparent",
-                        border: "none",
-                        margin: 0,
-                        padding: 0
-                    }),
-                // Store the size in case width/height are defined in % - Fixes #5245
-                size = {
-                    width: element.width(),
-                    height: element.height()
-                },
-                active = document.activeElement;
-
-            element.wrap( wrapper );
-
-            // Fixes #7595 - Elements lose focus when wrapped.
-            if ( element[ 0 ] === active || $.contains( element[ 0 ], active ) ) {
-                $( active ).focus();
-            }
-
-            wrapper = element.parent(); //Hotfix for jQuery 1.4 since some change in wrap() seems to actually loose the reference to the wrapped element
-
-            // transfer positioning properties to the wrapper
-            if ( element.css( "position" ) === "static" ) {
-                wrapper.css({ position: "relative" });
-                element.css({ position: "relative" });
-            } else {
-                $.extend( props, {
-                    position: element.css( "position" ),
-                    zIndex: element.css( "z-index" )
-                });
-                $.each([ "top", "left", "bottom", "right" ], function(i, pos) {
-                    props[ pos ] = element.css( pos );
-                    if ( isNaN( parseInt( props[ pos ], 10 ) ) ) {
-                        props[ pos ] = "auto";
-                    }
-                });
-                element.css({
-                    position: "relative",
-                    top: 0,
-                    left: 0,
-                    right: "auto",
-                    bottom: "auto"
-                });
-            }
-            element.css(size);
-
-            return wrapper.css( props ).show();
-        },
-
-        removeWrapper: function( element ) {
-            var active = document.activeElement;
-
-            if ( element.parent().is( ".ui-effects-wrapper" ) ) {
-                element.parent().replaceWith( element );
-
-                // Fixes #7595 - Elements lose focus when wrapped.
-                if ( element[ 0 ] === active || $.contains( element[ 0 ], active ) ) {
-                    $( active ).focus();
-                }
-            }
-
-
-            return element;
-        }
-    });
-
-    // return an effect options object for the given parameters:
-    function _normalizeArguments( effect, options, speed, callback ) {
-
-        // short path for passing an effect options object:
-        if ( $.isPlainObject( effect ) ) {
-            return effect;
-        }
-
-        // convert to an object
-        effect = { effect: effect };
-
-        // catch (effect)
-        if ( options === undefined ) {
-            options = {};
-        }
-
-        // catch (effect, callback)
-        if ( $.isFunction( options ) ) {
-            callback = options;
-            speed = null;
-            options = {};
-        }
-
-        // catch (effect, speed, ?)
-        if ( $.type( options ) === "number" || $.fx.speeds[ options ]) {
-            callback = speed;
-            speed = options;
-            options = {};
-        }
-
-        // catch (effect, options, callback)
-        if ( $.isFunction( speed ) ) {
-            callback = speed;
-            speed = null;
-        }
-
-        // add options to effect
-        if ( options ) {
-            $.extend( effect, options );
-        }
-
-        speed = speed || options.duration;
-        effect.duration = $.fx.off ? 0 : typeof speed === "number"
-            ? speed : speed in $.fx.speeds ? $.fx.speeds[ speed ] : $.fx.speeds._default;
-
-        effect.complete = callback || options.complete;
-
-        return effect;
-    }
-
-    function standardSpeed( speed ) {
-        // valid standard speeds
-        if ( !speed || typeof speed === "number" || $.fx.speeds[ speed ] ) {
-            return true;
-        }
-
-        // invalid strings - treat as "normal" speed
-        if ( typeof speed === "string" && !$.jqplot.effects.effect[ speed ] ) {
-            // TODO: remove in 2.0 (#7115)
-            if ( backCompat && $.jqplot.effects[ speed ] ) {
-                return false;
-            }
-            return true;
-        }
-
-        return false;
-    }
-
-    $.fn.extend({
-        jqplotEffect: function( effect, options, speed, callback ) {
-            var args = _normalizeArguments.apply( this, arguments ),
-                mode = args.mode,
-                queue = args.queue,
-                effectMethod = $.jqplot.effects.effect[ args.effect ],
-
-                // DEPRECATED: remove in 2.0 (#7115)
-                oldEffectMethod = !effectMethod && backCompat && $.jqplot.effects[ args.effect ];
-
-            if ( $.fx.off || !( effectMethod || oldEffectMethod ) ) {
-                // delegate to the original method (e.g., .show()) if possible
-                if ( mode ) {
-                    return this[ mode ]( args.duration, args.complete );
-                } else {
-                    return this.each( function() {
-                        if ( args.complete ) {
-                            args.complete.call( this );
-                        }
-                    });
-                }
-            }
-
-            function run( next ) {
-                var elem = $( this ),
-                    complete = args.complete,
-                    mode = args.mode;
-
-                function done() {
-                    if ( $.isFunction( complete ) ) {
-                        complete.call( elem[0] );
-                    }
-                    if ( $.isFunction( next ) ) {
-                        next();
-                    }
-                }
-
-                // if the element is hiddden and mode is hide,
-                // or element is visible and mode is show
-                if ( elem.is( ":hidden" ) ? mode === "hide" : mode === "show" ) {
-                    done();
-                } else {
-                    effectMethod.call( elem[0], args, done );
-                }
-            }
-
-            // TODO: remove this check in 2.0, effectMethod will always be true
-            if ( effectMethod ) {
-                return queue === false ? this.each( run ) : this.queue( queue || "fx", run );
-            } else {
-                // DEPRECATED: remove in 2.0 (#7115)
-                return oldEffectMethod.call(this, {
-                    options: args,
-                    duration: args.duration,
-                    callback: args.complete,
-                    mode: args.mode
-                });
-            }
-        }
-    });
-
-
-
-
-    var rvertical = /up|down|vertical/,
-        rpositivemotion = /up|left|vertical|horizontal/;
-
-    $.jqplot.effects.effect.blind = function( o, done ) {
-        // Create element
-        var el = $( this ),
-            props = [ "position", "top", "bottom", "left", "right", "height", "width" ],
-            mode = $.jqplot.effects.setMode( el, o.mode || "hide" ),
-            direction = o.direction || "up",
-            vertical = rvertical.test( direction ),
-            ref = vertical ? "height" : "width",
-            ref2 = vertical ? "top" : "left",
-            motion = rpositivemotion.test( direction ),
-            animation = {},
-            show = mode === "show",
-            wrapper, distance, top;
-
-        // // if already wrapped, the wrapper's properties are my property. #6245
-        if ( el.parent().is( ".ui-effects-wrapper" ) ) {
-            $.jqplot.effects.save( el.parent(), props );
-        } else {
-            $.jqplot.effects.save( el, props );
-        }
-        el.show();
-        top = parseInt(el.css('top'), 10);
-        wrapper = $.jqplot.effects.createWrapper( el ).css({
-            overflow: "hidden"
-        });
-
-        distance = vertical ? wrapper[ ref ]() + top : wrapper[ ref ]();
-
-        animation[ ref ] = show ? String(distance) : '0';
-        if ( !motion ) {
-            el
-                .css( vertical ? "bottom" : "right", 0 )
-                .css( vertical ? "top" : "left", "" )
-                .css({ position: "absolute" });
-            animation[ ref2 ] = show ? '0' : String(distance);
-        }
-
-        // // start at 0 if we are showing
-        if ( show ) {
-            wrapper.css( ref, 0 );
-            if ( ! motion ) {
-                wrapper.css( ref2, distance );
-            }
-        }
-
-        // // Animate
-        wrapper.animate( animation, {
-            duration: o.duration,
-            easing: o.easing,
-            queue: false,
-            complete: function() {
-                if ( mode === "hide" ) {
-                    el.hide();
-                }
-                $.jqplot.effects.restore( el, props );
-                $.jqplot.effects.removeWrapper( el );
-                done();
-            }
-        });
-
-    };
-
-})(jQuery);
+(function(w){var l;w.fn.emptyForce=function(){for(var O=0,P;(P=w(this)[O])!=null;O++){if(P.nodeType===1){jQuery.cleanData(P.getElementsByTagName("*"))}if(w.jqplot_use_excanvas){P.outerHTML=""}else{while(P.firstChild){P.removeChild(P.firstChild)}}P=null}return w(this)};w.fn.removeChildForce=function(O){while(O.firstChild){this.removeChildForce(O.firstChild);O.removeChild(O.firstChild)}};w.jqplot=function(U,R,P){var Q,O;if(P==null){if(jQuery.isArray(R)){Q=R;O=null}else{if(typeof(R)==="object"){Q=null;O=R}}}else{Q=R;O=P}var T=new C();w("#"+U).removeClass("jqplot-error");if(w.jqplot.config.catchErrors){try{T.init(U,Q,O);T.draw();T.themeEngine.init.call(T);return T}catch(S){var V=w.jqplot.config.errorMessage||S.message;w("#"+U).append('<div class="jqplot-error-message">'+V+"</div>");w("#"+U).addClass("jqplot-error");document.getElementById(U).style.background=w.jqplot.config.errorBackground;document.getElementById(U).style.border=w.jqplot.config.errorBorder;document.getElementById(U).style.fontFamily=w.jqplot.config.errorFontFamily;document.getElementById(U).style.fontSize=w.jqplot.config.errorFontSize;document.getElementById(U).style.fontStyle=w.jqplot.config.errorFontStyle;document.getElementById(U).style.fontWeight=w.jqplot.config.errorFontWeight}}else{T.init(U,Q,O);T.draw();T.themeEngine.init.call(T);return T}};w.jqplot.version="1.0.0b2_r792";w.jqplot.CanvasManager=function(){if(typeof w.jqplot.CanvasManager.canvases=="undefined"){w.jqplot.CanvasManager.canvases=[];w.jqplot.CanvasManager.free=[]}var O=[];this.getCanvas=function(){var R;var Q=true;if(!w.jqplot.use_excanvas){for(var S=0,P=w.jqplot.CanvasManager.canvases.length;S<P;S++){if(w.jqplot.CanvasManager.free[S]===true){Q=false;R=w.jqplot.CanvasManager.canvases[S];w.jqplot.CanvasManager.free[S]=false;O.push(S);break}}}if(Q){R=document.createElement("canvas");O.push(w.jqplot.CanvasManager.canvases.length);w.jqplot.CanvasManager.canvases.push(R);w.jqplot.CanvasManager.free.push(false)}return R};this.initCanvas=function(P){if(w.jqplot.use_excanvas){return window.G_vmlCanvasManager.initElement(P)}return P};this.freeAllCanvases=function(){for(var Q=0,P=O.length;Q<P;Q++){this.freeCanvas(O[Q])}O=[]};this.freeCanvas=function(P){if(w.jqplot.use_excanvas){window.G_vmlCanvasManager.uninitElement(w.jqplot.CanvasManager.canvases[P]);w.jqplot.CanvasManager.canvases[P]=null}else{var Q=w.jqplot.CanvasManager.canvases[P];Q.getContext("2d").clearRect(0,0,Q.width,Q.height);w(Q).unbind().removeAttr("class").removeAttr("style");w(Q).css({left:"",top:"",position:""});Q.width=0;Q.height=0;w.jqplot.CanvasManager.free[P]=true}}};w.jqplot.log=function(){if(window.console){console.log.apply(console,arguments)}};w.jqplot.config={enablePlugins:false,defaultHeight:300,defaultWidth:400,UTCAdjust:false,timezoneOffset:new Date(new Date().getTimezoneOffset()*60000),errorMessage:"",errorBackground:"",errorBorder:"",errorFontFamily:"",errorFontSize:"",errorFontStyle:"",errorFontWeight:"",catchErrors:false,defaultTickFormatString:"%.1f",defaultColors:["#4bb2c5","#EAA228","#c5b47f","#579575","#839557","#958c12","#953579","#4b5de4","#d8b83f","#ff5800","#0085cc","#c747a3","#cddf54","#FBD178","#26B4E3","#bd70c7"],defaultNegativeColors:["#498991","#C08840","#9F9274","#546D61","#646C4A","#6F6621","#6E3F5F","#4F64B0","#A89050","#C45923","#187399","#945381","#959E5C","#C7AF7B","#478396","#907294"]};w.jqplot.arrayMax=function(O){return Math.max.apply(Math,O)};w.jqplot.arrayMin=function(O){return Math.min.apply(Math,O)};w.jqplot.enablePlugins=w.jqplot.config.enablePlugins;w.jqplot.support_canvas=function(){if(typeof w.jqplot.support_canvas.result=="undefined"){w.jqplot.support_canvas.result=!!document.createElement("canvas").getContext}return w.jqplot.support_canvas.result};w.jqplot.support_canvas_text=function(){if(typeof w.jqplot.support_canvas_text.result=="undefined"){w.jqplot.support_canvas_text.result=!!(document.createElement("canvas").getContext&&typeof document.createElement("canvas").getContext("2d").fillText=="function")}return w.jqplot.support_canvas_text.result};w.jqplot.use_excanvas=(w.browser.msie&&!w.jqplot.support_canvas())?true:false;w.jqplot.preInitHooks=[];w.jqplot.postInitHooks=[];w.jqplot.preParseOptionsHooks=[];w.jqplot.postParseOptionsHooks=[];w.jqplot.preDrawHooks=[];w.jqplot.postDrawHooks=[];w.jqplot.preDrawSeriesHooks=[];w.jqplot.postDrawSeriesHooks=[];w.jqplot.preDrawLegendHooks=[];w.jqplot.addLegendRowHooks=[];w.jqplot.preSeriesInitHooks=[];w.jqplot.postSeriesInitHooks=[];w.jqplot.preParseSeriesOptionsHooks=[];w.jqplot.postParseSeriesOptionsHooks=[];w.jqplot.eventListenerHooks=[];w.jqplot.preDrawSeriesShadowHooks=[];w.jqplot.postDrawSeriesShadowHooks=[];w.jqplot.ElemContainer=function(){this._elem;this._plotWidth;this._plotHeight;this._plotDimensions={height:null,width:null}};w.jqplot.ElemContainer.prototype.createElement=function(R,T,P,Q,U){this._offsets=T;var O=P||"jqplot";var S=document.createElement(R);this._elem=w(S);this._elem.addClass(O);this._elem.css(Q);this._elem.attr(U);S=null;return this._elem};w.jqplot.ElemContainer.prototype.getWidth=function(){if(this._elem){return this._elem.outerWidth(true)}else{return null}};w.jqplot.ElemContainer.prototype.getHeight=function(){if(this._elem){return this._elem.outerHeight(true)}else{return null}};w.jqplot.ElemContainer.prototype.getPosition=function(){if(this._elem){return this._elem.position()}else{return{top:null,left:null,bottom:null,right:null}}};w.jqplot.ElemContainer.prototype.getTop=function(){return this.getPosition().top};w.jqplot.ElemContainer.prototype.getLeft=function(){return this.getPosition().left};w.jqplot.ElemContainer.prototype.getBottom=function(){return this._elem.css("bottom")};w.jqplot.ElemContainer.prototype.getRight=function(){return this._elem.css("right")};function m(O){w.jqplot.ElemContainer.call(this);this.name=O;this._series=[];this.show=false;this.tickRenderer=w.jqplot.AxisTickRenderer;this.tickOptions={};this.labelRenderer=w.jqplot.AxisLabelRenderer;this.labelOptions={};this.label=null;this.showLabel=true;this.min=null;this.max=null;this.autoscale=false;this.pad=1.2;this.padMax=null;this.padMin=null;this.ticks=[];this.numberTicks;this.tickInterval;this.renderer=w.jqplot.LinearAxisRenderer;this.rendererOptions={};this.showTicks=true;this.showTickMarks=true;this.showMinorTicks=true;this.useSeriesColor=false;this.borderWidth=null;this.borderColor=null;this._dataBounds={min:null,max:null};this._intervalStats=[];this._offsets={min:null,max:null};this._ticks=[];this._label=null;this.syncTicks=null;this.tickSpacing=75;this._min=null;this._max=null;this._tickInterval=null;this._numberTicks=null;this.__ticks=null;this._options={}}m.prototype=new w.jqplot.ElemContainer();m.prototype.constructor=m;m.prototype.init=function(){this.renderer=new this.renderer();this.tickOptions.axis=this.name;if(this.tickOptions.showMark==null){this.tickOptions.showMark=this.showTicks}if(this.tickOptions.showMark==null){this.tickOptions.showMark=this.showTickMarks}if(this.tickOptions.showLabel==null){this.tickOptions.showLabel=this.showTicks}if(this.label==null||this.label==""){this.showLabel=false}else{this.labelOptions.label=this.label}if(this.showLabel==false){this.labelOptions.show=false}if(this.pad==0){this.pad=1}if(this.padMax==0){this.padMax=1}if(this.padMin==0){this.padMin=1}if(this.padMax==null){this.padMax=(this.pad-1)/2+1}if(this.padMin==null){this.padMin=(this.pad-1)/2+1}this.pad=this.padMax+this.padMin-1;if(this.min!=null||this.max!=null){this.autoscale=false}if(this.syncTicks==null&&this.name.indexOf("y")>-1){this.syncTicks=true}else{if(this.syncTicks==null){this.syncTicks=false}}this.renderer.init.call(this,this.rendererOptions)};m.prototype.draw=function(O,P){if(this.__ticks){this.__ticks=null}return this.renderer.draw.call(this,O,P)};m.prototype.set=function(){this.renderer.set.call(this)};m.prototype.pack=function(P,O){if(this.show){this.renderer.pack.call(this,P,O)}if(this._min==null){this._min=this.min;this._max=this.max;this._tickInterval=this.tickInterval;this._numberTicks=this.numberTicks;this.__ticks=this._ticks}};m.prototype.reset=function(){this.renderer.reset.call(this)};m.prototype.resetScale=function(O){w.extend(true,this,{min:null,max:null,numberTicks:null,tickInterval:null,_ticks:[],ticks:[]},O);this.resetDataBounds()};m.prototype.resetDataBounds=function(){var O=this._dataBounds;O.min=null;O.max=null;var R=(this.show)?true:false;for(var Q=0;Q<this._series.length;Q++){var S=this._series[Q];var V=S._plotData;var T=1,U=1;if(S._type!=null&&S._type=="ohlc"){T=3;U=2}for(var P=0;P<V.length;P++){if(this.name=="xaxis"||this.name=="x2axis"){if((V[P][0]!=null&&V[P][0]<O.min)||O.min==null){O.min=V[P][0]}if((V[P][0]!=null&&V[P][0]>O.max)||O.max==null){O.max=V[P][0]}}else{if((V[P][T]!=null&&V[P][T]<O.min)||O.min==null){O.min=V[P][T]}if((V[P][U]!=null&&V[P][U]>O.max)||O.max==null){O.max=V[P][U]}}}if(R&&S.renderer.constructor!==w.jqplot.BarRenderer){R=false}else{if(R&&this._options.hasOwnProperty("forceTickAt0")&&this._options.forceTickAt0==false){R=false}else{if(R&&S.renderer.constructor===w.jqplot.BarRenderer){if(S.barDirection=="vertical"&&this.name!="xaxis"&&this.name!="x2axis"){if(this._options.pad!=null||this._options.padMin!=null){R=false}}else{if(S.barDirection=="horizontal"&&(this.name=="xaxis"||this.name=="x2axis")){if(this._options.pad!=null||this._options.padMin!=null){R=false}}}}}}}if(R&&this.renderer.constructor===w.jqplot.LinearAxisRenderer&&O.min>=0){this.padMin=1;this.forceTickAt0=true}};function h(O){w.jqplot.ElemContainer.call(this);this.show=false;this.location="ne";this.labels=[];this.showLabels=true;this.showSwatches=true;this.placement="insideGrid";this.xoffset=0;this.yoffset=0;this.border;this.background;this.textColor;this.fontFamily;this.fontSize;this.rowSpacing="0.5em";this.renderer=w.jqplot.TableLegendRenderer;this.rendererOptions={};this.preDraw=false;this.marginTop=null;this.marginRight=null;this.marginBottom=null;this.marginLeft=null;this.escapeHtml=false;this._series=[];w.extend(true,this,O)}h.prototype=new w.jqplot.ElemContainer();h.prototype.constructor=h;h.prototype.setOptions=function(O){w.extend(true,this,O);if(this.placement=="inside"){this.placement="insideGrid"}if(this.xoffset>0){if(this.placement=="insideGrid"){switch(this.location){case"nw":case"w":case"sw":if(this.marginLeft==null){this.marginLeft=this.xoffset+"px"}this.marginRight="0px";break;case"ne":case"e":case"se":default:if(this.marginRight==null){this.marginRight=this.xoffset+"px"}this.marginLeft="0px";break}}else{if(this.placement=="outside"){switch(this.location){case"nw":case"w":case"sw":if(this.marginRight==null){this.marginRight=this.xoffset+"px"}this.marginLeft="0px";break;case"ne":case"e":case"se":default:if(this.marginLeft==null){this.marginLeft=this.xoffset+"px"}this.marginRight="0px";break}}}this.xoffset=0}if(this.yoffset>0){if(this.placement=="outside"){switch(this.location){case"sw":case"s":case"se":if(this.marginTop==null){this.marginTop=this.yoffset+"px"}this.marginBottom="0px";break;case"ne":case"n":case"nw":default:if(this.marginBottom==null){this.marginBottom=this.yoffset+"px"}this.marginTop="0px";break}}else{if(this.placement=="insideGrid"){switch(this.location){case"sw":case"s":case"se":if(this.marginBottom==null){this.marginBottom=this.yoffset+"px"}this.marginTop="0px";break;case"ne":case"n":case"nw":default:if(this.marginTop==null){this.marginTop=this.yoffset+"px"}this.marginBottom="0px";break}}}this.yoffset=0}};h.prototype.init=function(){this.renderer=new this.renderer();this.renderer.init.call(this,this.rendererOptions)};h.prototype.draw=function(P){for(var O=0;O<w.jqplot.preDrawLegendHooks.length;O++){w.jqplot.preDrawLegendHooks[O].call(this,P)}return this.renderer.draw.call(this,P)};h.prototype.pack=function(O){this.renderer.pack.call(this,O)};function n(O){w.jqplot.ElemContainer.call(this);this.text=O;this.show=true;this.fontFamily;this.fontSize;this.textAlign;this.textColor;this.renderer=w.jqplot.DivTitleRenderer;this.rendererOptions={}}n.prototype=new w.jqplot.ElemContainer();n.prototype.constructor=n;n.prototype.init=function(){this.renderer=new this.renderer();this.renderer.init.call(this,this.rendererOptions)};n.prototype.draw=function(O){return this.renderer.draw.call(this,O)};n.prototype.pack=function(){this.renderer.pack.call(this)};function D(){w.jqplot.ElemContainer.call(this);this.show=true;this.xaxis="xaxis";this._xaxis;this.yaxis="yaxis";this._yaxis;this.gridBorderWidth=2;this.renderer=w.jqplot.LineRenderer;this.rendererOptions={};this.data=[];this.gridData=[];this.label="";this.showLabel=true;this.color;this.lineWidth=2.5;this.lineJoin="round";this.lineCap="round";this.shadow=true;this.shadowAngle=45;this.shadowOffset=1.25;this.shadowDepth=3;this.shadowAlpha="0.1";this.breakOnNull=false;this.markerRenderer=w.jqplot.MarkerRenderer;this.markerOptions={};this.showLine=true;this.showMarker=true;this.index;this.fill=false;this.fillColor;this.fillAlpha;this.fillAndStroke=false;this.disableStack=false;this._stack=false;this.neighborThreshold=4;this.fillToZero=false;this.fillToValue=0;this.fillAxis="y";this.useNegativeColors=true;this._stackData=[];this._plotData=[];this._plotValues={x:[],y:[]};this._intervals={x:{},y:{}};this._prevPlotData=[];this._prevGridData=[];this._stackAxis="y";this._primaryAxis="_xaxis";this.canvas=new w.jqplot.GenericCanvas();this.shadowCanvas=new w.jqplot.GenericCanvas();this.plugins={};this._sumy=0;this._sumx=0;this._type=""}D.prototype=new w.jqplot.ElemContainer();D.prototype.constructor=D;D.prototype.init=function(Q,U,S){this.index=Q;this.gridBorderWidth=U;var T=this.data;var P=[],R;for(R=0;R<T.length;R++){if(!this.breakOnNull){if(T[R]==null||T[R][0]==null||T[R][1]==null){continue}else{P.push(T[R])}}else{P.push(T[R])}}this.data=P;if(!this.fillColor){this.fillColor=this.color}if(this.fillAlpha){var O=w.jqplot.normalize2rgb(this.fillColor);var O=w.jqplot.getColorComponents(O);this.fillColor="rgba("+O[0]+","+O[1]+","+O[2]+","+this.fillAlpha+")"}this.renderer=new this.renderer();this.renderer.init.call(this,this.rendererOptions,S);this.markerRenderer=new this.markerRenderer();if(!this.markerOptions.color){this.markerOptions.color=this.color}if(this.markerOptions.show==null){this.markerOptions.show=this.showMarker}this.showMarker=this.markerOptions.show;this.markerRenderer.init(this.markerOptions)};D.prototype.draw=function(U,R,T){var P=(R==l)?{}:R;U=(U==l)?this.canvas._ctx:U;var O,S,Q;for(O=0;O<w.jqplot.preDrawSeriesHooks.length;O++){w.jqplot.preDrawSeriesHooks[O].call(this,U,P)}if(this.show){this.renderer.setGridData.call(this,T);if(!P.preventJqPlotSeriesDrawTrigger){w(U.canvas).trigger("jqplotSeriesDraw",[this.data,this.gridData])}S=[];if(P.data){S=P.data}else{if(!this._stack){S=this.data}else{S=this._plotData}}Q=P.gridData||this.renderer.makeGridData.call(this,S,T);this.renderer.draw.call(this,U,Q,P,T)}for(O=0;O<w.jqplot.postDrawSeriesHooks.length;O++){w.jqplot.postDrawSeriesHooks[O].call(this,U,P)}U=R=T=O=S=Q=null};D.prototype.drawShadow=function(U,R,T){var P=(R==l)?{}:R;U=(U==l)?this.shadowCanvas._ctx:U;var O,S,Q;for(O=0;O<w.jqplot.preDrawSeriesShadowHooks.length;O++){w.jqplot.preDrawSeriesShadowHooks[O].call(this,U,P)}if(this.shadow){this.renderer.setGridData.call(this,T);S=[];if(P.data){S=P.data}else{if(!this._stack){S=this.data}else{S=this._plotData}}Q=P.gridData||this.renderer.makeGridData.call(this,S,T);this.renderer.drawShadow.call(this,U,Q,P)}for(O=0;O<w.jqplot.postDrawSeriesShadowHooks.length;O++){w.jqplot.postDrawSeriesShadowHooks[O].call(this,U,P)}U=R=T=O=S=Q=null};D.prototype.toggleDisplay=function(P){var O,Q;if(P.data.series){O=P.data.series}else{O=this}if(P.data.speed){Q=P.data.speed}if(Q){if(O.canvas._elem.is(":hidden")){if(O.shadowCanvas._elem){O.shadowCanvas._elem.fadeIn(Q)}O.canvas._elem.fadeIn(Q);O.canvas._elem.nextAll(".jqplot-point-label.jqplot-series-"+O.index).fadeIn(Q)}else{if(O.shadowCanvas._elem){O.shadowCanvas._elem.fadeOut(Q)}O.canvas._elem.fadeOut(Q);O.canvas._elem.nextAll(".jqplot-point-label.jqplot-series-"+O.index).fadeOut(Q)}}else{if(O.canvas._elem.is(":hidden")){if(O.shadowCanvas._elem){O.shadowCanvas._elem.show()}O.canvas._elem.show();O.canvas._elem.nextAll(".jqplot-point-label.jqplot-series-"+O.index).show()}else{if(O.shadowCanvas._elem){O.shadowCanvas._elem.hide()}O.canvas._elem.hide();O.canvas._elem.nextAll(".jqplot-point-label.jqplot-series-"+O.index).hide()}}};function x(){w.jqplot.ElemContainer.call(this);this.drawGridlines=true;this.gridLineColor="#cccccc";this.gridLineWidth=1;this.background="#fffdf6";this.borderColor="#999999";this.borderWidth=2;this.drawBorder=true;this.shadow=true;this.shadowAngle=45;this.shadowOffset=1.5;this.shadowWidth=3;this.shadowDepth=3;this.shadowColor=null;this.shadowAlpha="0.07";this._left;this._top;this._right;this._bottom;this._width;this._height;this._axes=[];this.renderer=w.jqplot.CanvasGridRenderer;this.rendererOptions={};this._offsets={top:null,bottom:null,left:null,right:null}}x.prototype=new w.jqplot.ElemContainer();x.prototype.constructor=x;x.prototype.init=function(){this.renderer=new this.renderer();this.renderer.init.call(this,this.rendererOptions)};x.prototype.createElement=function(O,P){this._offsets=O;return this.renderer.createElement.call(this,P)};x.prototype.draw=function(){this.renderer.draw.call(this)};w.jqplot.GenericCanvas=function(){w.jqplot.ElemContainer.call(this);this._ctx};w.jqplot.GenericCanvas.prototype=new w.jqplot.ElemContainer();w.jqplot.GenericCanvas.prototype.constructor=w.jqplot.GenericCanvas;w.jqplot.GenericCanvas.prototype.createElement=function(S,Q,P,T){this._offsets=S;var O="jqplot";if(Q!=l){O=Q}var R;R=T.canvasManager.getCanvas();if(P!=null){this._plotDimensions=P}R.width=this._plotDimensions.width-this._offsets.left-this._offsets.right;R.height=this._plotDimensions.height-this._offsets.top-this._offsets.bottom;this._elem=w(R);this._elem.css({position:"absolute",left:this._offsets.left,top:this._offsets.top});this._elem.addClass(O);R=T.canvasManager.initCanvas(R);R=null;return this._elem};w.jqplot.GenericCanvas.prototype.setContext=function(){this._ctx=this._elem.get(0).getContext("2d");return this._ctx};w.jqplot.GenericCanvas.prototype.resetCanvas=function(){if(this._elem){if(w.jqplot.use_excanvas){window.G_vmlCanvasManager.uninitElement(this._elem.get(0))}this._elem.emptyForce()}this._ctx=null};w.jqplot.HooksManager=function(){this.hooks=[]};w.jqplot.HooksManager.prototype.addOnce=function(P){var Q=false,O;for(O=0;O<this.hooks.length;O++){if(this.hooks[O][0]==P){Q=true}}if(!Q){this.hooks.push(P)}};w.jqplot.HooksManager.prototype.add=function(O){this.hooks.push(O)};w.jqplot.EventListenerManager=function(){this.hooks=[]};w.jqplot.EventListenerManager.prototype.addOnce=function(R,Q){var S=false,P,O;for(O=0;O<this.hooks.length;O++){P=this.hooks[O];if(P[0]==R&&P[1]==Q){S=true}}if(!S){this.hooks.push([R,Q])}};w.jqplot.EventListenerManager.prototype.add=function(P,O){this.hooks.push([P,O])};function C(){this.data=[];this.dataRenderer;this.dataRendererOptions;this.noDataIndicator={show:false,indicator:"Loading Data...",axes:{xaxis:{min:0,max:10,tickInterval:2,show:true},yaxis:{min:0,max:12,tickInterval:3,show:true}}};this.targetId=null;this.target=null;this.defaults={axesDefaults:{},axes:{xaxis:{},yaxis:{},x2axis:{},y2axis:{},y3axis:{},y4axis:{},y5axis:{},y6axis:{},y7axis:{},y8axis:{},y9axis:{}},seriesDefaults:{},series:[]};this.series=[];this.axes={xaxis:new m("xaxis"),yaxis:new m("yaxis"),x2axis:new m("x2axis"),y2axis:new m("y2axis"),y3axis:new m("y3axis"),y4axis:new m("y4axis"),y5axis:new m("y5axis"),y6axis:new m("y6axis"),y7axis:new m("y7axis"),y8axis:new m("y8axis"),y9axis:new m("y9axis")};this.grid=new x();this.legend=new h();this.baseCanvas=new w.jqplot.GenericCanvas();this.seriesStack=[];this.previousSeriesStack=[];this.eventCanvas=new w.jqplot.GenericCanvas();this._width=null;this._height=null;this._plotDimensions={height:null,width:null};this._gridPadding={top:null,right:null,bottom:null,left:null};this._defaultGridPadding={top:10,right:10,bottom:23,left:10};this.syncXTicks=true;this.syncYTicks=true;this.seriesColors=w.jqplot.config.defaultColors;this.negativeSeriesColors=w.jqplot.config.defaultNegativeColors;this.sortData=true;var Q=0;this.textColor;this.fontFamily;this.fontSize;this.title=new n();this.options={};this.stackSeries=false;this.defaultAxisStart=1;this._stackData=[];this._plotData=[];this.plugins={};this._drawCount=0;this.drawIfHidden=false;this.captureRightClick=false;this.themeEngine=new w.jqplot.ThemeEngine();this._sumy=0;this._sumx=0;this.preInitHooks=new w.jqplot.HooksManager();this.postInitHooks=new w.jqplot.HooksManager();this.preParseOptionsHooks=new w.jqplot.HooksManager();this.postParseOptionsHooks=new w.jqplot.HooksManager();this.preDrawHooks=new w.jqplot.HooksManager();this.postDrawHooks=new w.jqplot.HooksManager();this.preDrawSeriesHooks=new w.jqplot.HooksManager();this.postDrawSeriesHooks=new w.jqplot.HooksManager();this.preDrawLegendHooks=new w.jqplot.HooksManager();this.addLegendRowHooks=new w.jqplot.HooksManager();this.preSeriesInitHooks=new w.jqplot.HooksManager();this.postSeriesInitHooks=new w.jqplot.HooksManager();this.preParseSeriesOptionsHooks=new w.jqplot.HooksManager();this.postParseSeriesOptionsHooks=new w.jqplot.HooksManager();this.eventListenerHooks=new w.jqplot.EventListenerManager();this.preDrawSeriesShadowHooks=new w.jqplot.HooksManager();this.postDrawSeriesShadowHooks=new w.jqplot.HooksManager();this.colorGenerator=w.jqplot.ColorGenerator;this.canvasManager=new w.jqplot.CanvasManager();this.init=function(Z,W,ab){ab=ab||{};for(var X=0;X<w.jqplot.preInitHooks.length;X++){w.jqplot.preInitHooks[X].call(this,Z,W,ab)}for(var X=0;X<this.preInitHooks.hooks.length;X++){this.preInitHooks.hooks[X].call(this,Z,W,ab)}this.targetId="#"+Z;this.target=w("#"+Z);this.target.removeClass("jqplot-error");if(!this.target.get(0)){throw"No plot target specified"}if(this.target.css("position")=="static"){this.target.css("position","relative")}if(!this.target.hasClass("jqplot-target")){this.target.addClass("jqplot-target")}if(!this.target.height()){var Y;if(ab&&ab.height){Y=parseInt(ab.height,10)}else{if(this.target.attr("data-height")){Y=parseInt(this.target.attr("data-height"),10)}else{Y=parseInt(w.jqplot.config.defaultHeight,10)}}this._height=Y;this.target.css("height",Y+"px")}else{this._height=Y=this.target.height()}if(!this.target.width()){var aa;if(ab&&ab.width){aa=parseInt(ab.width,10)}else{if(this.target.attr("data-width")){aa=parseInt(this.target.attr("data-width"),10)}else{aa=parseInt(w.jqplot.config.defaultWidth,10)}}this._width=aa;this.target.css("width",aa+"px")}else{this._width=aa=this.target.width()}this._plotDimensions.height=this._height;this._plotDimensions.width=this._width;this.grid._plotDimensions=this._plotDimensions;this.title._plotDimensions=this._plotDimensions;this.baseCanvas._plotDimensions=this._plotDimensions;this.eventCanvas._plotDimensions=this._plotDimensions;this.legend._plotDimensions=this._plotDimensions;if(this._height<=0||this._width<=0||!this._height||!this._width){throw"Canvas dimension not set"}if(ab.dataRenderer&&jQuery.isFunction(ab.dataRenderer)){if(ab.dataRendererOptions){this.dataRendererOptions=ab.dataRendererOptions}this.dataRenderer=ab.dataRenderer;W=this.dataRenderer(W,this,this.dataRendererOptions)}if(ab.noDataIndicator&&jQuery.isPlainObject(ab.noDataIndicator)){w.extend(true,this.noDataIndicator,ab.noDataIndicator)}if(W==null||jQuery.isArray(W)==false||W.length==0||jQuery.isArray(W[0])==false||W[0].length==0){if(this.noDataIndicator.show==false){throw {name:"DataError",message:"No data to plot."}}else{for(var S in this.noDataIndicator.axes){for(var U in this.noDataIndicator.axes[S]){this.axes[S][U]=this.noDataIndicator.axes[S][U]}}this.postDrawHooks.add(function(){var ah=this.eventCanvas.getHeight();var ae=this.eventCanvas.getWidth();var ad=w('<div class="jqplot-noData-container" style="position:absolute;"></div>');this.target.append(ad);ad.height(ah);ad.width(ae);ad.css("top",this.eventCanvas._offsets.top);ad.css("left",this.eventCanvas._offsets.left);var ag=w('<div class="jqplot-noData-contents" style="text-align:center; position:relative; margin-left:auto; margin-right:auto;"></div>');ad.append(ag);ag.html(this.noDataIndicator.indicator);var af=ag.height();var ac=ag.width();ag.height(af);ag.width(ac);ag.css("top",(ah-af)/2+"px")})}}this.data=W;this.parseOptions(ab);if(this.textColor){this.target.css("color",this.textColor)}if(this.fontFamily){this.target.css("font-family",this.fontFamily)}if(this.fontSize){this.target.css("font-size",this.fontSize)}this.title.init();this.legend.init();this._sumy=0;this._sumx=0;for(var X=0;X<this.series.length;X++){this.seriesStack.push(X);this.previousSeriesStack.push(X);this.series[X].shadowCanvas._plotDimensions=this._plotDimensions;this.series[X].canvas._plotDimensions=this._plotDimensions;for(var V=0;V<w.jqplot.preSeriesInitHooks.length;V++){w.jqplot.preSeriesInitHooks[V].call(this.series[X],Z,W,this.options.seriesDefaults,this.options.series[X],this)}for(var V=0;V<this.preSeriesInitHooks.hooks.length;V++){this.preSeriesInitHooks.hooks[V].call(this.series[X],Z,W,this.options.seriesDefaults,this.options.series[X],this)}this.populatePlotData(this.series[X],X);this.series[X]._plotDimensions=this._plotDimensions;this.series[X].init(X,this.grid.borderWidth,this);for(var V=0;V<w.jqplot.postSeriesInitHooks.length;V++){w.jqplot.postSeriesInitHooks[V].call(this.series[X],Z,W,this.options.seriesDefaults,this.options.series[X],this)}for(var V=0;V<this.postSeriesInitHooks.hooks.length;V++){this.postSeriesInitHooks.hooks[V].call(this.series[X],Z,W,this.options.seriesDefaults,this.options.series[X],this)}this._sumy+=this.series[X]._sumy;this._sumx+=this.series[X]._sumx}for(var T in this.axes){this.axes[T]._plotDimensions=this._plotDimensions;this.axes[T].init()}if(this.sortData){O(this.series)}this.grid.init();this.grid._axes=this.axes;this.legend._series=this.series;for(var X=0;X<w.jqplot.postInitHooks.length;X++){w.jqplot.postInitHooks[X].call(this,Z,W,ab)}for(var X=0;X<this.postInitHooks.hooks.length;X++){this.postInitHooks.hooks[X].call(this,Z,W,ab)}};this.resetAxesScale=function(X,T){var V=T||{};var W=X||this.axes;if(W===true){W=this.axes}if(jQuery.isArray(W)){for(var U=0;U<W.length;U++){this.axes[W[U]].resetScale(V[W[U]])}}else{if(typeof(W)==="object"){for(var S in W){this.axes[S].resetScale(V[S])}}}};this.reInitialize=function(){this._height=this.target.height();this._width=this.target.width();if(this._height<=0||this._width<=0||!this._height||!this._width){throw"Target dimension not set"}this._plotDimensions.height=this._height;this._plotDimensions.width=this._width;this.grid._plotDimensions=this._plotDimensions;this.title._plotDimensions=this._plotDimensions;this.baseCanvas._plotDimensions=this._plotDimensions;this.eventCanvas._plotDimensions=this._plotDimensions;this.legend._plotDimensions=this._plotDimensions;for(var W in this.axes){this.axes[W]._plotWidth=this._width;this.axes[W]._plotHeight=this._height}this.title._plotWidth=this._width;if(this.textColor){this.target.css("color",this.textColor)}if(this.fontFamily){this.target.css("font-family",this.fontFamily)}if(this.fontSize){this.target.css("font-size",this.fontSize)}this._sumy=0;this._sumx=0;for(var U=0;U<this.series.length;U++){this.populatePlotData(this.series[U],U);this.series[U]._plotDimensions=this._plotDimensions;this.series[U].canvas._plotDimensions=this._plotDimensions;this._sumy+=this.series[U]._sumy;this._sumx+=this.series[U]._sumx}for(var S in this.axes){var T=this.axes[S]._ticks;for(var U=0;U<T.length;U++){var V=T[U]._elem;if(V){if(w.jqplot.use_excanvas){window.G_vmlCanvasManager.uninitElement(V.get(0))}V.emptyForce();V=null;T._elem=null}}T=null;this.axes[S]._plotDimensions=this._plotDimensions;this.axes[S]._ticks=[];this.axes[S].renderer.init.call(this.axes[S],{})}if(this.sortData){O(this.series)}this.grid._axes=this.axes;this.legend._series=this.series};function O(W){var aa,ab,ac,S,Z;for(var X=0;X<W.length;X++){var T;var Y=[W[X].data,W[X]._stackData,W[X]._plotData,W[X]._prevPlotData];for(var U=0;U<4;U++){T=true;aa=Y[U];if(W[X]._stackAxis=="x"){for(var V=0;V<aa.length;V++){if(typeof(aa[V][1])!="number"){T=false;break}}if(T){aa.sort(function(ae,ad){return ae[1]-ad[1]})}}else{for(var V=0;V<aa.length;V++){if(typeof(aa[V][0])!="number"){T=false;break}}if(T){aa.sort(function(ae,ad){return ae[0]-ad[0]})}}}}}this.populatePlotData=function(W,X){this._plotData=[];this._stackData=[];W._stackData=[];W._plotData=[];var aa={x:[],y:[]};if(this.stackSeries&&!W.disableStack){W._stack=true;var Y=W._stackAxis=="x"?0:1;var Z=Y?0:1;var ab=w.extend(true,[],W.data);var ac=w.extend(true,[],W.data);for(var U=0;U<X;U++){var S=this.series[U].data;for(var T=0;T<S.length;T++){ab[T][0]+=S[T][0];ab[T][1]+=S[T][1];ac[T][Y]+=S[T][Y]}}for(var V=0;V<ac.length;V++){aa.x.push(ac[V][0]);aa.y.push(ac[V][1])}this._plotData.push(ac);this._stackData.push(ab);W._stackData=ab;W._plotData=ac;W._plotValues=aa}else{for(var V=0;V<W.data.length;V++){aa.x.push(W.data[V][0]);aa.y.push(W.data[V][1])}this._stackData.push(W.data);this.series[X]._stackData=W.data;this._plotData.push(W.data);W._plotData=W.data;W._plotValues=aa}if(X>0){W._prevPlotData=this.series[X-1]._plotData}W._sumy=0;W._sumx=0;for(V=W.data.length-1;V>-1;V--){W._sumy+=W.data[V][1];W._sumx+=W.data[V][0]}};this.getNextSeriesColor=(function(T){var S=0;var U=T.seriesColors;return function(){if(S<U.length){return U[S++]}else{S=0;return U[S++]}}})(this);this.parseOptions=function(aa){for(var X=0;X<this.preParseOptionsHooks.hooks.length;X++){this.preParseOptionsHooks.hooks[X].call(this,aa)}for(var X=0;X<w.jqplot.preParseOptionsHooks.length;X++){w.jqplot.preParseOptionsHooks[X].call(this,aa)}this.options=w.extend(true,{},this.defaults,aa);this.stackSeries=this.options.stackSeries;if(this.options.seriesColors){this.seriesColors=this.options.seriesColors}if(this.options.negativeSeriesColors){this.negativeSeriesColors=this.options.negativeSeriesColors}if(this.options.captureRightClick){this.captureRightClick=this.options.captureRightClick}this.defaultAxisStart=(aa&&aa.defaultAxisStart!=null)?aa.defaultAxisStart:this.defaultAxisStart;var S=new this.colorGenerator(this.seriesColors);w.extend(true,this._gridPadding,this.options.gridPadding);this.sortData=(this.options.sortData!=null)?this.options.sortData:this.sortData;for(var T in this.axes){var V=this.axes[T];V._options=w.extend(true,{},this.options.axesDefaults,this.options.axes[T]);w.extend(true,V,this.options.axesDefaults,this.options.axes[T]);V._plotWidth=this._width;V._plotHeight=this._height}var Y=function(ae,ac,af){var ab=[];var ad;ac=ac||"vertical";if(!jQuery.isArray(ae[0])){for(ad=0;ad<ae.length;ad++){if(ac=="vertical"){ab.push([af+ad,ae[ad]])}else{ab.push([ae[ad],af+ad])}}}else{w.extend(true,ab,ae)}return ab};for(var X=0;X<this.data.length;X++){var Z=new D();for(var W=0;W<w.jqplot.preParseSeriesOptionsHooks.length;W++){w.jqplot.preParseSeriesOptionsHooks[W].call(Z,this.options.seriesDefaults,this.options.series[X])}for(var W=0;W<this.preParseSeriesOptionsHooks.hooks.length;W++){this.preParseSeriesOptionsHooks.hooks[W].call(Z,this.options.seriesDefaults,this.options.series[X])}w.extend(true,Z,{seriesColors:this.seriesColors,negativeSeriesColors:this.negativeSeriesColors},this.options.seriesDefaults,this.options.series[X]);var U="vertical";if(Z.renderer===w.jqplot.BarRenderer&&Z.rendererOptions&&Z.rendererOptions.barDirection=="horizontal"){U="horizontal"}Z.data=Y(this.data[X],U,this.defaultAxisStart);switch(Z.xaxis){case"xaxis":Z._xaxis=this.axes.xaxis;break;case"x2axis":Z._xaxis=this.axes.x2axis;break;default:break}Z._yaxis=this.axes[Z.yaxis];Z._xaxis._series.push(Z);Z._yaxis._series.push(Z);if(Z.show){Z._xaxis.show=true;Z._yaxis.show=true}if(!Z.color&&Z.show!=false){Z.color=S.next()}if(!Z.label){Z.label="Series "+(X+1).toString()}this.series.push(Z);for(var W=0;W<w.jqplot.postParseSeriesOptionsHooks.length;W++){w.jqplot.postParseSeriesOptionsHooks[W].call(this.series[X],this.options.seriesDefaults,this.options.series[X])}for(var W=0;W<this.postParseSeriesOptionsHooks.hooks.length;W++){this.postParseSeriesOptionsHooks.hooks[W].call(this.series[X],this.options.seriesDefaults,this.options.series[X])}}w.extend(true,this.grid,this.options.grid);for(var T in this.axes){var V=this.axes[T];if(V.borderWidth==null){V.borderWidth=this.grid.borderWidth}if(V.borderColor==null){if(T!="xaxis"&&T!="x2axis"&&V.useSeriesColor===true&&V.show){V.borderColor=V._series[0].color}else{V.borderColor=this.grid.borderColor}}}if(typeof this.options.title=="string"){this.title.text=this.options.title}else{if(typeof this.options.title=="object"){w.extend(true,this.title,this.options.title)}}this.title._plotWidth=this._width;this.legend.setOptions(this.options.legend);for(var X=0;X<w.jqplot.postParseOptionsHooks.length;X++){w.jqplot.postParseOptionsHooks[X].call(this,aa)}for(var X=0;X<this.postParseOptionsHooks.hooks.length;X++){this.postParseOptionsHooks.hooks[X].call(this,aa)}};this.destroy=function(){this.canvasManager.freeAllCanvases();this.target[0].innerHTML=""};this.replot=function(T){var U=T||{};var S=U.clear||true;var V=U.resetAxes||false;this.target.trigger("jqplotPreReplot");if(S){this.canvasManager.freeAllCanvases();if(this._eventCanvas){this.eventCanvas._elem.unbind()}this.target.unbind();this.target.empty()}this.reInitialize();if(V){this.resetAxesScale(V,U.axes)}this.draw();this.target.trigger("jqplotPostReplot")};this.redraw=function(S){S=(S!=null)?S:true;this.target.trigger("jqplotPreRedraw");if(S){this.canvasManager.freeAllCanvases();this.eventCanvas._elem.unbind();this.target.unbind();this.target.empty()}for(var U in this.axes){this.axes[U]._ticks=[]}for(var T=0;T<this.series.length;T++){this.populatePlotData(this.series[T],T)}this._sumy=0;this._sumx=0;for(T=0;T<this.series.length;T++){this._sumy+=this.series[T]._sumy;this._sumx+=this.series[T]._sumx}this.draw();this.target.trigger("jqplotPostRedraw")};this.draw=function(){if(this.drawIfHidden||this.target.is(":visible")){this.target.trigger("jqplotPreDraw");var Y,X;for(Y=0;Y<w.jqplot.preDrawHooks.length;Y++){w.jqplot.preDrawHooks[Y].call(this)}for(Y=0;Y<this.preDrawHooks.hooks.length;Y++){this.preDrawHooks.hooks[Y].call(this)}this.target.append(this.baseCanvas.createElement({left:0,right:0,top:0,bottom:0},"jqplot-base-canvas",null,this));this.baseCanvas.setContext();this.target.append(this.title.draw());this.title.pack({top:0,left:0});var ad=this.legend.draw();var ac={top:0,left:0,bottom:0,right:0};if(this.legend.placement=="outsideGrid"){this.target.append(ad);switch(this.legend.location){case"n":ac.top+=this.legend.getHeight();break;case"s":ac.bottom+=this.legend.getHeight();break;case"ne":case"e":case"se":ac.right+=this.legend.getWidth();break;case"nw":case"w":case"sw":ac.left+=this.legend.getWidth();break;default:ac.right+=this.legend.getWidth();break}ad=ad.detach()}var S=this.axes;for(var U in S){this.target.append(S[U].draw(this.baseCanvas._ctx,this));S[U].set()}if(S.yaxis.show){ac.left+=S.yaxis.getWidth()}var V=["y2axis","y3axis","y4axis","y5axis","y6axis","y7axis","y8axis","y9axis"];var T=[0,0,0,0,0,0,0,0];var aa=0;var W;for(W=0;W<8;W++){if(S[V[W]].show){aa+=S[V[W]].getWidth();T[W]=aa}}ac.right+=aa;if(S.x2axis.show){ac.top+=S.x2axis.getHeight()}if(this.title.show){ac.top+=this.title.getHeight()}if(S.xaxis.show){ac.bottom+=S.xaxis.getHeight()}var Z=["top","bottom","left","right"];for(var W in Z){if(this._gridPadding[Z[W]]==null&&ac[Z[W]]>0){this._gridPadding[Z[W]]=ac[Z[W]]}else{if(this._gridPadding[Z[W]]==null){this._gridPadding[Z[W]]=this._defaultGridPadding[Z[W]]}}}var ab=(this.legend.placement=="outsideGrid")?{top:this.title.getHeight(),left:0,right:0,bottom:0}:this._gridPadding;S.xaxis.pack({position:"absolute",bottom:this._gridPadding.bottom-S.xaxis.getHeight(),left:0,width:this._width},{min:this._gridPadding.left,max:this._width-this._gridPadding.right});S.yaxis.pack({position:"absolute",top:0,left:this._gridPadding.left-S.yaxis.getWidth(),height:this._height},{min:this._height-this._gridPadding.bottom,max:this._gridPadding.top});S.x2axis.pack({position:"absolute",top:this._gridPadding.top-S.x2axis.getHeight(),left:0,width:this._width},{min:this._gridPadding.left,max:this._width-this._gridPadding.right});for(Y=8;Y>0;Y--){S[V[Y-1]].pack({position:"absolute",top:0,right:this._gridPadding.right-T[Y-1]},{min:this._height-this._gridPadding.bottom,max:this._gridPadding.top})}this.target.append(this.grid.createElement(this._gridPadding,this));this.grid.draw();for(Y=0;Y<this.series.length;Y++){X=this.seriesStack[Y];this.target.append(this.series[X].shadowCanvas.createElement(this._gridPadding,"jqplot-series-shadowCanvas",null,this));this.series[X].shadowCanvas.setContext();this.series[X].shadowCanvas._elem.data("seriesIndex",X)}for(Y=0;Y<this.series.length;Y++){X=this.seriesStack[Y];this.target.append(this.series[X].canvas.createElement(this._gridPadding,"jqplot-series-canvas",null,this));this.series[X].canvas.setContext();this.series[X].canvas._elem.data("seriesIndex",X)}this.target.append(this.eventCanvas.createElement(this._gridPadding,"jqplot-event-canvas",null,this));this.eventCanvas.setContext();this.eventCanvas._ctx.fillStyle="rgba(0,0,0,0)";this.eventCanvas._ctx.fillRect(0,0,this.eventCanvas._ctx.canvas.width,this.eventCanvas._ctx.canvas.height);this.bindCustomEvents();if(this.legend.preDraw){this.eventCanvas._elem.before(ad);this.legend.pack(ab);if(this.legend._elem){this.drawSeries({legendInfo:{location:this.legend.location,placement:this.legend.placement,width:this.legend.getWidth(),height:this.legend.getHeight(),xoffset:this.legend.xoffset,yoffset:this.legend.yoffset}})}else{this.drawSeries()}}else{this.drawSeries();if(this.series.length){w(this.series[this.series.length-1].canvas._elem).after(ad)}this.legend.pack(ab)}for(var Y=0;Y<w.jqplot.eventListenerHooks.length;Y++){this.eventCanvas._elem.bind(w.jqplot.eventListenerHooks[Y][0],{plot:this},w.jqplot.eventListenerHooks[Y][1])}for(var Y=0;Y<this.eventListenerHooks.hooks.length;Y++){this.eventCanvas._elem.bind(this.eventListenerHooks.hooks[Y][0],{plot:this},this.eventListenerHooks.hooks[Y][1])}for(var Y=0;Y<w.jqplot.postDrawHooks.length;Y++){w.jqplot.postDrawHooks[Y].call(this)}for(var Y=0;Y<this.postDrawHooks.hooks.length;Y++){this.postDrawHooks.hooks[Y].call(this)}if(this.target.is(":visible")){this._drawCount+=1}this.target.trigger("jqplotPostDraw",[this])}};this.bindCustomEvents=function(){this.eventCanvas._elem.bind("click",{plot:this},this.onClick);this.eventCanvas._elem.bind("dblclick",{plot:this},this.onDblClick);this.eventCanvas._elem.bind("mousedown",{plot:this},this.onMouseDown);this.eventCanvas._elem.bind("mousemove",{plot:this},this.onMouseMove);this.eventCanvas._elem.bind("mouseenter",{plot:this},this.onMouseEnter);this.eventCanvas._elem.bind("mouseleave",{plot:this},this.onMouseLeave);if(this.captureRightClick){this.eventCanvas._elem.bind("mouseup",{plot:this},this.onRightClick);this.eventCanvas._elem.get(0).oncontextmenu=function(){return false}}else{this.eventCanvas._elem.bind("mouseup",{plot:this},this.onMouseUp)}};function P(aa){var Z=aa.data.plot;var V=Z.eventCanvas._elem.offset();var Y={x:aa.pageX-V.left,y:aa.pageY-V.top};var W={xaxis:null,yaxis:null,x2axis:null,y2axis:null,y3axis:null,y4axis:null,y5axis:null,y6axis:null,y7axis:null,y8axis:null,y9axis:null};var X=["xaxis","yaxis","x2axis","y2axis","y3axis","y4axis","y5axis","y6axis","y7axis","y8axis","y9axis"];var S=Z.axes;var T,U;for(T=11;T>0;T--){U=X[T-1];if(S[U].show){W[U]=S[U].series_p2u(Y[U.charAt(0)])}}return{offsets:V,gridPos:Y,dataPos:W}}function R(S,T){var X=T.series;var aC,aB,aA,av,aw,ap,ao,ac,aa,af,ag,aq;var az,aD,ax,Y,an,at;var U,au;for(aA=T.seriesStack.length-1;aA>=0;aA--){aC=T.seriesStack[aA];av=X[aC];switch(av.renderer.constructor){case w.jqplot.BarRenderer:ap=S.x;ao=S.y;for(aB=0;aB<av._barPoints.length;aB++){an=av._barPoints[aB];ax=av.gridData[aB];if(ap>an[0][0]&&ap<an[2][0]&&ao>an[2][1]&&ao<an[0][1]){return{seriesIndex:av.index,pointIndex:aB,gridData:ax,data:av.data[aB],points:av._barPoints[aB]}}}break;case w.jqplot.DonutRenderer:af=av.startAngle/180*Math.PI;ap=S.x-av._center[0];ao=S.y-av._center[1];aw=Math.sqrt(Math.pow(ap,2)+Math.pow(ao,2));if(ap>0&&-ao>=0){ac=2*Math.PI-Math.atan(-ao/ap)}else{if(ap>0&&-ao<0){ac=-Math.atan(-ao/ap)}else{if(ap<0){ac=Math.PI-Math.atan(-ao/ap)}else{if(ap==0&&-ao>0){ac=3*Math.PI/2}else{if(ap==0&&-ao<0){ac=Math.PI/2}else{if(ap==0&&ao==0){ac=0}}}}}}if(af){ac-=af;if(ac<0){ac+=2*Math.PI}else{if(ac>2*Math.PI){ac-=2*Math.PI}}}aa=av.sliceMargin/180*Math.PI;if(aw<av._radius&&aw>av._innerRadius){for(aB=0;aB<av.gridData.length;aB++){ag=(aB>0)?av.gridData[aB-1][1]+aa:aa;aq=av.gridData[aB][1];if(ac>ag&&ac<aq){return{seriesIndex:av.index,pointIndex:aB,gridData:av.gridData[aB],data:av.data[aB]}}}}break;case w.jqplot.PieRenderer:af=av.startAngle/180*Math.PI;ap=S.x-av._center[0];ao=S.y-av._center[1];aw=Math.sqrt(Math.pow(ap,2)+Math.pow(ao,2));if(ap>0&&-ao>=0){ac=2*Math.PI-Math.atan(-ao/ap)}else{if(ap>0&&-ao<0){ac=-Math.atan(-ao/ap)}else{if(ap<0){ac=Math.PI-Math.atan(-ao/ap)}else{if(ap==0&&-ao>0){ac=3*Math.PI/2}else{if(ap==0&&-ao<0){ac=Math.PI/2}else{if(ap==0&&ao==0){ac=0}}}}}}if(af){ac-=af;if(ac<0){ac+=2*Math.PI}else{if(ac>2*Math.PI){ac-=2*Math.PI}}}aa=av.sliceMargin/180*Math.PI;if(aw<av._radius){for(aB=0;aB<av.gridData.length;aB++){ag=(aB>0)?av.gridData[aB-1][1]+aa:aa;aq=av.gridData[aB][1];if(ac>ag&&ac<aq){return{seriesIndex:av.index,pointIndex:aB,gridData:av.gridData[aB],data:av.data[aB]}}}}break;case w.jqplot.BubbleRenderer:ap=S.x;ao=S.y;var al=null;if(av.show){for(var aB=0;aB<av.gridData.length;aB++){ax=av.gridData[aB];aD=Math.sqrt((ap-ax[0])*(ap-ax[0])+(ao-ax[1])*(ao-ax[1]));if(aD<=ax[2]&&(aD<=az||az==null)){az=aD;al={seriesIndex:aC,pointIndex:aB,gridData:ax,data:av.data[aB]}}}if(al!=null){return al}}break;case w.jqplot.FunnelRenderer:ap=S.x;ao=S.y;var ar=av._vertices,W=ar[0],V=ar[ar.length-1],Z,ak,ae;function ay(aG,aI,aH){var aF=(aI[1]-aH[1])/(aI[0]-aH[0]);var aE=aI[1]-aF*aI[0];var aJ=aG+aI[1];return[(aJ-aE)/aF,aJ]}Z=ay(ao,W[0],V[3]);ak=ay(ao,W[1],V[2]);for(aB=0;aB<ar.length;aB++){ae=ar[aB];if(ao>=ae[0][1]&&ao<=ae[3][1]&&ap>=Z[0]&&ap<=ak[0]){return{seriesIndex:av.index,pointIndex:aB,gridData:null,data:av.data[aB]}}}break;case w.jqplot.LineRenderer:ap=S.x;ao=S.y;aw=av.renderer;if(av.show){if(av.fill){var ad=false;if(ap>av._boundingBox[0][0]&&ap<av._boundingBox[1][0]&&ao>av._boundingBox[1][1]&&ao<av._boundingBox[0][1]){var aj=av._areaPoints.length;var am;var aB=aj-1;for(var am=0;am<aj;am++){var ai=[av._areaPoints[am][0],av._areaPoints[am][1]];var ah=[av._areaPoints[aB][0],av._areaPoints[aB][1]];if(ai[1]<ao&&ah[1]>=ao||ah[1]<ao&&ai[1]>=ao){if(ai[0]+(ao-ai[1])/(ah[1]-ai[1])*(ah[0]-ai[0])<ap){ad=!ad}}aB=am}}if(ad){return{seriesIndex:aC,pointIndex:null,gridData:av.gridData,data:av.data,points:av._areaPoints}}break}else{au=av.markerRenderer.size/2+av.neighborThreshold;U=(au>0)?au:0;for(var aB=0;aB<av.gridData.length;aB++){ax=av.gridData[aB];if(aw.constructor==w.jqplot.OHLCRenderer){if(aw.candleStick){var ab=av._yaxis.series_u2p;if(ap>=ax[0]-aw._bodyWidth/2&&ap<=ax[0]+aw._bodyWidth/2&&ao>=ab(av.data[aB][2])&&ao<=ab(av.data[aB][3])){return{seriesIndex:aC,pointIndex:aB,gridData:ax,data:av.data[aB]}}}else{if(!aw.hlc){var ab=av._yaxis.series_u2p;if(ap>=ax[0]-aw._tickLength&&ap<=ax[0]+aw._tickLength&&ao>=ab(av.data[aB][2])&&ao<=ab(av.data[aB][3])){return{seriesIndex:aC,pointIndex:aB,gridData:ax,data:av.data[aB]}}}else{var ab=av._yaxis.series_u2p;if(ap>=ax[0]-aw._tickLength&&ap<=ax[0]+aw._tickLength&&ao>=ab(av.data[aB][1])&&ao<=ab(av.data[aB][2])){return{seriesIndex:aC,pointIndex:aB,gridData:ax,data:av.data[aB]}}}}}else{if(ax[0]!=null&&ax[1]!=null){aD=Math.sqrt((ap-ax[0])*(ap-ax[0])+(ao-ax[1])*(ao-ax[1]));if(aD<=U&&(aD<=az||az==null)){az=aD;return{seriesIndex:aC,pointIndex:aB,gridData:ax,data:av.data[aB]}}}}}}}break;default:ap=S.x;ao=S.y;aw=av.renderer;if(av.show){au=av.markerRenderer.size/2+av.neighborThreshold;U=(au>0)?au:0;for(var aB=0;aB<av.gridData.length;aB++){ax=av.gridData[aB];if(aw.constructor==w.jqplot.OHLCRenderer){if(aw.candleStick){var ab=av._yaxis.series_u2p;if(ap>=ax[0]-aw._bodyWidth/2&&ap<=ax[0]+aw._bodyWidth/2&&ao>=ab(av.data[aB][2])&&ao<=ab(av.data[aB][3])){return{seriesIndex:aC,pointIndex:aB,gridData:ax,data:av.data[aB]}}}else{if(!aw.hlc){var ab=av._yaxis.series_u2p;if(ap>=ax[0]-aw._tickLength&&ap<=ax[0]+aw._tickLength&&ao>=ab(av.data[aB][2])&&ao<=ab(av.data[aB][3])){return{seriesIndex:aC,pointIndex:aB,gridData:ax,data:av.data[aB]}}}else{var ab=av._yaxis.series_u2p;if(ap>=ax[0]-aw._tickLength&&ap<=ax[0]+aw._tickLength&&ao>=ab(av.data[aB][1])&&ao<=ab(av.data[aB][2])){return{seriesIndex:aC,pointIndex:aB,gridData:ax,data:av.data[aB]}}}}}else{aD=Math.sqrt((ap-ax[0])*(ap-ax[0])+(ao-ax[1])*(ao-ax[1]));if(aD<=U&&(aD<=az||az==null)){az=aD;return{seriesIndex:aC,pointIndex:aB,gridData:ax,data:av.data[aB]}}}}}break}}return null}this.onClick=function(U){var T=P(U);var W=U.data.plot;var V=R(T.gridPos,W);var S=jQuery.Event("jqplotClick");S.pageX=U.pageX;S.pageY=U.pageY;w(this).trigger(S,[T.gridPos,T.dataPos,V,W])};this.onDblClick=function(U){var T=P(U);var W=U.data.plot;var V=R(T.gridPos,W);var S=jQuery.Event("jqplotDblClick");S.pageX=U.pageX;S.pageY=U.pageY;w(this).trigger(S,[T.gridPos,T.dataPos,V,W])};this.onMouseDown=function(U){var T=P(U);var W=U.data.plot;var V=R(T.gridPos,W);var S=jQuery.Event("jqplotMouseDown");S.pageX=U.pageX;S.pageY=U.pageY;w(this).trigger(S,[T.gridPos,T.dataPos,V,W])};this.onMouseUp=function(U){var T=P(U);var S=jQuery.Event("jqplotMouseUp");S.pageX=U.pageX;S.pageY=U.pageY;w(this).trigger(S,[T.gridPos,T.dataPos,null,U.data.plot])};this.onRightClick=function(U){var T=P(U);var W=U.data.plot;var V=R(T.gridPos,W);if(W.captureRightClick){if(U.which==3){var S=jQuery.Event("jqplotRightClick");S.pageX=U.pageX;S.pageY=U.pageY;w(this).trigger(S,[T.gridPos,T.dataPos,V,W])}else{var S=jQuery.Event("jqplotMouseUp");S.pageX=U.pageX;S.pageY=U.pageY;w(this).trigger(S,[T.gridPos,T.dataPos,V,W])}}};this.onMouseMove=function(U){var T=P(U);var W=U.data.plot;var V=R(T.gridPos,W);var S=jQuery.Event("jqplotMouseMove");S.pageX=U.pageX;S.pageY=U.pageY;w(this).trigger(S,[T.gridPos,T.dataPos,V,W])};this.onMouseEnter=function(U){var T=P(U);var V=U.data.plot;var S=jQuery.Event("jqplotMouseEnter");S.pageX=U.pageX;S.pageY=U.pageY;w(this).trigger(S,[T.gridPos,T.dataPos,null,V])};this.onMouseLeave=function(U){var T=P(U);var V=U.data.plot;var S=jQuery.Event("jqplotMouseLeave");S.pageX=U.pageX;S.pageY=U.pageY;w(this).trigger(S,[T.gridPos,T.dataPos,null,V])};this.drawSeries=function(U,S){var W,V,T;S=(typeof(U)==="number"&&S==null)?U:S;U=(typeof(U)==="object")?U:{};if(S!=l){V=this.series[S];T=V.shadowCanvas._ctx;T.clearRect(0,0,T.canvas.width,T.canvas.height);V.drawShadow(T,U,this);T=V.canvas._ctx;T.clearRect(0,0,T.canvas.width,T.canvas.height);V.draw(T,U,this);if(V.renderer.constructor==w.jqplot.BezierCurveRenderer){if(S<this.series.length-1){this.drawSeries(S+1)}}}else{for(W=0;W<this.series.length;W++){V=this.series[W];T=V.shadowCanvas._ctx;T.clearRect(0,0,T.canvas.width,T.canvas.height);V.drawShadow(T,U,this);T=V.canvas._ctx;T.clearRect(0,0,T.canvas.width,T.canvas.height);V.draw(T,U,this)}}U=S=W=V=T=null};this.moveSeriesToFront=function(T){T=parseInt(T,10);var W=w.inArray(T,this.seriesStack);if(W==-1){return}if(W==this.seriesStack.length-1){this.previousSeriesStack=this.seriesStack.slice(0);return}var S=this.seriesStack[this.seriesStack.length-1];var V=this.series[T].canvas._elem.detach();var U=this.series[T].shadowCanvas._elem.detach();this.series[S].shadowCanvas._elem.after(U);this.series[S].canvas._elem.after(V);this.previousSeriesStack=this.seriesStack.slice(0);this.seriesStack.splice(W,1);this.seriesStack.push(T)};this.moveSeriesToBack=function(T){T=parseInt(T,10);var W=w.inArray(T,this.seriesStack);if(W==0||W==-1){return}var S=this.seriesStack[0];var V=this.series[T].canvas._elem.detach();var U=this.series[T].shadowCanvas._elem.detach();this.series[S].shadowCanvas._elem.before(U);this.series[S].canvas._elem.before(V);this.previousSeriesStack=this.seriesStack.slice(0);this.seriesStack.splice(W,1);this.seriesStack.unshift(T)};this.restorePreviousSeriesOrder=function(){var Y,X,W,V,U,S,T;if(this.seriesStack==this.previousSeriesStack){return}for(Y=1;Y<this.previousSeriesStack.length;Y++){S=this.previousSeriesStack[Y];T=this.previousSeriesStack[Y-1];W=this.series[S].canvas._elem.detach();V=this.series[S].shadowCanvas._elem.detach();this.series[T].shadowCanvas._elem.after(V);this.series[T].canvas._elem.after(W)}U=this.seriesStack.slice(0);this.seriesStack=this.previousSeriesStack.slice(0);this.previousSeriesStack=U};this.restoreOriginalSeriesOrder=function(){var W,V,S=[],U,T;for(W=0;W<this.series.length;W++){S.push(W)}if(this.seriesStack==S){return}this.previousSeriesStack=this.seriesStack.slice(0);this.seriesStack=S;for(W=1;W<this.seriesStack.length;W++){U=this.series[W].canvas._elem.detach();T=this.series[W].shadowCanvas._elem.detach();this.series[W-1].shadowCanvas._elem.after(T);this.series[W-1].canvas._elem.after(U)}};this.activateTheme=function(S){this.themeEngine.activate(this,S)}}w.jqplot.computeHighlightColors=function(P){var R;if(jQuery.isArray(P)){R=[];for(var T=0;T<P.length;T++){var S=w.jqplot.getColorComponents(P[T]);var O=[S[0],S[1],S[2]];var U=O[0]+O[1]+O[2];for(var Q=0;Q<3;Q++){O[Q]=(U>570)?O[Q]*0.8:O[Q]+0.3*(255-O[Q]);O[Q]=parseInt(O[Q],10)}R.push("rgb("+O[0]+","+O[1]+","+O[2]+")")}}else{var S=w.jqplot.getColorComponents(P);var O=[S[0],S[1],S[2]];var U=O[0]+O[1]+O[2];for(var Q=0;Q<3;Q++){O[Q]=(U>570)?O[Q]*0.8:O[Q]+0.3*(255-O[Q]);O[Q]=parseInt(O[Q],10)}R="rgb("+O[0]+","+O[1]+","+O[2]+")"}return R};w.jqplot.ColorGenerator=function(P){P=P||w.jqplot.config.defaultColors;var O=0;this.next=function(){if(O<P.length){return P[O++]}else{O=0;return P[O++]}};this.previous=function(){if(O>0){return P[O--]}else{O=P.length-1;return P[O]}};this.get=function(R){var Q=R-P.length*Math.floor(R/P.length);return P[Q]};this.setColors=function(Q){P=Q};this.reset=function(){O=0}};w.jqplot.hex2rgb=function(Q,O){Q=Q.replace("#","");if(Q.length==3){Q=Q.charAt(0)+Q.charAt(0)+Q.charAt(1)+Q.charAt(1)+Q.charAt(2)+Q.charAt(2)}var P;P="rgba("+parseInt(Q.slice(0,2),16)+", "+parseInt(Q.slice(2,4),16)+", "+parseInt(Q.slice(4,6),16);if(O){P+=", "+O}P+=")";return P};w.jqplot.rgb2hex=function(T){var Q=/rgba?\( *([0-9]{1,3}\.?[0-9]*%?) *, *([0-9]{1,3}\.?[0-9]*%?) *, *([0-9]{1,3}\.?[0-9]*%?) *(?:, *[0-9.]*)?\)/;var O=T.match(Q);var S="#";for(var R=1;R<4;R++){var P;if(O[R].search(/%/)!=-1){P=parseInt(255*O[R]/100,10).toString(16);if(P.length==1){P="0"+P}}else{P=parseInt(O[R],10).toString(16);if(P.length==1){P="0"+P}}S+=P}return S};w.jqplot.normalize2rgb=function(P,O){if(P.search(/^ *rgba?\(/)!=-1){return P}else{if(P.search(/^ *#?[0-9a-fA-F]?[0-9a-fA-F]/)!=-1){return w.jqplot.hex2rgb(P,O)}else{throw"invalid color spec"}}};w.jqplot.getColorComponents=function(T){T=w.jqplot.colorKeywordMap[T]||T;var R=w.jqplot.normalize2rgb(T);var Q=/rgba?\( *([0-9]{1,3}\.?[0-9]*%?) *, *([0-9]{1,3}\.?[0-9]*%?) *, *([0-9]{1,3}\.?[0-9]*%?) *,? *([0-9.]* *)?\)/;var O=R.match(Q);var P=[];for(var S=1;S<4;S++){if(O[S].search(/%/)!=-1){P[S-1]=parseInt(255*O[S]/100,10)}else{P[S-1]=parseInt(O[S],10)}}P[3]=parseFloat(O[4])?parseFloat(O[4]):1;return P};w.jqplot.colorKeywordMap={aliceblue:"rgb(240, 248, 255)",antiquewhite:"rgb(250, 235, 215)",aqua:"rgb( 0, 255, 255)",aquamarine:"rgb(127, 255, 212)",azure:"rgb(240, 255, 255)",beige:"rgb(245, 245, 220)",bisque:"rgb(255, 228, 196)",black:"rgb( 0, 0, 0)",blanchedalmond:"rgb(255, 235, 205)",blue:"rgb( 0, 0, 255)",blueviolet:"rgb(138, 43, 226)",brown:"rgb(165, 42, 42)",burlywood:"rgb(222, 184, 135)",cadetblue:"rgb( 95, 158, 160)",chartreuse:"rgb(127, 255, 0)",chocolate:"rgb(210, 105, 30)",coral:"rgb(255, 127, 80)",cornflowerblue:"rgb(100, 149, 237)",cornsilk:"rgb(255, 248, 220)",crimson:"rgb(220, 20, 60)",cyan:"rgb( 0, 255, 255)",darkblue:"rgb( 0, 0, 139)",darkcyan:"rgb( 0, 139, 139)",darkgoldenrod:"rgb(184, 134, 11)",darkgray:"rgb(169, 169, 169)",darkgreen:"rgb( 0, 100, 0)",darkgrey:"rgb(169, 169, 169)",darkkhaki:"rgb(189, 183, 107)",darkmagenta:"rgb(139, 0, 139)",darkolivegreen:"rgb( 85, 107, 47)",darkorange:"rgb(255, 140, 0)",darkorchid:"rgb(153, 50, 204)",darkred:"rgb(139, 0, 0)",darksalmon:"rgb(233, 150, 122)",darkseagreen:"rgb(143, 188, 143)",darkslateblue:"rgb( 72, 61, 139)",darkslategray:"rgb( 47, 79, 79)",darkslategrey:"rgb( 47, 79, 79)",darkturquoise:"rgb( 0, 206, 209)",darkviolet:"rgb(148, 0, 211)",deeppink:"rgb(255, 20, 147)",deepskyblue:"rgb( 0, 191, 255)",dimgray:"rgb(105, 105, 105)",dimgrey:"rgb(105, 105, 105)",dodgerblue:"rgb( 30, 144, 255)",firebrick:"rgb(178, 34, 34)",floralwhite:"rgb(255, 250, 240)",forestgreen:"rgb( 34, 139, 34)",fuchsia:"rgb(255, 0, 255)",gainsboro:"rgb(220, 220, 220)",ghostwhite:"rgb(248, 248, 255)",gold:"rgb(255, 215, 0)",goldenrod:"rgb(218, 165, 32)",gray:"rgb(128, 128, 128)",grey:"rgb(128, 128, 128)",green:"rgb( 0, 128, 0)",greenyellow:"rgb(173, 255, 47)",honeydew:"rgb(240, 255, 240)",hotpink:"rgb(255, 105, 180)",indianred:"rgb(205, 92, 92)",indigo:"rgb( 75, 0, 130)",ivory:"rgb(255, 255, 240)",khaki:"rgb(240, 230, 140)",lavender:"rgb(230, 230, 250)",lavenderblush:"rgb(255, 240, 245)",lawngreen:"rgb(124, 252, 0)",lemonchiffon:"rgb(255, 250, 205)",lightblue:"rgb(173, 216, 230)",lightcoral:"rgb(240, 128, 128)",lightcyan:"rgb(224, 255, 255)",lightgoldenrodyellow:"rgb(250, 250, 210)",lightgray:"rgb(211, 211, 211)",lightgreen:"rgb(144, 238, 144)",lightgrey:"rgb(211, 211, 211)",lightpink:"rgb(255, 182, 193)",lightsalmon:"rgb(255, 160, 122)",lightseagreen:"rgb( 32, 178, 170)",lightskyblue:"rgb(135, 206, 250)",lightslategray:"rgb(119, 136, 153)",lightslategrey:"rgb(119, 136, 153)",lightsteelblue:"rgb(176, 196, 222)",lightyellow:"rgb(255, 255, 224)",lime:"rgb( 0, 255, 0)",limegreen:"rgb( 50, 205, 50)",linen:"rgb(250, 240, 230)",magenta:"rgb(255, 0, 255)",maroon:"rgb(128, 0, 0)",mediumaquamarine:"rgb(102, 205, 170)",mediumblue:"rgb( 0, 0, 205)",mediumorchid:"rgb(186, 85, 211)",mediumpurple:"rgb(147, 112, 219)",mediumseagreen:"rgb( 60, 179, 113)",mediumslateblue:"rgb(123, 104, 238)",mediumspringgreen:"rgb( 0, 250, 154)",mediumturquoise:"rgb( 72, 209, 204)",mediumvioletred:"rgb(199, 21, 133)",midnightblue:"rgb( 25, 25, 112)",mintcream:"rgb(245, 255, 250)",mistyrose:"rgb(255, 228, 225)",moccasin:"rgb(255, 228, 181)",navajowhite:"rgb(255, 222, 173)",navy:"rgb( 0, 0, 128)",oldlace:"rgb(253, 245, 230)",olive:"rgb(128, 128, 0)",olivedrab:"rgb(107, 142, 35)",orange:"rgb(255, 165, 0)",orangered:"rgb(255, 69, 0)",orchid:"rgb(218, 112, 214)",palegoldenrod:"rgb(238, 232, 170)",palegreen:"rgb(152, 251, 152)",paleturquoise:"rgb(175, 238, 238)",palevioletred:"rgb(219, 112, 147)",papayawhip:"rgb(255, 239, 213)",peachpuff:"rgb(255, 218, 185)",peru:"rgb(205, 133, 63)",pink:"rgb(255, 192, 203)",plum:"rgb(221, 160, 221)",powderblue:"rgb(176, 224, 230)",purple:"rgb(128, 0, 128)",red:"rgb(255, 0, 0)",rosybrown:"rgb(188, 143, 143)",royalblue:"rgb( 65, 105, 225)",saddlebrown:"rgb(139, 69, 19)",salmon:"rgb(250, 128, 114)",sandybrown:"rgb(244, 164, 96)",seagreen:"rgb( 46, 139, 87)",seashell:"rgb(255, 245, 238)",sienna:"rgb(160, 82, 45)",silver:"rgb(192, 192, 192)",skyblue:"rgb(135, 206, 235)",slateblue:"rgb(106, 90, 205)",slategray:"rgb(112, 128, 144)",slategrey:"rgb(112, 128, 144)",snow:"rgb(255, 250, 250)",springgreen:"rgb( 0, 255, 127)",steelblue:"rgb( 70, 130, 180)",tan:"rgb(210, 180, 140)",teal:"rgb( 0, 128, 128)",thistle:"rgb(216, 191, 216)",tomato:"rgb(255, 99, 71)",turquoise:"rgb( 64, 224, 208)",violet:"rgb(238, 130, 238)",wheat:"rgb(245, 222, 179)",white:"rgb(255, 255, 255)",whitesmoke:"rgb(245, 245, 245)",yellow:"rgb(255, 255, 0)",yellowgreen:"rgb(154, 205, 50)"};w.jqplot.AxisLabelRenderer=function(O){w.jqplot.ElemContainer.call(this);this.axis;this.show=true;this.label="";this.fontFamily=null;this.fontSize=null;this.textColor=null;this._elem;this.escapeHTML=false;w.extend(true,this,O)};w.jqplot.AxisLabelRenderer.prototype=new w.jqplot.ElemContainer();w.jqplot.AxisLabelRenderer.prototype.constructor=w.jqplot.AxisLabelRenderer;w.jqplot.AxisLabelRenderer.prototype.init=function(O){w.extend(true,this,O)};w.jqplot.AxisLabelRenderer.prototype.draw=function(O,P){if(this._elem){this._elem.emptyForce();this._elem=null}this._elem=w('<div style="position:absolute;" class="jqplot-'+this.axis+'-label"></div>');if(Number(this.label)){this._elem.css("white-space","nowrap")}if(!this.escapeHTML){this._elem.html(this.label)}else{this._elem.text(this.label)}if(this.fontFamily){this._elem.css("font-family",this.fontFamily)}if(this.fontSize){this._elem.css("font-size",this.fontSize)}if(this.textColor){this._elem.css("color",this.textColor)}return this._elem};w.jqplot.AxisLabelRenderer.prototype.pack=function(){};w.jqplot.AxisTickRenderer=function(O){w.jqplot.ElemContainer.call(this);this.mark="outside";this.axis;this.showMark=true;this.showGridline=true;this.isMinorTick=false;this.size=4;this.markSize=6;this.show=true;this.showLabel=true;this.label="";this.value=null;this._styles={};this.formatter=w.jqplot.DefaultTickFormatter;this.prefix="";this.formatString="";this.fontFamily;this.fontSize;this.textColor;this.escapeHTML=false;this._elem;this._breakTick=false;w.extend(true,this,O)};w.jqplot.AxisTickRenderer.prototype.init=function(O){w.extend(true,this,O)};w.jqplot.AxisTickRenderer.prototype=new w.jqplot.ElemContainer();w.jqplot.AxisTickRenderer.prototype.constructor=w.jqplot.AxisTickRenderer;w.jqplot.AxisTickRenderer.prototype.setTick=function(O,Q,P){this.value=O;this.axis=Q;if(P){this.isMinorTick=true}return this};w.jqplot.AxisTickRenderer.prototype.draw=function(){if(!this.label){this.label=this.prefix+this.formatter(this.formatString,this.value)}var P={position:"absolute"};if(Number(this.label)){P.whitSpace="nowrap"}if(this._elem){this._elem.emptyForce();this._elem=null}this._elem=w(document.createElement("div"));this._elem.addClass("jqplot-"+this.axis+"-tick");if(!this.escapeHTML){this._elem.html(this.label)}else{this._elem.text(this.label)}this._elem.css(P);for(var O in this._styles){this._elem.css(O,this._styles[O])}if(this.fontFamily){this._elem.css("font-family",this.fontFamily)}if(this.fontSize){this._elem.css("font-size",this.fontSize)}if(this.textColor){this._elem.css("color",this.textColor)}if(this._breakTick){this._elem.addClass("jqplot-breakTick")}return this._elem};w.jqplot.DefaultTickFormatter=function(O,P){if(typeof P=="number"){if(!O){O=w.jqplot.config.defaultTickFormatString}return w.jqplot.sprintf(O,P)}else{return String(P)}};w.jqplot.AxisTickRenderer.prototype.pack=function(){};w.jqplot.CanvasGridRenderer=function(){this.shadowRenderer=new w.jqplot.ShadowRenderer()};w.jqplot.CanvasGridRenderer.prototype.init=function(P){this._ctx;w.extend(true,this,P);var O={lineJoin:"miter",lineCap:"round",fill:false,isarc:false,angle:this.shadowAngle,offset:this.shadowOffset,alpha:this.shadowAlpha,depth:this.shadowDepth,lineWidth:this.shadowWidth,closePath:false,strokeStyle:this.shadowColor};this.renderer.shadowRenderer.init(O)};w.jqplot.CanvasGridRenderer.prototype.createElement=function(R){var Q;if(this._elem){if(w.jqplot.use_excanvas){Q=this._elem.get(0);window.G_vmlCanvasManager.uninitElement(Q);Q=null}this._elem.emptyForce();this._elem=null}Q=R.canvasManager.getCanvas();var O=this._plotDimensions.width;var P=this._plotDimensions.height;Q.width=O;Q.height=P;this._elem=w(Q);this._elem.addClass("jqplot-grid-canvas");this._elem.css({position:"absolute",left:0,top:0});Q=R.canvasManager.initCanvas(Q);this._top=this._offsets.top;this._bottom=P-this._offsets.bottom;this._left=this._offsets.left;this._right=O-this._offsets.right;this._width=this._right-this._left;this._height=this._bottom-this._top;Q=null;return this._elem};w.jqplot.CanvasGridRenderer.prototype.draw=function(){this._ctx=this._elem.get(0).getContext("2d");var Y=this._ctx;var ab=this._axes;Y.save();Y.clearRect(0,0,this._plotDimensions.width,this._plotDimensions.height);Y.fillStyle=this.backgroundColor||this.background;Y.fillRect(this._left,this._top,this._width,this._height);if(true){Y.save();Y.lineJoin="miter";Y.lineCap="butt";Y.lineWidth=this.gridLineWidth;Y.strokeStyle=this.gridLineColor;var ae,ad,W,X;var T=["xaxis","yaxis","x2axis","y2axis"];for(var ac=4;ac>0;ac--){var ag=T[ac-1];var O=ab[ag];var af=O._ticks;if(O.show){for(var Z=af.length;Z>0;Z--){var U=af[Z-1];if(U.show){var R=Math.round(O.u2p(U.value))+0.5;switch(ag){case"xaxis":if(U.showGridline&&this.drawGridlines){V(R,this._top,R,this._bottom)}if(U.showMark&&U.mark){W=U.markSize;X=U.mark;var R=Math.round(O.u2p(U.value))+0.5;switch(X){case"outside":ae=this._bottom;ad=this._bottom+W;break;case"inside":ae=this._bottom-W;ad=this._bottom;break;case"cross":ae=this._bottom-W;ad=this._bottom+W;break;default:ae=this._bottom;ad=this._bottom+W;break}if(this.shadow){this.renderer.shadowRenderer.draw(Y,[[R,ae],[R,ad]],{lineCap:"butt",lineWidth:this.gridLineWidth,offset:this.gridLineWidth*0.75,depth:2,fill:false,closePath:false})}V(R,ae,R,ad)}break;case"yaxis":if(U.showGridline&&this.drawGridlines){V(this._right,R,this._left,R)}if(U.showMark&&U.mark){W=U.markSize;X=U.mark;var R=Math.round(O.u2p(U.value))+0.5;switch(X){case"outside":ae=this._left-W;ad=this._left;break;case"inside":ae=this._left;ad=this._left+W;break;case"cross":ae=this._left-W;ad=this._left+W;break;default:ae=this._left-W;ad=this._left;break}if(this.shadow){this.renderer.shadowRenderer.draw(Y,[[ae,R],[ad,R]],{lineCap:"butt",lineWidth:this.gridLineWidth*1.5,offset:this.gridLineWidth*0.75,fill:false,closePath:false})}V(ae,R,ad,R,{strokeStyle:O.borderColor})}break;case"x2axis":if(U.showGridline&&this.drawGridlines){V(R,this._bottom,R,this._top)}if(U.showMark&&U.mark){W=U.markSize;X=U.mark;var R=Math.round(O.u2p(U.value))+0.5;switch(X){case"outside":ae=this._top-W;ad=this._top;break;case"inside":ae=this._top;ad=this._top+W;break;case"cross":ae=this._top-W;ad=this._top+W;break;default:ae=this._top-W;ad=this._top;break}if(this.shadow){this.renderer.shadowRenderer.draw(Y,[[R,ae],[R,ad]],{lineCap:"butt",lineWidth:this.gridLineWidth,offset:this.gridLineWidth*0.75,depth:2,fill:false,closePath:false})}V(R,ae,R,ad)}break;case"y2axis":if(U.showGridline&&this.drawGridlines){V(this._left,R,this._right,R)}if(U.showMark&&U.mark){W=U.markSize;X=U.mark;var R=Math.round(O.u2p(U.value))+0.5;switch(X){case"outside":ae=this._right;ad=this._right+W;break;case"inside":ae=this._right-W;ad=this._right;break;case"cross":ae=this._right-W;ad=this._right+W;break;default:ae=this._right;ad=this._right+W;break}if(this.shadow){this.renderer.shadowRenderer.draw(Y,[[ae,R],[ad,R]],{lineCap:"butt",lineWidth:this.gridLineWidth*1.5,offset:this.gridLineWidth*0.75,fill:false,closePath:false})}V(ae,R,ad,R,{strokeStyle:O.borderColor})}break;default:break}}}U=null}O=null;af=null}T=["y3axis","y4axis","y5axis","y6axis","y7axis","y8axis","y9axis"];for(var ac=7;ac>0;ac--){var O=ab[T[ac-1]];var af=O._ticks;if(O.show){var P=af[O.numberTicks-1];var S=af[0];var Q=O.getLeft();var aa=[[Q,P.getTop()+P.getHeight()/2],[Q,S.getTop()+S.getHeight()/2+1]];if(this.shadow){this.renderer.shadowRenderer.draw(Y,aa,{lineCap:"butt",fill:false,closePath:false})}V(aa[0][0],aa[0][1],aa[1][0],aa[1][1],{lineCap:"butt",strokeStyle:O.borderColor,lineWidth:O.borderWidth});for(var Z=af.length;Z>0;Z--){var U=af[Z-1];W=U.markSize;X=U.mark;var R=Math.round(O.u2p(U.value))+0.5;if(U.showMark&&U.mark){switch(X){case"outside":ae=Q;ad=Q+W;break;case"inside":ae=Q-W;ad=Q;break;case"cross":ae=Q-W;ad=Q+W;break;default:ae=Q;ad=Q+W;break}aa=[[ae,R],[ad,R]];if(this.shadow){this.renderer.shadowRenderer.draw(Y,aa,{lineCap:"butt",lineWidth:this.gridLineWidth*1.5,offset:this.gridLineWidth*0.75,fill:false,closePath:false})}V(ae,R,ad,R,{strokeStyle:O.borderColor})}U=null}S=null}O=null;af=null}Y.restore()}function V(al,ak,ai,ah,aj){Y.save();aj=aj||{};if(aj.lineWidth==null||aj.lineWidth!=0){w.extend(true,Y,aj);Y.beginPath();Y.moveTo(al,ak);Y.lineTo(ai,ah);Y.stroke();Y.restore()}}if(this.shadow){var aa=[[this._left,this._bottom],[this._right,this._bottom],[this._right,this._top]];this.renderer.shadowRenderer.draw(Y,aa)}if(this.borderWidth!=0&&this.drawBorder){V(this._left,this._top,this._right,this._top,{lineCap:"round",strokeStyle:ab.x2axis.borderColor,lineWidth:ab.x2axis.borderWidth});V(this._right,this._top,this._right,this._bottom,{lineCap:"round",strokeStyle:ab.y2axis.borderColor,lineWidth:ab.y2axis.borderWidth});V(this._right,this._bottom,this._left,this._bottom,{lineCap:"round",strokeStyle:ab.xaxis.borderColor,lineWidth:ab.xaxis.borderWidth});V(this._left,this._bottom,this._left,this._top,{lineCap:"round",strokeStyle:ab.yaxis.borderColor,lineWidth:ab.yaxis.borderWidth})}Y.restore();Y=null;ab=null};w.jqplot.DivTitleRenderer=function(){};w.jqplot.DivTitleRenderer.prototype.init=function(O){w.extend(true,this,O)};w.jqplot.DivTitleRenderer.prototype.draw=function(){if(this._elem){this._elem.emptyForce();this._elem=null}var R=this.renderer;var Q=document.createElement("div");this._elem=w(Q);this._elem.addClass("jqplot-title");if(!this.text){this.show=false;this._elem.height(0);this._elem.width(0)}else{if(this.text){var O;if(this.color){O=this.color}else{if(this.textColor){O=this.textColor}}var P={position:"absolute",top:"0px",left:"0px"};if(this._plotWidth){P.width=this._plotWidth+"px"}if(this.fontSize){P.fontSize=this.fontSize}if(this.textAlign){P.textAlign=this.textAlign}else{P.textAlign="center"}if(O){P.color=O}if(this.paddingBottom){P.paddingBottom=this.paddingBottom}if(this.fontFamily){P.fontFamily=this.fontFamily}this._elem.css(P);this._elem.text(this.text)}}Q=null;return this._elem};w.jqplot.DivTitleRenderer.prototype.pack=function(){};w.jqplot.LineRenderer=function(){this.shapeRenderer=new w.jqplot.ShapeRenderer();this.shadowRenderer=new w.jqplot.ShadowRenderer()};w.jqplot.LineRenderer.prototype.init=function(P,T){P=P||{};this._type="line";var R={highlightMouseOver:P.highlightMouseOver,highlightMouseDown:P.highlightMouseDown,highlightColor:P.highlightColor};delete (P.highlightMouseOver);delete (P.highlightMouseDown);delete (P.highlightColor);w.extend(true,this.renderer,P);var S={lineJoin:this.lineJoin,lineCap:this.lineCap,fill:this.fill,isarc:false,strokeStyle:this.color,fillStyle:this.fillColor,lineWidth:this.lineWidth,closePath:this.fill};this.renderer.shapeRenderer.init(S);if(this.lineWidth>2.5){var Q=this.shadowOffset*(1+(Math.atan((this.lineWidth/2.5))/0.785398163-1)*0.6)}else{var Q=this.shadowOffset*Math.atan((this.lineWidth/2.5))/0.785398163}var O={lineJoin:this.lineJoin,lineCap:this.lineCap,fill:this.fill,isarc:false,angle:this.shadowAngle,offset:Q,alpha:this.shadowAlpha,depth:this.shadowDepth,lineWidth:this.lineWidth,closePath:this.fill};this.renderer.shadowRenderer.init(O);this._areaPoints=[];this._boundingBox=[[],[]];if(!this.isTrendline&&this.fill){this.highlightMouseOver=true;this.highlightMouseDown=false;this.highlightColor=null;if(R.highlightMouseDown&&R.highlightMouseOver==null){R.highlightMouseOver=false}w.extend(true,this,{highlightMouseOver:R.highlightMouseOver,highlightMouseDown:R.highlightMouseDown,highlightColor:R.highlightColor});if(!this.highlightColor){this.highlightColor=w.jqplot.computeHighlightColors(this.fillColor)}if(this.highlighter){this.highlighter.show=false}}if(!this.isTrendline&&T){T.plugins.lineRenderer={};T.postInitHooks.addOnce(o);T.postDrawHooks.addOnce(M);T.eventListenerHooks.addOnce("jqplotMouseMove",d);T.eventListenerHooks.addOnce("jqplotMouseDown",a);T.eventListenerHooks.addOnce("jqplotMouseUp",L);T.eventListenerHooks.addOnce("jqplotClick",c);T.eventListenerHooks.addOnce("jqplotRightClick",j)}};w.jqplot.LineRenderer.prototype.setGridData=function(T){var P=this._xaxis.series_u2p;var S=this._yaxis.series_u2p;var Q=this._plotData;var R=this._prevPlotData;this.gridData=[];this._prevGridData=[];for(var O=0;O<this.data.length;O++){if(Q[O][0]!=null&&Q[O][1]!=null){this.gridData.push([P.call(this._xaxis,Q[O][0]),S.call(this._yaxis,Q[O][1])])}else{if(Q[O][0]==null){this.gridData.push([null,S.call(this._yaxis,Q[O][1])])}else{if(Q[O][1]==null){this.gridData.push([P.call(this._xaxis,Q[O][0]),null])}}}if(R[O]!=null&&R[O][0]!=null&&R[O][1]!=null){this._prevGridData.push([P.call(this._xaxis,R[O][0]),S.call(this._yaxis,R[O][1])])}else{if(R[O]!=null&&R[O][0]==null){this._prevGridData.push([null,S.call(this._yaxis,R[O][1])])}else{if(R[O]!=null&&R[O][0]!=null&&R[O][1]==null){this._prevGridData.push([P.call(this._xaxis,R[O][0]),null])}}}}};w.jqplot.LineRenderer.prototype.makeGridData=function(R,T){var Q=this._xaxis.series_u2p;var S=this._yaxis.series_u2p;var P=[];var U=[];for(var O=0;O<R.length;O++){if(R[O][0]!=null&&R[O][1]!=null){P.push([Q.call(this._xaxis,R[O][0]),S.call(this._yaxis,R[O][1])])}else{if(R[O][0]==null){P.push([null,S.call(this._yaxis,R[O][1])])}else{if(R[O][1]==null){P.push([Q.call(this._xaxis,R[O][0]),null])}}}}return P};w.jqplot.LineRenderer.prototype.draw=function(ad,an,P){var ah;var X=(P!=l)?P:{};var R=(X.shadow!=l)?X.shadow:this.shadow;var ao=(X.showLine!=l)?X.showLine:this.showLine;var ag=(X.fill!=l)?X.fill:this.fill;var O=(X.fillAndStroke!=l)?X.fillAndStroke:this.fillAndStroke;var Y,ae,ab,aj;ad.save();if(an.length){if(ao){if(ag){if(this.fillToZero){var S=new w.jqplot.ColorGenerator(this.negativeSeriesColors);var ak=S.get(this.index);if(!this.useNegativeColors){ak=X.fillStyle}var V=false;var W=X.fillStyle;if(O){var am=an.slice(0)}if(this.index==0||!this._stack){var ac=[];this._areaPoints=[];var al=this._yaxis.series_u2p(this.fillToValue);var Q=this._xaxis.series_u2p(this.fillToValue);if(this.fillAxis=="y"){ac.push([an[0][0],al]);this._areaPoints.push([an[0][0],al]);for(var ah=0;ah<an.length-1;ah++){ac.push(an[ah]);this._areaPoints.push(an[ah]);if(this._plotData[ah][1]*this._plotData[ah+1][1]<0){if(this._plotData[ah][1]<0){V=true;X.fillStyle=ak}else{V=false;X.fillStyle=W}var U=an[ah][0]+(an[ah+1][0]-an[ah][0])*(al-an[ah][1])/(an[ah+1][1]-an[ah][1]);ac.push([U,al]);this._areaPoints.push([U,al]);if(R){this.renderer.shadowRenderer.draw(ad,ac,X)}this.renderer.shapeRenderer.draw(ad,ac,X);ac=[[U,al]]}}if(this._plotData[an.length-1][1]<0){V=true;X.fillStyle=ak}else{V=false;X.fillStyle=W}ac.push(an[an.length-1]);this._areaPoints.push(an[an.length-1]);ac.push([an[an.length-1][0],al]);this._areaPoints.push([an[an.length-1][0],al])}if(R){this.renderer.shadowRenderer.draw(ad,ac,X)}this.renderer.shapeRenderer.draw(ad,ac,X)}else{var aa=this._prevGridData;for(var ah=aa.length;ah>0;ah--){an.push(aa[ah-1])}if(R){this.renderer.shadowRenderer.draw(ad,an,X)}this._areaPoints=an;this.renderer.shapeRenderer.draw(ad,an,X)}}else{if(O){var am=an.slice(0)}if(this.index==0||!this._stack){var T=ad.canvas.height;an.unshift([an[0][0],T]);var ai=an.length;an.push([an[ai-1][0],T])}else{var aa=this._prevGridData;for(var ah=aa.length;ah>0;ah--){an.push(aa[ah-1])}}this._areaPoints=an;if(R){this.renderer.shadowRenderer.draw(ad,an,X)}this.renderer.shapeRenderer.draw(ad,an,X)}if(O){var af=w.extend(true,{},X,{fill:false,closePath:false});this.renderer.shapeRenderer.draw(ad,am,af);if(this.markerRenderer.show){for(ah=0;ah<am.length;ah++){this.markerRenderer.draw(am[ah][0],am[ah][1],ad,X.markerOptions)}}}}else{if(R){this.renderer.shadowRenderer.draw(ad,an,X)}this.renderer.shapeRenderer.draw(ad,an,X)}}var Y=ab=ae=aj=null;for(ah=0;ah<this._areaPoints.length;ah++){var Z=this._areaPoints[ah];if(Y>Z[0]||Y==null){Y=Z[0]}if(aj<Z[1]||aj==null){aj=Z[1]}if(ab<Z[0]||ab==null){ab=Z[0]}if(ae>Z[1]||ae==null){ae=Z[1]}}this._boundingBox=[[Y,aj],[ab,ae]];if(this.markerRenderer.show&&!ag){for(ah=0;ah<an.length;ah++){if(an[ah][0]!=null&&an[ah][1]!=null){this.markerRenderer.draw(an[ah][0],an[ah][1],ad,X.markerOptions)}}}}ad.restore()};w.jqplot.LineRenderer.prototype.drawShadow=function(O,Q,P){};function o(R,Q,O){for(var P=0;P<this.series.length;P++){if(this.series[P].renderer.constructor==w.jqplot.LineRenderer){if(this.series[P].highlightMouseOver){this.series[P].highlightMouseDown=false}}}this.target.bind("mouseout",{plot:this},function(S){I(S.data.plot)})}function M(){if(this.plugins.lineRenderer&&this.plugins.lineRenderer.highlightCanvas){this.plugins.lineRenderer.highlightCanvas.resetCanvas();this.plugins.lineRenderer.highlightCanvas=null}this.plugins.lineRenderer.highlightedSeriesIndex=null;this.plugins.lineRenderer.highlightCanvas=new w.jqplot.GenericCanvas();this.eventCanvas._elem.before(this.plugins.lineRenderer.highlightCanvas.createElement(this._gridPadding,"jqplot-lineRenderer-highlight-canvas",this._plotDimensions,this));this.plugins.lineRenderer.highlightCanvas.setContext()}function K(U,T,R,Q){var P=U.series[T];var O=U.plugins.lineRenderer.highlightCanvas;O._ctx.clearRect(0,0,O._ctx.canvas.width,O._ctx.canvas.height);P._highlightedPoint=R;U.plugins.lineRenderer.highlightedSeriesIndex=T;var S={fillStyle:P.highlightColor};P.renderer.shapeRenderer.draw(O._ctx,Q,S);O=null}function I(Q){var O=Q.plugins.lineRenderer.highlightCanvas;O._ctx.clearRect(0,0,O._ctx.canvas.width,O._ctx.canvas.height);for(var P=0;P<Q.series.length;P++){Q.series[P]._highlightedPoint=null}Q.plugins.lineRenderer.highlightedSeriesIndex=null;Q.target.trigger("jqplotDataUnhighlight");O=null}function d(S,R,V,U,T){if(U){var Q=[U.seriesIndex,U.pointIndex,U.data];var P=jQuery.Event("jqplotDataMouseOver");P.pageX=S.pageX;P.pageY=S.pageY;T.target.trigger(P,Q);if(T.series[Q[0]].highlightMouseOver&&!(Q[0]==T.plugins.lineRenderer.highlightedSeriesIndex)){var O=jQuery.Event("jqplotDataHighlight");O.pageX=S.pageX;O.pageY=S.pageY;T.target.trigger(O,Q);K(T,U.seriesIndex,U.pointIndex,U.points)}}else{if(U==null){I(T)}}}function a(R,Q,U,T,S){if(T){var P=[T.seriesIndex,T.pointIndex,T.data];if(S.series[P[0]].highlightMouseDown&&!(P[0]==S.plugins.lineRenderer.highlightedSeriesIndex)){var O=jQuery.Event("jqplotDataHighlight");O.pageX=R.pageX;O.pageY=R.pageY;S.target.trigger(O,P);K(S,T.seriesIndex,T.pointIndex,T.points)}}else{if(T==null){I(S)}}}function L(Q,P,T,S,R){var O=R.plugins.lineRenderer.highlightedSeriesIndex;if(O!=null&&R.series[O].highlightMouseDown){I(R)}}function c(R,Q,U,T,S){if(T){var P=[T.seriesIndex,T.pointIndex,T.data];var O=jQuery.Event("jqplotDataClick");O.pageX=R.pageX;O.pageY=R.pageY;S.target.trigger(O,P)}}function j(S,R,V,U,T){if(U){var Q=[U.seriesIndex,U.pointIndex,U.data];var O=T.plugins.lineRenderer.highlightedSeriesIndex;if(O!=null&&T.series[O].highlightMouseDown){I(T)}var P=jQuery.Event("jqplotDataRightClick");P.pageX=S.pageX;P.pageY=S.pageY;T.target.trigger(P,Q)}}w.jqplot.LinearAxisRenderer=function(){};w.jqplot.LinearAxisRenderer.prototype.init=function(O){this.breakPoints=null;this.breakTickLabel="&asymp;";this.forceTickAt0=false;this.forceTickAt100=false;this._autoFormatString="";this._overrideFormatString=false;w.extend(true,this,O);if(this.breakPoints){if(!w.isArray(this.breakPoints)){this.breakPoints=null}else{if(this.breakPoints.length<2||this.breakPoints[1]<=this.breakPoints[0]){this.breakPoints=null}}}this.resetDataBounds()};w.jqplot.LinearAxisRenderer.prototype.draw=function(O,V){if(this.show){this.renderer.createTicks.call(this);var U=0;var P;if(this._elem){this._elem.emptyForce();this._elem=null}this._elem=w(document.createElement("div"));this._elem.addClass("jqplot-axis jqplot-"+this.name);this._elem.css("posiiton","absolute");if(this.name=="xaxis"||this.name=="x2axis"){this._elem.width(this._plotDimensions.width)}else{this._elem.height(this._plotDimensions.height)}this.labelOptions.axis=this.name;this._label=new this.labelRenderer(this.labelOptions);if(this._label.show){var T=this._label.draw(O,V);T.appendTo(this._elem);T=null}var S=this._ticks;var R;for(var Q=0;Q<S.length;Q++){R=S[Q];if(R.show&&R.showLabel&&(!R.isMinorTick||this.showMinorTicks)){this._elem.append(R.draw(O,V))}}R=null;S=null}return this._elem};w.jqplot.LinearAxisRenderer.prototype.reset=function(){this.min=this._min;this.max=this._max;this.tickInterval=this._tickInterval;this.numberTicks=this._numberTicks;this._autoFormatString="";if(this._overrideFormatString&&this.tickOptions&&this.tickOptions.formatString){this.tickOptions.formatString=""}};w.jqplot.LinearAxisRenderer.prototype.set=function(){var V=0;var Q;var P=0;var U=0;var O=(this._label==null)?false:this._label.show;if(this.show){var T=this._ticks;var S;for(var R=0;R<T.length;R++){S=T[R];if(!S._breakTick&&S.show&&S.showLabel&&(!S.isMinorTick||this.showMinorTicks)){if(this.name=="xaxis"||this.name=="x2axis"){Q=S._elem.outerHeight(true)}else{Q=S._elem.outerWidth(true)}if(Q>V){V=Q}}}S=null;T=null;if(O){P=this._label._elem.outerWidth(true);U=this._label._elem.outerHeight(true)}if(this.name=="xaxis"){V=V+U;this._elem.css({height:V+"px",left:"0px",bottom:"0px"})}else{if(this.name=="x2axis"){V=V+U;this._elem.css({height:V+"px",left:"0px",top:"0px"})}else{if(this.name=="yaxis"){V=V+P;this._elem.css({width:V+"px",left:"0px",top:"0px"});if(O&&this._label.constructor==w.jqplot.AxisLabelRenderer){this._label._elem.css("width",P+"px")}}else{V=V+P;this._elem.css({width:V+"px",right:"0px",top:"0px"});if(O&&this._label.constructor==w.jqplot.AxisLabelRenderer){this._label._elem.css("width",P+"px")}}}}}};w.jqplot.LinearAxisRenderer.prototype.createTicks=function(){var ax=this._ticks;var an=this.ticks;var ae=this.name;var ag=this._dataBounds;var O,T;var aJ,al;var V,U;var aH,aE;var ak=this.min;var aI=this.max;var aA=this.numberTicks;var aM=this.tickInterval;if(an.length){for(aE=0;aE<an.length;aE++){var aq=an[aE];var ay=new this.tickRenderer(this.tickOptions);if(aq.constructor==Array){ay.value=aq[0];if(this.breakPoints){if(aq[0]==this.breakPoints[0]){ay.label=this.breakTickLabel;ay._breakTick=true;ay.showGridline=false;ay.showMark=false}else{if(aq[0]>this.breakPoints[0]&&aq[0]<=this.breakPoints[1]){ay.show=false;ay.showGridline=false;ay.label=aq[1]}else{ay.label=aq[1]}}}else{ay.label=aq[1]}ay.setTick(aq[0],this.name);this._ticks.push(ay)}else{ay.value=aq;if(this.breakPoints){if(aq==this.breakPoints[0]){ay.label=this.breakTickLabel;ay._breakTick=true;ay.showGridline=false;ay.showMark=false}else{if(aq>this.breakPoints[0]&&aq<=this.breakPoints[1]){ay.show=false;ay.showGridline=false}}}ay.setTick(aq,this.name);this._ticks.push(ay)}}this.numberTicks=an.length;this.min=this._ticks[0].value;this.max=this._ticks[this.numberTicks-1].value;this.tickInterval=(this.max-this.min)/(this.numberTicks-1)}else{if(ae=="xaxis"||ae=="x2axis"){O=this._plotDimensions.width}else{O=this._plotDimensions.height}aJ=((this.min!=null)?this.min:ag.min);al=((this.max!=null)?this.max:ag.max);var aa=al-aJ;var aw,ad;var Y;if(this.min==null&&this.max==null&&this.numberTicks==null&&this.tickInterval==null&&!this.autoscale){if(this.tickOptions==null||!this.tickOptions.formatString){this._overrideFormatString=true}if(this.forceTickAt0){if(aJ>0){aJ=0}if(al<0){al=0}}if(this.forceTickAt100){if(aJ>100){aJ=100}if(al<100){al=100}}var S=30;var at=Math.max(O,S+1);var ab=(at-S)/300;var ar=w.jqplot.LinearTickGenerator(aJ,al,ab);var ac=aJ+aa*(this.padMin-1);var au=al-aa*(this.padMax-1);if(aJ<=ac||al>=au){ac=aJ-aa*(this.padMin-1);au=al+aa*(this.padMax-1);ar=w.jqplot.LinearTickGenerator(ac,au,ab)}this.min=ar[0];this.max=ar[1];this.numberTicks=ar[2];this._autoFormatString=ar[3];this.tickInterval=ar[4]}else{if(aJ==al){var P=0.05;if(aJ>0){P=Math.max(Math.log(aJ)/Math.LN10,0.05)}aJ-=P;al+=P}if(this.autoscale&&this.min==null&&this.max==null){var Q,R,X;var ah=false;var ap=false;var af={min:null,max:null,average:null,stddev:null};for(var aE=0;aE<this._series.length;aE++){var az=this._series[aE];var ai=(az.fillAxis=="x")?az._xaxis.name:az._yaxis.name;if(this.name==ai){var av=az._plotValues[az.fillAxis];var aj=av[0];var aF=av[0];for(var aD=1;aD<av.length;aD++){if(av[aD]<aj){aj=av[aD]}else{if(av[aD]>aF){aF=av[aD]}}}var Z=(aF-aj)/aF;if(az.renderer.constructor==w.jqplot.BarRenderer){if(aj>=0&&(az.fillToZero||Z>0.1)){ah=true}else{ah=false;if(az.fill&&az.fillToZero&&aj<0&&aF>0){ap=true}else{ap=false}}}else{if(az.fill){if(aj>=0&&(az.fillToZero||Z>0.1)){ah=true}else{if(aj<0&&aF>0&&az.fillToZero){ah=false;ap=true}else{ah=false;ap=false}}}else{if(aj<0){ah=false}}}}}if(ah){this.numberTicks=2+Math.ceil((O-(this.tickSpacing-1))/this.tickSpacing);this.min=0;ak=0;R=al/(this.numberTicks-1);Y=Math.pow(10,Math.abs(Math.floor(Math.log(R)/Math.LN10)));if(R/Y==parseInt(R/Y,10)){R+=Y}this.tickInterval=Math.ceil(R/Y)*Y;this.max=this.tickInterval*(this.numberTicks-1)}else{if(ap){this.numberTicks=2+Math.ceil((O-(this.tickSpacing-1))/this.tickSpacing);var am=Math.ceil(Math.abs(aJ)/aa*(this.numberTicks-1));var aL=this.numberTicks-1-am;R=Math.max(Math.abs(aJ/am),Math.abs(al/aL));Y=Math.pow(10,Math.abs(Math.floor(Math.log(R)/Math.LN10)));this.tickInterval=Math.ceil(R/Y)*Y;this.max=this.tickInterval*aL;this.min=-this.tickInterval*am}else{if(this.numberTicks==null){if(this.tickInterval){this.numberTicks=3+Math.ceil(aa/this.tickInterval)}else{this.numberTicks=2+Math.ceil((O-(this.tickSpacing-1))/this.tickSpacing)}}if(this.tickInterval==null){R=aa/(this.numberTicks-1);if(R<1){Y=Math.pow(10,Math.abs(Math.floor(Math.log(R)/Math.LN10)))}else{Y=1}this.tickInterval=Math.ceil(R*Y*this.pad)/Y}else{Y=1/this.tickInterval}Q=this.tickInterval*(this.numberTicks-1);X=(Q-aa)/2;if(this.min==null){this.min=Math.floor(Y*(aJ-X))/Y}if(this.max==null){this.max=this.min+Q}}}}else{aw=(this.min!=null)?this.min:aJ-aa*(this.padMin-1);ad=(this.max!=null)?this.max:al+aa*(this.padMax-1);this.min=aw;this.max=ad;aa=this.max-this.min;if(this.numberTicks==null){if(this.tickInterval!=null){this.numberTicks=Math.ceil((this.max-this.min)/this.tickInterval)+1;this.max=this.min+this.tickInterval*(this.numberTicks-1)}else{if(O>100){this.numberTicks=parseInt(3+(O-100)/75,10)}else{this.numberTicks=2}}}if(this.tickInterval==null){this.tickInterval=aa/(this.numberTicks-1)}}if(this.renderer.constructor==w.jqplot.LinearAxisRenderer&&this._autoFormatString==""){aa=this.max-this.min;var aK=new this.tickRenderer(this.tickOptions);var ao=aK.formatString||w.jqplot.config.defaultTickFormatString;var ao=ao.match(w.jqplot.sprintf.regex)[0];var aG=0;if(ao){if(ao.search(/[fFeEgGpP]/)>-1){var aC=ao.match(/\%\.(\d{0,})?[eEfFgGpP]/);if(aC){aG=parseInt(aC[1],10)}else{aG=6}}else{if(ao.search(/[di]/)>-1){aG=0}}var W=Math.pow(10,-aG);if(this.tickInterval<W){if(aA==null&&aM==null){this.tickInterval=W;if(aI==null&&ak==null){this.min=Math.floor(this._dataBounds.min/W)*W;if(this.min==this._dataBounds.min){this.min=this._dataBounds.min-this.tickInterval}this.max=Math.ceil(this._dataBounds.max/W)*W;if(this.max==this._dataBounds.max){this.max=this._dataBounds.max+this.tickInterval}var aB=(this.max-this.min)/this.tickInterval;aB=aB.toFixed(11);aB=Math.ceil(aB);this.numberTicks=aB+1}else{if(aI==null){var aB=(this._dataBounds.max-this.min)/this.tickInterval;aB=aB.toFixed(11);this.numberTicks=Math.ceil(aB)+2;this.max=this.min+this.tickInterval*(this.numberTicks-1)}else{if(ak==null){var aB=(this.max-this._dataBounds.min)/this.tickInterval;aB=aB.toFixed(11);this.numberTicks=Math.ceil(aB)+2;this.min=this.max-this.tickInterval*(this.numberTicks-1)}else{this.numberTicks=Math.ceil((aI-ak)/this.tickInterval)+1;this.min=Math.floor(ak*Math.pow(10,aG))/Math.pow(10,aG);this.max=Math.ceil(aI*Math.pow(10,aG))/Math.pow(10,aG);this.numberTicks=Math.ceil((this.max-this.min)/this.tickInterval)+1}}}}}}}}if(this._overrideFormatString&&this._autoFormatString!=""){this.tickOptions=this.tickOptions||{};this.tickOptions.formatString=this._autoFormatString}for(var aE=0;aE<this.numberTicks;aE++){aH=this.min+aE*this.tickInterval;var ay=new this.tickRenderer(this.tickOptions);ay.setTick(aH,this.name);this._ticks.push(ay);ay=null}}ax=null};w.jqplot.LinearAxisRenderer.prototype.resetTickValues=function(Q){if(w.isArray(Q)&&Q.length==this._ticks.length){var P;for(var O=0;O<Q.length;O++){P=this._ticks[O];P.value=Q[O];P.label=P.formatter(P.formatString,Q[O]);P.label=P.prefix+P.label;P._elem.html(P.label)}P=null;this.min=w.jqplot.arrayMin(Q);this.max=w.jqplot.arrayMax(Q);this.pack()}};w.jqplot.LinearAxisRenderer.prototype.pack=function(Q,P){Q=Q||{};P=P||this._offsets;var ae=this._ticks;var aa=this.max;var Z=this.min;var V=P.max;var T=P.min;var X=(this._label==null)?false:this._label.show;for(var Y in Q){this._elem.css(Y,Q[Y])}this._offsets=P;var R=V-T;var S=aa-Z;if(this.breakPoints){S=S-this.breakPoints[1]+this.breakPoints[0];this.p2u=function(ag){return(ag-T)*S/R+Z};this.u2p=function(ag){if(ag>this.breakPoints[0]&&ag<this.breakPoints[1]){ag=this.breakPoints[0]}if(ag<=this.breakPoints[0]){return(ag-Z)*R/S+T}else{return(ag-this.breakPoints[1]+this.breakPoints[0]-Z)*R/S+T}};if(this.name.charAt(0)=="x"){this.series_u2p=function(ag){if(ag>this.breakPoints[0]&&ag<this.breakPoints[1]){ag=this.breakPoints[0]}if(ag<=this.breakPoints[0]){return(ag-Z)*R/S}else{return(ag-this.breakPoints[1]+this.breakPoints[0]-Z)*R/S}};this.series_p2u=function(ag){return ag*S/R+Z}}else{this.series_u2p=function(ag){if(ag>this.breakPoints[0]&&ag<this.breakPoints[1]){ag=this.breakPoints[0]}if(ag>=this.breakPoints[1]){return(ag-aa)*R/S}else{return(ag+this.breakPoints[1]-this.breakPoints[0]-aa)*R/S}};this.series_p2u=function(ag){return ag*S/R+aa}}}else{this.p2u=function(ag){return(ag-T)*S/R+Z};this.u2p=function(ag){return(ag-Z)*R/S+T};if(this.name=="xaxis"||this.name=="x2axis"){this.series_u2p=function(ag){return(ag-Z)*R/S};this.series_p2u=function(ag){return ag*S/R+Z}}else{this.series_u2p=function(ag){return(ag-aa)*R/S};this.series_p2u=function(ag){return ag*S/R+aa}}}if(this.show){if(this.name=="xaxis"||this.name=="x2axis"){for(var ab=0;ab<ae.length;ab++){var W=ae[ab];if(W.show&&W.showLabel){var O;if(W.constructor==w.jqplot.CanvasAxisTickRenderer&&W.angle){var ad=(this.name=="xaxis")?1:-1;switch(W.labelPosition){case"auto":if(ad*W.angle<0){O=-W.getWidth()+W._textRenderer.height*Math.sin(-W._textRenderer.angle)/2}else{O=-W._textRenderer.height*Math.sin(W._textRenderer.angle)/2}break;case"end":O=-W.getWidth()+W._textRenderer.height*Math.sin(-W._textRenderer.angle)/2;break;case"start":O=-W._textRenderer.height*Math.sin(W._textRenderer.angle)/2;break;case"middle":O=-W.getWidth()/2+W._textRenderer.height*Math.sin(-W._textRenderer.angle)/2;break;default:O=-W.getWidth()/2+W._textRenderer.height*Math.sin(-W._textRenderer.angle)/2;break}}else{O=-W.getWidth()/2}var af=this.u2p(W.value)+O+"px";W._elem.css("left",af);W.pack()}}if(X){var U=this._label._elem.outerWidth(true);this._label._elem.css("left",T+R/2-U/2+"px");if(this.name=="xaxis"){this._label._elem.css("bottom","0px")}else{this._label._elem.css("top","0px")}this._label.pack()}}else{for(var ab=0;ab<ae.length;ab++){var W=ae[ab];if(W.show&&W.showLabel){var O;if(W.constructor==w.jqplot.CanvasAxisTickRenderer&&W.angle){var ad=(this.name=="yaxis")?1:-1;switch(W.labelPosition){case"auto":case"end":if(ad*W.angle<0){O=-W._textRenderer.height*Math.cos(-W._textRenderer.angle)/2}else{O=-W.getHeight()+W._textRenderer.height*Math.cos(W._textRenderer.angle)/2}break;case"start":if(W.angle>0){O=-W._textRenderer.height*Math.cos(-W._textRenderer.angle)/2}else{O=-W.getHeight()+W._textRenderer.height*Math.cos(W._textRenderer.angle)/2}break;case"middle":O=-W.getHeight()/2;break;default:O=-W.getHeight()/2;break}}else{O=-W.getHeight()/2}var af=this.u2p(W.value)+O+"px";W._elem.css("top",af);W.pack()}}if(X){var ac=this._label._elem.outerHeight(true);this._label._elem.css("top",V-R/2-ac/2+"px");if(this.name=="yaxis"){this._label._elem.css("left","0px")}else{this._label._elem.css("right","0px")}this._label.pack()}}}ae=null};function e(O){O=Math.abs(O);if(O>1){return"%d"}var P=-Math.floor(Math.log(O)/Math.LN10);return"%."+P+"f"}function B(P,O){var Q=Math.floor(Math.log(P)/Math.LN10);var S=Math.pow(10,Q);var R=P/S;R=R/O;if(R<=0.38){return 0.1*S}if(R<=1.6){return 0.2*S}if(R<=4){return 0.5*S}if(R<=8){return S}if(R<=16){return 2*S}return 5*S}w.jqplot.LinearTickGenerator=function(Q,T,P){if(Q==T){T=(T)?0:1}P=P||1;if(T<Q){var O=T;T=Q;Q=O}var R=B(T-Q,P);var S=[];S[0]=Math.floor(Q/R)*R;S[1]=Math.ceil(T/R)*R;S[2]=Math.round((S[1]-S[0])/R+1);S[3]=e(R);S[4]=R;return S};w.jqplot.MarkerRenderer=function(O){this.show=true;this.style="filledCircle";this.lineWidth=2;this.size=9;this.color="#666666";this.shadow=true;this.shadowAngle=45;this.shadowOffset=1;this.shadowDepth=3;this.shadowAlpha="0.07";this.shadowRenderer=new w.jqplot.ShadowRenderer();this.shapeRenderer=new w.jqplot.ShapeRenderer();w.extend(true,this,O)};w.jqplot.MarkerRenderer.prototype.init=function(O){w.extend(true,this,O);var Q={angle:this.shadowAngle,offset:this.shadowOffset,alpha:this.shadowAlpha,lineWidth:this.lineWidth,depth:this.shadowDepth,closePath:true};if(this.style.indexOf("filled")!=-1){Q.fill=true}if(this.style.indexOf("ircle")!=-1){Q.isarc=true;Q.closePath=false}this.shadowRenderer.init(Q);var P={fill:false,isarc:false,strokeStyle:this.color,fillStyle:this.color,lineWidth:this.lineWidth,closePath:true};if(this.style.indexOf("filled")!=-1){P.fill=true}if(this.style.indexOf("ircle")!=-1){P.isarc=true;P.closePath=false}this.shapeRenderer.init(P)};w.jqplot.MarkerRenderer.prototype.drawDiamond=function(Q,P,T,S,V){var O=1.2;var W=this.size/2/O;var U=this.size/2*O;var R=[[Q-W,P],[Q,P+U],[Q+W,P],[Q,P-U]];if(this.shadow){this.shadowRenderer.draw(T,R)}this.shapeRenderer.draw(T,R,V)};w.jqplot.MarkerRenderer.prototype.drawPlus=function(R,Q,U,T,X){var P=1;var Y=this.size/2*P;var V=this.size/2*P;var W=[[R,Q-V],[R,Q+V]];var S=[[R+Y,Q],[R-Y,Q]];var O=w.extend(true,{},this.options,{closePath:false});if(this.shadow){this.shadowRenderer.draw(U,W,{closePath:false});this.shadowRenderer.draw(U,S,{closePath:false})}this.shapeRenderer.draw(U,W,O);this.shapeRenderer.draw(U,S,O)};w.jqplot.MarkerRenderer.prototype.drawX=function(R,Q,U,T,X){var P=1;var Y=this.size/2*P;var V=this.size/2*P;var O=w.extend(true,{},this.options,{closePath:false});var W=[[R-Y,Q-V],[R+Y,Q+V]];var S=[[R-Y,Q+V],[R+Y,Q-V]];if(this.shadow){this.shadowRenderer.draw(U,W,{closePath:false});this.shadowRenderer.draw(U,S,{closePath:false})}this.shapeRenderer.draw(U,W,O);this.shapeRenderer.draw(U,S,O)};w.jqplot.MarkerRenderer.prototype.drawDash=function(Q,P,T,S,V){var O=1;var W=this.size/2*O;var U=this.size/2*O;var R=[[Q-W,P],[Q+W,P]];if(this.shadow){this.shadowRenderer.draw(T,R)}this.shapeRenderer.draw(T,R,V)};w.jqplot.MarkerRenderer.prototype.drawLine=function(T,S,O,R,P){var Q=[T,S];if(this.shadow){this.shadowRenderer.draw(O,Q)}this.shapeRenderer.draw(O,Q,P)};w.jqplot.MarkerRenderer.prototype.drawSquare=function(Q,P,T,S,V){var O=1;var W=this.size/2/O;var U=this.size/2*O;var R=[[Q-W,P-U],[Q-W,P+U],[Q+W,P+U],[Q+W,P-U]];if(this.shadow){this.shadowRenderer.draw(T,R)}this.shapeRenderer.draw(T,R,V)};w.jqplot.MarkerRenderer.prototype.drawCircle=function(P,V,R,U,S){var O=this.size/2;var Q=2*Math.PI;var T=[P,V,O,0,Q,true];if(this.shadow){this.shadowRenderer.draw(R,T)}this.shapeRenderer.draw(R,T,S)};w.jqplot.MarkerRenderer.prototype.draw=function(O,R,P,Q){Q=Q||{};if(Q.show==null||Q.show!=false){if(Q.color&&!Q.fillStyle){Q.fillStyle=Q.color}if(Q.color&&!Q.strokeStyle){Q.strokeStyle=Q.color}switch(this.style){case"diamond":this.drawDiamond(O,R,P,false,Q);break;case"filledDiamond":this.drawDiamond(O,R,P,true,Q);break;case"circle":this.drawCircle(O,R,P,false,Q);break;case"filledCircle":this.drawCircle(O,R,P,true,Q);break;case"square":this.drawSquare(O,R,P,false,Q);break;case"filledSquare":this.drawSquare(O,R,P,true,Q);break;case"x":this.drawX(O,R,P,true,Q);break;case"plus":this.drawPlus(O,R,P,true,Q);break;case"dash":this.drawDash(O,R,P,true,Q);break;case"line":this.drawLine(O,R,P,false,Q);break;default:this.drawDiamond(O,R,P,false,Q);break}}};w.jqplot.ShadowRenderer=function(O){this.angle=45;this.offset=1;this.alpha=0.07;this.lineWidth=1.5;this.lineJoin="miter";this.lineCap="round";this.closePath=false;this.fill=false;this.depth=3;this.strokeStyle="rgba(0,0,0,0.1)";this.isarc=false;w.extend(true,this,O)};w.jqplot.ShadowRenderer.prototype.init=function(O){w.extend(true,this,O)};w.jqplot.ShadowRenderer.prototype.draw=function(Y,W,aa){Y.save();var O=(aa!=null)?aa:{};var X=(O.fill!=null)?O.fill:this.fill;var V=(O.closePath!=null)?O.closePath:this.closePath;var S=(O.offset!=null)?O.offset:this.offset;var Q=(O.alpha!=null)?O.alpha:this.alpha;var U=(O.depth!=null)?O.depth:this.depth;var Z=(O.isarc!=null)?O.isarc:this.isarc;Y.lineWidth=(O.lineWidth!=null)?O.lineWidth:this.lineWidth;Y.lineJoin=(O.lineJoin!=null)?O.lineJoin:this.lineJoin;Y.lineCap=(O.lineCap!=null)?O.lineCap:this.lineCap;Y.strokeStyle=O.strokeStyle||this.strokeStyle||"rgba(0,0,0,"+Q+")";Y.fillStyle=O.fillStyle||this.fillStyle||"rgba(0,0,0,"+Q+")";for(var R=0;R<U;R++){Y.translate(Math.cos(this.angle*Math.PI/180)*S,Math.sin(this.angle*Math.PI/180)*S);Y.beginPath();if(Z){Y.arc(W[0],W[1],W[2],W[3],W[4],true)}else{if(W&&W.length){var P=true;for(var T=0;T<W.length;T++){if(W[T][0]!=null&&W[T][1]!=null){if(P){Y.moveTo(W[T][0],W[T][1]);P=false}else{Y.lineTo(W[T][0],W[T][1])}}else{P=true}}}}if(V){Y.closePath()}if(X){Y.fill()}else{Y.stroke()}}Y.restore()};w.jqplot.ShapeRenderer=function(O){this.lineWidth=1.5;this.lineJoin="miter";this.lineCap="round";this.closePath=false;this.fill=false;this.isarc=false;this.fillRect=false;this.strokeRect=false;this.clearRect=false;this.strokeStyle="#999999";this.fillStyle="#999999";w.extend(true,this,O)};w.jqplot.ShapeRenderer.prototype.init=function(O){w.extend(true,this,O)};w.jqplot.ShapeRenderer.prototype.draw=function(X,V,Z){X.save();var O=(Z!=null)?Z:{};var W=(O.fill!=null)?O.fill:this.fill;var T=(O.closePath!=null)?O.closePath:this.closePath;var U=(O.fillRect!=null)?O.fillRect:this.fillRect;var R=(O.strokeRect!=null)?O.strokeRect:this.strokeRect;var P=(O.clearRect!=null)?O.clearRect:this.clearRect;var Y=(O.isarc!=null)?O.isarc:this.isarc;X.lineWidth=O.lineWidth||this.lineWidth;X.lineJoin=O.lineJoin||this.lineJoin;X.lineCap=O.lineCap||this.lineCap;X.strokeStyle=(O.strokeStyle||O.color)||this.strokeStyle;X.fillStyle=O.fillStyle||this.fillStyle;X.beginPath();if(Y){X.arc(V[0],V[1],V[2],V[3],V[4],true);if(T){X.closePath()}if(W){X.fill()}else{X.stroke()}X.restore();return}else{if(P){X.clearRect(V[0],V[1],V[2],V[3]);X.restore();return}else{if(U||R){if(U){X.fillRect(V[0],V[1],V[2],V[3])}if(R){X.strokeRect(V[0],V[1],V[2],V[3]);X.restore();return}}else{if(V&&V.length){var Q=true;for(var S=0;S<V.length;S++){if(V[S][0]!=null&&V[S][1]!=null){if(Q){X.moveTo(V[S][0],V[S][1]);Q=false}else{X.lineTo(V[S][0],V[S][1])}}else{Q=true}}if(T){X.closePath()}if(W){X.fill()}else{X.stroke()}}}}}X.restore()};w.jqplot.TableLegendRenderer=function(){};w.jqplot.TableLegendRenderer.prototype.init=function(O){w.extend(true,this,O)};w.jqplot.TableLegendRenderer.prototype.addrow=function(X,R,O,V){var S=(O)?this.rowSpacing+"px":"0px";var W;var Q;var P;var U;var T;P=document.createElement("tr");W=w(P);W.addClass("jqplot-table-legend");P=null;if(V){W.prependTo(this._elem)}else{W.appendTo(this._elem)}if(this.showSwatches){Q=w(document.createElement("td"));Q.addClass("jqplot-table-legend");Q.css({textAlign:"center",paddingTop:S});U=w(document.createElement("div"));T=w(document.createElement("div"));T.addClass("jqplot-table-legend-swatch");T.css({backgroundColor:R,borderColor:R});W.append(Q.append(U.append(T)))}if(this.showLabels){Q=w(document.createElement("td"));Q.addClass("jqplot-table-legend");Q.css("paddingTop",S);W.append(Q);if(this.escapeHtml){Q.text(X)}else{Q.html(X)}}Q=null;U=null;T=null;W=null;P=null};w.jqplot.TableLegendRenderer.prototype.draw=function(){if(this._elem){this._elem.emptyForce();this._elem=null}if(this.show){var T=this._series;var P=document.createElement("table");this._elem=w(P);this._elem.addClass("jqplot-table-legend");var Y={position:"absolute"};if(this.background){Y.background=this.background}if(this.border){Y.border=this.border}if(this.fontSize){Y.fontSize=this.fontSize}if(this.fontFamily){Y.fontFamily=this.fontFamily}if(this.textColor){Y.textColor=this.textColor}if(this.marginTop!=null){Y.marginTop=this.marginTop}if(this.marginBottom!=null){Y.marginBottom=this.marginBottom}if(this.marginLeft!=null){Y.marginLeft=this.marginLeft}if(this.marginRight!=null){Y.marginRight=this.marginRight}var O=false,V=false,X;for(var U=0;U<T.length;U++){X=T[U];if(X._stack||X.renderer.constructor==w.jqplot.BezierCurveRenderer){V=true}if(X.show&&X.showLabel){var S=this.labels[U]||X.label.toString();if(S){var Q=X.color;if(V&&U<T.length-1){O=true}else{if(V&&U==T.length-1){O=false}}this.renderer.addrow.call(this,S,Q,O,V);O=true}for(var R=0;R<w.jqplot.addLegendRowHooks.length;R++){var W=w.jqplot.addLegendRowHooks[R].call(this,X);if(W){this.renderer.addrow.call(this,W.label,W.color,O);O=true}}S=null}}}return this._elem};w.jqplot.TableLegendRenderer.prototype.pack=function(Q){if(this.show){if(this.placement=="insideGrid"){switch(this.location){case"nw":var P=Q.left;var O=Q.top;this._elem.css("left",P);this._elem.css("top",O);break;case"n":var P=(Q.left+(this._plotDimensions.width-Q.right))/2-this.getWidth()/2;var O=Q.top;this._elem.css("left",P);this._elem.css("top",O);break;case"ne":var P=Q.right;var O=Q.top;this._elem.css({right:P,top:O});break;case"e":var P=Q.right;var O=(Q.top+(this._plotDimensions.height-Q.bottom))/2-this.getHeight()/2;this._elem.css({right:P,top:O});break;case"se":var P=Q.right;var O=Q.bottom;this._elem.css({right:P,bottom:O});break;case"s":var P=(Q.left+(this._plotDimensions.width-Q.right))/2-this.getWidth()/2;var O=Q.bottom;this._elem.css({left:P,bottom:O});break;case"sw":var P=Q.left;var O=Q.bottom;this._elem.css({left:P,bottom:O});break;case"w":var P=Q.left;var O=(Q.top+(this._plotDimensions.height-Q.bottom))/2-this.getHeight()/2;this._elem.css({left:P,top:O});break;default:var P=Q.right;var O=Q.bottom;this._elem.css({right:P,bottom:O});break}}else{if(this.placement=="outside"){switch(this.location){case"nw":var P=this._plotDimensions.width-Q.left;var O=Q.top;this._elem.css("right",P);this._elem.css("top",O);break;case"n":var P=(Q.left+(this._plotDimensions.width-Q.right))/2-this.getWidth()/2;var O=this._plotDimensions.height-Q.top;this._elem.css("left",P);this._elem.css("bottom",O);break;case"ne":var P=this._plotDimensions.width-Q.right;var O=Q.top;this._elem.css({left:P,top:O});break;case"e":var P=this._plotDimensions.width-Q.right;var O=(Q.top+(this._plotDimensions.height-Q.bottom))/2-this.getHeight()/2;this._elem.css({left:P,top:O});break;case"se":var P=this._plotDimensions.width-Q.right;var O=Q.bottom;this._elem.css({left:P,bottom:O});break;case"s":var P=(Q.left+(this._plotDimensions.width-Q.right))/2-this.getWidth()/2;var O=this._plotDimensions.height-Q.bottom;this._elem.css({left:P,top:O});break;case"sw":var P=this._plotDimensions.width-Q.left;var O=Q.bottom;this._elem.css({right:P,bottom:O});break;case"w":var P=this._plotDimensions.width-Q.left;var O=(Q.top+(this._plotDimensions.height-Q.bottom))/2-this.getHeight()/2;this._elem.css({right:P,top:O});break;default:var P=Q.right;var O=Q.bottom;this._elem.css({right:P,bottom:O});break}}else{switch(this.location){case"nw":this._elem.css({left:0,top:Q.top});break;case"n":var P=(Q.left+(this._plotDimensions.width-Q.right))/2-this.getWidth()/2;this._elem.css({left:P,top:Q.top});break;case"ne":this._elem.css({right:0,top:Q.top});break;case"e":var O=(Q.top+(this._plotDimensions.height-Q.bottom))/2-this.getHeight()/2;this._elem.css({right:Q.right,top:O});break;case"se":this._elem.css({right:Q.right,bottom:Q.bottom});break;case"s":var P=(Q.left+(this._plotDimensions.width-Q.right))/2-this.getWidth()/2;this._elem.css({left:P,bottom:Q.bottom});break;case"sw":this._elem.css({left:Q.left,bottom:Q.bottom});break;case"w":var O=(Q.top+(this._plotDimensions.height-Q.bottom))/2-this.getHeight()/2;this._elem.css({left:Q.left,top:O});break;default:this._elem.css({right:Q.right,bottom:Q.bottom});break}}}}};w.jqplot.ThemeEngine=function(){this.themes={};this.activeTheme=null};w.jqplot.ThemeEngine.prototype.init=function(){var R=new w.jqplot.Theme({_name:"Default"});var U,P,T;for(U in R.target){if(U=="textColor"){R.target[U]=this.target.css("color")}else{R.target[U]=this.target.css(U)}}if(this.title.show&&this.title._elem){for(U in R.title){if(U=="textColor"){R.title[U]=this.title._elem.css("color")}else{R.title[U]=this.title._elem.css(U)}}}for(U in R.grid){R.grid[U]=this.grid[U]}if(R.grid.backgroundColor==null&&this.grid.background!=null){R.grid.backgroundColor=this.grid.background}if(this.legend.show&&this.legend._elem){for(U in R.legend){if(U=="textColor"){R.legend[U]=this.legend._elem.css("color")}else{R.legend[U]=this.legend._elem.css(U)}}}var Q;for(P=0;P<this.series.length;P++){Q=this.series[P];if(Q.renderer.constructor==w.jqplot.LineRenderer){R.series.push(new i())}else{if(Q.renderer.constructor==w.jqplot.BarRenderer){R.series.push(new E())}else{if(Q.renderer.constructor==w.jqplot.PieRenderer){R.series.push(new b())}else{if(Q.renderer.constructor==w.jqplot.DonutRenderer){R.series.push(new t())}else{if(Q.renderer.constructor==w.jqplot.FunnelRenderer){R.series.push(new H())}else{if(Q.renderer.constructor==w.jqplot.MeterGaugeRenderer){R.series.push(new r())}else{R.series.push({})}}}}}}for(U in R.series[P]){R.series[P][U]=Q[U]}}var O,S;for(U in this.axes){S=this.axes[U];O=R.axes[U]=new A();O.borderColor=S.borderColor;O.borderWidth=S.borderWidth;if(S._ticks&&S._ticks[0]){for(T in O.ticks){if(S._ticks[0].hasOwnProperty(T)){O.ticks[T]=S._ticks[0][T]}else{if(S._ticks[0]._elem){O.ticks[T]=S._ticks[0]._elem.css(T)}}}}if(S._label&&S._label.show){for(T in O.label){if(S._label[T]){O.label[T]=S._label[T]}else{if(S._label._elem){if(T=="textColor"){O.label[T]=S._label._elem.css("color")}else{O.label[T]=S._label._elem.css(T)}}}}}}this.themeEngine._add(R);this.themeEngine.activeTheme=this.themeEngine.themes[R._name]};w.jqplot.ThemeEngine.prototype.get=function(O){if(!O){return this.activeTheme}else{return this.themes[O]}};function z(P,O){return P-O}w.jqplot.ThemeEngine.prototype.getThemeNames=function(){var O=[];for(var P in this.themes){O.push(P)}return O.sort(z)};w.jqplot.ThemeEngine.prototype.getThemes=function(){var P=[];var O=[];for(var R in this.themes){P.push(R)}P.sort(z);for(var Q=0;Q<P.length;Q++){O.push(this.themes[P[Q]])}return O};w.jqplot.ThemeEngine.prototype.activate=function(ab,ag){var O=false;if(!ag&&this.activeTheme&&this.activeTheme._name){ag=this.activeTheme._name}if(!this.themes.hasOwnProperty(ag)){throw new Error("No theme of that name")}else{var T=this.themes[ag];this.activeTheme=T;var af,Z=false,Y=false;var P=["xaxis","x2axis","yaxis","y2axis"];for(ac=0;ac<P.length;ac++){var U=P[ac];if(T.axesStyles.borderColor!=null){ab.axes[U].borderColor=T.axesStyles.borderColor}if(T.axesStyles.borderWidth!=null){ab.axes[U].borderWidth=T.axesStyles.borderWidth}}for(var ae in ab.axes){var R=ab.axes[ae];if(R.show){var X=T.axes[ae]||{};var V=T.axesStyles;var S=w.jqplot.extend(true,{},X,V);af=(T.axesStyles.borderColor!=null)?T.axesStyles.borderColor:S.borderColor;if(S.borderColor!=null){R.borderColor=S.borderColor;O=true}af=(T.axesStyles.borderWidth!=null)?T.axesStyles.borderWidth:S.borderWidth;if(S.borderWidth!=null){R.borderWidth=S.borderWidth;O=true}if(R._ticks&&R._ticks[0]){for(var Q in S.ticks){af=S.ticks[Q];if(af!=null){R.tickOptions[Q]=af;R._ticks=[];O=true}}}if(R._label&&R._label.show){for(var Q in S.label){af=S.label[Q];if(af!=null){R.labelOptions[Q]=af;O=true}}}}}for(var aa in T.grid){if(T.grid[aa]!=null){ab.grid[aa]=T.grid[aa]}}if(!O){ab.grid.draw()}if(ab.legend.show){for(aa in T.legend){if(T.legend[aa]!=null){ab.legend[aa]=T.legend[aa]}}}if(ab.title.show){for(aa in T.title){if(T.title[aa]!=null){ab.title[aa]=T.title[aa]}}}var ac;for(ac=0;ac<T.series.length;ac++){var W={};var ad=false;for(aa in T.series[ac]){af=(T.seriesStyles[aa]!=null)?T.seriesStyles[aa]:T.series[ac][aa];if(af!=null){W[aa]=af;if(aa=="color"){ab.series[ac].renderer.shapeRenderer.fillStyle=af;ab.series[ac].renderer.shapeRenderer.strokeStyle=af;ab.series[ac][aa]=af}else{if(aa=="lineWidth"){ab.series[ac].renderer.shapeRenderer.lineWidth=af;ab.series[ac][aa]=af}else{if(aa=="markerOptions"){F(ab.series[ac].markerOptions,af);F(ab.series[ac].markerRenderer,af)}else{ab.series[ac][aa]=af}}}O=true}}}if(O){ab.target.empty();ab.draw()}for(aa in T.target){if(T.target[aa]!=null){ab.target.css(aa,T.target[aa])}}}};w.jqplot.ThemeEngine.prototype._add=function(P,O){if(O){P._name=O}if(!P._name){P._name=Date.parse(new Date())}if(!this.themes.hasOwnProperty(P._name)){this.themes[P._name]=P}else{throw new Error("jqplot.ThemeEngine Error: Theme already in use")}};w.jqplot.ThemeEngine.prototype.remove=function(O){if(O=="Default"){return false}return delete this.themes[O]};w.jqplot.ThemeEngine.prototype.newTheme=function(O,Q){if(typeof(O)=="object"){Q=Q||O;O=null}if(Q&&Q._name){O=Q._name}else{O=O||Date.parse(new Date())}var P=this.copy(this.themes.Default._name,O);w.jqplot.extend(P,Q);return P};function p(Q){if(Q==null||typeof(Q)!="object"){return Q}var O=new Q.constructor();for(var P in Q){O[P]=p(Q[P])}return O}w.jqplot.clone=p;function F(Q,P){if(P==null||typeof(P)!="object"){return}for(var O in P){if(O=="highlightColors"){Q[O]=p(P[O])}if(P[O]!=null&&typeof(P[O])=="object"){if(!Q.hasOwnProperty(O)){Q[O]={}}F(Q[O],P[O])}else{Q[O]=P[O]}}}w.jqplot.merge=F;w.jqplot.extend=function(){var T=arguments[0]||{},R=1,S=arguments.length,O=false,Q;if(typeof T==="boolean"){O=T;T=arguments[1]||{};R=2}if(typeof T!=="object"&&!toString.call(T)==="[object Function]"){T={}}for(;R<S;R++){if((Q=arguments[R])!=null){for(var P in Q){var U=T[P],V=Q[P];if(T===V){continue}if(O&&V&&typeof V==="object"&&!V.nodeType){T[P]=w.jqplot.extend(O,U||(V.length!=null?[]:{}),V)}else{if(V!==l){T[P]=V}}}}}return T};w.jqplot.ThemeEngine.prototype.rename=function(P,O){if(P=="Default"||O=="Default"){throw new Error("jqplot.ThemeEngine Error: Cannot rename from/to Default")}if(this.themes.hasOwnProperty(O)){throw new Error("jqplot.ThemeEngine Error: New name already in use.")}else{if(this.themes.hasOwnProperty(P)){var Q=this.copy(P,O);this.remove(P);return Q}}throw new Error("jqplot.ThemeEngine Error: Old name or new name invalid")};w.jqplot.ThemeEngine.prototype.copy=function(O,Q,S){if(Q=="Default"){throw new Error("jqplot.ThemeEngine Error: Cannot copy over Default theme")}if(!this.themes.hasOwnProperty(O)){var P="jqplot.ThemeEngine Error: Source name invalid";throw new Error(P)}if(this.themes.hasOwnProperty(Q)){var P="jqplot.ThemeEngine Error: Target name invalid";throw new Error(P)}else{var R=p(this.themes[O]);R._name=Q;w.jqplot.extend(true,R,S);this._add(R);return R}};w.jqplot.Theme=function(O,P){if(typeof(O)=="object"){P=P||O;O=null}O=O||Date.parse(new Date());this._name=O;this.target={backgroundColor:null};this.legend={textColor:null,fontFamily:null,fontSize:null,border:null,background:null};this.title={textColor:null,fontFamily:null,fontSize:null,textAlign:null};this.seriesStyles={};this.series=[];this.grid={drawGridlines:null,gridLineColor:null,gridLineWidth:null,backgroundColor:null,borderColor:null,borderWidth:null,shadow:null};this.axesStyles={label:{},ticks:{}};this.axes={};if(typeof(P)=="string"){this._name=P}else{if(typeof(P)=="object"){w.jqplot.extend(true,this,P)}}};var A=function(){this.borderColor=null;this.borderWidth=null;this.ticks=new g();this.label=new k()};var g=function(){this.show=null;this.showGridline=null;this.showLabel=null;this.showMark=null;this.size=null;this.textColor=null;this.whiteSpace=null;this.fontSize=null;this.fontFamily=null};var k=function(){this.textColor=null;this.whiteSpace=null;this.fontSize=null;this.fontFamily=null;this.fontWeight=null};var i=function(){this.color=null;this.lineWidth=null;this.shadow=null;this.fillColor=null;this.showMarker=null;this.markerOptions=new v()};var v=function(){this.show=null;this.style=null;this.lineWidth=null;this.size=null;this.color=null;this.shadow=null};var E=function(){this.color=null;this.seriesColors=null;this.lineWidth=null;this.shadow=null;this.barPadding=null;this.barMargin=null;this.barWidth=null;this.highlightColors=null};var b=function(){this.seriesColors=null;this.padding=null;this.sliceMargin=null;this.fill=null;this.shadow=null;this.startAngle=null;this.lineWidth=null;this.highlightColors=null};var t=function(){this.seriesColors=null;this.padding=null;this.sliceMargin=null;this.fill=null;this.shadow=null;this.startAngle=null;this.lineWidth=null;this.innerDiameter=null;this.thickness=null;this.ringMargin=null;this.highlightColors=null};var H=function(){this.color=null;this.lineWidth=null;this.shadow=null;this.padding=null;this.sectionMargin=null;this.seriesColors=null;this.highlightColors=null};var r=function(){this.padding=null;this.backgroundColor=null;this.ringColor=null;this.tickColor=null;this.ringWidth=null;this.intervalColors=null;this.intervalInnerRadius=null;this.intervalOuterRadius=null;this.hubRadius=null;this.needleThickness=null;this.needlePad=null};var N=function(){this.syntax=N.config.syntax;this._type="jsDate";this.utcOffset=new Date().getTimezoneOffset*60000;this.proxy=new Date();this.options={};this.locale=N.regional.getLocale();this.formatString="";this.defaultCentury=N.config.defaultCentury;switch(arguments.length){case 0:break;case 1:if(f(arguments[0])=="[object Object]"&&arguments[0]._type!="jsDate"){var Q=this.options=arguments[0];this.syntax=Q.syntax||this.syntax;this.defaultCentury=Q.defaultCentury||this.defaultCentury;this.proxy=N.createDate(Q.date)}else{this.proxy=N.createDate(arguments[0])}break;default:var O=[];for(var P=0;P<arguments.length;P++){O.push(arguments[P])}this.proxy=new Date(this.utcOffset);this.proxy.setFullYear.apply(this.proxy,O.slice(0,3));if(O.slice(3).length){this.proxy.setHours.apply(this.proxy,O.slice(3))}break}};N.config={defaultLocale:"en",syntax:"perl",defaultCentury:1900};N.prototype.add=function(Q,P){var O=s[P]||s.day;if(typeof O=="number"){this.proxy.setTime(this.proxy.getTime()+(O*Q))}else{O.add(this,Q)}return this};N.prototype.clone=function(){return new N(this.proxy.getTime())};N.prototype.diff=function(P,S,O){P=new N(P);if(P===null){return null}var Q=s[S]||s.day;if(typeof Q=="number"){var R=(this.proxy.getTime()-P.proxy.getTime())/Q}else{var R=Q.diff(this.proxy,P.proxy)}return(O?R:Math[R>0?"floor":"ceil"](R))};N.prototype.getAbbrDayName=function(){return N.regional[this.locale]["dayNamesShort"][this.proxy.getDay()]};N.prototype.getAbbrMonthName=function(){return N.regional[this.locale]["monthNamesShort"][this.proxy.getMonth()]};N.prototype.getAMPM=function(){return this.proxy.getHours()>=12?"PM":"AM"};N.prototype.getAmPm=function(){return this.proxy.getHours()>=12?"pm":"am"};N.prototype.getCentury=function(){return parseInt(this.proxy.getFullYear()/100,10)};N.prototype.getDate=function(){return this.proxy.getDate()};N.prototype.getDay=function(){return this.proxy.getDay()};N.prototype.getDayOfWeek=function(){var O=this.proxy.getDay();return O===0?7:O};N.prototype.getDayOfYear=function(){var P=this.proxy;var O=P-new Date(""+P.getFullYear()+"/1/1 GMT");O+=P.getTimezoneOffset()*60000;P=null;return parseInt(O/60000/60/24,10)+1};N.prototype.getDayName=function(){return N.regional[this.locale]["dayNames"][this.proxy.getDay()]};N.prototype.getFullWeekOfYear=function(){var R=this.proxy;var O=this.getDayOfYear();var Q=6-R.getDay();var P=parseInt((O+Q)/7,10);return P};N.prototype.getFullYear=function(){return this.proxy.getFullYear()};N.prototype.getGmtOffset=function(){var O=this.proxy.getTimezoneOffset()/60;var P=O<0?"+":"-";O=Math.abs(O);return P+y(Math.floor(O),2)+":"+y((O%1)*60,2)};N.prototype.getHours=function(){return this.proxy.getHours()};N.prototype.getHours12=function(){var O=this.proxy.getHours();return O>12?O-12:(O==0?12:O)};N.prototype.getIsoWeek=function(){var R=this.proxy;var Q=R.getWeekOfYear();var O=(new Date(""+R.getFullYear()+"/1/1")).getDay();var P=Q+(O>4||O<=1?0:1);if(P==53&&(new Date(""+R.getFullYear()+"/12/31")).getDay()<4){P=1}else{if(P===0){R=new N(new Date(""+(R.getFullYear()-1)+"/12/31"));P=R.getIsoWeek()}}R=null;return P};N.prototype.getMilliseconds=function(){return this.proxy.getMilliseconds()};N.prototype.getMinutes=function(){return this.proxy.getMinutes()};N.prototype.getMonth=function(){return this.proxy.getMonth()};N.prototype.getMonthName=function(){return N.regional[this.locale]["monthNames"][this.proxy.getMonth()]};N.prototype.getMonthNumber=function(){return this.proxy.getMonth()+1};N.prototype.getSeconds=function(){return this.proxy.getSeconds()};N.prototype.getShortYear=function(){return this.proxy.getYear()%100};N.prototype.getTime=function(){return this.proxy.getTime()};N.prototype.getTimezoneAbbr=function(){return this.proxy.toString().replace(/^.*\(([^)]+)\)$/,"$1")};N.prototype.getTimezoneName=function(){var O=/(?:\((.+)\)$| ([A-Z]{3}) )/.exec(this.toString());return O[1]||O[2]||"GMT"+this.getGmtOffset()};N.prototype.getTimezoneOffset=function(){return this.proxy.getTimezoneOffset()};N.prototype.getWeekOfYear=function(){var O=this.getDayOfYear();var Q=7-this.getDayOfWeek();var P=parseInt((O+Q)/7,10);return P};N.prototype.getUnix=function(){return Math.round(this.proxy.getTime()/1000,0)};N.prototype.getYear=function(){return this.proxy.getYear()};N.prototype.next=function(O){O=O||"day";return this.clone().add(1,O)};N.prototype.set=function(){switch(arguments.length){case 0:this.proxy=new Date();break;case 1:if(f(arguments[0])=="[object Object]"&&arguments[0]._type!="jsDate"){var Q=this.options=arguments[0];this.syntax=Q.syntax||this.syntax;this.defaultCentury=Q.defaultCentury||this.defaultCentury;this.proxy=N.createDate(Q.date)}else{this.proxy=N.createDate(arguments[0])}break;default:var O=[];for(var P=0;P<arguments.length;P++){O.push(arguments[P])}this.proxy=new Date(this.utcOffset);this.proxy.setFullYear.apply(this.proxy,O.slice(0,3));if(O.slice(3).length){this.proxy.setHours.apply(this.proxy,O.slice(3))}break}};N.prototype.setDate=function(O){return this.proxy.setDate(O)};N.prototype.setFullYear=function(){return this.proxy.setFullYear.apply(this.proxy,arguments)};N.prototype.setHours=function(){return this.proxy.setHours.apply(this.proxy,arguments)};N.prototype.setMilliseconds=function(O){return this.proxy.setMilliseconds(O)};N.prototype.setMinutes=function(){return this.proxy.setMinutes.apply(this.proxy,arguments)};N.prototype.setMonth=function(){return this.proxy.setMonth.apply(this.proxy,arguments)};N.prototype.setSeconds=function(){return this.proxy.setSeconds.apply(this.proxy,arguments)};N.prototype.setTime=function(O){return this.proxy.setTime(O)};N.prototype.setYear=function(){return this.proxy.setYear.apply(this.proxy,arguments)};N.prototype.strftime=function(O){O=O||this.formatString||N.regional[this.locale]["formatString"];return N.strftime(this,O,this.syntax)};N.prototype.toString=function(){return this.proxy.toString()};N.prototype.toYmdInt=function(){return(this.proxy.getFullYear()*10000)+(this.getMonthNumber()*100)+this.proxy.getDate()};N.regional={en:{monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],dayNamesShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],formatString:"%Y-%m-%d %H:%M:%S"},fr:{monthNames:["Janvier","Février","Mars","Avril","Mai","Juin","Juillet","Août","Septembre","Octobre","Novembre","Décembre"],monthNamesShort:["Jan","Fév","Mar","Avr","Mai","Jun","Jul","Aoû","Sep","Oct","Nov","Déc"],dayNames:["Dimanche","Lundi","Mardi","Mercredi","Jeudi","Vendredi","Samedi"],dayNamesShort:["Dim","Lun","Mar","Mer","Jeu","Ven","Sam"],formatString:"%Y-%m-%d %H:%M:%S"},de:{monthNames:["Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"],monthNamesShort:["Jan","Feb","Mär","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez"],dayNames:["Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"],dayNamesShort:["So","Mo","Di","Mi","Do","Fr","Sa"],formatString:"%Y-%m-%d %H:%M:%S"},es:{monthNames:["Enero","Febrero","Marzo","Abril","Mayo","Junio","Julio","Agosto","Septiembre","Octubre","Noviembre","Diciembre"],monthNamesShort:["Ene","Feb","Mar","Abr","May","Jun","Jul","Ago","Sep","Oct","Nov","Dic"],dayNames:["Domingo","Lunes","Martes","Mi&eacute;rcoles","Jueves","Viernes","S&aacute;bado"],dayNamesShort:["Dom","Lun","Mar","Mi&eacute;","Juv","Vie","S&aacute;b"],formatString:"%Y-%m-%d %H:%M:%S"},ru:{monthNames:["Январь","Февраль","Март","Апрель","Май","Июнь","Июль","Август","Сентябрь","Октябрь","Ноябрь","Декабрь"],monthNamesShort:["Янв","Фев","Мар","Апр","Май","Июн","Июл","Авг","Сен","Окт","Ноя","Дек"],dayNames:["воскресенье","понедельник","вторник","среда","четверг","пятница","суббота"],dayNamesShort:["вск","пнд","втр","срд","чтв","птн","сбт"],formatString:"%Y-%m-%d %H:%M:%S"},ar:{monthNames:["كانون الثاني","شباط","آذار","نيسان","آذار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول"],monthNamesShort:["1","2","3","4","5","6","7","8","9","10","11","12"],dayNames:["السبت","الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة"],dayNamesShort:["سبت","أحد","اثنين","ثلاثاء","أربعاء","خميس","جمعة"],formatString:"%Y-%m-%d %H:%M:%S"},pt:{monthNames:["Janeiro","Fevereiro","Mar&ccedil;o","Abril","Maio","Junho","Julho","Agosto","Setembro","Outubro","Novembro","Dezembro"],monthNamesShort:["Jan","Fev","Mar","Abr","Mai","Jun","Jul","Ago","Set","Out","Nov","Dez"],dayNames:["Domingo","Segunda-feira","Ter&ccedil;a-feira","Quarta-feira","Quinta-feira","Sexta-feira","S&aacute;bado"],dayNamesShort:["Dom","Seg","Ter","Qua","Qui","Sex","S&aacute;b"],formatString:"%Y-%m-%d %H:%M:%S"},"pt-BR":{monthNames:["Janeiro","Fevereiro","Mar&ccedil;o","Abril","Maio","Junho","Julho","Agosto","Setembro","Outubro","Novembro","Dezembro"],monthNamesShort:["Jan","Fev","Mar","Abr","Mai","Jun","Jul","Ago","Set","Out","Nov","Dez"],dayNames:["Domingo","Segunda-feira","Ter&ccedil;a-feira","Quarta-feira","Quinta-feira","Sexta-feira","S&aacute;bado"],dayNamesShort:["Dom","Seg","Ter","Qua","Qui","Sex","S&aacute;b"],formatString:"%Y-%m-%d %H:%M:%S"}};N.regional["en-US"]=N.regional["en-GB"]=N.regional.en;N.regional.getLocale=function(){var O=N.config.defaultLocale;if(document&&document.getElementsByTagName("html")&&document.getElementsByTagName("html")[0].lang){O=document.getElementsByTagName("html")[0].lang;if(!N.regional.hasOwnProperty(O)){O=N.config.defaultLocale}}return O};var q=24*60*60*1000;var y=function(O,R){O=String(O);var P=R-O.length;var Q=String(Math.pow(10,P)).slice(1);return Q.concat(O)};var s={millisecond:1,second:1000,minute:60*1000,hour:60*60*1000,day:q,week:7*q,month:{add:function(Q,O){s.year.add(Q,Math[O>0?"floor":"ceil"](O/12));var P=Q.getMonth()+(O%12);if(P==12){P=0;Q.setYear(Q.getFullYear()+1)}else{if(P==-1){P=11;Q.setYear(Q.getFullYear()-1)}}Q.setMonth(P)},diff:function(S,Q){var O=S.getFullYear()-Q.getFullYear();var P=S.getMonth()-Q.getMonth()+(O*12);var R=S.getDate()-Q.getDate();return P+(R/30)}},year:{add:function(P,O){P.setYear(P.getFullYear()+Math[O>0?"floor":"ceil"](O))},diff:function(P,O){return s.month.diff(P,O)/12}}};for(var G in s){if(G.substring(G.length-1)!="s"){s[G+"s"]=s[G]}}var u=function(S,R,P){if(N.formats[P]["shortcuts"][R]){return N.strftime(S,N.formats[P]["shortcuts"][R],P)}else{var O=(N.formats[P]["codes"][R]||"").split(".");var Q=S["get"+O[0]]?S["get"+O[0]]():"";if(O[1]){Q=y(Q,O[1])}return Q}};N.strftime=function(U,R,Q,V){var P="perl";var T=N.regional.getLocale();if(Q&&N.formats.hasOwnProperty(Q)){P=Q}else{if(Q&&N.regional.hasOwnProperty(Q)){T=Q}}if(V&&N.formats.hasOwnProperty(V)){P=V}else{if(V&&N.regional.hasOwnProperty(V)){T=V}}if(f(U)!="[object Object]"||U._type!="jsDate"){U=new N(U);U.locale=T}if(!R){R=U.formatString||N.regional[T]["formatString"]}var O=R||"%Y-%m-%d",W="",S;while(O.length>0){if(S=O.match(N.formats[P].codes.matcher)){W+=O.slice(0,S.index);W+=(S[1]||"")+u(U,S[2],P);O=O.slice(S.index+S[0].length)}else{W+=O;O=""}}return W};N.formats={ISO:"%Y-%m-%dT%H:%M:%S.%N%G",SQL:"%Y-%m-%d %H:%M:%S"};N.formats.perl={codes:{matcher:/()%(#?(%|[a-z]))/i,Y:"FullYear",y:"ShortYear.2",m:"MonthNumber.2","#m":"MonthNumber",B:"MonthName",b:"AbbrMonthName",d:"Date.2","#d":"Date",e:"Date",A:"DayName",a:"AbbrDayName",w:"Day",H:"Hours.2","#H":"Hours",I:"Hours12.2","#I":"Hours12",p:"AMPM",M:"Minutes.2","#M":"Minutes",S:"Seconds.2","#S":"Seconds",s:"Unix",N:"Milliseconds.3","#N":"Milliseconds",O:"TimezoneOffset",Z:"TimezoneName",G:"GmtOffset"},shortcuts:{F:"%Y-%m-%d",T:"%H:%M:%S",X:"%H:%M:%S",x:"%m/%d/%y",D:"%m/%d/%y","#c":"%a %b %e %H:%M:%S %Y",v:"%e-%b-%Y",R:"%H:%M",r:"%I:%M:%S %p",t:"\t",n:"\n","%":"%"}};N.formats.php={codes:{matcher:/()%((%|[a-z]))/i,a:"AbbrDayName",A:"DayName",d:"Date.2",e:"Date",j:"DayOfYear.3",u:"DayOfWeek",w:"Day",U:"FullWeekOfYear.2",V:"IsoWeek.2",W:"WeekOfYear.2",b:"AbbrMonthName",B:"MonthName",m:"MonthNumber.2",h:"AbbrMonthName",C:"Century.2",y:"ShortYear.2",Y:"FullYear",H:"Hours.2",I:"Hours12.2",l:"Hours12",p:"AMPM",P:"AmPm",M:"Minutes.2",S:"Seconds.2",s:"Unix",O:"TimezoneOffset",z:"GmtOffset",Z:"TimezoneAbbr"},shortcuts:{D:"%m/%d/%y",F:"%Y-%m-%d",T:"%H:%M:%S",X:"%H:%M:%S",x:"%m/%d/%y",R:"%H:%M",r:"%I:%M:%S %p",t:"\t",n:"\n","%":"%"}};N.createDate=function(Q){if(Q==null){return new Date()}if(Q instanceof Date){return Q}if(typeof Q=="number"){return new Date(Q)}var V=String(Q).replace(/^\s*(.+)\s*$/g,"$1");V=V.replace(/^([0-9]{1,4})-([0-9]{1,2})-([0-9]{1,4})/,"$1/$2/$3");V=V.replace(/^(3[01]|[0-2]?\d)[-\/]([a-z]{3,})[-\/](\d{4})/i,"$1 $2 $3");var U=V.match(/^(3[01]|[0-2]?\d)[-\/]([a-z]{3,})[-\/](\d{2})\D*/i);if(U&&U.length>3){var Z=parseFloat(U[3]);var T=N.config.defaultCentury+Z;T=String(T);V=V.replace(/^(3[01]|[0-2]?\d)[-\/]([a-z]{3,})[-\/](\d{2})\D*/i,U[1]+" "+U[2]+" "+T)}U=V.match(/^([0-9]{1,2})[-\/]([0-9]{1,2})[-\/]([0-9]{1,2})[^0-9]/);function Y(ad,ac){var ai=parseFloat(ac[1]);var ah=parseFloat(ac[2]);var ag=parseFloat(ac[3]);var af=N.config.defaultCentury;var ab,aa,aj,ae;if(ai>31){aa=ag;aj=ah;ab=af+ai}else{aa=ah;aj=ai;ab=af+ag}ae=aj+"/"+aa+"/"+ab;return ad.replace(/^([0-9]{1,2})[-\/]([0-9]{1,2})[-\/]([0-9]{1,2})/,ae)}if(U&&U.length>3){V=Y(V,U)}var U=V.match(/^([0-9]{1,2})[-\/]([0-9]{1,2})[-\/]([0-9]{1,2})$/);if(U&&U.length>3){V=Y(V,U)}var S=0;var P=N.matchers.length;var X,O,W=V;while(S<P){O=Date.parse(W);if(!isNaN(O)){return new Date(O)}X=N.matchers[S];if(typeof X=="function"){var R=X.call(N,W);if(R instanceof Date){return R}}else{W=V.replace(X[0],X[1])}S++}return NaN};N.daysInMonth=function(O,P){if(P==2){return new Date(O,1,29).getDate()==29?29:28}return[l,31,l,31,30,31,30,31,31,30,31,30,31][P]};N.matchers=[[/(3[01]|[0-2]\d)\s*\.\s*(1[0-2]|0\d)\s*\.\s*([1-9]\d{3})/,"$2/$1/$3"],[/([1-9]\d{3})\s*-\s*(1[0-2]|0\d)\s*-\s*(3[01]|[0-2]\d)/,"$2/$3/$1"],function(R){var P=R.match(/^(?:(.+)\s+)?([012]?\d)(?:\s*\:\s*(\d\d))?(?:\s*\:\s*(\d\d(\.\d*)?))?\s*(am|pm)?\s*$/i);if(P){if(P[1]){var Q=this.createDate(P[1]);if(isNaN(Q)){return}}else{var Q=new Date();Q.setMilliseconds(0)}var O=parseFloat(P[2]);if(P[6]){O=P[6].toLowerCase()=="am"?(O==12?0:O):(O==12?12:O+12)}Q.setHours(O,parseInt(P[3]||0,10),parseInt(P[4]||0,10),((parseFloat(P[5]||0))||0)*1000);return Q}else{return R}},function(R){var P=R.match(/^(?:(.+))[T|\s+]([012]\d)(?:\:(\d\d))(?:\:(\d\d))(?:\.\d+)([\+\-]\d\d\:\d\d)$/i);if(P){if(P[1]){var Q=this.createDate(P[1]);if(isNaN(Q)){return}}else{var Q=new Date();Q.setMilliseconds(0)}var O=parseFloat(P[2]);Q.setHours(O,parseInt(P[3],10),parseInt(P[4],10),parseFloat(P[5])*1000);return Q}else{return R}},function(S){var Q=S.match(/^([0-3]?\d)\s*[-\/.\s]{1}\s*([a-zA-Z]{3,9})\s*[-\/.\s]{1}\s*([0-3]?\d)$/);if(Q){var R=new Date();var T=N.config.defaultCentury;var V=parseFloat(Q[1]);var U=parseFloat(Q[3]);var P,O,W;if(V>31){O=U;P=T+V}else{O=V;P=T+U}var W=J(Q[2],N.regional[this.locale]["monthNamesShort"]);if(W==-1){W=J(Q[2],N.regional[this.locale]["monthNames"])}R.setFullYear(P,W,O);R.setHours(0,0,0,0);return R}else{return S}}];function J(Q,R){if(R.indexOf){return R.indexOf(Q)}for(var O=0,P=R.length;O<P;O++){if(R[O]===Q){return O}}return -1}function f(O){if(O===null){return"[object Null]"}return Object.prototype.toString.call(O)}w.jsDate=N;w.jqplot.sprintf=function(){function U(aa,W,X,Z){var Y=(aa.length>=W)?"":Array(1+W-aa.length>>>0).join(X);return Z?aa+Y:Y+aa}function R(Y){var X=new String(Y);for(var W=10;W>0;W--){if(X==(X=X.replace(/^(\d+)(\d{3})/,"$1"+w.jqplot.sprintf.thousandsSeparator+"$2"))){break}}return X}function Q(ab,aa,ad,Y,Z,X){var ac=Y-ab.length;if(ac>0){var W=" ";if(X){W="&nbsp;"}if(ad||!Z){ab=U(ab,Y,W,ad)}else{ab=ab.slice(0,aa.length)+U("",ac,"0",true)+ab.slice(aa.length)}}return ab}function V(ae,X,ac,Y,W,ab,ad,aa){var Z=ae>>>0;ac=ac&&Z&&{"2":"0b","8":"0","16":"0x"}[X]||"";ae=ac+U(Z.toString(X),ab||0,"0",false);return Q(ae,ac,Y,W,ad,aa)}function O(aa,ab,Y,W,Z,X){if(W!=null){aa=aa.slice(0,W)}return Q(aa,"",ab,Y,Z,X)}var P=arguments,S=0,T=P[S++];return T.replace(w.jqplot.sprintf.regex,function(ar,ad,ae,ah,au,ao,ab){if(ar=="%%"){return"%"}var ai=false,af="",ag=false,aq=false,ac=false,aa=false;for(var an=0;ae&&an<ae.length;an++){switch(ae.charAt(an)){case" ":af=" ";break;case"+":af="+";break;case"-":ai=true;break;case"0":ag=true;break;case"#":aq=true;break;case"&":ac=true;break;case"'":aa=true;break}}if(!ah){ah=0}else{if(ah=="*"){ah=+P[S++]}else{if(ah.charAt(0)=="*"){ah=+P[ah.slice(1,-1)]}else{ah=+ah}}}if(ah<0){ah=-ah;ai=true}if(!isFinite(ah)){throw new Error("$.jqplot.sprintf: (minimum-)width must be finite")}if(!ao){ao="fFeE".indexOf(ab)>-1?6:(ab=="d")?0:void (0)}else{if(ao=="*"){ao=+P[S++]}else{if(ao.charAt(0)=="*"){ao=+P[ao.slice(1,-1)]}else{ao=+ao}}}var ak=ad?P[ad.slice(0,-1)]:P[S++];switch(ab){case"s":if(ak==null){return""}return O(String(ak),ai,ah,ao,ag,ac);case"c":return O(String.fromCharCode(+ak),ai,ah,ao,ag,ac);case"b":return V(ak,2,aq,ai,ah,ao,ag,ac);case"o":return V(ak,8,aq,ai,ah,ao,ag,ac);case"x":return V(ak,16,aq,ai,ah,ao,ag,ac);case"X":return V(ak,16,aq,ai,ah,ao,ag,ac).toUpperCase();case"u":return V(ak,10,aq,ai,ah,ao,ag,ac);case"i":var Y=parseInt(+ak,10);if(isNaN(Y)){return""}var am=Y<0?"-":af;var ap=aa?R(String(Math.abs(Y))):String(Math.abs(Y));ak=am+U(ap,ao,"0",false);return Q(ak,am,ai,ah,ag,ac);case"d":var Y=Math.round(+ak);if(isNaN(Y)){return""}var am=Y<0?"-":af;var ap=aa?R(String(Math.abs(Y))):String(Math.abs(Y));ak=am+U(ap,ao,"0",false);return Q(ak,am,ai,ah,ag,ac);case"e":case"E":case"f":case"F":case"g":case"G":var Y=+ak;if(isNaN(Y)){return""}var am=Y<0?"-":af;var Z=["toExponential","toFixed","toPrecision"]["efg".indexOf(ab.toLowerCase())];var at=["toString","toUpperCase"]["eEfFgG".indexOf(ab)%2];var ap=Math.abs(Y)[Z](ao);ap=aa?R(ap):ap;ak=am+ap;return Q(ak,am,ai,ah,ag,ac)[at]();case"p":case"P":var Y=+ak;if(isNaN(Y)){return""}var am=Y<0?"-":af;var aj=String(Number(Math.abs(Y)).toExponential()).split(/e|E/);var X=(aj[0].indexOf(".")!=-1)?aj[0].length-1:aj[0].length;var al=(aj[1]<0)?-aj[1]-1:0;if(Math.abs(Y)<1){if(X+al<=ao){ak=am+Math.abs(Y).toPrecision(X)}else{if(X<=ao-1){ak=am+Math.abs(Y).toExponential(X-1)}else{ak=am+Math.abs(Y).toExponential(ao-1)}}}else{var W=(X<=ao)?X:ao;ak=am+Math.abs(Y).toPrecision(W)}var at=["toString","toUpperCase"]["pP".indexOf(ab)%2];return Q(ak,am,ai,ah,ag,ac)[at]();case"n":return"";default:return ar}})};w.jqplot.sprintf.thousandsSeparator=",";w.jqplot.sprintf.regex=/%%|%(\d+\$)?([-+#0&\' ]*)(\*\d+\$|\*|\d+)?(\.(\*\d+\$|\*|\d+))?([nAscboxXuidfegpEGP])/g})(jQuery);
\ No newline at end of file
index e2c203f..11e6d06 100644 (file)
@@ -1,37 +1,31 @@
 /*!
 /*!
- * jQuery JavaScript Library v1.9.1
+ * jQuery JavaScript Library v1.6.4
  * http://jquery.com/
  *
  * http://jquery.com/
  *
+ * Copyright 2011, John Resig
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
  * Includes Sizzle.js
  * http://sizzlejs.com/
  * Includes Sizzle.js
  * http://sizzlejs.com/
+ * Copyright 2011, The Dojo Foundation
+ * Released under the MIT, BSD, and GPL Licenses.
  *
  *
- * Copyright 2005, 2012 jQuery Foundation, Inc. and other contributors
- * Released under the MIT license
- * http://jquery.org/license
- *
- * Date: 2013-2-4
+ * Date: Mon Sep 12 18:54:48 2011 -0400
  */
 (function( window, undefined ) {
 
  */
 (function( window, undefined ) {
 
-// Can't do this because several apps including ASP.NET trace
-// the stack via arguments.caller.callee and Firefox dies if
-// you try to trace through "use strict" call chains. (#13335)
-// Support: Firefox 18+
-//"use strict";
-var
-       // The deferred used on DOM ready
-       readyList,
-
-       // A central reference to the root jQuery(document)
-       rootjQuery,
-
-       // Support: IE<9
-       // For `typeof node.method` instead of `node.method !== undefined`
-       core_strundefined = typeof undefined,
+// Use the correct document accordingly with window argument (sandbox)
+var document = window.document,
+       navigator = window.navigator,
+       location = window.location;
+var jQuery = (function() {
 
 
-       // Use the correct document accordingly with window argument (sandbox)
-       document = window.document,
-       location = window.location,
+// Define a local copy of jQuery
+var jQuery = function( selector, context ) {
+               // The jQuery object is actually just the init constructor 'enhanced'
+               return new jQuery.fn.init( selector, context, rootjQuery );
+       },
 
        // Map over jQuery in case of overwrite
        _jQuery = window.jQuery,
 
        // Map over jQuery in case of overwrite
        _jQuery = window.jQuery,
@@ -39,136 +33,136 @@ var
        // Map over the $ in case of overwrite
        _$ = window.$,
 
        // Map over the $ in case of overwrite
        _$ = window.$,
 
-       // [[Class]] -> type pairs
-       class2type = {},
-
-       // List of deleted data cache ids, so we can reuse them
-       core_deletedIds = [],
-
-       core_version = "1.9.1",
-
-       // Save a reference to some core methods
-       core_concat = core_deletedIds.concat,
-       core_push = core_deletedIds.push,
-       core_slice = core_deletedIds.slice,
-       core_indexOf = core_deletedIds.indexOf,
-       core_toString = class2type.toString,
-       core_hasOwn = class2type.hasOwnProperty,
-       core_trim = core_version.trim,
-
-       // Define a local copy of jQuery
-       jQuery = function( selector, context ) {
-               // The jQuery object is actually just the init constructor 'enhanced'
-               return new jQuery.fn.init( selector, context, rootjQuery );
-       },
+       // A central reference to the root jQuery(document)
+       rootjQuery,
 
 
-       // Used for matching numbers
-       core_pnum = /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,
+       // A simple way to check for HTML strings or ID strings
+       // Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
+       quickExpr = /^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,
 
 
-       // Used for splitting on whitespace
-       core_rnotwhite = /\S+/g,
+       // Check if a string has a non-whitespace character in it
+       rnotwhite = /\S/,
 
 
-       // Make sure we trim BOM and NBSP (here's looking at you, Safari 5.0 and IE)
-       rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,
+       // Used for trimming whitespace
+       trimLeft = /^\s+/,
+       trimRight = /\s+$/,
 
 
-       // A simple way to check for HTML strings
-       // Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
-       // Strict HTML recognition (#11290: must start with <)
-       rquickExpr = /^(?:(<[\w\W]+>)[^>]*|#([\w-]*))$/,
+       // Check for digits
+       rdigit = /\d/,
 
        // Match a standalone tag
 
        // Match a standalone tag
-       rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>|)$/,
+       rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>)?$/,
 
        // JSON RegExp
        rvalidchars = /^[\],:{}\s]*$/,
 
        // JSON RegExp
        rvalidchars = /^[\],:{}\s]*$/,
+       rvalidescape = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,
+       rvalidtokens = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,
        rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g,
        rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g,
-       rvalidescape = /\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,
-       rvalidtokens = /"[^"\\\r\n]*"|true|false|null|-?(?:\d+\.|)\d+(?:[eE][+-]?\d+|)/g,
+
+       // Useragent RegExp
+       rwebkit = /(webkit)[ \/]([\w.]+)/,
+       ropera = /(opera)(?:.*version)?[ \/]([\w.]+)/,
+       rmsie = /(msie) ([\w.]+)/,
+       rmozilla = /(mozilla)(?:.*? rv:([\w.]+))?/,
 
        // Matches dashed string for camelizing
 
        // Matches dashed string for camelizing
+       rdashAlpha = /-([a-z]|[0-9])/ig,
        rmsPrefix = /^-ms-/,
        rmsPrefix = /^-ms-/,
-       rdashAlpha = /-([\da-z])/gi,
 
        // Used by jQuery.camelCase as callback to replace()
        fcamelCase = function( all, letter ) {
 
        // Used by jQuery.camelCase as callback to replace()
        fcamelCase = function( all, letter ) {
-               return letter.toUpperCase();
+               return ( letter + "" ).toUpperCase();
        },
 
        },
 
+       // Keep a UserAgent string for use with jQuery.browser
+       userAgent = navigator.userAgent,
+
+       // For matching the engine and version of the browser
+       browserMatch,
+
+       // The deferred used on DOM ready
+       readyList,
+
        // The ready event handler
        // The ready event handler
-       completed = function( event ) {
+       DOMContentLoaded,
 
 
-               // readyState === "complete" is good enough for us to call the dom ready in oldIE
-               if ( document.addEventListener || event.type === "load" || document.readyState === "complete" ) {
-                       detach();
-                       jQuery.ready();
-               }
-       },
-       // Clean-up method for dom ready events
-       detach = function() {
-               if ( document.addEventListener ) {
-                       document.removeEventListener( "DOMContentLoaded", completed, false );
-                       window.removeEventListener( "load", completed, false );
+       // Save a reference to some core methods
+       toString = Object.prototype.toString,
+       hasOwn = Object.prototype.hasOwnProperty,
+       push = Array.prototype.push,
+       slice = Array.prototype.slice,
+       trim = String.prototype.trim,
+       indexOf = Array.prototype.indexOf,
 
 
-               } else {
-                       document.detachEvent( "onreadystatechange", completed );
-                       window.detachEvent( "onload", completed );
-               }
-       };
+       // [[Class]] -> type pairs
+       class2type = {};
 
 jQuery.fn = jQuery.prototype = {
 
 jQuery.fn = jQuery.prototype = {
-       // The current version of jQuery being used
-       jquery: core_version,
-
        constructor: jQuery,
        init: function( selector, context, rootjQuery ) {
        constructor: jQuery,
        init: function( selector, context, rootjQuery ) {
-               var match, elem;
+               var match, elem, ret, doc;
 
 
-               // HANDLE: $(""), $(null), $(undefined), $(false)
+               // Handle $(""), $(null), or $(undefined)
                if ( !selector ) {
                        return this;
                }
 
                if ( !selector ) {
                        return this;
                }
 
+               // Handle $(DOMElement)
+               if ( selector.nodeType ) {
+                       this.context = this[0] = selector;
+                       this.length = 1;
+                       return this;
+               }
+
+               // The body element only exists once, optimize finding it
+               if ( selector === "body" && !context && document.body ) {
+                       this.context = document;
+                       this[0] = document.body;
+                       this.selector = selector;
+                       this.length = 1;
+                       return this;
+               }
+
                // Handle HTML strings
                if ( typeof selector === "string" ) {
                // Handle HTML strings
                if ( typeof selector === "string" ) {
+                       // Are we dealing with HTML string or an ID?
                        if ( selector.charAt(0) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) {
                                // Assume that strings that start and end with <> are HTML and skip the regex check
                                match = [ null, selector, null ];
 
                        } else {
                        if ( selector.charAt(0) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) {
                                // Assume that strings that start and end with <> are HTML and skip the regex check
                                match = [ null, selector, null ];
 
                        } else {
-                               match = rquickExpr.exec( selector );
+                               match = quickExpr.exec( selector );
                        }
 
                        }
 
-                       // Match html or make sure no context is specified for #id
+                       // Verify a match, and that no context was specified for #id
                        if ( match && (match[1] || !context) ) {
 
                                // HANDLE: $(html) -> $(array)
                                if ( match[1] ) {
                                        context = context instanceof jQuery ? context[0] : context;
                        if ( match && (match[1] || !context) ) {
 
                                // HANDLE: $(html) -> $(array)
                                if ( match[1] ) {
                                        context = context instanceof jQuery ? context[0] : context;
+                                       doc = (context ? context.ownerDocument || context : document);
 
 
-                                       // scripts is true for back-compat
-                                       jQuery.merge( this, jQuery.parseHTML(
-                                               match[1],
-                                               context && context.nodeType ? context.ownerDocument || context : document,
-                                               true
-                                       ) );
-
-                                       // HANDLE: $(html, props)
-                                       if ( rsingleTag.test( match[1] ) && jQuery.isPlainObject( context ) ) {
-                                               for ( match in context ) {
-                                                       // Properties of context are called as methods if possible
-                                                       if ( jQuery.isFunction( this[ match ] ) ) {
-                                                               this[ match ]( context[ match ] );
-
-                                                       // ...and otherwise set as attributes
-                                                       } else {
-                                                               this.attr( match, context[ match ] );
-                                                       }
+                                       // If a single string is passed in and it's a single tag
+                                       // just do a createElement and skip the rest
+                                       ret = rsingleTag.exec( selector );
+
+                                       if ( ret ) {
+                                               if ( jQuery.isPlainObject( context ) ) {
+                                                       selector = [ document.createElement( ret[1] ) ];
+                                                       jQuery.fn.attr.call( selector, context, true );
+
+                                               } else {
+                                                       selector = [ doc.createElement( ret[1] ) ];
                                                }
                                                }
+
+                                       } else {
+                                               ret = jQuery.buildFragment( [ match[1] ], [ doc ] );
+                                               selector = (ret.cacheable ? jQuery.clone(ret.fragment) : ret.fragment).childNodes;
                                        }
 
                                        }
 
-                                       return this;
+                                       return jQuery.merge( this, selector );
 
 
-                               // HANDLE: $(#id)
+                               // HANDLE: $("#id")
                                } else {
                                        elem = document.getElementById( match[2] );
 
                                } else {
                                        elem = document.getElementById( match[2] );
 
@@ -193,7 +187,7 @@ jQuery.fn = jQuery.prototype = {
 
                        // HANDLE: $(expr, $(...))
                        } else if ( !context || context.jquery ) {
 
                        // HANDLE: $(expr, $(...))
                        } else if ( !context || context.jquery ) {
-                               return ( context || rootjQuery ).find( selector );
+                               return (context || rootjQuery).find( selector );
 
                        // HANDLE: $(expr, context)
                        // (which is just equivalent to: $(context).find(expr)
 
                        // HANDLE: $(expr, context)
                        // (which is just equivalent to: $(context).find(expr)
@@ -201,19 +195,13 @@ jQuery.fn = jQuery.prototype = {
                                return this.constructor( context ).find( selector );
                        }
 
                                return this.constructor( context ).find( selector );
                        }
 
-               // HANDLE: $(DOMElement)
-               } else if ( selector.nodeType ) {
-                       this.context = this[0] = selector;
-                       this.length = 1;
-                       return this;
-
                // HANDLE: $(function)
                // Shortcut for document ready
                } else if ( jQuery.isFunction( selector ) ) {
                        return rootjQuery.ready( selector );
                }
 
                // HANDLE: $(function)
                // Shortcut for document ready
                } else if ( jQuery.isFunction( selector ) ) {
                        return rootjQuery.ready( selector );
                }
 
-               if ( selector.selector !== undefined ) {
+               if (selector.selector !== undefined) {
                        this.selector = selector.selector;
                        this.context = selector.context;
                }
                        this.selector = selector.selector;
                        this.context = selector.context;
                }
@@ -224,6 +212,9 @@ jQuery.fn = jQuery.prototype = {
        // Start with an empty selector
        selector: "",
 
        // Start with an empty selector
        selector: "",
 
+       // The current version of jQuery being used
+       jquery: "1.6.4",
+
        // The default length of a jQuery object is 0
        length: 0,
 
        // The default length of a jQuery object is 0
        length: 0,
 
@@ -233,7 +224,7 @@ jQuery.fn = jQuery.prototype = {
        },
 
        toArray: function() {
        },
 
        toArray: function() {
-               return core_slice.call( this );
+               return slice.call( this, 0 );
        },
 
        // Get the Nth element in the matched element set OR
        },
 
        // Get the Nth element in the matched element set OR
@@ -250,15 +241,28 @@ jQuery.fn = jQuery.prototype = {
 
        // Take an array of elements and push it onto the stack
        // (returning the new matched element set)
 
        // Take an array of elements and push it onto the stack
        // (returning the new matched element set)
-       pushStack: function( elems ) {
-
+       pushStack: function( elems, name, selector ) {
                // Build a new jQuery matched element set
                // Build a new jQuery matched element set
-               var ret = jQuery.merge( this.constructor(), elems );
+               var ret = this.constructor();
+
+               if ( jQuery.isArray( elems ) ) {
+                       push.apply( ret, elems );
+
+               } else {
+                       jQuery.merge( ret, elems );
+               }
 
                // Add the old object onto the stack (as a reference)
                ret.prevObject = this;
 
                // Add the old object onto the stack (as a reference)
                ret.prevObject = this;
+
                ret.context = this.context;
 
                ret.context = this.context;
 
+               if ( name === "find" ) {
+                       ret.selector = this.selector + (this.selector ? " " : "") + selector;
+               } else if ( name ) {
+                       ret.selector = this.selector + "." + name + "(" + selector + ")";
+               }
+
                // Return the newly-formed element set
                return ret;
        },
                // Return the newly-formed element set
                return ret;
        },
@@ -271,14 +275,19 @@ jQuery.fn = jQuery.prototype = {
        },
 
        ready: function( fn ) {
        },
 
        ready: function( fn ) {
+               // Attach the listeners
+               jQuery.bindReady();
+
                // Add the callback
                // Add the callback
-               jQuery.ready.promise().done( fn );
+               readyList.done( fn );
 
                return this;
        },
 
 
                return this;
        },
 
-       slice: function() {
-               return this.pushStack( core_slice.apply( this, arguments ) );
+       eq: function( i ) {
+               return i === -1 ?
+                       this.slice( i ) :
+                       this.slice( i, +i + 1 );
        },
 
        first: function() {
        },
 
        first: function() {
@@ -289,10 +298,9 @@ jQuery.fn = jQuery.prototype = {
                return this.eq( -1 );
        },
 
                return this.eq( -1 );
        },
 
-       eq: function( i ) {
-               var len = this.length,
-                       j = +i + ( i < 0 ? len : 0 );
-               return this.pushStack( j >= 0 && j < len ? [ this[j] ] : [] );
+       slice: function() {
+               return this.pushStack( slice.apply( this, arguments ),
+                       "slice", slice.call(arguments).join(",") );
        },
 
        map: function( callback ) {
        },
 
        map: function( callback ) {
@@ -307,7 +315,7 @@ jQuery.fn = jQuery.prototype = {
 
        // For internal use only.
        // Behaves like an Array's method, not like a jQuery method.
 
        // For internal use only.
        // Behaves like an Array's method, not like a jQuery method.
-       push: core_push,
+       push: push,
        sort: [].sort,
        splice: [].splice
 };
        sort: [].sort,
        splice: [].splice
 };
@@ -316,7 +324,7 @@ jQuery.fn = jQuery.prototype = {
 jQuery.fn.init.prototype = jQuery.fn;
 
 jQuery.extend = jQuery.fn.extend = function() {
 jQuery.fn.init.prototype = jQuery.fn;
 
 jQuery.extend = jQuery.fn.extend = function() {
-       var src, copyIsArray, copy, name, options, clone,
+       var options, name, src, copy, copyIsArray, clone,
                target = arguments[0] || {},
                i = 1,
                length = arguments.length,
                target = arguments[0] || {},
                i = 1,
                length = arguments.length,
@@ -410,31 +418,73 @@ jQuery.extend({
 
        // Handle when the DOM is ready
        ready: function( wait ) {
 
        // Handle when the DOM is ready
        ready: function( wait ) {
+               // Either a released hold or an DOMready/load event and not yet ready
+               if ( (wait === true && !--jQuery.readyWait) || (wait !== true && !jQuery.isReady) ) {
+                       // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
+                       if ( !document.body ) {
+                               return setTimeout( jQuery.ready, 1 );
+                       }
 
 
-               // Abort if there are pending holds or we're already ready
-               if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {
-                       return;
+                       // Remember that the DOM is ready
+                       jQuery.isReady = true;
+
+                       // If a normal DOM Ready event fired, decrement, and wait if need be
+                       if ( wait !== true && --jQuery.readyWait > 0 ) {
+                               return;
+                       }
+
+                       // If there are functions bound, to execute
+                       readyList.resolveWith( document, [ jQuery ] );
+
+                       // Trigger any bound ready events
+                       if ( jQuery.fn.trigger ) {
+                               jQuery( document ).trigger( "ready" ).unbind( "ready" );
+                       }
                }
                }
+       },
 
 
-               // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
-               if ( !document.body ) {
-                       return setTimeout( jQuery.ready );
+       bindReady: function() {
+               if ( readyList ) {
+                       return;
                }
 
                }
 
-               // Remember that the DOM is ready
-               jQuery.isReady = true;
+               readyList = jQuery._Deferred();
 
 
-               // If a normal DOM Ready event fired, decrement, and wait if need be
-               if ( wait !== true && --jQuery.readyWait > 0 ) {
-                       return;
+               // Catch cases where $(document).ready() is called after the
+               // browser event has already occurred.
+               if ( document.readyState === "complete" ) {
+                       // Handle it asynchronously to allow scripts the opportunity to delay ready
+                       return setTimeout( jQuery.ready, 1 );
                }
 
                }
 
-               // If there are functions bound, to execute
-               readyList.resolveWith( document, [ jQuery ] );
+               // Mozilla, Opera and webkit nightlies currently support this event
+               if ( document.addEventListener ) {
+                       // Use the handy event callback
+                       document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false );
+
+                       // A fallback to window.onload, that will always work
+                       window.addEventListener( "load", jQuery.ready, false );
+
+               // If IE event model is used
+               } else if ( document.attachEvent ) {
+                       // ensure firing before onload,
+                       // maybe late but safe also for iframes
+                       document.attachEvent( "onreadystatechange", DOMContentLoaded );
+
+                       // A fallback to window.onload, that will always work
+                       window.attachEvent( "onload", jQuery.ready );
+
+                       // If IE and not a frame
+                       // continually check to see if the document is ready
+                       var toplevel = false;
+
+                       try {
+                               toplevel = window.frameElement == null;
+                       } catch(e) {}
 
 
-               // Trigger any bound ready events
-               if ( jQuery.fn.trigger ) {
-                       jQuery( document ).trigger("ready").off("ready");
+                       if ( document.documentElement.doScroll && toplevel ) {
+                               doScrollCheck();
+                       }
                }
        },
 
                }
        },
 
@@ -449,21 +499,19 @@ jQuery.extend({
                return jQuery.type(obj) === "array";
        },
 
                return jQuery.type(obj) === "array";
        },
 
+       // A crude way of determining if an object is a window
        isWindow: function( obj ) {
        isWindow: function( obj ) {
-               return obj != null && obj == obj.window;
+               return obj && typeof obj === "object" && "setInterval" in obj;
        },
 
        },
 
-       isNumeric: function( obj ) {
-               return !isNaN( parseFloat(obj) ) && isFinite( obj );
+       isNaN: function( obj ) {
+               return obj == null || !rdigit.test( obj ) || isNaN( obj );
        },
 
        type: function( obj ) {
        },
 
        type: function( obj ) {
-               if ( obj == null ) {
-                       return String( obj );
-               }
-               return typeof obj === "object" || typeof obj === "function" ?
-                       class2type[ core_toString.call(obj) ] || "object" :
-                       typeof obj;
+               return obj == null ?
+                       String( obj ) :
+                       class2type[ toString.call(obj) ] || "object";
        },
 
        isPlainObject: function( obj ) {
        },
 
        isPlainObject: function( obj ) {
@@ -477,8 +525,8 @@ jQuery.extend({
                try {
                        // Not own constructor property must be Object
                        if ( obj.constructor &&
                try {
                        // Not own constructor property must be Object
                        if ( obj.constructor &&
-                               !core_hasOwn.call(obj, "constructor") &&
-                               !core_hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) {
+                               !hasOwn.call(obj, "constructor") &&
+                               !hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) {
                                return false;
                        }
                } catch ( e ) {
                                return false;
                        }
                } catch ( e ) {
@@ -492,85 +540,48 @@ jQuery.extend({
                var key;
                for ( key in obj ) {}
 
                var key;
                for ( key in obj ) {}
 
-               return key === undefined || core_hasOwn.call( obj, key );
+               return key === undefined || hasOwn.call( obj, key );
        },
 
        isEmptyObject: function( obj ) {
        },
 
        isEmptyObject: function( obj ) {
-               var name;
-               for ( name in obj ) {
+               for ( var name in obj ) {
                        return false;
                }
                return true;
        },
 
        error: function( msg ) {
                        return false;
                }
                return true;
        },
 
        error: function( msg ) {
-               throw new Error( msg );
+               throw msg;
        },
 
        },
 
-       // data: string of html
-       // context (optional): If specified, the fragment will be created in this context, defaults to document
-       // keepScripts (optional): If true, will include scripts passed in the html string
-       parseHTML: function( data, context, keepScripts ) {
-               if ( !data || typeof data !== "string" ) {
+       parseJSON: function( data ) {
+               if ( typeof data !== "string" || !data ) {
                        return null;
                }
                        return null;
                }
-               if ( typeof context === "boolean" ) {
-                       keepScripts = context;
-                       context = false;
-               }
-               context = context || document;
-
-               var parsed = rsingleTag.exec( data ),
-                       scripts = !keepScripts && [];
-
-               // Single tag
-               if ( parsed ) {
-                       return [ context.createElement( parsed[1] ) ];
-               }
 
 
-               parsed = jQuery.buildFragment( [ data ], context, scripts );
-               if ( scripts ) {
-                       jQuery( scripts ).remove();
-               }
-               return jQuery.merge( [], parsed.childNodes );
-       },
+               // Make sure leading/trailing whitespace is removed (IE can't handle it)
+               data = jQuery.trim( data );
 
 
-       parseJSON: function( data ) {
                // Attempt to parse using the native JSON parser first
                if ( window.JSON && window.JSON.parse ) {
                        return window.JSON.parse( data );
                }
 
                // Attempt to parse using the native JSON parser first
                if ( window.JSON && window.JSON.parse ) {
                        return window.JSON.parse( data );
                }
 
-               if ( data === null ) {
-                       return data;
-               }
-
-               if ( typeof data === "string" ) {
-
-                       // Make sure leading/trailing whitespace is removed (IE can't handle it)
-                       data = jQuery.trim( data );
+               // Make sure the incoming data is actual JSON
+               // Logic borrowed from http://json.org/json2.js
+               if ( rvalidchars.test( data.replace( rvalidescape, "@" )
+                       .replace( rvalidtokens, "]" )
+                       .replace( rvalidbraces, "")) ) {
 
 
-                       if ( data ) {
-                               // Make sure the incoming data is actual JSON
-                               // Logic borrowed from http://json.org/json2.js
-                               if ( rvalidchars.test( data.replace( rvalidescape, "@" )
-                                       .replace( rvalidtokens, "]" )
-                                       .replace( rvalidbraces, "")) ) {
+                       return (new Function( "return " + data ))();
 
 
-                                       return ( new Function( "return " + data ) )();
-                               }
-                       }
                }
                }
-
                jQuery.error( "Invalid JSON: " + data );
        },
 
        // Cross-browser xml parsing
        parseXML: function( data ) {
                var xml, tmp;
                jQuery.error( "Invalid JSON: " + data );
        },
 
        // Cross-browser xml parsing
        parseXML: function( data ) {
                var xml, tmp;
-               if ( !data || typeof data !== "string" ) {
-                       return null;
-               }
                try {
                        if ( window.DOMParser ) { // Standard
                                tmp = new DOMParser();
                try {
                        if ( window.DOMParser ) { // Standard
                                tmp = new DOMParser();
@@ -595,7 +606,7 @@ jQuery.extend({
        // Workarounds based on findings by Jim Driscoll
        // http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context
        globalEval: function( data ) {
        // Workarounds based on findings by Jim Driscoll
        // http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context
        globalEval: function( data ) {
-               if ( data && jQuery.trim( data ) ) {
+               if ( data && rnotwhite.test( data ) ) {
                        // We use execScript on Internet Explorer
                        // We use an anonymous function so that context is window
                        // rather than jQuery in Firefox
                        // We use execScript on Internet Explorer
                        // We use an anonymous function so that context is window
                        // rather than jQuery in Firefox
@@ -612,30 +623,25 @@ jQuery.extend({
        },
 
        nodeName: function( elem, name ) {
        },
 
        nodeName: function( elem, name ) {
-               return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
+               return elem.nodeName && elem.nodeName.toUpperCase() === name.toUpperCase();
        },
 
        // args is for internal usage only
        },
 
        // args is for internal usage only
-       each: function( obj, callback, args ) {
-               var value,
-                       i = 0,
-                       length = obj.length,
-                       isArray = isArraylike( obj );
+       each: function( object, callback, args ) {
+               var name, i = 0,
+                       length = object.length,
+                       isObj = length === undefined || jQuery.isFunction( object );
 
                if ( args ) {
 
                if ( args ) {
-                       if ( isArray ) {
-                               for ( ; i < length; i++ ) {
-                                       value = callback.apply( obj[ i ], args );
-
-                                       if ( value === false ) {
+                       if ( isObj ) {
+                               for ( name in object ) {
+                                       if ( callback.apply( object[ name ], args ) === false ) {
                                                break;
                                        }
                                }
                        } else {
                                                break;
                                        }
                                }
                        } else {
-                               for ( i in obj ) {
-                                       value = callback.apply( obj[ i ], args );
-
-                                       if ( value === false ) {
+                               for ( ; i < length; ) {
+                                       if ( callback.apply( object[ i++ ], args ) === false ) {
                                                break;
                                        }
                                }
                                                break;
                                        }
                                }
@@ -643,77 +649,72 @@ jQuery.extend({
 
                // A special, fast, case for the most common use of each
                } else {
 
                // A special, fast, case for the most common use of each
                } else {
-                       if ( isArray ) {
-                               for ( ; i < length; i++ ) {
-                                       value = callback.call( obj[ i ], i, obj[ i ] );
-
-                                       if ( value === false ) {
+                       if ( isObj ) {
+                               for ( name in object ) {
+                                       if ( callback.call( object[ name ], name, object[ name ] ) === false ) {
                                                break;
                                        }
                                }
                        } else {
                                                break;
                                        }
                                }
                        } else {
-                               for ( i in obj ) {
-                                       value = callback.call( obj[ i ], i, obj[ i ] );
-
-                                       if ( value === false ) {
+                               for ( ; i < length; ) {
+                                       if ( callback.call( object[ i ], i, object[ i++ ] ) === false ) {
                                                break;
                                        }
                                }
                        }
                }
 
                                                break;
                                        }
                                }
                        }
                }
 
-               return obj;
+               return object;
        },
 
        // Use native String.trim function wherever possible
        },
 
        // Use native String.trim function wherever possible
-       trim: core_trim && !core_trim.call("\uFEFF\xA0") ?
+       trim: trim ?
                function( text ) {
                        return text == null ?
                                "" :
                function( text ) {
                        return text == null ?
                                "" :
-                               core_trim.call( text );
+                               trim.call( text );
                } :
 
                // Otherwise use our own trimming functionality
                function( text ) {
                        return text == null ?
                                "" :
                } :
 
                // Otherwise use our own trimming functionality
                function( text ) {
                        return text == null ?
                                "" :
-                               ( text + "" ).replace( rtrim, "" );
+                               text.toString().replace( trimLeft, "" ).replace( trimRight, "" );
                },
 
        // results is for internal usage only
                },
 
        // results is for internal usage only
-       makeArray: function( arr, results ) {
+       makeArray: function( array, results ) {
                var ret = results || [];
 
                var ret = results || [];
 
-               if ( arr != null ) {
-                       if ( isArraylike( Object(arr) ) ) {
-                               jQuery.merge( ret,
-                                       typeof arr === "string" ?
-                                       [ arr ] : arr
-                               );
+               if ( array != null ) {
+                       // The window, strings (and functions) also have 'length'
+                       // The extra typeof function check is to prevent crashes
+                       // in Safari 2 (See: #3039)
+                       // Tweaked logic slightly to handle Blackberry 4.7 RegExp issues #6930
+                       var type = jQuery.type( array );
+
+                       if ( array.length == null || type === "string" || type === "function" || type === "regexp" || jQuery.isWindow( array ) ) {
+                               push.call( ret, array );
                        } else {
                        } else {
-                               core_push.call( ret, arr );
+                               jQuery.merge( ret, array );
                        }
                }
 
                return ret;
        },
 
                        }
                }
 
                return ret;
        },
 
-       inArray: function( elem, arr, i ) {
-               var len;
-
-               if ( arr ) {
-                       if ( core_indexOf ) {
-                               return core_indexOf.call( arr, elem, i );
-                       }
+       inArray: function( elem, array ) {
+               if ( !array ) {
+                       return -1;
+               }
 
 
-                       len = arr.length;
-                       i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0;
+               if ( indexOf ) {
+                       return indexOf.call( array, elem );
+               }
 
 
-                       for ( ; i < len; i++ ) {
-                               // Skip accessing in sparse arrays
-                               if ( i in arr && arr[ i ] === elem ) {
-                                       return i;
-                               }
+               for ( var i = 0, length = array.length; i < length; i++ ) {
+                       if ( array[ i ] === elem ) {
+                               return i;
                        }
                }
 
                        }
                }
 
@@ -721,14 +722,14 @@ jQuery.extend({
        },
 
        merge: function( first, second ) {
        },
 
        merge: function( first, second ) {
-               var l = second.length,
-                       i = first.length,
+               var i = first.length,
                        j = 0;
 
                        j = 0;
 
-               if ( typeof l === "number" ) {
-                       for ( ; j < l; j++ ) {
+               if ( typeof second.length === "number" ) {
+                       for ( var l = second.length; j < l; j++ ) {
                                first[ i++ ] = second[ j ];
                        }
                                first[ i++ ] = second[ j ];
                        }
+
                } else {
                        while ( second[j] !== undefined ) {
                                first[ i++ ] = second[ j++ ];
                } else {
                        while ( second[j] !== undefined ) {
                                first[ i++ ] = second[ j++ ];
@@ -741,15 +742,12 @@ jQuery.extend({
        },
 
        grep: function( elems, callback, inv ) {
        },
 
        grep: function( elems, callback, inv ) {
-               var retVal,
-                       ret = [],
-                       i = 0,
-                       length = elems.length;
+               var ret = [], retVal;
                inv = !!inv;
 
                // Go through the array, only saving the items
                // that pass the validator function
                inv = !!inv;
 
                // Go through the array, only saving the items
                // that pass the validator function
-               for ( ; i < length; i++ ) {
+               for ( var i = 0, length = elems.length; i < length; i++ ) {
                        retVal = !!callback( elems[ i ], i );
                        if ( inv !== retVal ) {
                                ret.push( elems[ i ] );
                        retVal = !!callback( elems[ i ], i );
                        if ( inv !== retVal ) {
                                ret.push( elems[ i ] );
@@ -761,11 +759,11 @@ jQuery.extend({
 
        // arg is for internal usage only
        map: function( elems, callback, arg ) {
 
        // arg is for internal usage only
        map: function( elems, callback, arg ) {
-               var value,
+               var value, key, ret = [],
                        i = 0,
                        length = elems.length,
                        i = 0,
                        length = elems.length,
-                       isArray = isArraylike( elems ),
-                       ret = [];
+                       // jquery objects are treated as arrays
+                       isArray = elems instanceof jQuery || length !== undefined && typeof length === "number" && ( ( length > 0 && elems[ 0 ] && elems[ length -1 ] ) || length === 0 || jQuery.isArray( elems ) ) ;
 
                // Go through the array, translating each of the items to their
                if ( isArray ) {
 
                // Go through the array, translating each of the items to their
                if ( isArray ) {
@@ -779,8 +777,8 @@ jQuery.extend({
 
                // Go through every key on the object,
                } else {
 
                // Go through every key on the object,
                } else {
-                       for ( i in elems ) {
-                               value = callback( elems[ i ], i, arg );
+                       for ( key in elems ) {
+                               value = callback( elems[ key ], key, arg );
 
                                if ( value != null ) {
                                        ret[ ret.length ] = value;
 
                                if ( value != null ) {
                                        ret[ ret.length ] = value;
@@ -789,7 +787,7 @@ jQuery.extend({
                }
 
                // Flatten any nested arrays
                }
 
                // Flatten any nested arrays
-               return core_concat.apply( [], ret );
+               return ret.concat.apply( [], ret );
        },
 
        // A global GUID counter for objects
        },
 
        // A global GUID counter for objects
@@ -798,10 +796,8 @@ jQuery.extend({
        // Bind a function to a context, optionally partially applying any
        // arguments.
        proxy: function( fn, context ) {
        // Bind a function to a context, optionally partially applying any
        // arguments.
        proxy: function( fn, context ) {
-               var args, proxy, tmp;
-
                if ( typeof context === "string" ) {
                if ( typeof context === "string" ) {
-                       tmp = fn[ context ];
+                       var tmp = fn[ context ];
                        context = fn;
                        fn = tmp;
                }
                        context = fn;
                        fn = tmp;
                }
@@ -813,535 +809,403 @@ jQuery.extend({
                }
 
                // Simulated bind
                }
 
                // Simulated bind
-               args = core_slice.call( arguments, 2 );
-               proxy = function() {
-                       return fn.apply( context || this, args.concat( core_slice.call( arguments ) ) );
-               };
+               var args = slice.call( arguments, 2 ),
+                       proxy = function() {
+                               return fn.apply( context, args.concat( slice.call( arguments ) ) );
+                       };
 
                // Set the guid of unique handler to the same of original handler, so it can be removed
 
                // Set the guid of unique handler to the same of original handler, so it can be removed
-               proxy.guid = fn.guid = fn.guid || jQuery.guid++;
+               proxy.guid = fn.guid = fn.guid || proxy.guid || jQuery.guid++;
 
                return proxy;
        },
 
 
                return proxy;
        },
 
-       // Multifunctional method to get and set values of a collection
+       // Mutifunctional method to get and set values to a collection
        // The value/s can optionally be executed if it's a function
        // The value/s can optionally be executed if it's a function
-       access: function( elems, fn, key, value, chainable, emptyGet, raw ) {
-               var i = 0,
-                       length = elems.length,
-                       bulk = key == null;
-
-               // Sets many values
-               if ( jQuery.type( key ) === "object" ) {
-                       chainable = true;
-                       for ( i in key ) {
-                               jQuery.access( elems, fn, i, key[i], true, emptyGet, raw );
-                       }
-
-               // Sets one value
-               } else if ( value !== undefined ) {
-                       chainable = true;
+       access: function( elems, key, value, exec, fn, pass ) {
+               var length = elems.length;
 
 
-                       if ( !jQuery.isFunction( value ) ) {
-                               raw = true;
+               // Setting many attributes
+               if ( typeof key === "object" ) {
+                       for ( var k in key ) {
+                               jQuery.access( elems, k, key[k], exec, fn, value );
                        }
                        }
+                       return elems;
+               }
 
 
-                       if ( bulk ) {
-                               // Bulk operations run against the entire set
-                               if ( raw ) {
-                                       fn.call( elems, value );
-                                       fn = null;
+               // Setting one attribute
+               if ( value !== undefined ) {
+                       // Optionally, function values get executed if exec is true
+                       exec = !pass && exec && jQuery.isFunction(value);
 
 
-                               // ...except when executing function values
-                               } else {
-                                       bulk = fn;
-                                       fn = function( elem, key, value ) {
-                                               return bulk.call( jQuery( elem ), value );
-                                       };
-                               }
+                       for ( var i = 0; i < length; i++ ) {
+                               fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass );
                        }
 
                        }
 
-                       if ( fn ) {
-                               for ( ; i < length; i++ ) {
-                                       fn( elems[i], key, raw ? value : value.call( elems[i], i, fn( elems[i], key ) ) );
-                               }
-                       }
+                       return elems;
                }
 
                }
 
-               return chainable ?
-                       elems :
-
-                       // Gets
-                       bulk ?
-                               fn.call( elems ) :
-                               length ? fn( elems[0], key ) : emptyGet;
+               // Getting an attribute
+               return length ? fn( elems[0], key ) : undefined;
        },
 
        now: function() {
        },
 
        now: function() {
-               return ( new Date() ).getTime();
-       }
-});
+               return (new Date()).getTime();
+       },
 
 
-jQuery.ready.promise = function( obj ) {
-       if ( !readyList ) {
+       // Use of jQuery.browser is frowned upon.
+       // More details: http://docs.jquery.com/Utilities/jQuery.browser
+       uaMatch: function( ua ) {
+               ua = ua.toLowerCase();
 
 
-               readyList = jQuery.Deferred();
+               var match = rwebkit.exec( ua ) ||
+                       ropera.exec( ua ) ||
+                       rmsie.exec( ua ) ||
+                       ua.indexOf("compatible") < 0 && rmozilla.exec( ua ) ||
+                       [];
 
 
-               // Catch cases where $(document).ready() is called after the browser event has already occurred.
-               // we once tried to use readyState "interactive" here, but it caused issues like the one
-               // discovered by ChrisS here: http://bugs.jquery.com/ticket/12282#comment:15
-               if ( document.readyState === "complete" ) {
-                       // Handle it asynchronously to allow scripts the opportunity to delay ready
-                       setTimeout( jQuery.ready );
+               return { browser: match[1] || "", version: match[2] || "0" };
+       },
 
 
-               // Standards-based browsers support DOMContentLoaded
-               } else if ( document.addEventListener ) {
-                       // Use the handy event callback
-                       document.addEventListener( "DOMContentLoaded", completed, false );
+       sub: function() {
+               function jQuerySub( selector, context ) {
+                       return new jQuerySub.fn.init( selector, context );
+               }
+               jQuery.extend( true, jQuerySub, this );
+               jQuerySub.superclass = this;
+               jQuerySub.fn = jQuerySub.prototype = this();
+               jQuerySub.fn.constructor = jQuerySub;
+               jQuerySub.sub = this.sub;
+               jQuerySub.fn.init = function init( selector, context ) {
+                       if ( context && context instanceof jQuery && !(context instanceof jQuerySub) ) {
+                               context = jQuerySub( context );
+                       }
 
 
-                       // A fallback to window.onload, that will always work
-                       window.addEventListener( "load", completed, false );
+                       return jQuery.fn.init.call( this, selector, context, rootjQuerySub );
+               };
+               jQuerySub.fn.init.prototype = jQuerySub.fn;
+               var rootjQuerySub = jQuerySub(document);
+               return jQuerySub;
+       },
 
 
-               // If IE event model is used
-               } else {
-                       // Ensure firing before onload, maybe late but safe also for iframes
-                       document.attachEvent( "onreadystatechange", completed );
+       browser: {}
+});
 
 
-                       // A fallback to window.onload, that will always work
-                       window.attachEvent( "onload", completed );
+// Populate the class2type map
+jQuery.each("Boolean Number String Function Array Date RegExp Object".split(" "), function(i, name) {
+       class2type[ "[object " + name + "]" ] = name.toLowerCase();
+});
 
 
-                       // If IE and not a frame
-                       // continually check to see if the document is ready
-                       var top = false;
+browserMatch = jQuery.uaMatch( userAgent );
+if ( browserMatch.browser ) {
+       jQuery.browser[ browserMatch.browser ] = true;
+       jQuery.browser.version = browserMatch.version;
+}
 
 
-                       try {
-                               top = window.frameElement == null && document.documentElement;
-                       } catch(e) {}
+// Deprecated, use jQuery.browser.webkit instead
+if ( jQuery.browser.webkit ) {
+       jQuery.browser.safari = true;
+}
 
 
-                       if ( top && top.doScroll ) {
-                               (function doScrollCheck() {
-                                       if ( !jQuery.isReady ) {
+// IE doesn't match non-breaking spaces with \s
+if ( rnotwhite.test( "\xA0" ) ) {
+       trimLeft = /^[\s\xA0]+/;
+       trimRight = /[\s\xA0]+$/;
+}
 
 
-                                               try {
-                                                       // Use the trick by Diego Perini
-                                                       // http://javascript.nwbox.com/IEContentLoaded/
-                                                       top.doScroll("left");
-                                               } catch(e) {
-                                                       return setTimeout( doScrollCheck, 50 );
-                                               }
+// All jQuery objects should point back to these
+rootjQuery = jQuery(document);
 
 
-                                               // detach all dom ready events
-                                               detach();
+// Cleanup functions for the document ready method
+if ( document.addEventListener ) {
+       DOMContentLoaded = function() {
+               document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false );
+               jQuery.ready();
+       };
 
 
-                                               // and execute any waiting functions
-                                               jQuery.ready();
-                                       }
-                               })();
-                       }
+} else if ( document.attachEvent ) {
+       DOMContentLoaded = function() {
+               // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
+               if ( document.readyState === "complete" ) {
+                       document.detachEvent( "onreadystatechange", DOMContentLoaded );
+                       jQuery.ready();
                }
                }
-       }
-       return readyList.promise( obj );
-};
-
-// Populate the class2type map
-jQuery.each("Boolean Number String Function Array Date RegExp Object Error".split(" "), function(i, name) {
-       class2type[ "[object " + name + "]" ] = name.toLowerCase();
-});
-
-function isArraylike( obj ) {
-       var length = obj.length,
-               type = jQuery.type( obj );
+       };
+}
 
 
-       if ( jQuery.isWindow( obj ) ) {
-               return false;
+// The DOM ready check for Internet Explorer
+function doScrollCheck() {
+       if ( jQuery.isReady ) {
+               return;
        }
 
        }
 
-       if ( obj.nodeType === 1 && length ) {
-               return true;
+       try {
+               // If IE is used, use the trick by Diego Perini
+               // http://javascript.nwbox.com/IEContentLoaded/
+               document.documentElement.doScroll("left");
+       } catch(e) {
+               setTimeout( doScrollCheck, 1 );
+               return;
        }
 
        }
 
-       return type === "array" || type !== "function" &&
-               ( length === 0 ||
-               typeof length === "number" && length > 0 && ( length - 1 ) in obj );
+       // and execute any waiting functions
+       jQuery.ready();
 }
 
 }
 
-// All jQuery objects should point back to these
-rootjQuery = jQuery(document);
-// String to Object options format cache
-var optionsCache = {};
-
-// Convert String-formatted options into Object-formatted ones and store in cache
-function createOptions( options ) {
-       var object = optionsCache[ options ] = {};
-       jQuery.each( options.match( core_rnotwhite ) || [], function( _, flag ) {
-               object[ flag ] = true;
-       });
-       return object;
-}
+return jQuery;
 
 
-/*
- * Create a callback list using the following parameters:
- *
- *     options: an optional list of space-separated options that will change how
- *                     the callback list behaves or a more traditional option object
- *
- * By default a callback list will act like an event callback list and can be
- * "fired" multiple times.
- *
- * Possible options:
- *
- *     once:                   will ensure the callback list can only be fired once (like a Deferred)
- *
- *     memory:                 will keep track of previous values and will call any callback added
- *                                     after the list has been fired right away with the latest "memorized"
- *                                     values (like a Deferred)
- *
- *     unique:                 will ensure a callback can only be added once (no duplicate in the list)
- *
- *     stopOnFalse:    interrupt callings when a callback returns false
- *
- */
-jQuery.Callbacks = function( options ) {
-
-       // Convert options from String-formatted to Object-formatted if needed
-       // (we check in cache first)
-       options = typeof options === "string" ?
-               ( optionsCache[ options ] || createOptions( options ) ) :
-               jQuery.extend( {}, options );
-
-       var // Flag to know if list is currently firing
-               firing,
-               // Last fire value (for non-forgettable lists)
-               memory,
-               // Flag to know if list was already fired
-               fired,
-               // End of the loop when firing
-               firingLength,
-               // Index of currently firing callback (modified by remove if needed)
-               firingIndex,
-               // First callback to fire (used internally by add and fireWith)
-               firingStart,
-               // Actual callback list
-               list = [],
-               // Stack of fire calls for repeatable lists
-               stack = !options.once && [],
-               // Fire callbacks
-               fire = function( data ) {
-                       memory = options.memory && data;
-                       fired = true;
-                       firingIndex = firingStart || 0;
-                       firingStart = 0;
-                       firingLength = list.length;
-                       firing = true;
-                       for ( ; list && firingIndex < firingLength; firingIndex++ ) {
-                               if ( list[ firingIndex ].apply( data[ 0 ], data[ 1 ] ) === false && options.stopOnFalse ) {
-                                       memory = false; // To prevent further calls using add
-                                       break;
-                               }
-                       }
-                       firing = false;
-                       if ( list ) {
-                               if ( stack ) {
-                                       if ( stack.length ) {
-                                               fire( stack.shift() );
-                                       }
-                               } else if ( memory ) {
-                                       list = [];
-                               } else {
-                                       self.disable();
-                               }
-                       }
-               },
-               // Actual Callbacks object
-               self = {
-                       // Add a callback or a collection of callbacks to the list
-                       add: function() {
-                               if ( list ) {
-                                       // First, we save the current length
-                                       var start = list.length;
-                                       (function add( args ) {
-                                               jQuery.each( args, function( _, arg ) {
-                                                       var type = jQuery.type( arg );
-                                                       if ( type === "function" ) {
-                                                               if ( !options.unique || !self.has( arg ) ) {
-                                                                       list.push( arg );
-                                                               }
-                                                       } else if ( arg && arg.length && type !== "string" ) {
-                                                               // Inspect recursively
-                                                               add( arg );
+})();
+
+
+var // Promise methods
+       promiseMethods = "done fail isResolved isRejected promise then always pipe".split( " " ),
+       // Static reference to slice
+       sliceDeferred = [].slice;
+
+jQuery.extend({
+       // Create a simple deferred (one callbacks list)
+       _Deferred: function() {
+               var // callbacks list
+                       callbacks = [],
+                       // stored [ context , args ]
+                       fired,
+                       // to avoid firing when already doing so
+                       firing,
+                       // flag to know if the deferred has been cancelled
+                       cancelled,
+                       // the deferred itself
+                       deferred  = {
+
+                               // done( f1, f2, ...)
+                               done: function() {
+                                       if ( !cancelled ) {
+                                               var args = arguments,
+                                                       i,
+                                                       length,
+                                                       elem,
+                                                       type,
+                                                       _fired;
+                                               if ( fired ) {
+                                                       _fired = fired;
+                                                       fired = 0;
+                                               }
+                                               for ( i = 0, length = args.length; i < length; i++ ) {
+                                                       elem = args[ i ];
+                                                       type = jQuery.type( elem );
+                                                       if ( type === "array" ) {
+                                                               deferred.done.apply( deferred, elem );
+                                                       } else if ( type === "function" ) {
+                                                               callbacks.push( elem );
                                                        }
                                                        }
-                                               });
-                                       })( arguments );
-                                       // Do we need to add the callbacks to the
-                                       // current firing batch?
-                                       if ( firing ) {
-                                               firingLength = list.length;
-                                       // With memory, if we're not firing then
-                                       // we should call right away
-                                       } else if ( memory ) {
-                                               firingStart = start;
-                                               fire( memory );
+                                               }
+                                               if ( _fired ) {
+                                                       deferred.resolveWith( _fired[ 0 ], _fired[ 1 ] );
+                                               }
                                        }
                                        }
-                               }
-                               return this;
-                       },
-                       // Remove a callback from the list
-                       remove: function() {
-                               if ( list ) {
-                                       jQuery.each( arguments, function( _, arg ) {
-                                               var index;
-                                               while( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {
-                                                       list.splice( index, 1 );
-                                                       // Handle firing indexes
-                                                       if ( firing ) {
-                                                               if ( index <= firingLength ) {
-                                                                       firingLength--;
-                                                               }
-                                                               if ( index <= firingIndex ) {
-                                                                       firingIndex--;
-                                                               }
+                                       return this;
+                               },
+
+                               // resolve with given context and args
+                               resolveWith: function( context, args ) {
+                                       if ( !cancelled && !fired && !firing ) {
+                                               // make sure args are available (#8421)
+                                               args = args || [];
+                                               firing = 1;
+                                               try {
+                                                       while( callbacks[ 0 ] ) {
+                                                               callbacks.shift().apply( context, args );
                                                        }
                                                }
                                                        }
                                                }
-                                       });
-                               }
-                               return this;
-                       },
-                       // Check if a given callback is in the list.
-                       // If no argument is given, return whether or not list has callbacks attached.
-                       has: function( fn ) {
-                               return fn ? jQuery.inArray( fn, list ) > -1 : !!( list && list.length );
-                       },
-                       // Remove all callbacks from the list
-                       empty: function() {
-                               list = [];
-                               return this;
-                       },
-                       // Have the list do nothing anymore
-                       disable: function() {
-                               list = stack = memory = undefined;
-                               return this;
-                       },
-                       // Is it disabled?
-                       disabled: function() {
-                               return !list;
-                       },
-                       // Lock the list in its current state
-                       lock: function() {
-                               stack = undefined;
-                               if ( !memory ) {
-                                       self.disable();
-                               }
-                               return this;
-                       },
-                       // Is it locked?
-                       locked: function() {
-                               return !stack;
-                       },
-                       // Call all callbacks with the given context and arguments
-                       fireWith: function( context, args ) {
-                               args = args || [];
-                               args = [ context, args.slice ? args.slice() : args ];
-                               if ( list && ( !fired || stack ) ) {
-                                       if ( firing ) {
-                                               stack.push( args );
-                                       } else {
-                                               fire( args );
+                                               finally {
+                                                       fired = [ context, args ];
+                                                       firing = 0;
+                                               }
                                        }
                                        }
-                               }
-                               return this;
-                       },
-                       // Call all the callbacks with the given arguments
-                       fire: function() {
-                               self.fireWith( this, arguments );
-                               return this;
-                       },
-                       // To know if the callbacks have already been called at least once
-                       fired: function() {
-                               return !!fired;
-                       }
-               };
+                                       return this;
+                               },
 
 
-       return self;
-};
-jQuery.extend({
+                               // resolve with this as context and given arguments
+                               resolve: function() {
+                                       deferred.resolveWith( this, arguments );
+                                       return this;
+                               },
 
 
-       Deferred: function( func ) {
-               var tuples = [
-                               // action, add listener, listener list, final state
-                               [ "resolve", "done", jQuery.Callbacks("once memory"), "resolved" ],
-                               [ "reject", "fail", jQuery.Callbacks("once memory"), "rejected" ],
-                               [ "notify", "progress", jQuery.Callbacks("memory") ]
-                       ],
-                       state = "pending",
-                       promise = {
-                               state: function() {
-                                       return state;
+                               // Has this deferred been resolved?
+                               isResolved: function() {
+                                       return !!( firing || fired );
                                },
                                },
-                               always: function() {
-                                       deferred.done( arguments ).fail( arguments );
+
+                               // Cancel
+                               cancel: function() {
+                                       cancelled = 1;
+                                       callbacks = [];
                                        return this;
                                        return this;
-                               },
-                               then: function( /* fnDone, fnFail, fnProgress */ ) {
-                                       var fns = arguments;
-                                       return jQuery.Deferred(function( newDefer ) {
-                                               jQuery.each( tuples, function( i, tuple ) {
-                                                       var action = tuple[ 0 ],
-                                                               fn = jQuery.isFunction( fns[ i ] ) && fns[ i ];
-                                                       // deferred[ done | fail | progress ] for forwarding actions to newDefer
-                                                       deferred[ tuple[1] ](function() {
-                                                               var returned = fn && fn.apply( this, arguments );
+                               }
+                       };
+
+               return deferred;
+       },
+
+       // Full fledged deferred (two callbacks list)
+       Deferred: function( func ) {
+               var deferred = jQuery._Deferred(),
+                       failDeferred = jQuery._Deferred(),
+                       promise;
+               // Add errorDeferred methods, then and promise
+               jQuery.extend( deferred, {
+                       then: function( doneCallbacks, failCallbacks ) {
+                               deferred.done( doneCallbacks ).fail( failCallbacks );
+                               return this;
+                       },
+                       always: function() {
+                               return deferred.done.apply( deferred, arguments ).fail.apply( this, arguments );
+                       },
+                       fail: failDeferred.done,
+                       rejectWith: failDeferred.resolveWith,
+                       reject: failDeferred.resolve,
+                       isRejected: failDeferred.isResolved,
+                       pipe: function( fnDone, fnFail ) {
+                               return jQuery.Deferred(function( newDefer ) {
+                                       jQuery.each( {
+                                               done: [ fnDone, "resolve" ],
+                                               fail: [ fnFail, "reject" ]
+                                       }, function( handler, data ) {
+                                               var fn = data[ 0 ],
+                                                       action = data[ 1 ],
+                                                       returned;
+                                               if ( jQuery.isFunction( fn ) ) {
+                                                       deferred[ handler ](function() {
+                                                               returned = fn.apply( this, arguments );
                                                                if ( returned && jQuery.isFunction( returned.promise ) ) {
                                                                if ( returned && jQuery.isFunction( returned.promise ) ) {
-                                                                       returned.promise()
-                                                                               .done( newDefer.resolve )
-                                                                               .fail( newDefer.reject )
-                                                                               .progress( newDefer.notify );
+                                                                       returned.promise().then( newDefer.resolve, newDefer.reject );
                                                                } else {
                                                                } else {
-                                                                       newDefer[ action + "With" ]( this === promise ? newDefer.promise() : this, fn ? [ returned ] : arguments );
+                                                                       newDefer[ action + "With" ]( this === deferred ? newDefer : this, [ returned ] );
                                                                }
                                                        });
                                                                }
                                                        });
-                                               });
-                                               fns = null;
-                                       }).promise();
-                               },
-                               // Get a promise for this deferred
-                               // If obj is provided, the promise aspect is added to the object
-                               promise: function( obj ) {
-                                       return obj != null ? jQuery.extend( obj, promise ) : promise;
-                               }
+                                               } else {
+                                                       deferred[ handler ]( newDefer[ action ] );
+                                               }
+                                       });
+                               }).promise();
                        },
                        },
-                       deferred = {};
-
-               // Keep pipe for back-compat
-               promise.pipe = promise.then;
-
-               // Add list-specific methods
-               jQuery.each( tuples, function( i, tuple ) {
-                       var list = tuple[ 2 ],
-                               stateString = tuple[ 3 ];
-
-                       // promise[ done | fail | progress ] = list.add
-                       promise[ tuple[1] ] = list.add;
-
-                       // Handle state
-                       if ( stateString ) {
-                               list.add(function() {
-                                       // state = [ resolved | rejected ]
-                                       state = stateString;
-
-                               // [ reject_list | resolve_list ].disable; progress_list.lock
-                               }, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock );
+                       // Get a promise for this deferred
+                       // If obj is provided, the promise aspect is added to the object
+                       promise: function( obj ) {
+                               if ( obj == null ) {
+                                       if ( promise ) {
+                                               return promise;
+                                       }
+                                       promise = obj = {};
+                               }
+                               var i = promiseMethods.length;
+                               while( i-- ) {
+                                       obj[ promiseMethods[i] ] = deferred[ promiseMethods[i] ];
+                               }
+                               return obj;
                        }
                        }
-
-                       // deferred[ resolve | reject | notify ]
-                       deferred[ tuple[0] ] = function() {
-                               deferred[ tuple[0] + "With" ]( this === deferred ? promise : this, arguments );
-                               return this;
-                       };
-                       deferred[ tuple[0] + "With" ] = list.fireWith;
                });
                });
-
-               // Make the deferred a promise
-               promise.promise( deferred );
-
+               // Make sure only one callback list will be used
+               deferred.done( failDeferred.cancel ).fail( deferred.cancel );
+               // Unexpose cancel
+               delete deferred.cancel;
                // Call given func if any
                if ( func ) {
                        func.call( deferred, deferred );
                }
                // Call given func if any
                if ( func ) {
                        func.call( deferred, deferred );
                }
-
-               // All done!
                return deferred;
        },
 
        // Deferred helper
                return deferred;
        },
 
        // Deferred helper
-       when: function( subordinate /* , ..., subordinateN */ ) {
-               var i = 0,
-                       resolveValues = core_slice.call( arguments ),
-                       length = resolveValues.length,
-
-                       // the count of uncompleted subordinates
-                       remaining = length !== 1 || ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0,
-
-                       // the master Deferred. If resolveValues consist of only a single Deferred, just use that.
-                       deferred = remaining === 1 ? subordinate : jQuery.Deferred(),
-
-                       // Update function for both resolve and progress values
-                       updateFunc = function( i, contexts, values ) {
-                               return function( value ) {
-                                       contexts[ i ] = this;
-                                       values[ i ] = arguments.length > 1 ? core_slice.call( arguments ) : value;
-                                       if( values === progressValues ) {
-                                               deferred.notifyWith( contexts, values );
-                                       } else if ( !( --remaining ) ) {
-                                               deferred.resolveWith( contexts, values );
-                                       }
-                               };
-                       },
-
-                       progressValues, progressContexts, resolveContexts;
-
-               // add listeners to Deferred subordinates; treat others as resolved
+       when: function( firstParam ) {
+               var args = arguments,
+                       i = 0,
+                       length = args.length,
+                       count = length,
+                       deferred = length <= 1 && firstParam && jQuery.isFunction( firstParam.promise ) ?
+                               firstParam :
+                               jQuery.Deferred();
+               function resolveFunc( i ) {
+                       return function( value ) {
+                               args[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value;
+                               if ( !( --count ) ) {
+                                       // Strange bug in FF4:
+                                       // Values changed onto the arguments object sometimes end up as undefined values
+                                       // outside the $.when method. Cloning the object into a fresh array solves the issue
+                                       deferred.resolveWith( deferred, sliceDeferred.call( args, 0 ) );
+                               }
+                       };
+               }
                if ( length > 1 ) {
                if ( length > 1 ) {
-                       progressValues = new Array( length );
-                       progressContexts = new Array( length );
-                       resolveContexts = new Array( length );
-                       for ( ; i < length; i++ ) {
-                               if ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) {
-                                       resolveValues[ i ].promise()
-                                               .done( updateFunc( i, resolveContexts, resolveValues ) )
-                                               .fail( deferred.reject )
-                                               .progress( updateFunc( i, progressContexts, progressValues ) );
+                       for( ; i < length; i++ ) {
+                               if ( args[ i ] && jQuery.isFunction( args[ i ].promise ) ) {
+                                       args[ i ].promise().then( resolveFunc(i), deferred.reject );
                                } else {
                                } else {
-                                       --remaining;
+                                       --count;
                                }
                        }
                                }
                        }
+                       if ( !count ) {
+                               deferred.resolveWith( deferred, args );
+                       }
+               } else if ( deferred !== firstParam ) {
+                       deferred.resolveWith( deferred, length ? [ firstParam ] : [] );
                }
                }
-
-               // if we're not waiting on anything, resolve the master
-               if ( !remaining ) {
-                       deferred.resolveWith( resolveContexts, resolveValues );
-               }
-
                return deferred.promise();
        }
 });
                return deferred.promise();
        }
 });
-jQuery.support = (function() {
 
 
-       var support, all, a,
-               input, select, fragment,
-               opt, eventName, isSupported, i,
-               div = document.createElement("div");
 
 
-       // Setup
-       div.setAttribute( "className", "t" );
-       div.innerHTML = "  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>";
 
 
-       // Support tests won't run in some limited or non-browser environments
-       all = div.getElementsByTagName("*");
-       a = div.getElementsByTagName("a")[ 0 ];
-       if ( !all || !a || !all.length ) {
+jQuery.support = (function() {
+
+       var div = document.createElement( "div" ),
+               documentElement = document.documentElement,
+               all,
+               a,
+               select,
+               opt,
+               input,
+               marginDiv,
+               support,
+               fragment,
+               body,
+               testElementParent,
+               testElement,
+               testElementStyle,
+               tds,
+               events,
+               eventName,
+               i,
+               isSupported;
+
+       // Preliminary tests
+       div.setAttribute("className", "t");
+       div.innerHTML = "   <link/><table></table><a href='/a' style='top:1px;float:left;opacity:.55;'>a</a><input type='checkbox'/>";
+
+
+       all = div.getElementsByTagName( "*" );
+       a = div.getElementsByTagName( "a" )[ 0 ];
+
+       // Can't get basic test support
+       if ( !all || !all.length || !a ) {
                return {};
        }
 
                return {};
        }
 
-       // First batch of tests
-       select = document.createElement("select");
+       // First batch of supports tests
+       select = document.createElement( "select" );
        opt = select.appendChild( document.createElement("option") );
        opt = select.appendChild( document.createElement("option") );
-       input = div.getElementsByTagName("input")[ 0 ];
+       input = div.getElementsByTagName( "input" )[ 0 ];
 
 
-       a.style.cssText = "top:1px;float:left;opacity:.5";
        support = {
        support = {
-               // Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7)
-               getSetAttribute: div.className !== "t",
-
                // IE strips leading whitespace when .innerHTML is used
                // IE strips leading whitespace when .innerHTML is used
-               leadingWhitespace: div.firstChild.nodeType === 3,
+               leadingWhitespace: ( div.firstChild.nodeType === 3 ),
 
                // Make sure that tbody elements aren't automatically inserted
                // IE will insert them into empty tables
 
                // Make sure that tbody elements aren't automatically inserted
                // IE will insert them into empty tables
-               tbody: !div.getElementsByTagName("tbody").length,
+               tbody: !div.getElementsByTagName( "tbody" ).length,
 
                // Make sure that link elements get serialized correctly by innerHTML
                // This requires a wrapper element in IE
 
                // Make sure that link elements get serialized correctly by innerHTML
                // This requires a wrapper element in IE
-               htmlSerialize: !!div.getElementsByTagName("link").length,
+               htmlSerialize: !!div.getElementsByTagName( "link" ).length,
 
                // Get the style information from getAttribute
                // (IE uses .cssText instead)
 
                // Get the style information from getAttribute
                // (IE uses .cssText instead)
@@ -1349,42 +1213,38 @@ jQuery.support = (function() {
 
                // Make sure that URLs aren't manipulated
                // (IE normalizes it by default)
 
                // Make sure that URLs aren't manipulated
                // (IE normalizes it by default)
-               hrefNormalized: a.getAttribute("href") === "/a",
+               hrefNormalized: ( a.getAttribute( "href" ) === "/a" ),
 
                // Make sure that element opacity exists
                // (IE uses filter instead)
                // Use a regex to work around a WebKit issue. See #5145
 
                // Make sure that element opacity exists
                // (IE uses filter instead)
                // Use a regex to work around a WebKit issue. See #5145
-               opacity: /^0.5/.test( a.style.opacity ),
+               opacity: /^0.55$/.test( a.style.opacity ),
 
                // Verify style float existence
                // (IE uses styleFloat instead of cssFloat)
                cssFloat: !!a.style.cssFloat,
 
 
                // Verify style float existence
                // (IE uses styleFloat instead of cssFloat)
                cssFloat: !!a.style.cssFloat,
 
-               // Check the default checkbox/radio value ("" on WebKit; "on" elsewhere)
-               checkOn: !!input.value,
+               // Make sure that if no value is specified for a checkbox
+               // that it defaults to "on".
+               // (WebKit defaults to "" instead)
+               checkOn: ( input.value === "on" ),
 
                // Make sure that a selected-by-default option has a working selected property.
                // (WebKit defaults to false instead of true, IE too, if it's in an optgroup)
                optSelected: opt.selected,
 
 
                // Make sure that a selected-by-default option has a working selected property.
                // (WebKit defaults to false instead of true, IE too, if it's in an optgroup)
                optSelected: opt.selected,
 
-               // Tests for enctype support on a form (#6743)
-               enctype: !!document.createElement("form").enctype,
-
-               // Makes sure cloning an html5 element does not cause problems
-               // Where outerHTML is undefined, this still works
-               html5Clone: document.createElement("nav").cloneNode( true ).outerHTML !== "<:nav></:nav>",
-
-               // jQuery.support.boxModel DEPRECATED in 1.8 since we don't support Quirks Mode
-               boxModel: document.compatMode === "CSS1Compat",
+               // Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7)
+               getSetAttribute: div.className !== "t",
 
                // Will be defined later
 
                // Will be defined later
+               submitBubbles: true,
+               changeBubbles: true,
+               focusinBubbles: false,
                deleteExpando: true,
                noCloneEvent: true,
                inlineBlockNeedsLayout: false,
                shrinkWrapBlocks: false,
                deleteExpando: true,
                noCloneEvent: true,
                inlineBlockNeedsLayout: false,
                shrinkWrapBlocks: false,
-               reliableMarginRight: true,
-               boxSizingReliable: true,
-               pixelPosition: false
+               reliableMarginRight: true
        };
 
        // Make sure checked status is properly cloned
        };
 
        // Make sure checked status is properly cloned
@@ -1396,439 +1256,466 @@ jQuery.support = (function() {
        select.disabled = true;
        support.optDisabled = !opt.disabled;
 
        select.disabled = true;
        support.optDisabled = !opt.disabled;
 
-       // Support: IE<9
+       // Test to see if it's possible to delete an expando from an element
+       // Fails in Internet Explorer
        try {
                delete div.test;
        } catch( e ) {
                support.deleteExpando = false;
        }
 
        try {
                delete div.test;
        } catch( e ) {
                support.deleteExpando = false;
        }
 
-       // Check if we can trust getAttribute("value")
-       input = document.createElement("input");
-       input.setAttribute( "value", "" );
-       support.input = input.getAttribute( "value" ) === "";
+       if ( !div.addEventListener && div.attachEvent && div.fireEvent ) {
+               div.attachEvent( "onclick", function() {
+                       // Cloning a node shouldn't copy over any
+                       // bound event handlers (IE does this)
+                       support.noCloneEvent = false;
+               });
+               div.cloneNode( true ).fireEvent( "onclick" );
+       }
 
 
-       // Check if an input maintains its value after becoming a radio
+       // Check if a radio maintains it's value
+       // after being appended to the DOM
+       input = document.createElement("input");
        input.value = "t";
        input.value = "t";
-       input.setAttribute( "type", "radio" );
+       input.setAttribute("type", "radio");
        support.radioValue = input.value === "t";
 
        support.radioValue = input.value === "t";
 
-       // #11217 - WebKit loses check when the name is after the checked attribute
-       input.setAttribute( "checked", "t" );
-       input.setAttribute( "name", "t" );
-
+       input.setAttribute("checked", "checked");
+       div.appendChild( input );
        fragment = document.createDocumentFragment();
        fragment = document.createDocumentFragment();
-       fragment.appendChild( input );
-
-       // Check if a disconnected checkbox will retain its checked
-       // value of true after appended to the DOM (IE6/7)
-       support.appendChecked = input.checked;
+       fragment.appendChild( div.firstChild );
 
        // WebKit doesn't clone checked state correctly in fragments
        support.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked;
 
 
        // WebKit doesn't clone checked state correctly in fragments
        support.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked;
 
-       // Support: IE<9
-       // Opera does not clone events (and typeof div.attachEvent === undefined).
-       // IE9-10 clones events bound via attachEvent, but they don't trigger with .click()
-       if ( div.attachEvent ) {
-               div.attachEvent( "onclick", function() {
-                       support.noCloneEvent = false;
+       div.innerHTML = "";
+
+       // Figure out if the W3C box model works as expected
+       div.style.width = div.style.paddingLeft = "1px";
+
+       body = document.getElementsByTagName( "body" )[ 0 ];
+       // We use our own, invisible, body unless the body is already present
+       // in which case we use a div (#9239)
+       testElement = document.createElement( body ? "div" : "body" );
+       testElementStyle = {
+               visibility: "hidden",
+               width: 0,
+               height: 0,
+               border: 0,
+               margin: 0,
+               background: "none"
+       };
+       if ( body ) {
+               jQuery.extend( testElementStyle, {
+                       position: "absolute",
+                       left: "-1000px",
+                       top: "-1000px"
                });
                });
-
-               div.cloneNode( true ).click();
        }
        }
-
-       // Support: IE<9 (lack submit/change bubble), Firefox 17+ (lack focusin event)
-       // Beware of CSP restrictions (https://developer.mozilla.org/en/Security/CSP), test/csp.php
-       for ( i in { submit: true, change: true, focusin: true }) {
-               div.setAttribute( eventName = "on" + i, "t" );
-
-               support[ i + "Bubbles" ] = eventName in window || div.attributes[ eventName ].expando === false;
+       for ( i in testElementStyle ) {
+               testElement.style[ i ] = testElementStyle[ i ];
        }
        }
+       testElement.appendChild( div );
+       testElementParent = body || documentElement;
+       testElementParent.insertBefore( testElement, testElementParent.firstChild );
 
 
-       div.style.backgroundClip = "content-box";
-       div.cloneNode( true ).style.backgroundClip = "";
-       support.clearCloneStyle = div.style.backgroundClip === "content-box";
-
-       // Run tests that need a body at doc ready
-       jQuery(function() {
-               var container, marginDiv, tds,
-                       divReset = "padding:0;margin:0;border:0;display:block;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;",
-                       body = document.getElementsByTagName("body")[0];
-
-               if ( !body ) {
-                       // Return for frameset docs that don't have a body
-                       return;
-               }
+       // Check if a disconnected checkbox will retain its checked
+       // value of true after appended to the DOM (IE6/7)
+       support.appendChecked = input.checked;
 
 
-               container = document.createElement("div");
-               container.style.cssText = "border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px";
-
-               body.appendChild( container ).appendChild( div );
-
-               // Support: IE8
-               // Check if table cells still have offsetWidth/Height when they are set
-               // to display:none and there are still other visible table cells in a
-               // table row; if so, offsetWidth/Height are not reliable for use when
-               // determining if an element has been hidden directly using
-               // display:none (it is still safe to use offsets if a parent element is
-               // hidden; don safety goggles and see bug #4512 for more information).
-               div.innerHTML = "<table><tr><td></td><td>t</td></tr></table>";
-               tds = div.getElementsByTagName("td");
-               tds[ 0 ].style.cssText = "padding:0;margin:0;border:0;display:none";
-               isSupported = ( tds[ 0 ].offsetHeight === 0 );
-
-               tds[ 0 ].style.display = "";
-               tds[ 1 ].style.display = "none";
-
-               // Support: IE8
-               // Check if empty table cells still have offsetWidth/Height
-               support.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 );
-
-               // Check box-sizing and margin behavior
-               div.innerHTML = "";
-               div.style.cssText = "box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;";
-               support.boxSizing = ( div.offsetWidth === 4 );
-               support.doesNotIncludeMarginInBodyOffset = ( body.offsetTop !== 1 );
-
-               // Use window.getComputedStyle because jsdom on node.js will break without it.
-               if ( window.getComputedStyle ) {
-                       support.pixelPosition = ( window.getComputedStyle( div, null ) || {} ).top !== "1%";
-                       support.boxSizingReliable = ( window.getComputedStyle( div, null ) || { width: "4px" } ).width === "4px";
-
-                       // Check if div with explicit width and no margin-right incorrectly
-                       // gets computed margin-right based on width of container. (#3333)
-                       // Fails in WebKit before Feb 2011 nightlies
-                       // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
-                       marginDiv = div.appendChild( document.createElement("div") );
-                       marginDiv.style.cssText = div.style.cssText = divReset;
-                       marginDiv.style.marginRight = marginDiv.style.width = "0";
-                       div.style.width = "1px";
-
-                       support.reliableMarginRight =
-                               !parseFloat( ( window.getComputedStyle( marginDiv, null ) || {} ).marginRight );
-               }
-
-               if ( typeof div.style.zoom !== core_strundefined ) {
-                       // Support: IE<8
-                       // Check if natively block-level elements act like inline-block
-                       // elements when setting their display to 'inline' and giving
-                       // them layout
-                       div.innerHTML = "";
-                       div.style.cssText = divReset + "width:1px;padding:1px;display:inline;zoom:1";
-                       support.inlineBlockNeedsLayout = ( div.offsetWidth === 3 );
-
-                       // Support: IE6
-                       // Check if elements with layout shrink-wrap their children
-                       div.style.display = "block";
-                       div.innerHTML = "<div></div>";
-                       div.firstChild.style.width = "5px";
-                       support.shrinkWrapBlocks = ( div.offsetWidth !== 3 );
-
-                       if ( support.inlineBlockNeedsLayout ) {
-                               // Prevent IE 6 from affecting layout for positioned elements #11048
-                               // Prevent IE from shrinking the body in IE 7 mode #12869
-                               // Support: IE<8
-                               body.style.zoom = 1;
+       support.boxModel = div.offsetWidth === 2;
+
+       if ( "zoom" in div.style ) {
+               // Check if natively block-level elements act like inline-block
+               // elements when setting their display to 'inline' and giving
+               // them layout
+               // (IE < 8 does this)
+               div.style.display = "inline";
+               div.style.zoom = 1;
+               support.inlineBlockNeedsLayout = ( div.offsetWidth === 2 );
+
+               // Check if elements with layout shrink-wrap their children
+               // (IE 6 does this)
+               div.style.display = "";
+               div.innerHTML = "<div style='width:4px;'></div>";
+               support.shrinkWrapBlocks = ( div.offsetWidth !== 2 );
+       }
+
+       div.innerHTML = "<table><tr><td style='padding:0;border:0;display:none'></td><td>t</td></tr></table>";
+       tds = div.getElementsByTagName( "td" );
+
+       // Check if table cells still have offsetWidth/Height when they are set
+       // to display:none and there are still other visible table cells in a
+       // table row; if so, offsetWidth/Height are not reliable for use when
+       // determining if an element has been hidden directly using
+       // display:none (it is still safe to use offsets if a parent element is
+       // hidden; don safety goggles and see bug #4512 for more information).
+       // (only IE 8 fails this test)
+       isSupported = ( tds[ 0 ].offsetHeight === 0 );
+
+       tds[ 0 ].style.display = "";
+       tds[ 1 ].style.display = "none";
+
+       // Check if empty table cells still have offsetWidth/Height
+       // (IE < 8 fail this test)
+       support.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 );
+       div.innerHTML = "";
+
+       // Check if div with explicit width and no margin-right incorrectly
+       // gets computed margin-right based on width of container. For more
+       // info see bug #3333
+       // Fails in WebKit before Feb 2011 nightlies
+       // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
+       if ( document.defaultView && document.defaultView.getComputedStyle ) {
+               marginDiv = document.createElement( "div" );
+               marginDiv.style.width = "0";
+               marginDiv.style.marginRight = "0";
+               div.appendChild( marginDiv );
+               support.reliableMarginRight =
+                       ( parseInt( ( document.defaultView.getComputedStyle( marginDiv, null ) || { marginRight: 0 } ).marginRight, 10 ) || 0 ) === 0;
+       }
+
+       // Remove the body element we added
+       testElement.innerHTML = "";
+       testElementParent.removeChild( testElement );
+
+       // Technique from Juriy Zaytsev
+       // http://thinkweb2.com/projects/prototype/detecting-event-support-without-browser-sniffing/
+       // We only care about the case where non-standard event systems
+       // are used, namely in IE. Short-circuiting here helps us to
+       // avoid an eval call (in setAttribute) which can cause CSP
+       // to go haywire. See: https://developer.mozilla.org/en/Security/CSP
+       if ( div.attachEvent ) {
+               for( i in {
+                       submit: 1,
+                       change: 1,
+                       focusin: 1
+               } ) {
+                       eventName = "on" + i;
+                       isSupported = ( eventName in div );
+                       if ( !isSupported ) {
+                               div.setAttribute( eventName, "return;" );
+                               isSupported = ( typeof div[ eventName ] === "function" );
                        }
                        }
+                       support[ i + "Bubbles" ] = isSupported;
                }
                }
+       }
 
 
-               body.removeChild( container );
-
-               // Null elements to avoid leaks in IE
-               container = div = tds = marginDiv = null;
-       });
-
-       // Null elements to avoid leaks in IE
-       all = select = fragment = opt = a = input = null;
+       // Null connected elements to avoid leaks in IE
+       testElement = fragment = select = opt = body = marginDiv = div = input = null;
 
        return support;
 })();
 
 
        return support;
 })();
 
-var rbrace = /(?:\{[\s\S]*\}|\[[\s\S]*\])$/,
-       rmultiDash = /([A-Z])/g;
-
-function internalData( elem, name, data, pvt /* Internal Use Only */ ){
-       if ( !jQuery.acceptData( elem ) ) {
-               return;
-       }
+// Keep track of boxModel
+jQuery.boxModel = jQuery.support.boxModel;
 
 
-       var thisCache, ret,
-               internalKey = jQuery.expando,
-               getByName = typeof name === "string",
 
 
-               // We have to handle DOM nodes and JS objects differently because IE6-7
-               // can't GC object references properly across the DOM-JS boundary
-               isNode = elem.nodeType,
 
 
-               // Only DOM nodes need the global jQuery cache; JS object data is
-               // attached directly to the object so GC can occur automatically
-               cache = isNode ? jQuery.cache : elem,
 
 
-               // Only defining an ID for JS objects if its cache already exists allows
-               // the code to shortcut on the same path as a DOM node with no cache
-               id = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey;
+var rbrace = /^(?:\{.*\}|\[.*\])$/,
+       rmultiDash = /([A-Z])/g;
 
 
-       // Avoid doing any more work than we need to when trying to get data on an
-       // object that has no data at all
-       if ( (!id || !cache[id] || (!pvt && !cache[id].data)) && getByName && data === undefined ) {
-               return;
-       }
+jQuery.extend({
+       cache: {},
 
 
-       if ( !id ) {
-               // Only DOM nodes need a new unique ID for each element since their data
-               // ends up in the global cache
-               if ( isNode ) {
-                       elem[ internalKey ] = id = core_deletedIds.pop() || jQuery.guid++;
-               } else {
-                       id = internalKey;
-               }
-       }
+       // Please use with caution
+       uuid: 0,
 
 
-       if ( !cache[ id ] ) {
-               cache[ id ] = {};
+       // Unique for each copy of jQuery on the page
+       // Non-digits removed to match rinlinejQuery
+       expando: "jQuery" + ( jQuery.fn.jquery + Math.random() ).replace( /\D/g, "" ),
 
 
-               // Avoids exposing jQuery metadata on plain JS objects when the object
-               // is serialized using JSON.stringify
-               if ( !isNode ) {
-                       cache[ id ].toJSON = jQuery.noop;
-               }
-       }
+       // The following elements throw uncatchable exceptions if you
+       // attempt to add expando properties to them.
+       noData: {
+               "embed": true,
+               // Ban all objects except for Flash (which handle expandos)
+               "object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",
+               "applet": true
+       },
 
 
-       // An object can be passed to jQuery.data instead of a key/value pair; this gets
-       // shallow copied over onto the existing cache
-       if ( typeof name === "object" || typeof name === "function" ) {
-               if ( pvt ) {
-                       cache[ id ] = jQuery.extend( cache[ id ], name );
-               } else {
-                       cache[ id ].data = jQuery.extend( cache[ id ].data, name );
-               }
-       }
+       hasData: function( elem ) {
+               elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ];
 
 
-       thisCache = cache[ id ];
+               return !!elem && !isEmptyDataObject( elem );
+       },
 
 
-       // jQuery data() is stored in a separate object inside the object's internal data
-       // cache in order to avoid key collisions between internal data and user-defined
-       // data.
-       if ( !pvt ) {
-               if ( !thisCache.data ) {
-                       thisCache.data = {};
+       data: function( elem, name, data, pvt /* Internal Use Only */ ) {
+               if ( !jQuery.acceptData( elem ) ) {
+                       return;
                }
 
                }
 
-               thisCache = thisCache.data;
-       }
+               var thisCache, ret,
+                       internalKey = jQuery.expando,
+                       getByName = typeof name === "string",
 
 
-       if ( data !== undefined ) {
-               thisCache[ jQuery.camelCase( name ) ] = data;
-       }
+                       // We have to handle DOM nodes and JS objects differently because IE6-7
+                       // can't GC object references properly across the DOM-JS boundary
+                       isNode = elem.nodeType,
 
 
-       // Check for both converted-to-camel and non-converted data property names
-       // If a data property was specified
-       if ( getByName ) {
+                       // Only DOM nodes need the global jQuery cache; JS object data is
+                       // attached directly to the object so GC can occur automatically
+                       cache = isNode ? jQuery.cache : elem,
 
 
-               // First Try to find as-is property data
-               ret = thisCache[ name ];
+                       // Only defining an ID for JS objects if its cache already exists allows
+                       // the code to shortcut on the same path as a DOM node with no cache
+                       id = isNode ? elem[ jQuery.expando ] : elem[ jQuery.expando ] && jQuery.expando;
 
 
-               // Test for null|undefined property data
-               if ( ret == null ) {
+               // Avoid doing any more work than we need to when trying to get data on an
+               // object that has no data at all
+               if ( (!id || (pvt && id && (cache[ id ] && !cache[ id ][ internalKey ]))) && getByName && data === undefined ) {
+                       return;
+               }
 
 
-                       // Try to find the camelCased property
-                       ret = thisCache[ jQuery.camelCase( name ) ];
+               if ( !id ) {
+                       // Only DOM nodes need a new unique ID for each element since their data
+                       // ends up in the global cache
+                       if ( isNode ) {
+                               elem[ jQuery.expando ] = id = ++jQuery.uuid;
+                       } else {
+                               id = jQuery.expando;
+                       }
                }
                }
-       } else {
-               ret = thisCache;
-       }
 
 
-       return ret;
-}
+               if ( !cache[ id ] ) {
+                       cache[ id ] = {};
 
 
-function internalRemoveData( elem, name, pvt ) {
-       if ( !jQuery.acceptData( elem ) ) {
-               return;
-       }
+                       // TODO: This is a hack for 1.5 ONLY. Avoids exposing jQuery
+                       // metadata on plain JS objects when the object is serialized using
+                       // JSON.stringify
+                       if ( !isNode ) {
+                               cache[ id ].toJSON = jQuery.noop;
+                       }
+               }
 
 
-       var i, l, thisCache,
-               isNode = elem.nodeType,
+               // An object can be passed to jQuery.data instead of a key/value pair; this gets
+               // shallow copied over onto the existing cache
+               if ( typeof name === "object" || typeof name === "function" ) {
+                       if ( pvt ) {
+                               cache[ id ][ internalKey ] = jQuery.extend(cache[ id ][ internalKey ], name);
+                       } else {
+                               cache[ id ] = jQuery.extend(cache[ id ], name);
+                       }
+               }
 
 
-               // See jQuery.data for more information
-               cache = isNode ? jQuery.cache : elem,
-               id = isNode ? elem[ jQuery.expando ] : jQuery.expando;
+               thisCache = cache[ id ];
 
 
-       // If there is already no cache entry for this object, there is no
-       // purpose in continuing
-       if ( !cache[ id ] ) {
-               return;
-       }
+               // Internal jQuery data is stored in a separate object inside the object's data
+               // cache in order to avoid key collisions between internal data and user-defined
+               // data
+               if ( pvt ) {
+                       if ( !thisCache[ internalKey ] ) {
+                               thisCache[ internalKey ] = {};
+                       }
 
 
-       if ( name ) {
+                       thisCache = thisCache[ internalKey ];
+               }
 
 
-               thisCache = pvt ? cache[ id ] : cache[ id ].data;
+               if ( data !== undefined ) {
+                       thisCache[ jQuery.camelCase( name ) ] = data;
+               }
 
 
-               if ( thisCache ) {
+               // TODO: This is a hack for 1.5 ONLY. It will be removed in 1.6. Users should
+               // not attempt to inspect the internal events object using jQuery.data, as this
+               // internal data object is undocumented and subject to change.
+               if ( name === "events" && !thisCache[name] ) {
+                       return thisCache[ internalKey ] && thisCache[ internalKey ].events;
+               }
 
 
-                       // Support array or space separated string names for data keys
-                       if ( !jQuery.isArray( name ) ) {
+               // Check for both converted-to-camel and non-converted data property names
+               // If a data property was specified
+               if ( getByName ) {
 
 
-                               // try the string as a key before any manipulation
-                               if ( name in thisCache ) {
-                                       name = [ name ];
-                               } else {
+                       // First Try to find as-is property data
+                       ret = thisCache[ name ];
 
 
-                                       // split the camel cased version by spaces unless a key with the spaces exists
-                                       name = jQuery.camelCase( name );
-                                       if ( name in thisCache ) {
-                                               name = [ name ];
-                                       } else {
-                                               name = name.split(" ");
-                                       }
-                               }
-                       } else {
-                               // If "name" is an array of keys...
-                               // When data is initially created, via ("key", "val") signature,
-                               // keys will be converted to camelCase.
-                               // Since there is no way to tell _how_ a key was added, remove
-                               // both plain key and camelCase key. #12786
-                               // This will only penalize the array argument path.
-                               name = name.concat( jQuery.map( name, jQuery.camelCase ) );
-                       }
+                       // Test for null|undefined property data
+                       if ( ret == null ) {
 
 
-                       for ( i = 0, l = name.length; i < l; i++ ) {
-                               delete thisCache[ name[i] ];
+                               // Try to find the camelCased property
+                               ret = thisCache[ jQuery.camelCase( name ) ];
                        }
                        }
+               } else {
+                       ret = thisCache;
+               }
 
 
-                       // If there is no data left in the cache, we want to continue
-                       // and let the cache object itself get destroyed
-                       if ( !( pvt ? isEmptyDataObject : jQuery.isEmptyObject )( thisCache ) ) {
-                               return;
-                       }
+               return ret;
+       },
+
+       removeData: function( elem, name, pvt /* Internal Use Only */ ) {
+               if ( !jQuery.acceptData( elem ) ) {
+                       return;
                }
                }
-       }
 
 
-       // See jQuery.data for more information
-       if ( !pvt ) {
-               delete cache[ id ].data;
+               var thisCache,
+
+                       // Reference to internal data cache key
+                       internalKey = jQuery.expando,
+
+                       isNode = elem.nodeType,
+
+                       // See jQuery.data for more information
+                       cache = isNode ? jQuery.cache : elem,
 
 
-               // Don't destroy the parent cache unless the internal data object
-               // had been the only thing left in it
-               if ( !isEmptyDataObject( cache[ id ] ) ) {
+                       // See jQuery.data for more information
+                       id = isNode ? elem[ jQuery.expando ] : jQuery.expando;
+
+               // If there is already no cache entry for this object, there is no
+               // purpose in continuing
+               if ( !cache[ id ] ) {
                        return;
                }
                        return;
                }
-       }
 
 
-       // Destroy the cache
-       if ( isNode ) {
-               jQuery.cleanData( [ elem ], true );
+               if ( name ) {
 
 
-       // Use delete when supported for expandos or `cache` is not a window per isWindow (#10080)
-       } else if ( jQuery.support.deleteExpando || cache != cache.window ) {
-               delete cache[ id ];
+                       thisCache = pvt ? cache[ id ][ internalKey ] : cache[ id ];
 
 
-       // When all else fails, null
-       } else {
-               cache[ id ] = null;
-       }
-}
+                       if ( thisCache ) {
 
 
-jQuery.extend({
-       cache: {},
+                               // Support interoperable removal of hyphenated or camelcased keys
+                               if ( !thisCache[ name ] ) {
+                                       name = jQuery.camelCase( name );
+                               }
 
 
-       // Unique for each copy of jQuery on the page
-       // Non-digits removed to match rinlinejQuery
-       expando: "jQuery" + ( core_version + Math.random() ).replace( /\D/g, "" ),
+                               delete thisCache[ name ];
 
 
-       // The following elements throw uncatchable exceptions if you
-       // attempt to add expando properties to them.
-       noData: {
-               "embed": true,
-               // Ban all objects except for Flash (which handle expandos)
-               "object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",
-               "applet": true
-       },
+                               // If there is no data left in the cache, we want to continue
+                               // and let the cache object itself get destroyed
+                               if ( !isEmptyDataObject(thisCache) ) {
+                                       return;
+                               }
+                       }
+               }
 
 
-       hasData: function( elem ) {
-               elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ];
-               return !!elem && !isEmptyDataObject( elem );
-       },
+               // See jQuery.data for more information
+               if ( pvt ) {
+                       delete cache[ id ][ internalKey ];
 
 
-       data: function( elem, name, data ) {
-               return internalData( elem, name, data );
-       },
+                       // Don't destroy the parent cache unless the internal data object
+                       // had been the only thing left in it
+                       if ( !isEmptyDataObject(cache[ id ]) ) {
+                               return;
+                       }
+               }
+
+               var internalCache = cache[ id ][ internalKey ];
 
 
-       removeData: function( elem, name ) {
-               return internalRemoveData( elem, name );
+               // Browsers that fail expando deletion also refuse to delete expandos on
+               // the window, but it will allow it on all other JS objects; other browsers
+               // don't care
+               // Ensure that `cache` is not a window object #10080
+               if ( jQuery.support.deleteExpando || !cache.setInterval ) {
+                       delete cache[ id ];
+               } else {
+                       cache[ id ] = null;
+               }
+
+               // We destroyed the entire user cache at once because it's faster than
+               // iterating through each key, but we need to continue to persist internal
+               // data if it existed
+               if ( internalCache ) {
+                       cache[ id ] = {};
+                       // TODO: This is a hack for 1.5 ONLY. Avoids exposing jQuery
+                       // metadata on plain JS objects when the object is serialized using
+                       // JSON.stringify
+                       if ( !isNode ) {
+                               cache[ id ].toJSON = jQuery.noop;
+                       }
+
+                       cache[ id ][ internalKey ] = internalCache;
+
+               // Otherwise, we need to eliminate the expando on the node to avoid
+               // false lookups in the cache for entries that no longer exist
+               } else if ( isNode ) {
+                       // IE does not allow us to delete expando properties from nodes,
+                       // nor does it have a removeAttribute function on Document nodes;
+                       // we must handle all of these cases
+                       if ( jQuery.support.deleteExpando ) {
+                               delete elem[ jQuery.expando ];
+                       } else if ( elem.removeAttribute ) {
+                               elem.removeAttribute( jQuery.expando );
+                       } else {
+                               elem[ jQuery.expando ] = null;
+                       }
+               }
        },
 
        // For internal use only.
        _data: function( elem, name, data ) {
        },
 
        // For internal use only.
        _data: function( elem, name, data ) {
-               return internalData( elem, name, data, true );
-       },
-
-       _removeData: function( elem, name ) {
-               return internalRemoveData( elem, name, true );
+               return jQuery.data( elem, name, data, true );
        },
 
        // A method for determining if a DOM node can handle the data expando
        acceptData: function( elem ) {
        },
 
        // A method for determining if a DOM node can handle the data expando
        acceptData: function( elem ) {
-               // Do not set data on non-element because it will not be cleared (#8335).
-               if ( elem.nodeType && elem.nodeType !== 1 && elem.nodeType !== 9 ) {
-                       return false;
-               }
+               if ( elem.nodeName ) {
+                       var match = jQuery.noData[ elem.nodeName.toLowerCase() ];
 
 
-               var noData = elem.nodeName && jQuery.noData[ elem.nodeName.toLowerCase() ];
+                       if ( match ) {
+                               return !(match === true || elem.getAttribute("classid") !== match);
+                       }
+               }
 
 
-               // nodes accept data unless otherwise specified; rejection can be conditional
-               return !noData || noData !== true && elem.getAttribute("classid") === noData;
+               return true;
        }
 });
 
 jQuery.fn.extend({
        data: function( key, value ) {
        }
 });
 
 jQuery.fn.extend({
        data: function( key, value ) {
-               var attrs, name,
-                       elem = this[0],
-                       i = 0,
-                       data = null;
+               var data = null;
 
 
-               // Gets all values
-               if ( key === undefined ) {
+               if ( typeof key === "undefined" ) {
                        if ( this.length ) {
                        if ( this.length ) {
-                               data = jQuery.data( elem );
+                               data = jQuery.data( this[0] );
 
 
-                               if ( elem.nodeType === 1 && !jQuery._data( elem, "parsedAttrs" ) ) {
-                                       attrs = elem.attributes;
-                                       for ( ; i < attrs.length; i++ ) {
-                                               name = attrs[i].name;
+                               if ( this[0].nodeType === 1 ) {
+                           var attr = this[0].attributes, name;
+                                       for ( var i = 0, l = attr.length; i < l; i++ ) {
+                                               name = attr[i].name;
 
 
-                                               if ( !name.indexOf( "data-" ) ) {
-                                                       name = jQuery.camelCase( name.slice(5) );
+                                               if ( name.indexOf( "data-" ) === 0 ) {
+                                                       name = jQuery.camelCase( name.substring(5) );
 
 
-                                                       dataAttr( elem, name, data[ name ] );
+                                                       dataAttr( this[0], name, data[ name ] );
                                                }
                                        }
                                                }
                                        }
-                                       jQuery._data( elem, "parsedAttrs", true );
                                }
                        }
 
                        return data;
                                }
                        }
 
                        return data;
-               }
 
 
-               // Sets multiple values
-               if ( typeof key === "object" ) {
+               } else if ( typeof key === "object" ) {
                        return this.each(function() {
                                jQuery.data( this, key );
                        });
                }
 
                        return this.each(function() {
                                jQuery.data( this, key );
                        });
                }
 
-               return jQuery.access( this, function( value ) {
+               var parts = key.split(".");
+               parts[1] = parts[1] ? "." + parts[1] : "";
 
 
-                       if ( value === undefined ) {
-                               // Try to fetch any internally stored data first
-                               return elem ? dataAttr( elem, key, jQuery.data( elem, key ) ) : null;
+               if ( value === undefined ) {
+                       data = this.triggerHandler("getData" + parts[1] + "!", [parts[0]]);
+
+                       // Try to fetch any internally stored data first
+                       if ( data === undefined && this.length ) {
+                               data = jQuery.data( this[0], key );
+                               data = dataAttr( this[0], key, data );
                        }
 
                        }
 
-                       this.each(function() {
+                       return data === undefined && parts[1] ?
+                               this.data( parts[0] ) :
+                               data;
+
+               } else {
+                       return this.each(function() {
+                               var $this = jQuery( this ),
+                                       args = [ parts[0], value ];
+
+                               $this.triggerHandler( "setData" + parts[1] + "!", args );
                                jQuery.data( this, key, value );
                                jQuery.data( this, key, value );
+                               $this.triggerHandler( "changeData" + parts[1] + "!", args );
                        });
                        });
-               }, null, value, arguments.length > 1, null, true );
+               }
        },
 
        removeData: function( key ) {
        },
 
        removeData: function( key ) {
@@ -1850,12 +1737,11 @@ function dataAttr( elem, key, data ) {
                if ( typeof data === "string" ) {
                        try {
                                data = data === "true" ? true :
                if ( typeof data === "string" ) {
                        try {
                                data = data === "true" ? true :
-                                       data === "false" ? false :
-                                       data === "null" ? null :
-                                       // Only convert to a number if it doesn't change the string
-                                       +data + "" === data ? +data :
+                               data === "false" ? false :
+                               data === "null" ? null :
+                               !jQuery.isNaN( data ) ? parseFloat( data ) :
                                        rbrace.test( data ) ? jQuery.parseJSON( data ) :
                                        rbrace.test( data ) ? jQuery.parseJSON( data ) :
-                                               data;
+                                       data;
                        } catch( e ) {}
 
                        // Make sure we set the data so it isn't changed later
                        } catch( e ) {}
 
                        // Make sure we set the data so it isn't changed later
@@ -1869,15 +1755,11 @@ function dataAttr( elem, key, data ) {
        return data;
 }
 
        return data;
 }
 
-// checks a cache object for emptiness
+// TODO: This is a hack for 1.5 ONLY to allow objects with a single toJSON
+// property to be considered empty objects; this property always exists in
+// order to make sure JSON.stringify does not expose internal metadata
 function isEmptyDataObject( obj ) {
 function isEmptyDataObject( obj ) {
-       var name;
-       for ( name in obj ) {
-
-               // if the public data object is empty, the private is still empty
-               if ( name === "data" && jQuery.isEmptyObject( obj[name] ) ) {
-                       continue;
-               }
+       for ( var name in obj ) {
                if ( name !== "toJSON" ) {
                        return false;
                }
                if ( name !== "toJSON" ) {
                        return false;
                }
@@ -1885,23 +1767,71 @@ function isEmptyDataObject( obj ) {
 
        return true;
 }
 
        return true;
 }
-jQuery.extend({
-       queue: function( elem, type, data ) {
-               var queue;
 
 
-               if ( elem ) {
-                       type = ( type || "fx" ) + "queue";
-                       queue = jQuery._data( elem, type );
 
 
-                       // Speed up dequeue by getting out quickly if this is just a lookup
-                       if ( data ) {
-                               if ( !queue || jQuery.isArray(data) ) {
-                                       queue = jQuery._data( elem, type, jQuery.makeArray(data) );
+
+
+function handleQueueMarkDefer( elem, type, src ) {
+       var deferDataKey = type + "defer",
+               queueDataKey = type + "queue",
+               markDataKey = type + "mark",
+               defer = jQuery.data( elem, deferDataKey, undefined, true );
+       if ( defer &&
+               ( src === "queue" || !jQuery.data( elem, queueDataKey, undefined, true ) ) &&
+               ( src === "mark" || !jQuery.data( elem, markDataKey, undefined, true ) ) ) {
+               // Give room for hard-coded callbacks to fire first
+               // and eventually mark/queue something else on the element
+               setTimeout( function() {
+                       if ( !jQuery.data( elem, queueDataKey, undefined, true ) &&
+                               !jQuery.data( elem, markDataKey, undefined, true ) ) {
+                               jQuery.removeData( elem, deferDataKey, true );
+                               defer.resolve();
+                       }
+               }, 0 );
+       }
+}
+
+jQuery.extend({
+
+       _mark: function( elem, type ) {
+               if ( elem ) {
+                       type = (type || "fx") + "mark";
+                       jQuery.data( elem, type, (jQuery.data(elem,type,undefined,true) || 0) + 1, true );
+               }
+       },
+
+       _unmark: function( force, elem, type ) {
+               if ( force !== true ) {
+                       type = elem;
+                       elem = force;
+                       force = false;
+               }
+               if ( elem ) {
+                       type = type || "fx";
+                       var key = type + "mark",
+                               count = force ? 0 : ( (jQuery.data( elem, key, undefined, true) || 1 ) - 1 );
+                       if ( count ) {
+                               jQuery.data( elem, key, count, true );
+                       } else {
+                               jQuery.removeData( elem, key, true );
+                               handleQueueMarkDefer( elem, type, "mark" );
+                       }
+               }
+       },
+
+       queue: function( elem, type, data ) {
+               if ( elem ) {
+                       type = (type || "fx") + "queue";
+                       var q = jQuery.data( elem, type, undefined, true );
+                       // Speed up dequeue by getting out quickly if this is just a lookup
+                       if ( data ) {
+                               if ( !q || jQuery.isArray(data) ) {
+                                       q = jQuery.data( elem, type, jQuery.makeArray(data), true );
                                } else {
                                } else {
-                                       queue.push( data );
+                                       q.push( data );
                                }
                        }
                                }
                        }
-                       return queue || [];
+                       return q || [];
                }
        },
 
                }
        },
 
@@ -1909,76 +1839,50 @@ jQuery.extend({
                type = type || "fx";
 
                var queue = jQuery.queue( elem, type ),
                type = type || "fx";
 
                var queue = jQuery.queue( elem, type ),
-                       startLength = queue.length,
                        fn = queue.shift(),
                        fn = queue.shift(),
-                       hooks = jQuery._queueHooks( elem, type ),
-                       next = function() {
-                               jQuery.dequeue( elem, type );
-                       };
+                       defer;
 
                // If the fx queue is dequeued, always remove the progress sentinel
                if ( fn === "inprogress" ) {
                        fn = queue.shift();
 
                // If the fx queue is dequeued, always remove the progress sentinel
                if ( fn === "inprogress" ) {
                        fn = queue.shift();
-                       startLength--;
                }
 
                }
 
-               hooks.cur = fn;
                if ( fn ) {
                if ( fn ) {
-
                        // Add a progress sentinel to prevent the fx queue from being
                        // automatically dequeued
                        if ( type === "fx" ) {
                        // Add a progress sentinel to prevent the fx queue from being
                        // automatically dequeued
                        if ( type === "fx" ) {
-                               queue.unshift( "inprogress" );
+                               queue.unshift("inprogress");
                        }
 
                        }
 
-                       // clear up the last queue stop function
-                       delete hooks.stop;
-                       fn.call( elem, next, hooks );
+                       fn.call(elem, function() {
+                               jQuery.dequeue(elem, type);
+                       });
                }
 
                }
 
-               if ( !startLength && hooks ) {
-                       hooks.empty.fire();
+               if ( !queue.length ) {
+                       jQuery.removeData( elem, type + "queue", true );
+                       handleQueueMarkDefer( elem, type, "queue" );
                }
                }
-       },
-
-       // not intended for public consumption - generates a queueHooks object, or returns the current one
-       _queueHooks: function( elem, type ) {
-               var key = type + "queueHooks";
-               return jQuery._data( elem, key ) || jQuery._data( elem, key, {
-                       empty: jQuery.Callbacks("once memory").add(function() {
-                               jQuery._removeData( elem, type + "queue" );
-                               jQuery._removeData( elem, key );
-                       })
-               });
        }
 });
 
 jQuery.fn.extend({
        queue: function( type, data ) {
        }
 });
 
 jQuery.fn.extend({
        queue: function( type, data ) {
-               var setter = 2;
-
                if ( typeof type !== "string" ) {
                        data = type;
                        type = "fx";
                if ( typeof type !== "string" ) {
                        data = type;
                        type = "fx";
-                       setter--;
                }
 
                }
 
-               if ( arguments.length < setter ) {
+               if ( data === undefined ) {
                        return jQuery.queue( this[0], type );
                }
                        return jQuery.queue( this[0], type );
                }
+               return this.each(function() {
+                       var queue = jQuery.queue( this, type, data );
 
 
-               return data === undefined ?
-                       this :
-                       this.each(function() {
-                               var queue = jQuery.queue( this, type, data );
-
-                               // ensure a hooks for this queue
-                               jQuery._queueHooks( this, type );
-
-                               if ( type === "fx" && queue[0] !== "inprogress" ) {
-                                       jQuery.dequeue( this, type );
-                               }
-                       });
+                       if ( type === "fx" && queue[0] !== "inprogress" ) {
+                               jQuery.dequeue( this, type );
+                       }
+               });
        },
        dequeue: function( type ) {
                return this.each(function() {
        },
        dequeue: function( type ) {
                return this.each(function() {
@@ -1988,14 +1892,14 @@ jQuery.fn.extend({
        // Based off of the plugin by Clint Helfers, with permission.
        // http://blindsignals.com/index.php/2009/07/jquery-delay/
        delay: function( time, type ) {
        // Based off of the plugin by Clint Helfers, with permission.
        // http://blindsignals.com/index.php/2009/07/jquery-delay/
        delay: function( time, type ) {
-               time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;
+               time = jQuery.fx ? jQuery.fx.speeds[time] || time : time;
                type = type || "fx";
 
                type = type || "fx";
 
-               return this.queue( type, function( next, hooks ) {
-                       var timeout = setTimeout( next, time );
-                       hooks.stop = function() {
-                               clearTimeout( timeout );
-                       };
+               return this.queue( type, function() {
+                       var elem = this;
+                       setTimeout(function() {
+                               jQuery.dequeue( elem, type );
+                       }, time );
                });
        },
        clearQueue: function( type ) {
                });
        },
        clearQueue: function( type ) {
@@ -2003,48 +1907,54 @@ jQuery.fn.extend({
        },
        // Get a promise resolved when queues of a certain type
        // are emptied (fx is the type by default)
        },
        // Get a promise resolved when queues of a certain type
        // are emptied (fx is the type by default)
-       promise: function( type, obj ) {
-               var tmp,
-                       count = 1,
-                       defer = jQuery.Deferred(),
-                       elements = this,
-                       i = this.length,
-                       resolve = function() {
-                               if ( !( --count ) ) {
-                                       defer.resolveWith( elements, [ elements ] );
-                               }
-                       };
-
+       promise: function( type, object ) {
                if ( typeof type !== "string" ) {
                if ( typeof type !== "string" ) {
-                       obj = type;
+                       object = type;
                        type = undefined;
                }
                type = type || "fx";
                        type = undefined;
                }
                type = type || "fx";
-
+               var defer = jQuery.Deferred(),
+                       elements = this,
+                       i = elements.length,
+                       count = 1,
+                       deferDataKey = type + "defer",
+                       queueDataKey = type + "queue",
+                       markDataKey = type + "mark",
+                       tmp;
+               function resolve() {
+                       if ( !( --count ) ) {
+                               defer.resolveWith( elements, [ elements ] );
+                       }
+               }
                while( i-- ) {
                while( i-- ) {
-                       tmp = jQuery._data( elements[ i ], type + "queueHooks" );
-                       if ( tmp && tmp.empty ) {
+                       if (( tmp = jQuery.data( elements[ i ], deferDataKey, undefined, true ) ||
+                                       ( jQuery.data( elements[ i ], queueDataKey, undefined, true ) ||
+                                               jQuery.data( elements[ i ], markDataKey, undefined, true ) ) &&
+                                       jQuery.data( elements[ i ], deferDataKey, jQuery._Deferred(), true ) )) {
                                count++;
                                count++;
-                               tmp.empty.add( resolve );
+                               tmp.done( resolve );
                        }
                }
                resolve();
                        }
                }
                resolve();
-               return defer.promise( obj );
+               return defer.promise();
        }
 });
        }
 });
-var nodeHook, boolHook,
-       rclass = /[\t\r\n]/g,
+
+
+
+
+var rclass = /[\n\t\r]/g,
+       rspace = /\s+/,
        rreturn = /\r/g,
        rreturn = /\r/g,
-       rfocusable = /^(?:input|select|textarea|button|object)$/i,
-       rclickable = /^(?:a|area)$/i,
-       rboolean = /^(?:checked|selected|autofocus|autoplay|async|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped)$/i,
-       ruseDefault = /^(?:checked|selected)$/i,
-       getSetAttribute = jQuery.support.getSetAttribute,
-       getSetInput = jQuery.support.input;
+       rtype = /^(?:button|input)$/i,
+       rfocusable = /^(?:button|input|object|select|textarea)$/i,
+       rclickable = /^a(?:rea)?$/i,
+       rboolean = /^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,
+       nodeHook, boolHook;
 
 jQuery.fn.extend({
        attr: function( name, value ) {
 
 jQuery.fn.extend({
        attr: function( name, value ) {
-               return jQuery.access( this, jQuery.attr, name, value, arguments.length > 1 );
+               return jQuery.access( this, name, value, true, jQuery.attr );
        },
 
        removeAttr: function( name ) {
        },
 
        removeAttr: function( name ) {
@@ -2052,11 +1962,11 @@ jQuery.fn.extend({
                        jQuery.removeAttr( this, name );
                });
        },
                        jQuery.removeAttr( this, name );
                });
        },
-
+       
        prop: function( name, value ) {
        prop: function( name, value ) {
-               return jQuery.access( this, jQuery.prop, name, value, arguments.length > 1 );
+               return jQuery.access( this, name, value, true, jQuery.prop );
        },
        },
-
+       
        removeProp: function( name ) {
                name = jQuery.propFix[ name ] || name;
                return this.each(function() {
        removeProp: function( name ) {
                name = jQuery.propFix[ name ] || name;
                return this.each(function() {
@@ -2069,37 +1979,35 @@ jQuery.fn.extend({
        },
 
        addClass: function( value ) {
        },
 
        addClass: function( value ) {
-               var classes, elem, cur, clazz, j,
-                       i = 0,
-                       len = this.length,
-                       proceed = typeof value === "string" && value;
+               var classNames, i, l, elem,
+                       setClass, c, cl;
 
                if ( jQuery.isFunction( value ) ) {
                        return this.each(function( j ) {
 
                if ( jQuery.isFunction( value ) ) {
                        return this.each(function( j ) {
-                               jQuery( this ).addClass( value.call( this, j, this.className ) );
+                               jQuery( this ).addClass( value.call(this, j, this.className) );
                        });
                }
 
                        });
                }
 
-               if ( proceed ) {
-                       // The disjunction here is for better compressibility (see removeClass)
-                       classes = ( value || "" ).match( core_rnotwhite ) || [];
+               if ( value && typeof value === "string" ) {
+                       classNames = value.split( rspace );
 
 
-                       for ( ; i < len; i++ ) {
+                       for ( i = 0, l = this.length; i < l; i++ ) {
                                elem = this[ i ];
                                elem = this[ i ];
-                               cur = elem.nodeType === 1 && ( elem.className ?
-                                       ( " " + elem.className + " " ).replace( rclass, " " ) :
-                                       " "
-                               );
 
 
-                               if ( cur ) {
-                                       j = 0;
-                                       while ( (clazz = classes[j++]) ) {
-                                               if ( cur.indexOf( " " + clazz + " " ) < 0 ) {
-                                                       cur += clazz + " ";
+                               if ( elem.nodeType === 1 ) {
+                                       if ( !elem.className && classNames.length === 1 ) {
+                                               elem.className = value;
+
+                                       } else {
+                                               setClass = " " + elem.className + " ";
+
+                                               for ( c = 0, cl = classNames.length; c < cl; c++ ) {
+                                                       if ( !~setClass.indexOf( " " + classNames[ c ] + " " ) ) {
+                                                               setClass += classNames[ c ] + " ";
+                                                       }
                                                }
                                                }
+                                               elem.className = jQuery.trim( setClass );
                                        }
                                        }
-                                       elem.className = jQuery.trim( cur );
-
                                }
                        }
                }
                                }
                        }
                }
@@ -2108,36 +2016,31 @@ jQuery.fn.extend({
        },
 
        removeClass: function( value ) {
        },
 
        removeClass: function( value ) {
-               var classes, elem, cur, clazz, j,
-                       i = 0,
-                       len = this.length,
-                       proceed = arguments.length === 0 || typeof value === "string" && value;
+               var classNames, i, l, elem, className, c, cl;
 
                if ( jQuery.isFunction( value ) ) {
                        return this.each(function( j ) {
 
                if ( jQuery.isFunction( value ) ) {
                        return this.each(function( j ) {
-                               jQuery( this ).removeClass( value.call( this, j, this.className ) );
+                               jQuery( this ).removeClass( value.call(this, j, this.className) );
                        });
                }
                        });
                }
-               if ( proceed ) {
-                       classes = ( value || "" ).match( core_rnotwhite ) || [];
 
 
-                       for ( ; i < len; i++ ) {
+               if ( (value && typeof value === "string") || value === undefined ) {
+                       classNames = (value || "").split( rspace );
+
+                       for ( i = 0, l = this.length; i < l; i++ ) {
                                elem = this[ i ];
                                elem = this[ i ];
-                               // This expression is here for better compressibility (see addClass)
-                               cur = elem.nodeType === 1 && ( elem.className ?
-                                       ( " " + elem.className + " " ).replace( rclass, " " ) :
-                                       ""
-                               );
 
 
-                               if ( cur ) {
-                                       j = 0;
-                                       while ( (clazz = classes[j++]) ) {
-                                               // Remove *all* instances
-                                               while ( cur.indexOf( " " + clazz + " " ) >= 0 ) {
-                                                       cur = cur.replace( " " + clazz + " ", " " );
+                               if ( elem.nodeType === 1 && elem.className ) {
+                                       if ( value ) {
+                                               className = (" " + elem.className + " ").replace( rclass, " " );
+                                               for ( c = 0, cl = classNames.length; c < cl; c++ ) {
+                                                       className = className.replace(" " + classNames[ c ] + " ", " ");
                                                }
                                                }
+                                               elem.className = jQuery.trim( className );
+
+                                       } else {
+                                               elem.className = "";
                                        }
                                        }
-                                       elem.className = value ? jQuery.trim( cur ) : "";
                                }
                        }
                }
                                }
                        }
                }
@@ -2162,36 +2065,30 @@ jQuery.fn.extend({
                                        i = 0,
                                        self = jQuery( this ),
                                        state = stateVal,
                                        i = 0,
                                        self = jQuery( this ),
                                        state = stateVal,
-                                       classNames = value.match( core_rnotwhite ) || [];
+                                       classNames = value.split( rspace );
 
                                while ( (className = classNames[ i++ ]) ) {
 
                                while ( (className = classNames[ i++ ]) ) {
-                                       // check each className given, space separated list
+                                       // check each className given, space seperated list
                                        state = isBool ? state : !self.hasClass( className );
                                        self[ state ? "addClass" : "removeClass" ]( className );
                                }
 
                                        state = isBool ? state : !self.hasClass( className );
                                        self[ state ? "addClass" : "removeClass" ]( className );
                                }
 
-                       // Toggle whole class name
-                       } else if ( type === core_strundefined || type === "boolean" ) {
+                       } else if ( type === "undefined" || type === "boolean" ) {
                                if ( this.className ) {
                                        // store className if set
                                        jQuery._data( this, "__className__", this.className );
                                }
 
                                if ( this.className ) {
                                        // store className if set
                                        jQuery._data( this, "__className__", this.className );
                                }
 
-                               // If the element has a class name or if we're passed "false",
-                               // then remove the whole classname (if there was one, the above saved it).
-                               // Otherwise bring back whatever was previously saved (if anything),
-                               // falling back to the empty string if nothing was stored.
+                               // toggle whole className
                                this.className = this.className || value === false ? "" : jQuery._data( this, "__className__" ) || "";
                        }
                });
        },
 
        hasClass: function( selector ) {
                                this.className = this.className || value === false ? "" : jQuery._data( this, "__className__" ) || "";
                        }
                });
        },
 
        hasClass: function( selector ) {
-               var className = " " + selector + " ",
-                       i = 0,
-                       l = this.length;
-               for ( ; i < l; i++ ) {
-                       if ( this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) >= 0 ) {
+               var className = " " + selector + " ";
+               for ( var i = 0, l = this.length; i < l; i++ ) {
+                       if ( this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) > -1 ) {
                                return true;
                        }
                }
                                return true;
                        }
                }
@@ -2200,12 +2097,12 @@ jQuery.fn.extend({
        },
 
        val: function( value ) {
        },
 
        val: function( value ) {
-               var ret, hooks, isFunction,
+               var hooks, ret,
                        elem = this[0];
                        elem = this[0];
-
+               
                if ( !arguments.length ) {
                        if ( elem ) {
                if ( !arguments.length ) {
                        if ( elem ) {
-                               hooks = jQuery.valHooks[ elem.type ] || jQuery.valHooks[ elem.nodeName.toLowerCase() ];
+                               hooks = jQuery.valHooks[ elem.nodeName.toLowerCase() ] || jQuery.valHooks[ elem.type ];
 
                                if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) {
                                        return ret;
 
                                if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) {
                                        return ret;
@@ -2213,21 +2110,20 @@ jQuery.fn.extend({
 
                                ret = elem.value;
 
 
                                ret = elem.value;
 
-                               return typeof ret === "string" ?
+                               return typeof ret === "string" ? 
                                        // handle most common string cases
                                        // handle most common string cases
-                                       ret.replace(rreturn, "") :
+                                       ret.replace(rreturn, "") : 
                                        // handle cases where value is null/undef or number
                                        ret == null ? "" : ret;
                        }
 
                                        // handle cases where value is null/undef or number
                                        ret == null ? "" : ret;
                        }
 
-                       return;
+                       return undefined;
                }
 
                }
 
-               isFunction = jQuery.isFunction( value );
+               var isFunction = jQuery.isFunction( value );
 
                return this.each(function( i ) {
 
                return this.each(function( i ) {
-                       var val,
-                               self = jQuery(this);
+                       var self = jQuery(this), val;
 
                        if ( this.nodeType !== 1 ) {
                                return;
 
                        if ( this.nodeType !== 1 ) {
                                return;
@@ -2250,7 +2146,7 @@ jQuery.fn.extend({
                                });
                        }
 
                                });
                        }
 
-                       hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];
+                       hooks = jQuery.valHooks[ this.nodeName.toLowerCase() ] || jQuery.valHooks[ this.type ];
 
                        // If set returns undefined, fall back to normal setting
                        if ( !hooks || !("set" in hooks) || hooks.set( this, val, "value" ) === undefined ) {
 
                        // If set returns undefined, fall back to normal setting
                        if ( !hooks || !("set" in hooks) || hooks.set( this, val, "value" ) === undefined ) {
@@ -2272,25 +2168,24 @@ jQuery.extend({
                },
                select: {
                        get: function( elem ) {
                },
                select: {
                        get: function( elem ) {
-                               var value, option,
-                                       options = elem.options,
+                               var value,
                                        index = elem.selectedIndex,
                                        index = elem.selectedIndex,
-                                       one = elem.type === "select-one" || index < 0,
-                                       values = one ? null : [],
-                                       max = one ? index + 1 : options.length,
-                                       i = index < 0 ?
-                                               max :
-                                               one ? index : 0;
+                                       values = [],
+                                       options = elem.options,
+                                       one = elem.type === "select-one";
+
+                               // Nothing was selected
+                               if ( index < 0 ) {
+                                       return null;
+                               }
 
                                // Loop through all the selected options
 
                                // Loop through all the selected options
-                               for ( ; i < max; i++ ) {
-                                       option = options[ i ];
+                               for ( var i = one ? index : 0, max = one ? index + 1 : options.length; i < max; i++ ) {
+                                       var option = options[ i ];
 
 
-                                       // oldIE doesn't update selected after form reset (#2551)
-                                       if ( ( option.selected || i === index ) &&
-                                                       // Don't return options that are disabled or in a disabled optgroup
-                                                       ( jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null ) &&
-                                                       ( !option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" ) ) ) {
+                                       // Don't return options that are disabled or in a disabled optgroup
+                                       if ( option.selected && (jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null) &&
+                                                       (!option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" )) ) {
 
                                                // Get the specific value for the option
                                                value = jQuery( option ).val();
 
                                                // Get the specific value for the option
                                                value = jQuery( option ).val();
@@ -2305,6 +2200,11 @@ jQuery.extend({
                                        }
                                }
 
                                        }
                                }
 
+                               // Fixes Bug #2551 -- select.val() broken in IE after form.reset()
+                               if ( one && !values.length && options.length ) {
+                                       return jQuery( options[ index ] ).val();
+                               }
+
                                return values;
                        },
 
                                return values;
                        },
 
@@ -2323,86 +2223,99 @@ jQuery.extend({
                }
        },
 
                }
        },
 
-       attr: function( elem, name, value ) {
-               var hooks, notxml, ret,
-                       nType = elem.nodeType;
-
+       attrFn: {
+               val: true,
+               css: true,
+               html: true,
+               text: true,
+               data: true,
+               width: true,
+               height: true,
+               offset: true
+       },
+       
+       attrFix: {
+               // Always normalize to ensure hook usage
+               tabindex: "tabIndex"
+       },
+       
+       attr: function( elem, name, value, pass ) {
+               var nType = elem.nodeType;
+               
                // don't get/set attributes on text, comment and attribute nodes
                if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
                // don't get/set attributes on text, comment and attribute nodes
                if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
-                       return;
+                       return undefined;
+               }
+
+               if ( pass && name in jQuery.attrFn ) {
+                       return jQuery( elem )[ name ]( value );
                }
 
                // Fallback to prop when attributes are not supported
                }
 
                // Fallback to prop when attributes are not supported
-               if ( typeof elem.getAttribute === core_strundefined ) {
+               if ( !("getAttribute" in elem) ) {
                        return jQuery.prop( elem, name, value );
                }
 
                        return jQuery.prop( elem, name, value );
                }
 
-               notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
+               var ret, hooks,
+                       notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
 
 
-               // All attributes are lowercase
-               // Grab necessary hook if one is defined
+               // Normalize the name if needed
                if ( notxml ) {
                if ( notxml ) {
-                       name = name.toLowerCase();
-                       hooks = jQuery.attrHooks[ name ] || ( rboolean.test( name ) ? boolHook : nodeHook );
+                       name = jQuery.attrFix[ name ] || name;
+
+                       hooks = jQuery.attrHooks[ name ];
+
+                       if ( !hooks ) {
+                               // Use boolHook for boolean attributes
+                               if ( rboolean.test( name ) ) {
+                                       hooks = boolHook;
+
+                               // Use nodeHook if available( IE6/7 )
+                               } else if ( nodeHook ) {
+                                       hooks = nodeHook;
+                               }
+                       }
                }
 
                if ( value !== undefined ) {
 
                        if ( value === null ) {
                                jQuery.removeAttr( elem, name );
                }
 
                if ( value !== undefined ) {
 
                        if ( value === null ) {
                                jQuery.removeAttr( elem, name );
+                               return undefined;
 
 
-                       } else if ( hooks && notxml && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) {
+                       } else if ( hooks && "set" in hooks && notxml && (ret = hooks.set( elem, value, name )) !== undefined ) {
                                return ret;
 
                        } else {
                                return ret;
 
                        } else {
-                               elem.setAttribute( name, value + "" );
+                               elem.setAttribute( name, "" + value );
                                return value;
                        }
 
                                return value;
                        }
 
-               } else if ( hooks && notxml && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) {
+               } else if ( hooks && "get" in hooks && notxml && (ret = hooks.get( elem, name )) !== null ) {
                        return ret;
 
                } else {
 
                        return ret;
 
                } else {
 
-                       // In IE9+, Flash objects don't have .getAttribute (#12945)
-                       // Support: IE9+
-                       if ( typeof elem.getAttribute !== core_strundefined ) {
-                               ret =  elem.getAttribute( name );
-                       }
+                       ret = elem.getAttribute( name );
 
                        // Non-existent attributes return null, we normalize to undefined
 
                        // Non-existent attributes return null, we normalize to undefined
-                       return ret == null ?
+                       return ret === null ?
                                undefined :
                                ret;
                }
        },
 
                                undefined :
                                ret;
                }
        },
 
-       removeAttr: function( elem, value ) {
-               var name, propName,
-                       i = 0,
-                       attrNames = value && value.match( core_rnotwhite );
-
-               if ( attrNames && elem.nodeType === 1 ) {
-                       while ( (name = attrNames[i++]) ) {
-                               propName = jQuery.propFix[ name ] || name;
-
-                               // Boolean attributes get special treatment (#10870)
-                               if ( rboolean.test( name ) ) {
-                                       // Set corresponding property to false for boolean attributes
-                                       // Also clear defaultChecked/defaultSelected (if appropriate) for IE<8
-                                       if ( !getSetAttribute && ruseDefault.test( name ) ) {
-                                               elem[ jQuery.camelCase( "default-" + name ) ] =
-                                                       elem[ propName ] = false;
-                                       } else {
-                                               elem[ propName ] = false;
-                                       }
+       removeAttr: function( elem, name ) {
+               var propName;
+               if ( elem.nodeType === 1 ) {
+                       name = jQuery.attrFix[ name ] || name;
 
 
-                               // See #9699 for explanation of this approach (setting first, then removal)
-                               } else {
-                                       jQuery.attr( elem, name, "" );
-                               }
+                       jQuery.attr( elem, name, "" );
+                       elem.removeAttribute( name );
 
 
-                               elem.removeAttribute( getSetAttribute ? name : propName );
+                       // Set corresponding property to false for boolean attributes
+                       if ( rboolean.test( name ) && (propName = jQuery.propFix[ name ] || name) in elem ) {
+                               elem[ propName ] = false;
                        }
                }
        },
                        }
                }
        },
@@ -2410,9 +2323,13 @@ jQuery.extend({
        attrHooks: {
                type: {
                        set: function( elem, value ) {
        attrHooks: {
                type: {
                        set: function( elem, value ) {
-                               if ( !jQuery.support.radioValue && value === "radio" && jQuery.nodeName(elem, "input") ) {
+                               // We can't allow the type property to be changed (since it causes problems in IE)
+                               if ( rtype.test( elem.nodeName ) && elem.parentNode ) {
+                                       jQuery.error( "type property can't be changed" );
+                               } else if ( !jQuery.support.radioValue && value === "radio" && jQuery.nodeName(elem, "input") ) {
                                        // Setting the type on a radio button after the value resets the value in IE6-9
                                        // Setting the type on a radio button after the value resets the value in IE6-9
-                                       // Reset value to default in case type is set after value during creation
+                                       // Reset value to it's default in case type is set after value
+                                       // This is for element creation
                                        var val = elem.value;
                                        elem.setAttribute( "type", value );
                                        if ( val ) {
                                        var val = elem.value;
                                        elem.setAttribute( "type", value );
                                        if ( val ) {
@@ -2421,6 +2338,25 @@ jQuery.extend({
                                        return value;
                                }
                        }
                                        return value;
                                }
                        }
+               },
+               // Use the value property for back compat
+               // Use the nodeHook for button elements in IE6/7 (#1954)
+               value: {
+                       get: function( elem, name ) {
+                               if ( nodeHook && jQuery.nodeName( elem, "button" ) ) {
+                                       return nodeHook.get( elem, name );
+                               }
+                               return name in elem ?
+                                       elem.value :
+                                       null;
+                       },
+                       set: function( elem, value, name ) {
+                               if ( nodeHook && jQuery.nodeName( elem, "button" ) ) {
+                                       return nodeHook.set( elem, value, name );
+                               }
+                               // Does not return so that setAttribute is also used
+                               elem.value = value;
+                       }
                }
        },
 
                }
        },
 
@@ -2438,17 +2374,17 @@ jQuery.extend({
                frameborder: "frameBorder",
                contenteditable: "contentEditable"
        },
                frameborder: "frameBorder",
                contenteditable: "contentEditable"
        },
-
+       
        prop: function( elem, name, value ) {
        prop: function( elem, name, value ) {
-               var ret, hooks, notxml,
-                       nType = elem.nodeType;
+               var nType = elem.nodeType;
 
                // don't get/set properties on text, comment and attribute nodes
                if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
 
                // don't get/set properties on text, comment and attribute nodes
                if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
-                       return;
+                       return undefined;
                }
 
                }
 
-               notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
+               var ret, hooks,
+                       notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
 
                if ( notxml ) {
                        // Fix name and attach hooks
 
                if ( notxml ) {
                        // Fix name and attach hooks
@@ -2461,7 +2397,7 @@ jQuery.extend({
                                return ret;
 
                        } else {
                                return ret;
 
                        } else {
-                               return ( elem[ name ] = value );
+                               return (elem[ name ] = value);
                        }
 
                } else {
                        }
 
                } else {
@@ -2473,7 +2409,7 @@ jQuery.extend({
                        }
                }
        },
                        }
                }
        },
-
+       
        propHooks: {
                tabIndex: {
                        get: function( elem ) {
        propHooks: {
                tabIndex: {
                        get: function( elem ) {
@@ -2491,109 +2427,61 @@ jQuery.extend({
        }
 });
 
        }
 });
 
+// Add the tabindex propHook to attrHooks for back-compat
+jQuery.attrHooks.tabIndex = jQuery.propHooks.tabIndex;
+
 // Hook for boolean attributes
 boolHook = {
        get: function( elem, name ) {
 // Hook for boolean attributes
 boolHook = {
        get: function( elem, name ) {
-               var
-                       // Use .prop to determine if this attribute is understood as boolean
-                       prop = jQuery.prop( elem, name ),
-
-                       // Fetch it accordingly
-                       attr = typeof prop === "boolean" && elem.getAttribute( name ),
-                       detail = typeof prop === "boolean" ?
-
-                               getSetInput && getSetAttribute ?
-                                       attr != null :
-                                       // oldIE fabricates an empty string for missing boolean attributes
-                                       // and conflates checked/selected into attroperties
-                                       ruseDefault.test( name ) ?
-                                               elem[ jQuery.camelCase( "default-" + name ) ] :
-                                               !!attr :
-
-                               // fetch an attribute node for properties not recognized as boolean
-                               elem.getAttributeNode( name );
-
-               return detail && detail.value !== false ?
+               // Align boolean attributes with corresponding properties
+               // Fall back to attribute presence where some booleans are not supported
+               var attrNode;
+               return jQuery.prop( elem, name ) === true || ( attrNode = elem.getAttributeNode( name ) ) && attrNode.nodeValue !== false ?
                        name.toLowerCase() :
                        undefined;
        },
        set: function( elem, value, name ) {
                        name.toLowerCase() :
                        undefined;
        },
        set: function( elem, value, name ) {
+               var propName;
                if ( value === false ) {
                        // Remove boolean attributes when set to false
                        jQuery.removeAttr( elem, name );
                if ( value === false ) {
                        // Remove boolean attributes when set to false
                        jQuery.removeAttr( elem, name );
-               } else if ( getSetInput && getSetAttribute || !ruseDefault.test( name ) ) {
-                       // IE<8 needs the *property* name
-                       elem.setAttribute( !getSetAttribute && jQuery.propFix[ name ] || name, name );
-
-               // Use defaultChecked and defaultSelected for oldIE
                } else {
                } else {
-                       elem[ jQuery.camelCase( "default-" + name ) ] = elem[ name ] = true;
-               }
+                       // value is true since we know at this point it's type boolean and not false
+                       // Set boolean attributes to the same name and set the DOM property
+                       propName = jQuery.propFix[ name ] || name;
+                       if ( propName in elem ) {
+                               // Only set the IDL specifically if it already exists on the element
+                               elem[ propName ] = true;
+                       }
 
 
+                       elem.setAttribute( name, name.toLowerCase() );
+               }
                return name;
        }
 };
 
                return name;
        }
 };
 
-// fix oldIE value attroperty
-if ( !getSetInput || !getSetAttribute ) {
-       jQuery.attrHooks.value = {
-               get: function( elem, name ) {
-                       var ret = elem.getAttributeNode( name );
-                       return jQuery.nodeName( elem, "input" ) ?
-
-                               // Ignore the value *property* by using defaultValue
-                               elem.defaultValue :
-
-                               ret && ret.specified ? ret.value : undefined;
-               },
-               set: function( elem, value, name ) {
-                       if ( jQuery.nodeName( elem, "input" ) ) {
-                               // Does not return so that setAttribute is also used
-                               elem.defaultValue = value;
-                       } else {
-                               // Use nodeHook if defined (#1954); otherwise setAttribute is fine
-                               return nodeHook && nodeHook.set( elem, value, name );
-                       }
-               }
-       };
-}
-
 // IE6/7 do not support getting/setting some attributes with get/setAttribute
 // IE6/7 do not support getting/setting some attributes with get/setAttribute
-if ( !getSetAttribute ) {
-
+if ( !jQuery.support.getSetAttribute ) {
+       
        // Use this for any attribute in IE6/7
        // This fixes almost every IE6/7 issue
        nodeHook = jQuery.valHooks.button = {
                get: function( elem, name ) {
        // Use this for any attribute in IE6/7
        // This fixes almost every IE6/7 issue
        nodeHook = jQuery.valHooks.button = {
                get: function( elem, name ) {
-                       var ret = elem.getAttributeNode( name );
-                       return ret && ( name === "id" || name === "name" || name === "coords" ? ret.value !== "" : ret.specified ) ?
-                               ret.value :
+                       var ret;
+                       ret = elem.getAttributeNode( name );
+                       // Return undefined if nodeValue is empty string
+                       return ret && ret.nodeValue !== "" ?
+                               ret.nodeValue :
                                undefined;
                },
                set: function( elem, value, name ) {
                        // Set the existing or create a new attribute node
                        var ret = elem.getAttributeNode( name );
                        if ( !ret ) {
                                undefined;
                },
                set: function( elem, value, name ) {
                        // Set the existing or create a new attribute node
                        var ret = elem.getAttributeNode( name );
                        if ( !ret ) {
-                               elem.setAttributeNode(
-                                       (ret = elem.ownerDocument.createAttribute( name ))
-                               );
+                               ret = document.createAttribute( name );
+                               elem.setAttributeNode( ret );
                        }
                        }
-
-                       ret.value = value += "";
-
-                       // Break association with cloned elements by also using setAttribute (#9646)
-                       return name === "value" || value === elem.getAttribute( name ) ?
-                               value :
-                               undefined;
-               }
-       };
-
-       // Set contenteditable to false on removals(#10429)
-       // Setting to empty string throws an error as an invalid value
-       jQuery.attrHooks.contenteditable = {
-               get: nodeHook.get,
-               set: function( elem, value, name ) {
-                       nodeHook.set( elem, value === "" ? false : value, name );
+                       return (ret.nodeValue = value + "");
                }
        };
 
                }
        };
 
@@ -2613,37 +2501,26 @@ if ( !getSetAttribute ) {
 
 
 // Some attributes require a special call on IE
 
 
 // Some attributes require a special call on IE
-// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx
 if ( !jQuery.support.hrefNormalized ) {
        jQuery.each([ "href", "src", "width", "height" ], function( i, name ) {
                jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {
                        get: function( elem ) {
                                var ret = elem.getAttribute( name, 2 );
 if ( !jQuery.support.hrefNormalized ) {
        jQuery.each([ "href", "src", "width", "height" ], function( i, name ) {
                jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {
                        get: function( elem ) {
                                var ret = elem.getAttribute( name, 2 );
-                               return ret == null ? undefined : ret;
+                               return ret === null ? undefined : ret;
                        }
                });
        });
                        }
                });
        });
-
-       // href/src property should get the full normalized URL (#10299/#12915)
-       jQuery.each([ "href", "src" ], function( i, name ) {
-               jQuery.propHooks[ name ] = {
-                       get: function( elem ) {
-                               return elem.getAttribute( name, 4 );
-                       }
-               };
-       });
 }
 
 if ( !jQuery.support.style ) {
        jQuery.attrHooks.style = {
                get: function( elem ) {
                        // Return undefined in the case of empty string
 }
 
 if ( !jQuery.support.style ) {
        jQuery.attrHooks.style = {
                get: function( elem ) {
                        // Return undefined in the case of empty string
-                       // Note: IE uppercases css property names, but if we were to .toLowerCase()
-                       // .cssText, that would destroy case senstitivity in URL's, like in "background"
-                       return elem.style.cssText || undefined;
+                       // Normalize to lowercase since IE uppercases css property names
+                       return elem.style.cssText.toLowerCase() || undefined;
                },
                set: function( elem, value ) {
                },
                set: function( elem, value ) {
-                       return ( elem.style.cssText = value + "" );
+                       return (elem.style.cssText = "" + value);
                }
        };
 }
                }
        };
 }
@@ -2668,11 +2545,6 @@ if ( !jQuery.support.optSelected ) {
        });
 }
 
        });
 }
 
-// IE6/7 call enctype encoding
-if ( !jQuery.support.enctype ) {
-       jQuery.propFix.enctype = "encoding";
-}
-
 // Radios and checkboxes getter/setter
 if ( !jQuery.support.checkOn ) {
        jQuery.each([ "radio", "checkbox" ], function() {
 // Radios and checkboxes getter/setter
 if ( !jQuery.support.checkOn ) {
        jQuery.each([ "radio", "checkbox" ], function() {
@@ -2688,108 +2560,125 @@ jQuery.each([ "radio", "checkbox" ], function() {
        jQuery.valHooks[ this ] = jQuery.extend( jQuery.valHooks[ this ], {
                set: function( elem, value ) {
                        if ( jQuery.isArray( value ) ) {
        jQuery.valHooks[ this ] = jQuery.extend( jQuery.valHooks[ this ], {
                set: function( elem, value ) {
                        if ( jQuery.isArray( value ) ) {
-                               return ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 );
+                               return (elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0);
                        }
                }
        });
 });
                        }
                }
        });
 });
-var rformElems = /^(?:input|select|textarea)$/i,
-       rkeyEvent = /^key/,
-       rmouseEvent = /^(?:mouse|contextmenu)|click/,
-       rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,
-       rtypenamespace = /^([^.]*)(?:\.(.+)|)$/;
 
 
-function returnTrue() {
-       return true;
-}
 
 
-function returnFalse() {
-       return false;
-}
+
+
+var rnamespaces = /\.(.*)$/,
+       rformElems = /^(?:textarea|input|select)$/i,
+       rperiod = /\./g,
+       rspaces = / /g,
+       rescape = /[^\w\s.|`]/g,
+       fcleanup = function( nm ) {
+               return nm.replace(rescape, "\\$&");
+       };
 
 /*
 
 /*
- * Helper functions for managing events -- not part of the public interface.
- * Props to Dean Edwards' addEvent library for many of the ideas.
+ * A number of helper functions used for managing events.
+ * Many of the ideas behind this code originated from
+ * Dean Edwards' addEvent library.
  */
 jQuery.event = {
 
  */
 jQuery.event = {
 
-       global: {},
-
-       add: function( elem, types, handler, data, selector ) {
-               var tmp, events, t, handleObjIn,
-                       special, eventHandle, handleObj,
-                       handlers, type, namespaces, origType,
-                       elemData = jQuery._data( elem );
+       // Bind an event to an element
+       // Original by Dean Edwards
+       add: function( elem, types, handler, data ) {
+               if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
+                       return;
+               }
 
 
-               // Don't attach events to noData or text/comment nodes (but allow plain objects)
-               if ( !elemData ) {
+               if ( handler === false ) {
+                       handler = returnFalse;
+               } else if ( !handler ) {
+                       // Fixes bug #7229. Fix recommended by jdalton
                        return;
                }
 
                        return;
                }
 
-               // Caller can pass in an object of custom data in lieu of the handler
+               var handleObjIn, handleObj;
+
                if ( handler.handler ) {
                        handleObjIn = handler;
                        handler = handleObjIn.handler;
                if ( handler.handler ) {
                        handleObjIn = handler;
                        handler = handleObjIn.handler;
-                       selector = handleObjIn.selector;
                }
 
                }
 
-               // Make sure that the handler has a unique ID, used to find/remove it later
+               // Make sure that the function being executed has a unique ID
                if ( !handler.guid ) {
                        handler.guid = jQuery.guid++;
                }
 
                if ( !handler.guid ) {
                        handler.guid = jQuery.guid++;
                }
 
-               // Init the element's event structure and main handler, if this is the first
-               if ( !(events = elemData.events) ) {
-                       events = elemData.events = {};
+               // Init the element's event structure
+               var elemData = jQuery._data( elem );
+
+               // If no elemData is found then we must be trying to bind to one of the
+               // banned noData elements
+               if ( !elemData ) {
+                       return;
+               }
+
+               var events = elemData.events,
+                       eventHandle = elemData.handle;
+
+               if ( !events ) {
+                       elemData.events = events = {};
                }
                }
-               if ( !(eventHandle = elemData.handle) ) {
-                       eventHandle = elemData.handle = function( e ) {
+
+               if ( !eventHandle ) {
+                       elemData.handle = eventHandle = function( e ) {
                                // Discard the second event of a jQuery.event.trigger() and
                                // when an event is called after a page has unloaded
                                // Discard the second event of a jQuery.event.trigger() and
                                // when an event is called after a page has unloaded
-                               return typeof jQuery !== core_strundefined && (!e || jQuery.event.triggered !== e.type) ?
-                                       jQuery.event.dispatch.apply( eventHandle.elem, arguments ) :
+                               return typeof jQuery !== "undefined" && (!e || jQuery.event.triggered !== e.type) ?
+                                       jQuery.event.handle.apply( eventHandle.elem, arguments ) :
                                        undefined;
                        };
                                        undefined;
                        };
-                       // Add elem as a property of the handle fn to prevent a memory leak with IE non-native events
-                       eventHandle.elem = elem;
                }
 
                }
 
+               // Add elem as a property of the handle function
+               // This is to prevent a memory leak with non-native events in IE.
+               eventHandle.elem = elem;
+
                // Handle multiple events separated by a space
                // jQuery(...).bind("mouseover mouseout", fn);
                // Handle multiple events separated by a space
                // jQuery(...).bind("mouseover mouseout", fn);
-               types = ( types || "" ).match( core_rnotwhite ) || [""];
-               t = types.length;
-               while ( t-- ) {
-                       tmp = rtypenamespace.exec( types[t] ) || [];
-                       type = origType = tmp[1];
-                       namespaces = ( tmp[2] || "" ).split( "." ).sort();
-
-                       // If event changes its type, use the special event handlers for the changed type
-                       special = jQuery.event.special[ type ] || {};
+               types = types.split(" ");
 
 
-                       // If selector defined, determine special event api type, otherwise given type
-                       type = ( selector ? special.delegateType : special.bindType ) || type;
+               var type, i = 0, namespaces;
 
 
-                       // Update special based on newly reset type
-                       special = jQuery.event.special[ type ] || {};
+               while ( (type = types[ i++ ]) ) {
+                       handleObj = handleObjIn ?
+                               jQuery.extend({}, handleObjIn) :
+                               { handler: handler, data: data };
+
+                       // Namespaced event handlers
+                       if ( type.indexOf(".") > -1 ) {
+                               namespaces = type.split(".");
+                               type = namespaces.shift();
+                               handleObj.namespace = namespaces.slice(0).sort().join(".");
+
+                       } else {
+                               namespaces = [];
+                               handleObj.namespace = "";
+                       }
+
+                       handleObj.type = type;
+                       if ( !handleObj.guid ) {
+                               handleObj.guid = handler.guid;
+                       }
 
 
-                       // handleObj is passed to all event handlers
-                       handleObj = jQuery.extend({
-                               type: type,
-                               origType: origType,
-                               data: data,
-                               handler: handler,
-                               guid: handler.guid,
-                               selector: selector,
-                               needsContext: selector && jQuery.expr.match.needsContext.test( selector ),
-                               namespace: namespaces.join(".")
-                       }, handleObjIn );
-
-                       // Init the event handler queue if we're the first
-                       if ( !(handlers = events[ type ]) ) {
+                       // Get the current list of functions bound to this event
+                       var handlers = events[ type ],
+                               special = jQuery.event.special[ type ] || {};
+
+                       // Init the event handler queue
+                       if ( !handlers ) {
                                handlers = events[ type ] = [];
                                handlers = events[ type ] = [];
-                               handlers.delegateCount = 0;
 
 
-                               // Only use addEventListener/attachEvent if the special events handler returns false
+                               // Check for a special event handler
+                               // Only use addEventListener/attachEvent if the special
+                               // events handler returns false
                                if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
                                        // Bind the global event handler to the element
                                        if ( elem.addEventListener ) {
                                if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
                                        // Bind the global event handler to the element
                                        if ( elem.addEventListener ) {
@@ -2809,14 +2698,10 @@ jQuery.event = {
                                }
                        }
 
                                }
                        }
 
-                       // Add to the element's handler list, delegates in front
-                       if ( selector ) {
-                               handlers.splice( handlers.delegateCount++, 0, handleObj );
-                       } else {
-                               handlers.push( handleObj );
-                       }
+                       // Add the function to the element's handler list
+                       handlers.push( handleObj );
 
 
-                       // Keep track of which events have ever been used, for event optimization
+                       // Keep track of which events have been used, for event optimization
                        jQuery.event.global[ type ] = true;
                }
 
                        jQuery.event.global[ type ] = true;
                }
 
@@ -2824,97 +2709,150 @@ jQuery.event = {
                elem = null;
        },
 
                elem = null;
        },
 
+       global: {},
+
        // Detach an event or set of events from an element
        // Detach an event or set of events from an element
-       remove: function( elem, types, handler, selector, mappedTypes ) {
-               var j, handleObj, tmp,
-                       origCount, t, events,
-                       special, handlers, type,
-                       namespaces, origType,
-                       elemData = jQuery.hasData( elem ) && jQuery._data( elem );
-
-               if ( !elemData || !(events = elemData.events) ) {
+       remove: function( elem, types, handler, pos ) {
+               // don't do events on text and comment nodes
+               if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
+                       return;
+               }
+
+               if ( handler === false ) {
+                       handler = returnFalse;
+               }
+
+               var ret, type, fn, j, i = 0, all, namespaces, namespace, special, eventType, handleObj, origType,
+                       elemData = jQuery.hasData( elem ) && jQuery._data( elem ),
+                       events = elemData && elemData.events;
+
+               if ( !elemData || !events ) {
                        return;
                }
 
                        return;
                }
 
-               // Once for each type.namespace in types; type may be omitted
-               types = ( types || "" ).match( core_rnotwhite ) || [""];
-               t = types.length;
-               while ( t-- ) {
-                       tmp = rtypenamespace.exec( types[t] ) || [];
-                       type = origType = tmp[1];
-                       namespaces = ( tmp[2] || "" ).split( "." ).sort();
+               // types is actually an event object here
+               if ( types && types.type ) {
+                       handler = types.handler;
+                       types = types.type;
+               }
+
+               // Unbind all events for the element
+               if ( !types || typeof types === "string" && types.charAt(0) === "." ) {
+                       types = types || "";
+
+                       for ( type in events ) {
+                               jQuery.event.remove( elem, type + types );
+                       }
+
+                       return;
+               }
+
+               // Handle multiple events separated by a space
+               // jQuery(...).unbind("mouseover mouseout", fn);
+               types = types.split(" ");
+
+               while ( (type = types[ i++ ]) ) {
+                       origType = type;
+                       handleObj = null;
+                       all = type.indexOf(".") < 0;
+                       namespaces = [];
+
+                       if ( !all ) {
+                               // Namespaced event handlers
+                               namespaces = type.split(".");
+                               type = namespaces.shift();
+
+                               namespace = new RegExp("(^|\\.)" +
+                                       jQuery.map( namespaces.slice(0).sort(), fcleanup ).join("\\.(?:.*\\.)?") + "(\\.|$)");
+                       }
+
+                       eventType = events[ type ];
+
+                       if ( !eventType ) {
+                               continue;
+                       }
+
+                       if ( !handler ) {
+                               for ( j = 0; j < eventType.length; j++ ) {
+                                       handleObj = eventType[ j ];
 
 
-                       // Unbind all events (on this namespace, if provided) for the element
-                       if ( !type ) {
-                               for ( type in events ) {
-                                       jQuery.event.remove( elem, type + types[ t ], handler, selector, true );
+                                       if ( all || namespace.test( handleObj.namespace ) ) {
+                                               jQuery.event.remove( elem, origType, handleObj.handler, j );
+                                               eventType.splice( j--, 1 );
+                                       }
                                }
                                }
+
                                continue;
                        }
 
                        special = jQuery.event.special[ type ] || {};
                                continue;
                        }
 
                        special = jQuery.event.special[ type ] || {};
-                       type = ( selector ? special.delegateType : special.bindType ) || type;
-                       handlers = events[ type ] || [];
-                       tmp = tmp[2] && new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" );
-
-                       // Remove matching events
-                       origCount = j = handlers.length;
-                       while ( j-- ) {
-                               handleObj = handlers[ j ];
-
-                               if ( ( mappedTypes || origType === handleObj.origType ) &&
-                                       ( !handler || handler.guid === handleObj.guid ) &&
-                                       ( !tmp || tmp.test( handleObj.namespace ) ) &&
-                                       ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) {
-                                       handlers.splice( j, 1 );
-
-                                       if ( handleObj.selector ) {
-                                               handlers.delegateCount--;
+
+                       for ( j = pos || 0; j < eventType.length; j++ ) {
+                               handleObj = eventType[ j ];
+
+                               if ( handler.guid === handleObj.guid ) {
+                                       // remove the given handler for the given type
+                                       if ( all || namespace.test( handleObj.namespace ) ) {
+                                               if ( pos == null ) {
+                                                       eventType.splice( j--, 1 );
+                                               }
+
+                                               if ( special.remove ) {
+                                                       special.remove.call( elem, handleObj );
+                                               }
                                        }
                                        }
-                                       if ( special.remove ) {
-                                               special.remove.call( elem, handleObj );
+
+                                       if ( pos != null ) {
+                                               break;
                                        }
                                }
                        }
 
                                        }
                                }
                        }
 
-                       // Remove generic event handler if we removed something and no more handlers exist
-                       // (avoids potential for endless recursion during removal of special event handlers)
-                       if ( origCount && !handlers.length ) {
-                               if ( !special.teardown || special.teardown.call( elem, namespaces, elemData.handle ) === false ) {
+                       // remove generic event handler if no more handlers exist
+                       if ( eventType.length === 0 || pos != null && eventType.length === 1 ) {
+                               if ( !special.teardown || special.teardown.call( elem, namespaces ) === false ) {
                                        jQuery.removeEvent( elem, type, elemData.handle );
                                }
 
                                        jQuery.removeEvent( elem, type, elemData.handle );
                                }
 
+                               ret = null;
                                delete events[ type ];
                        }
                }
 
                // Remove the expando if it's no longer used
                if ( jQuery.isEmptyObject( events ) ) {
                                delete events[ type ];
                        }
                }
 
                // Remove the expando if it's no longer used
                if ( jQuery.isEmptyObject( events ) ) {
+                       var handle = elemData.handle;
+                       if ( handle ) {
+                               handle.elem = null;
+                       }
+
+                       delete elemData.events;
                        delete elemData.handle;
 
                        delete elemData.handle;
 
-                       // removeData also checks for emptiness and clears the expando if empty
-                       // so use it instead of delete
-                       jQuery._removeData( elem, "events" );
+                       if ( jQuery.isEmptyObject( elemData ) ) {
+                               jQuery.removeData( elem, undefined, true );
+                       }
                }
        },
                }
        },
+       
+       // Events that are safe to short-circuit if no handlers are attached.
+       // Native DOM events should not be added, they may have inline handlers.
+       customEvent: {
+               "getData": true,
+               "setData": true,
+               "changeData": true
+       },
 
        trigger: function( event, data, elem, onlyHandlers ) {
 
        trigger: function( event, data, elem, onlyHandlers ) {
-               var handle, ontype, cur,
-                       bubbleType, special, tmp, i,
-                       eventPath = [ elem || document ],
-                       type = core_hasOwn.call( event, "type" ) ? event.type : event,
-                       namespaces = core_hasOwn.call( event, "namespace" ) ? event.namespace.split(".") : [];
+               // Event object or event type
+               var type = event.type || event,
+                       namespaces = [],
+                       exclusive;
 
 
-               cur = tmp = elem = elem || document;
-
-               // Don't do events on text and comment nodes
-               if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
-                       return;
-               }
-
-               // focus/blur morphs to focusin/out; ensure we're not firing them right now
-               if ( rfocusMorph.test( type + jQuery.event.triggered ) ) {
-                       return;
+               if ( type.indexOf("!") >= 0 ) {
+                       // Exclusive events trigger only for the exact event (no namespaces)
+                       type = type.slice(0, -1);
+                       exclusive = true;
                }
 
                if ( type.indexOf(".") >= 0 ) {
                }
 
                if ( type.indexOf(".") >= 0 ) {
@@ -2923,387 +2861,261 @@ jQuery.event = {
                        type = namespaces.shift();
                        namespaces.sort();
                }
                        type = namespaces.shift();
                        namespaces.sort();
                }
-               ontype = type.indexOf(":") < 0 && "on" + type;
 
 
-               // Caller can pass in a jQuery.Event object, Object, or just an event type string
-               event = event[ jQuery.expando ] ?
-                       event :
-                       new jQuery.Event( type, typeof event === "object" && event );
+               if ( (!elem || jQuery.event.customEvent[ type ]) && !jQuery.event.global[ type ] ) {
+                       // No jQuery handlers for this event type, and it can't have inline handlers
+                       return;
+               }
+
+               // Caller can pass in an Event, Object, or just an event type string
+               event = typeof event === "object" ?
+                       // jQuery.Event object
+                       event[ jQuery.expando ] ? event :
+                       // Object literal
+                       new jQuery.Event( type, event ) :
+                       // Just the event type (string)
+                       new jQuery.Event( type );
 
 
-               event.isTrigger = true;
+               event.type = type;
+               event.exclusive = exclusive;
                event.namespace = namespaces.join(".");
                event.namespace = namespaces.join(".");
-               event.namespace_re = event.namespace ?
-                       new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" ) :
-                       null;
-
-               // Clean up the event in case it is being reused
-               event.result = undefined;
-               if ( !event.target ) {
-                       event.target = elem;
+               event.namespace_re = new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.)?") + "(\\.|$)");
+               
+               // triggerHandler() and global events don't bubble or run the default action
+               if ( onlyHandlers || !elem ) {
+                       event.preventDefault();
+                       event.stopPropagation();
                }
 
                }
 
-               // Clone any incoming data and prepend the event, creating the handler arg list
-               data = data == null ?
-                       [ event ] :
-                       jQuery.makeArray( data, [ event ] );
+               // Handle a global trigger
+               if ( !elem ) {
+                       // TODO: Stop taunting the data cache; remove global events and always attach to document
+                       jQuery.each( jQuery.cache, function() {
+                               // internalKey variable is just used to make it easier to find
+                               // and potentially change this stuff later; currently it just
+                               // points to jQuery.expando
+                               var internalKey = jQuery.expando,
+                                       internalCache = this[ internalKey ];
+                               if ( internalCache && internalCache.events && internalCache.events[ type ] ) {
+                                       jQuery.event.trigger( event, data, internalCache.handle.elem );
+                               }
+                       });
+                       return;
+               }
 
 
-               // Allow special events to draw outside the lines
-               special = jQuery.event.special[ type ] || {};
-               if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {
+               // Don't do events on text and comment nodes
+               if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
                        return;
                }
 
                        return;
                }
 
-               // Determine event propagation path in advance, per W3C events spec (#9951)
-               // Bubble up to document, then to window; watch for a global ownerDocument var (#9724)
-               if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {
+               // Clean up the event in case it is being reused
+               event.result = undefined;
+               event.target = elem;
 
 
-                       bubbleType = special.delegateType || type;
-                       if ( !rfocusMorph.test( bubbleType + type ) ) {
-                               cur = cur.parentNode;
-                       }
-                       for ( ; cur; cur = cur.parentNode ) {
-                               eventPath.push( cur );
-                               tmp = cur;
-                       }
+               // Clone any incoming data and prepend the event, creating the handler arg list
+               data = data != null ? jQuery.makeArray( data ) : [];
+               data.unshift( event );
 
 
-                       // Only add window if we got to document (e.g., not plain obj or detached DOM)
-                       if ( tmp === (elem.ownerDocument || document) ) {
-                               eventPath.push( tmp.defaultView || tmp.parentWindow || window );
-                       }
-               }
+               var cur = elem,
+                       // IE doesn't like method names with a colon (#3533, #8272)
+                       ontype = type.indexOf(":") < 0 ? "on" + type : "";
 
 
-               // Fire handlers on the event path
-               i = 0;
-               while ( (cur = eventPath[i++]) && !event.isPropagationStopped() ) {
+               // Fire event on the current element, then bubble up the DOM tree
+               do {
+                       var handle = jQuery._data( cur, "handle" );
 
 
-                       event.type = i > 1 ?
-                               bubbleType :
-                               special.bindType || type;
-
-                       // jQuery handler
-                       handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] && jQuery._data( cur, "handle" );
+                       event.currentTarget = cur;
                        if ( handle ) {
                                handle.apply( cur, data );
                        }
 
                        if ( handle ) {
                                handle.apply( cur, data );
                        }
 
-                       // Native handler
-                       handle = ontype && cur[ ontype ];
-                       if ( handle && jQuery.acceptData( cur ) && handle.apply && handle.apply( cur, data ) === false ) {
+                       // Trigger an inline bound script
+                       if ( ontype && jQuery.acceptData( cur ) && cur[ ontype ] && cur[ ontype ].apply( cur, data ) === false ) {
+                               event.result = false;
                                event.preventDefault();
                        }
                                event.preventDefault();
                        }
-               }
-               event.type = type;
+
+                       // Bubble up to document, then to window
+                       cur = cur.parentNode || cur.ownerDocument || cur === event.target.ownerDocument && window;
+               } while ( cur && !event.isPropagationStopped() );
 
                // If nobody prevented the default action, do it now
 
                // If nobody prevented the default action, do it now
-               if ( !onlyHandlers && !event.isDefaultPrevented() ) {
+               if ( !event.isDefaultPrevented() ) {
+                       var old,
+                               special = jQuery.event.special[ type ] || {};
 
 
-                       if ( (!special._default || special._default.apply( elem.ownerDocument, data ) === false) &&
+                       if ( (!special._default || special._default.call( elem.ownerDocument, event ) === false) &&
                                !(type === "click" && jQuery.nodeName( elem, "a" )) && jQuery.acceptData( elem ) ) {
 
                                // Call a native DOM method on the target with the same name name as the event.
                                !(type === "click" && jQuery.nodeName( elem, "a" )) && jQuery.acceptData( elem ) ) {
 
                                // Call a native DOM method on the target with the same name name as the event.
-                               // Can't use an .isFunction() check here because IE6/7 fails that test.
-                               // Don't do default actions on window, that's where global variables be (#6170)
-                               if ( ontype && elem[ type ] && !jQuery.isWindow( elem ) ) {
-
-                                       // Don't re-trigger an onFOO event when we call its FOO() method
-                                       tmp = elem[ ontype ];
+                               // Can't use an .isFunction)() check here because IE6/7 fails that test.
+                               // IE<9 dies on focus to hidden element (#1486), may want to revisit a try/catch.
+                               try {
+                                       if ( ontype && elem[ type ] ) {
+                                               // Don't re-trigger an onFOO event when we call its FOO() method
+                                               old = elem[ ontype ];
 
 
-                                       if ( tmp ) {
-                                               elem[ ontype ] = null;
-                                       }
+                                               if ( old ) {
+                                                       elem[ ontype ] = null;
+                                               }
 
 
-                                       // Prevent re-triggering of the same event, since we already bubbled it above
-                                       jQuery.event.triggered = type;
-                                       try {
+                                               jQuery.event.triggered = type;
                                                elem[ type ]();
                                                elem[ type ]();
-                                       } catch ( e ) {
-                                               // IE<9 dies on focus/blur to hidden element (#1486,#12518)
-                                               // only reproducible on winXP IE8 native, not IE9 in IE8 mode
                                        }
                                        }
-                                       jQuery.event.triggered = undefined;
+                               } catch ( ieError ) {}
 
 
-                                       if ( tmp ) {
-                                               elem[ ontype ] = tmp;
-                                       }
+                               if ( old ) {
+                                       elem[ ontype ] = old;
                                }
                                }
+
+                               jQuery.event.triggered = undefined;
                        }
                }
                        }
                }
-
+               
                return event.result;
        },
 
                return event.result;
        },
 
-       dispatch: function( event ) {
+       handle: function( event ) {
+               event = jQuery.event.fix( event || window.event );
+               // Snapshot the handlers list since a called handler may add/remove events.
+               var handlers = ((jQuery._data( this, "events" ) || {})[ event.type ] || []).slice(0),
+                       run_all = !event.exclusive && !event.namespace,
+                       args = Array.prototype.slice.call( arguments, 0 );
 
 
-               // Make a writable jQuery.Event from the native event object
-               event = jQuery.event.fix( event );
-
-               var i, ret, handleObj, matched, j,
-                       handlerQueue = [],
-                       args = core_slice.call( arguments ),
-                       handlers = ( jQuery._data( this, "events" ) || {} )[ event.type ] || [],
-                       special = jQuery.event.special[ event.type ] || {};
-
-               // Use the fix-ed jQuery.Event rather than the (read-only) native event
+               // Use the fix-ed Event rather than the (read-only) native event
                args[0] = event;
                args[0] = event;
-               event.delegateTarget = this;
-
-               // Call the preDispatch hook for the mapped type, and let it bail if desired
-               if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {
-                       return;
-               }
-
-               // Determine handlers
-               handlerQueue = jQuery.event.handlers.call( this, event, handlers );
-
-               // Run delegates first; they may want to stop propagation beneath us
-               i = 0;
-               while ( (matched = handlerQueue[ i++ ]) && !event.isPropagationStopped() ) {
-                       event.currentTarget = matched.elem;
-
-                       j = 0;
-                       while ( (handleObj = matched.handlers[ j++ ]) && !event.isImmediatePropagationStopped() ) {
-
-                               // Triggered event must either 1) have no namespace, or
-                               // 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace).
-                               if ( !event.namespace_re || event.namespace_re.test( handleObj.namespace ) ) {
-
-                                       event.handleObj = handleObj;
-                                       event.data = handleObj.data;
-
-                                       ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler )
-                                                       .apply( matched.elem, args );
-
-                                       if ( ret !== undefined ) {
-                                               if ( (event.result = ret) === false ) {
-                                                       event.preventDefault();
-                                                       event.stopPropagation();
-                                               }
+               event.currentTarget = this;
+
+               for ( var j = 0, l = handlers.length; j < l; j++ ) {
+                       var handleObj = handlers[ j ];
+
+                       // Triggered event must 1) be non-exclusive and have no namespace, or
+                       // 2) have namespace(s) a subset or equal to those in the bound event.
+                       if ( run_all || event.namespace_re.test( handleObj.namespace ) ) {
+                               // Pass in a reference to the handler function itself
+                               // So that we can later remove it
+                               event.handler = handleObj.handler;
+                               event.data = handleObj.data;
+                               event.handleObj = handleObj;
+
+                               var ret = handleObj.handler.apply( this, args );
+
+                               if ( ret !== undefined ) {
+                                       event.result = ret;
+                                       if ( ret === false ) {
+                                               event.preventDefault();
+                                               event.stopPropagation();
                                        }
                                }
                                        }
                                }
-                       }
-               }
-
-               // Call the postDispatch hook for the mapped type
-               if ( special.postDispatch ) {
-                       special.postDispatch.call( this, event );
-               }
-
-               return event.result;
-       },
-
-       handlers: function( event, handlers ) {
-               var sel, handleObj, matches, i,
-                       handlerQueue = [],
-                       delegateCount = handlers.delegateCount,
-                       cur = event.target;
-
-               // Find delegate handlers
-               // Black-hole SVG <use> instance trees (#13180)
-               // Avoid non-left-click bubbling in Firefox (#3861)
-               if ( delegateCount && cur.nodeType && (!event.button || event.type !== "click") ) {
-
-                       for ( ; cur != this; cur = cur.parentNode || this ) {
 
 
-                               // Don't check non-elements (#13208)
-                               // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)
-                               if ( cur.nodeType === 1 && (cur.disabled !== true || event.type !== "click") ) {
-                                       matches = [];
-                                       for ( i = 0; i < delegateCount; i++ ) {
-                                               handleObj = handlers[ i ];
-
-                                               // Don't conflict with Object.prototype properties (#13203)
-                                               sel = handleObj.selector + " ";
-
-                                               if ( matches[ sel ] === undefined ) {
-                                                       matches[ sel ] = handleObj.needsContext ?
-                                                               jQuery( sel, this ).index( cur ) >= 0 :
-                                                               jQuery.find( sel, this, null, [ cur ] ).length;
-                                               }
-                                               if ( matches[ sel ] ) {
-                                                       matches.push( handleObj );
-                                               }
-                                       }
-                                       if ( matches.length ) {
-                                               handlerQueue.push({ elem: cur, handlers: matches });
-                                       }
+                               if ( event.isImmediatePropagationStopped() ) {
+                                       break;
                                }
                        }
                }
                                }
                        }
                }
-
-               // Add the remaining (directly-bound) handlers
-               if ( delegateCount < handlers.length ) {
-                       handlerQueue.push({ elem: this, handlers: handlers.slice( delegateCount ) });
-               }
-
-               return handlerQueue;
+               return event.result;
        },
 
        },
 
+       props: "altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),
+
        fix: function( event ) {
                if ( event[ jQuery.expando ] ) {
                        return event;
                }
 
        fix: function( event ) {
                if ( event[ jQuery.expando ] ) {
                        return event;
                }
 
-               // Create a writable copy of the event object and normalize some properties
-               var i, prop, copy,
-                       type = event.type,
-                       originalEvent = event,
-                       fixHook = this.fixHooks[ type ];
+               // store a copy of the original event object
+               // and "clone" to set read-only properties
+               var originalEvent = event;
+               event = jQuery.Event( originalEvent );
 
 
-               if ( !fixHook ) {
-                       this.fixHooks[ type ] = fixHook =
-                               rmouseEvent.test( type ) ? this.mouseHooks :
-                               rkeyEvent.test( type ) ? this.keyHooks :
-                               {};
-               }
-               copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props;
-
-               event = new jQuery.Event( originalEvent );
-
-               i = copy.length;
-               while ( i-- ) {
-                       prop = copy[ i ];
+               for ( var i = this.props.length, prop; i; ) {
+                       prop = this.props[ --i ];
                        event[ prop ] = originalEvent[ prop ];
                }
 
                        event[ prop ] = originalEvent[ prop ];
                }
 
-               // Support: IE<9
-               // Fix target property (#1925)
+               // Fix target property, if necessary
                if ( !event.target ) {
                if ( !event.target ) {
-                       event.target = originalEvent.srcElement || document;
+                       // Fixes #1925 where srcElement might not be defined either
+                       event.target = event.srcElement || document;
                }
 
                }
 
-               // Support: Chrome 23+, Safari?
-               // Target should not be a text node (#504, #13143)
+               // check if target is a textnode (safari)
                if ( event.target.nodeType === 3 ) {
                        event.target = event.target.parentNode;
                }
 
                if ( event.target.nodeType === 3 ) {
                        event.target = event.target.parentNode;
                }
 
-               // Support: IE<9
-               // For mouse/key events, metaKey==false if it's undefined (#3368, #11328)
-               event.metaKey = !!event.metaKey;
-
-               return fixHook.filter ? fixHook.filter( event, originalEvent ) : event;
-       },
-
-       // Includes some event props shared by KeyEvent and MouseEvent
-       props: "altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),
-
-       fixHooks: {},
-
-       keyHooks: {
-               props: "char charCode key keyCode".split(" "),
-               filter: function( event, original ) {
+               // Add relatedTarget, if necessary
+               if ( !event.relatedTarget && event.fromElement ) {
+                       event.relatedTarget = event.fromElement === event.target ? event.toElement : event.fromElement;
+               }
 
 
-                       // Add which for key events
-                       if ( event.which == null ) {
-                               event.which = original.charCode != null ? original.charCode : original.keyCode;
-                       }
+               // Calculate pageX/Y if missing and clientX/Y available
+               if ( event.pageX == null && event.clientX != null ) {
+                       var eventDocument = event.target.ownerDocument || document,
+                               doc = eventDocument.documentElement,
+                               body = eventDocument.body;
 
 
-                       return event;
+                       event.pageX = event.clientX + (doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc && doc.clientLeft || body && body.clientLeft || 0);
+                       event.pageY = event.clientY + (doc && doc.scrollTop  || body && body.scrollTop  || 0) - (doc && doc.clientTop  || body && body.clientTop  || 0);
                }
                }
-       },
 
 
-       mouseHooks: {
-               props: "button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),
-               filter: function( event, original ) {
-                       var body, eventDoc, doc,
-                               button = original.button,
-                               fromElement = original.fromElement;
+               // Add which for key events
+               if ( event.which == null && (event.charCode != null || event.keyCode != null) ) {
+                       event.which = event.charCode != null ? event.charCode : event.keyCode;
+               }
 
 
-                       // Calculate pageX/Y if missing and clientX/Y available
-                       if ( event.pageX == null && original.clientX != null ) {
-                               eventDoc = event.target.ownerDocument || document;
-                               doc = eventDoc.documentElement;
-                               body = eventDoc.body;
+               // Add metaKey to non-Mac browsers (use ctrl for PC's and Meta for Macs)
+               if ( !event.metaKey && event.ctrlKey ) {
+                       event.metaKey = event.ctrlKey;
+               }
 
 
-                               event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 );
-                               event.pageY = original.clientY + ( doc && doc.scrollTop  || body && body.scrollTop  || 0 ) - ( doc && doc.clientTop  || body && body.clientTop  || 0 );
-                       }
+               // Add which for click: 1 === left; 2 === middle; 3 === right
+               // Note: button is not normalized, so don't use it
+               if ( !event.which && event.button !== undefined ) {
+                       event.which = (event.button & 1 ? 1 : ( event.button & 2 ? 3 : ( event.button & 4 ? 2 : 0 ) ));
+               }
 
 
-                       // Add relatedTarget, if necessary
-                       if ( !event.relatedTarget && fromElement ) {
-                               event.relatedTarget = fromElement === event.target ? original.toElement : fromElement;
-                       }
+               return event;
+       },
 
 
-                       // Add which for click: 1 === left; 2 === middle; 3 === right
-                       // Note: button is not normalized, so don't use it
-                       if ( !event.which && button !== undefined ) {
-                               event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) );
-                       }
+       // Deprecated, use jQuery.guid instead
+       guid: 1E8,
 
 
-                       return event;
-               }
-       },
+       // Deprecated, use jQuery.proxy instead
+       proxy: jQuery.proxy,
 
        special: {
 
        special: {
-               load: {
-                       // Prevent triggered image.load events from bubbling to window.load
-                       noBubble: true
-               },
-               click: {
-                       // For checkbox, fire native event so checked state will be right
-                       trigger: function() {
-                               if ( jQuery.nodeName( this, "input" ) && this.type === "checkbox" && this.click ) {
-                                       this.click();
-                                       return false;
-                               }
-                       }
-               },
-               focus: {
-                       // Fire native event if possible so blur/focus sequence is correct
-                       trigger: function() {
-                               if ( this !== document.activeElement && this.focus ) {
-                                       try {
-                                               this.focus();
-                                               return false;
-                                       } catch ( e ) {
-                                               // Support: IE<9
-                                               // If we error on focus to hidden element (#1486, #12518),
-                                               // let .trigger() run the handlers
-                                       }
-                               }
-                       },
-                       delegateType: "focusin"
+               ready: {
+                       // Make sure the ready event is setup
+                       setup: jQuery.bindReady,
+                       teardown: jQuery.noop
                },
                },
-               blur: {
-                       trigger: function() {
-                               if ( this === document.activeElement && this.blur ) {
-                                       this.blur();
-                                       return false;
-                               }
+
+               live: {
+                       add: function( handleObj ) {
+                               jQuery.event.add( this,
+                                       liveConvert( handleObj.origType, handleObj.selector ),
+                                       jQuery.extend({}, handleObj, {handler: liveHandler, guid: handleObj.handler.guid}) );
                        },
                        },
-                       delegateType: "focusout"
+
+                       remove: function( handleObj ) {
+                               jQuery.event.remove( this, liveConvert( handleObj.origType, handleObj.selector ), handleObj );
+                       }
                },
 
                beforeunload: {
                },
 
                beforeunload: {
-                       postDispatch: function( event ) {
-
-                               // Even when returnValue equals to undefined Firefox will still show alert
-                               if ( event.result !== undefined ) {
-                                       event.originalEvent.returnValue = event.result;
+                       setup: function( data, namespaces, eventHandle ) {
+                               // We only want to do this special case on windows
+                               if ( jQuery.isWindow( this ) ) {
+                                       this.onbeforeunload = eventHandle;
                                }
                                }
-                       }
-               }
-       },
+                       },
 
 
-       simulate: function( type, elem, event, bubble ) {
-               // Piggyback on a donor event to simulate a different one.
-               // Fake originalEvent to avoid donor's stopPropagation, but if the
-               // simulated event prevents default then we do the same on the donor.
-               var e = jQuery.extend(
-                       new jQuery.Event(),
-                       event,
-                       { type: type,
-                               isSimulated: true,
-                               originalEvent: {}
+                       teardown: function( namespaces, eventHandle ) {
+                               if ( this.onbeforeunload === eventHandle ) {
+                                       this.onbeforeunload = null;
+                               }
                        }
                        }
-               );
-               if ( bubble ) {
-                       jQuery.event.trigger( e, null, elem );
-               } else {
-                       jQuery.event.dispatch.call( elem, e );
-               }
-               if ( e.isDefaultPrevented() ) {
-                       event.preventDefault();
                }
        }
 };
                }
        }
 };
@@ -3315,23 +3127,14 @@ jQuery.removeEvent = document.removeEventListener ?
                }
        } :
        function( elem, type, handle ) {
                }
        } :
        function( elem, type, handle ) {
-               var name = "on" + type;
-
                if ( elem.detachEvent ) {
                if ( elem.detachEvent ) {
-
-                       // #8545, #7054, preventing memory leaks for custom events in IE6-8
-                       // detachEvent needed property on element, by name of that event, to properly expose it to GC
-                       if ( typeof elem[ name ] === core_strundefined ) {
-                               elem[ name ] = null;
-                       }
-
-                       elem.detachEvent( name, handle );
+                       elem.detachEvent( "on" + type, handle );
                }
        };
 
 jQuery.Event = function( src, props ) {
        // Allow instantiation without the 'new' keyword
                }
        };
 
 jQuery.Event = function( src, props ) {
        // Allow instantiation without the 'new' keyword
-       if ( !(this instanceof jQuery.Event) ) {
+       if ( !this.preventDefault ) {
                return new jQuery.Event( src, props );
        }
 
                return new jQuery.Event( src, props );
        }
 
@@ -3342,8 +3145,8 @@ jQuery.Event = function( src, props ) {
 
                // Events bubbling up the document may have been marked as prevented
                // by a handler lower down the tree; reflect the correct value.
 
                // Events bubbling up the document may have been marked as prevented
                // by a handler lower down the tree; reflect the correct value.
-               this.isDefaultPrevented = ( src.defaultPrevented || src.returnValue === false ||
-                       src.getPreventDefault && src.getPreventDefault() ) ? returnTrue : returnFalse;
+               this.isDefaultPrevented = (src.defaultPrevented || src.returnValue === false ||
+                       src.getPreventDefault && src.getPreventDefault()) ? returnTrue : returnFalse;
 
        // Event type
        } else {
 
        // Event type
        } else {
@@ -3355,191 +3158,274 @@ jQuery.Event = function( src, props ) {
                jQuery.extend( this, props );
        }
 
                jQuery.extend( this, props );
        }
 
-       // Create a timestamp if incoming event doesn't have one
-       this.timeStamp = src && src.timeStamp || jQuery.now();
+       // timeStamp is buggy for some events on Firefox(#3843)
+       // So we won't rely on the native value
+       this.timeStamp = jQuery.now();
 
        // Mark it as fixed
        this[ jQuery.expando ] = true;
 };
 
 
        // Mark it as fixed
        this[ jQuery.expando ] = true;
 };
 
+function returnFalse() {
+       return false;
+}
+function returnTrue() {
+       return true;
+}
+
 // jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
 // http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
 jQuery.Event.prototype = {
 // jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
 // http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
 jQuery.Event.prototype = {
-       isDefaultPrevented: returnFalse,
-       isPropagationStopped: returnFalse,
-       isImmediatePropagationStopped: returnFalse,
-
        preventDefault: function() {
        preventDefault: function() {
-               var e = this.originalEvent;
-
                this.isDefaultPrevented = returnTrue;
                this.isDefaultPrevented = returnTrue;
+
+               var e = this.originalEvent;
                if ( !e ) {
                        return;
                }
 
                if ( !e ) {
                        return;
                }
 
-               // If preventDefault exists, run it on the original event
+               // if preventDefault exists run it on the original event
                if ( e.preventDefault ) {
                        e.preventDefault();
 
                if ( e.preventDefault ) {
                        e.preventDefault();
 
-               // Support: IE
-               // Otherwise set the returnValue property of the original event to false
+               // otherwise set the returnValue property of the original event to false (IE)
                } else {
                        e.returnValue = false;
                }
        },
        stopPropagation: function() {
                } else {
                        e.returnValue = false;
                }
        },
        stopPropagation: function() {
-               var e = this.originalEvent;
-
                this.isPropagationStopped = returnTrue;
                this.isPropagationStopped = returnTrue;
+
+               var e = this.originalEvent;
                if ( !e ) {
                        return;
                }
                if ( !e ) {
                        return;
                }
-               // If stopPropagation exists, run it on the original event
+               // if stopPropagation exists run it on the original event
                if ( e.stopPropagation ) {
                        e.stopPropagation();
                }
                if ( e.stopPropagation ) {
                        e.stopPropagation();
                }
-
-               // Support: IE
-               // Set the cancelBubble property of the original event to true
+               // otherwise set the cancelBubble property of the original event to true (IE)
                e.cancelBubble = true;
        },
        stopImmediatePropagation: function() {
                this.isImmediatePropagationStopped = returnTrue;
                this.stopPropagation();
                e.cancelBubble = true;
        },
        stopImmediatePropagation: function() {
                this.isImmediatePropagationStopped = returnTrue;
                this.stopPropagation();
+       },
+       isDefaultPrevented: returnFalse,
+       isPropagationStopped: returnFalse,
+       isImmediatePropagationStopped: returnFalse
+};
+
+// Checks if an event happened on an element within another element
+// Used in jQuery.event.special.mouseenter and mouseleave handlers
+var withinElement = function( event ) {
+
+       // Check if mouse(over|out) are still within the same parent element
+       var related = event.relatedTarget,
+               inside = false,
+               eventType = event.type;
+
+       event.type = event.data;
+
+       if ( related !== this ) {
+
+               if ( related ) {
+                       inside = jQuery.contains( this, related );
+               }
+
+               if ( !inside ) {
+
+                       jQuery.event.handle.apply( this, arguments );
+
+                       event.type = eventType;
+               }
        }
        }
+},
+
+// In case of event delegation, we only need to rename the event.type,
+// liveHandler will take care of the rest.
+delegate = function( event ) {
+       event.type = event.data;
+       jQuery.event.handle.apply( this, arguments );
 };
 
 };
 
-// Create mouseenter/leave events using mouseover/out and event-time checks
+// Create mouseenter and mouseleave events
 jQuery.each({
        mouseenter: "mouseover",
        mouseleave: "mouseout"
 }, function( orig, fix ) {
        jQuery.event.special[ orig ] = {
 jQuery.each({
        mouseenter: "mouseover",
        mouseleave: "mouseout"
 }, function( orig, fix ) {
        jQuery.event.special[ orig ] = {
-               delegateType: fix,
-               bindType: fix,
-
-               handle: function( event ) {
-                       var ret,
-                               target = this,
-                               related = event.relatedTarget,
-                               handleObj = event.handleObj;
-
-                       // For mousenter/leave call the handler if related is outside the target.
-                       // NB: No relatedTarget if the mouse left/entered the browser window
-                       if ( !related || (related !== target && !jQuery.contains( target, related )) ) {
-                               event.type = handleObj.origType;
-                               ret = handleObj.handler.apply( this, arguments );
-                               event.type = fix;
-                       }
-                       return ret;
+               setup: function( data ) {
+                       jQuery.event.add( this, fix, data && data.selector ? delegate : withinElement, orig );
+               },
+               teardown: function( data ) {
+                       jQuery.event.remove( this, fix, data && data.selector ? delegate : withinElement );
                }
        };
 });
 
                }
        };
 });
 
-// IE submit delegation
+// submit delegation
 if ( !jQuery.support.submitBubbles ) {
 
        jQuery.event.special.submit = {
 if ( !jQuery.support.submitBubbles ) {
 
        jQuery.event.special.submit = {
-               setup: function() {
-                       // Only need this for delegated form submit events
-                       if ( jQuery.nodeName( this, "form" ) ) {
-                               return false;
-                       }
+               setup: function( data, namespaces ) {
+                       if ( !jQuery.nodeName( this, "form" ) ) {
+                               jQuery.event.add(this, "click.specialSubmit", function( e ) {
+                                       // Avoid triggering error on non-existent type attribute in IE VML (#7071)
+                                       var elem = e.target,
+                                               type = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.type : "";
+
+                                       if ( (type === "submit" || type === "image") && jQuery( elem ).closest("form").length ) {
+                                               trigger( "submit", this, arguments );
+                                       }
+                               });
 
 
-                       // Lazy-add a submit handler when a descendant form may potentially be submitted
-                       jQuery.event.add( this, "click._submit keypress._submit", function( e ) {
-                               // Node name check avoids a VML-related crash in IE (#9807)
-                               var elem = e.target,
-                                       form = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.form : undefined;
-                               if ( form && !jQuery._data( form, "submitBubbles" ) ) {
-                                       jQuery.event.add( form, "submit._submit", function( event ) {
-                                               event._submit_bubble = true;
-                                       });
-                                       jQuery._data( form, "submitBubbles", true );
-                               }
-                       });
-                       // return undefined since we don't need an event listener
-               },
+                               jQuery.event.add(this, "keypress.specialSubmit", function( e ) {
+                                       var elem = e.target,
+                                               type = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.type : "";
 
 
-               postDispatch: function( event ) {
-                       // If form was submitted by the user, bubble the event up the tree
-                       if ( event._submit_bubble ) {
-                               delete event._submit_bubble;
-                               if ( this.parentNode && !event.isTrigger ) {
-                                       jQuery.event.simulate( "submit", this.parentNode, event, true );
-                               }
-                       }
-               },
+                                       if ( (type === "text" || type === "password") && jQuery( elem ).closest("form").length && e.keyCode === 13 ) {
+                                               trigger( "submit", this, arguments );
+                                       }
+                               });
 
 
-               teardown: function() {
-                       // Only need this for delegated form submit events
-                       if ( jQuery.nodeName( this, "form" ) ) {
+                       } else {
                                return false;
                        }
                                return false;
                        }
+               },
 
 
-                       // Remove delegated handlers; cleanData eventually reaps submit handlers attached above
-                       jQuery.event.remove( this, "._submit" );
+               teardown: function( namespaces ) {
+                       jQuery.event.remove( this, ".specialSubmit" );
                }
        };
                }
        };
+
 }
 
 }
 
-// IE change delegation and checkbox/radio fix
+// change delegation, happens here so we have bind.
 if ( !jQuery.support.changeBubbles ) {
 
 if ( !jQuery.support.changeBubbles ) {
 
+       var changeFilters,
+
+       getVal = function( elem ) {
+               var type = jQuery.nodeName( elem, "input" ) ? elem.type : "",
+                       val = elem.value;
+
+               if ( type === "radio" || type === "checkbox" ) {
+                       val = elem.checked;
+
+               } else if ( type === "select-multiple" ) {
+                       val = elem.selectedIndex > -1 ?
+                               jQuery.map( elem.options, function( elem ) {
+                                       return elem.selected;
+                               }).join("-") :
+                               "";
+
+               } else if ( jQuery.nodeName( elem, "select" ) ) {
+                       val = elem.selectedIndex;
+               }
+
+               return val;
+       },
+
+       testChange = function testChange( e ) {
+               var elem = e.target, data, val;
+
+               if ( !rformElems.test( elem.nodeName ) || elem.readOnly ) {
+                       return;
+               }
+
+               data = jQuery._data( elem, "_change_data" );
+               val = getVal(elem);
+
+               // the current data will be also retrieved by beforeactivate
+               if ( e.type !== "focusout" || elem.type !== "radio" ) {
+                       jQuery._data( elem, "_change_data", val );
+               }
+
+               if ( data === undefined || val === data ) {
+                       return;
+               }
+
+               if ( data != null || val ) {
+                       e.type = "change";
+                       e.liveFired = undefined;
+                       jQuery.event.trigger( e, arguments[1], elem );
+               }
+       };
+
        jQuery.event.special.change = {
        jQuery.event.special.change = {
+               filters: {
+                       focusout: testChange,
 
 
-               setup: function() {
+                       beforedeactivate: testChange,
 
 
-                       if ( rformElems.test( this.nodeName ) ) {
-                               // IE doesn't fire change on a check/radio until blur; trigger it on click
-                               // after a propertychange. Eat the blur-change in special.change.handle.
-                               // This still fires onchange a second time for check/radio after blur.
-                               if ( this.type === "checkbox" || this.type === "radio" ) {
-                                       jQuery.event.add( this, "propertychange._change", function( event ) {
-                                               if ( event.originalEvent.propertyName === "checked" ) {
-                                                       this._just_changed = true;
-                                               }
-                                       });
-                                       jQuery.event.add( this, "click._change", function( event ) {
-                                               if ( this._just_changed && !event.isTrigger ) {
-                                                       this._just_changed = false;
-                                               }
-                                               // Allow triggered, simulated change events (#11500)
-                                               jQuery.event.simulate( "change", this, event, true );
-                                       });
+                       click: function( e ) {
+                               var elem = e.target, type = jQuery.nodeName( elem, "input" ) ? elem.type : "";
+
+                               if ( type === "radio" || type === "checkbox" || jQuery.nodeName( elem, "select" ) ) {
+                                       testChange.call( this, e );
                                }
                                }
-                               return false;
-                       }
-                       // Delegated event; lazy-add a change handler on descendant inputs
-                       jQuery.event.add( this, "beforeactivate._change", function( e ) {
-                               var elem = e.target;
+                       },
 
 
-                               if ( rformElems.test( elem.nodeName ) && !jQuery._data( elem, "changeBubbles" ) ) {
-                                       jQuery.event.add( elem, "change._change", function( event ) {
-                                               if ( this.parentNode && !event.isSimulated && !event.isTrigger ) {
-                                                       jQuery.event.simulate( "change", this.parentNode, event, true );
-                                               }
-                                       });
-                                       jQuery._data( elem, "changeBubbles", true );
+                       // Change has to be called before submit
+                       // Keydown will be called before keypress, which is used in submit-event delegation
+                       keydown: function( e ) {
+                               var elem = e.target, type = jQuery.nodeName( elem, "input" ) ? elem.type : "";
+
+                               if ( (e.keyCode === 13 && !jQuery.nodeName( elem, "textarea" ) ) ||
+                                       (e.keyCode === 32 && (type === "checkbox" || type === "radio")) ||
+                                       type === "select-multiple" ) {
+                                       testChange.call( this, e );
                                }
                                }
-                       });
+                       },
+
+                       // Beforeactivate happens also before the previous element is blurred
+                       // with this event you can't trigger a change event, but you can store
+                       // information
+                       beforeactivate: function( e ) {
+                               var elem = e.target;
+                               jQuery._data( elem, "_change_data", getVal(elem) );
+                       }
                },
 
                },
 
-               handle: function( event ) {
-                       var elem = event.target;
+               setup: function( data, namespaces ) {
+                       if ( this.type === "file" ) {
+                               return false;
+                       }
 
 
-                       // Swallow native change events from checkbox/radio, we already triggered them above
-                       if ( this !== elem || event.isSimulated || event.isTrigger || (elem.type !== "radio" && elem.type !== "checkbox") ) {
-                               return event.handleObj.handler.apply( this, arguments );
+                       for ( var type in changeFilters ) {
+                               jQuery.event.add( this, type + ".specialChange", changeFilters[type] );
                        }
                        }
+
+                       return rformElems.test( this.nodeName );
                },
 
                },
 
-               teardown: function() {
-                       jQuery.event.remove( this, "._change" );
+               teardown: function( namespaces ) {
+                       jQuery.event.remove( this, ".specialChange" );
 
 
-                       return !rformElems.test( this.nodeName );
+                       return rformElems.test( this.nodeName );
                }
        };
                }
        };
+
+       changeFilters = jQuery.event.special.change.filters;
+
+       // Handle when the input is .focus()'d
+       changeFilters.focus = changeFilters.beforeactivate;
+}
+
+function trigger( type, elem, args ) {
+       // Piggyback on a donor event to simulate a different one.
+       // Fake originalEvent to avoid donor's stopPropagation, but if the
+       // simulated event prevents default then we do the same on the donor.
+       // Don't pass args or remember liveFired; they apply to the donor event.
+       var event = jQuery.extend( {}, args[ 0 ] );
+       event.type = type;
+       event.originalEvent = {};
+       event.liveFired = undefined;
+       jQuery.event.handle.call( elem, event );
+       if ( event.isDefaultPrevented() ) {
+               args[ 0 ].preventDefault();
+       }
 }
 
 // Create "bubbling" focus and blur events
 }
 
 // Create "bubbling" focus and blur events
@@ -3547,10 +3433,7 @@ if ( !jQuery.support.focusinBubbles ) {
        jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) {
 
                // Attach a single capturing handler while someone wants focusin/focusout
        jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) {
 
                // Attach a single capturing handler while someone wants focusin/focusout
-               var attaches = 0,
-                       handler = function( event ) {
-                               jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true );
-                       };
+               var attaches = 0;
 
                jQuery.event.special[ fix ] = {
                        setup: function() {
 
                jQuery.event.special[ fix ] = {
                        setup: function() {
@@ -3564,112 +3447,89 @@ if ( !jQuery.support.focusinBubbles ) {
                                }
                        }
                };
                                }
                        }
                };
+
+               function handler( donor ) {
+                       // Donor event is always a native one; fix it and switch its type.
+                       // Let focusin/out handler cancel the donor focus/blur event.
+                       var e = jQuery.event.fix( donor );
+                       e.type = fix;
+                       e.originalEvent = {};
+                       jQuery.event.trigger( e, null, e.target );
+                       if ( e.isDefaultPrevented() ) {
+                               donor.preventDefault();
+                       }
+               }
        });
 }
 
        });
 }
 
-jQuery.fn.extend({
-
-       on: function( types, selector, data, fn, /*INTERNAL*/ one ) {
-               var type, origFn;
+jQuery.each(["bind", "one"], function( i, name ) {
+       jQuery.fn[ name ] = function( type, data, fn ) {
+               var handler;
 
 
-               // Types can be a map of types/handlers
-               if ( typeof types === "object" ) {
-                       // ( types-Object, selector, data )
-                       if ( typeof selector !== "string" ) {
-                               // ( types-Object, data )
-                               data = data || selector;
-                               selector = undefined;
-                       }
-                       for ( type in types ) {
-                               this.on( type, selector, data, types[ type ], one );
+               // Handle object literals
+               if ( typeof type === "object" ) {
+                       for ( var key in type ) {
+                               this[ name ](key, data, type[key], fn);
                        }
                        return this;
                }
 
                        }
                        return this;
                }
 
-               if ( data == null && fn == null ) {
-                       // ( types, fn )
-                       fn = selector;
-                       data = selector = undefined;
-               } else if ( fn == null ) {
-                       if ( typeof selector === "string" ) {
-                               // ( types, selector, fn )
-                               fn = data;
-                               data = undefined;
-                       } else {
-                               // ( types, data, fn )
-                               fn = data;
-                               data = selector;
-                               selector = undefined;
-                       }
-               }
-               if ( fn === false ) {
-                       fn = returnFalse;
-               } else if ( !fn ) {
-                       return this;
+               if ( arguments.length === 2 || data === false ) {
+                       fn = data;
+                       data = undefined;
                }
 
                }
 
-               if ( one === 1 ) {
-                       origFn = fn;
-                       fn = function( event ) {
-                               // Can use an empty set, since event contains the info
-                               jQuery().off( event );
-                               return origFn.apply( this, arguments );
+               if ( name === "one" ) {
+                       handler = function( event ) {
+                               jQuery( this ).unbind( event, handler );
+                               return fn.apply( this, arguments );
                        };
                        };
-                       // Use same guid so caller can remove using origFn
-                       fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );
-               }
-               return this.each( function() {
-                       jQuery.event.add( this, types, fn, data, selector );
-               });
-       },
-       one: function( types, selector, data, fn ) {
-               return this.on( types, selector, data, fn, 1 );
-       },
-       off: function( types, selector, fn ) {
-               var handleObj, type;
-               if ( types && types.preventDefault && types.handleObj ) {
-                       // ( event )  dispatched jQuery.Event
-                       handleObj = types.handleObj;
-                       jQuery( types.delegateTarget ).off(
-                               handleObj.namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType,
-                               handleObj.selector,
-                               handleObj.handler
-                       );
-                       return this;
+                       handler.guid = fn.guid || jQuery.guid++;
+               } else {
+                       handler = fn;
                }
                }
-               if ( typeof types === "object" ) {
-                       // ( types-object [, selector] )
-                       for ( type in types ) {
-                               this.off( type, selector, types[ type ] );
+
+               if ( type === "unload" && name !== "one" ) {
+                       this.one( type, data, fn );
+
+               } else {
+                       for ( var i = 0, l = this.length; i < l; i++ ) {
+                               jQuery.event.add( this[i], type, handler, data );
                        }
                        }
-                       return this;
-               }
-               if ( selector === false || typeof selector === "function" ) {
-                       // ( types [, fn] )
-                       fn = selector;
-                       selector = undefined;
                }
                }
-               if ( fn === false ) {
-                       fn = returnFalse;
+
+               return this;
+       };
+});
+
+jQuery.fn.extend({
+       unbind: function( type, fn ) {
+               // Handle object literals
+               if ( typeof type === "object" && !type.preventDefault ) {
+                       for ( var key in type ) {
+                               this.unbind(key, type[key]);
+                       }
+
+               } else {
+                       for ( var i = 0, l = this.length; i < l; i++ ) {
+                               jQuery.event.remove( this[i], type, fn );
+                       }
                }
                }
-               return this.each(function() {
-                       jQuery.event.remove( this, types, fn, selector );
-               });
-       },
 
 
-       bind: function( types, data, fn ) {
-               return this.on( types, null, data, fn );
-       },
-       unbind: function( types, fn ) {
-               return this.off( types, null, fn );
+               return this;
        },
 
        delegate: function( selector, types, data, fn ) {
        },
 
        delegate: function( selector, types, data, fn ) {
-               return this.on( types, selector, data, fn );
+               return this.live( types, data, fn, selector );
        },
        },
+
        undelegate: function( selector, types, fn ) {
        undelegate: function( selector, types, fn ) {
-               // ( namespace ) or ( selector, types [, fn] )
-               return arguments.length === 1 ? this.off( selector, "**" ) : this.off( types, selector || "**", fn );
+               if ( arguments.length === 0 ) {
+                       return this.unbind( "live" );
+
+               } else {
+                       return this.die( types, null, fn, selector );
+               }
        },
 
        trigger: function( type, data ) {
        },
 
        trigger: function( type, data ) {
@@ -3677,1876 +3537,1664 @@ jQuery.fn.extend({
                        jQuery.event.trigger( type, data, this );
                });
        },
                        jQuery.event.trigger( type, data, this );
                });
        },
+
        triggerHandler: function( type, data ) {
        triggerHandler: function( type, data ) {
-               var elem = this[0];
-               if ( elem ) {
-                       return jQuery.event.trigger( type, data, elem, true );
+               if ( this[0] ) {
+                       return jQuery.event.trigger( type, data, this[0], true );
                }
                }
-       }
-});
-/*!
- * Sizzle CSS Selector Engine
- * Copyright 2012 jQuery Foundation and other contributors
- * Released under the MIT license
- * http://sizzlejs.com/
- */
-(function( window, undefined ) {
+       },
 
 
-var i,
-       cachedruns,
-       Expr,
-       getText,
-       isXML,
-       compile,
-       hasDuplicate,
-       outermostContext,
-
-       // Local document vars
-       setDocument,
-       document,
-       docElem,
-       documentIsXML,
-       rbuggyQSA,
-       rbuggyMatches,
-       matches,
-       contains,
-       sortOrder,
-
-       // Instance-specific data
-       expando = "sizzle" + -(new Date()),
-       preferredDoc = window.document,
-       support = {},
-       dirruns = 0,
-       done = 0,
-       classCache = createCache(),
-       tokenCache = createCache(),
-       compilerCache = createCache(),
-
-       // General-purpose constants
-       strundefined = typeof undefined,
-       MAX_NEGATIVE = 1 << 31,
-
-       // Array methods
-       arr = [],
-       pop = arr.pop,
-       push = arr.push,
-       slice = arr.slice,
-       // Use a stripped-down indexOf if we can't use a native one
-       indexOf = arr.indexOf || function( elem ) {
-               var i = 0,
-                       len = this.length;
-               for ( ; i < len; i++ ) {
-                       if ( this[i] === elem ) {
-                               return i;
-                       }
-               }
-               return -1;
-       },
+       toggle: function( fn ) {
+               // Save reference to arguments for access in closure
+               var args = arguments,
+                       guid = fn.guid || jQuery.guid++,
+                       i = 0,
+                       toggler = function( event ) {
+                               // Figure out which function to execute
+                               var lastToggle = ( jQuery.data( this, "lastToggle" + fn.guid ) || 0 ) % i;
+                               jQuery.data( this, "lastToggle" + fn.guid, lastToggle + 1 );
 
 
+                               // Make sure that clicks stop
+                               event.preventDefault();
 
 
-       // Regular expressions
-
-       // Whitespace characters http://www.w3.org/TR/css3-selectors/#whitespace
-       whitespace = "[\\x20\\t\\r\\n\\f]",
-       // http://www.w3.org/TR/css3-syntax/#characters
-       characterEncoding = "(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",
-
-       // Loosely modeled on CSS identifier characters
-       // An unquoted value should be a CSS identifier http://www.w3.org/TR/css3-selectors/#attribute-selectors
-       // Proper syntax: http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier
-       identifier = characterEncoding.replace( "w", "w#" ),
-
-       // Acceptable operators http://www.w3.org/TR/selectors/#attribute-selectors
-       operators = "([*^$|!~]?=)",
-       attributes = "\\[" + whitespace + "*(" + characterEncoding + ")" + whitespace +
-               "*(?:" + operators + whitespace + "*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|(" + identifier + ")|)|)" + whitespace + "*\\]",
-
-       // Prefer arguments quoted,
-       //   then not containing pseudos/brackets,
-       //   then attribute selectors/non-parenthetical expressions,
-       //   then anything else
-       // These preferences are here to reduce the number of selectors
-       //   needing tokenize in the PSEUDO preFilter
-       pseudos = ":(" + characterEncoding + ")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|" + attributes.replace( 3, 8 ) + ")*)|.*)\\)|)",
-
-       // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter
-       rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ),
-
-       rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ),
-       rcombinators = new RegExp( "^" + whitespace + "*([\\x20\\t\\r\\n\\f>+~])" + whitespace + "*" ),
-       rpseudo = new RegExp( pseudos ),
-       ridentifier = new RegExp( "^" + identifier + "$" ),
-
-       matchExpr = {
-               "ID": new RegExp( "^#(" + characterEncoding + ")" ),
-               "CLASS": new RegExp( "^\\.(" + characterEncoding + ")" ),
-               "NAME": new RegExp( "^\\[name=['\"]?(" + characterEncoding + ")['\"]?\\]" ),
-               "TAG": new RegExp( "^(" + characterEncoding.replace( "w", "w*" ) + ")" ),
-               "ATTR": new RegExp( "^" + attributes ),
-               "PSEUDO": new RegExp( "^" + pseudos ),
-               "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace +
-                       "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace +
-                       "*(\\d+)|))" + whitespace + "*\\)|)", "i" ),
-               // For use in libraries implementing .is()
-               // We use this for POS matching in `select`
-               "needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" +
-                       whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" )
-       },
-
-       rsibling = /[\x20\t\r\n\f]*[+~]/,
-
-       rnative = /^[^{]+\{\s*\[native code/,
-
-       // Easily-parseable/retrievable ID or TAG or CLASS selectors
-       rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,
-
-       rinputs = /^(?:input|select|textarea|button)$/i,
-       rheader = /^h\d$/i,
-
-       rescape = /'|\\/g,
-       rattributeQuotes = /\=[\x20\t\r\n\f]*([^'"\]]*)[\x20\t\r\n\f]*\]/g,
-
-       // CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters
-       runescape = /\\([\da-fA-F]{1,6}[\x20\t\r\n\f]?|.)/g,
-       funescape = function( _, escaped ) {
-               var high = "0x" + escaped - 0x10000;
-               // NaN means non-codepoint
-               return high !== high ?
-                       escaped :
-                       // BMP codepoint
-                       high < 0 ?
-                               String.fromCharCode( high + 0x10000 ) :
-                               // Supplemental Plane codepoint (surrogate pair)
-                               String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );
-       };
+                               // and execute the function
+                               return args[ lastToggle ].apply( this, arguments ) || false;
+                       };
 
 
-// Use a stripped-down slice if we can't use a native one
-try {
-       slice.call( preferredDoc.documentElement.childNodes, 0 )[0].nodeType;
-} catch ( e ) {
-       slice = function( i ) {
-               var elem,
-                       results = [];
-               while ( (elem = this[i++]) ) {
-                       results.push( elem );
+               // link all the functions, so any of them can unbind this click handler
+               toggler.guid = guid;
+               while ( i < args.length ) {
+                       args[ i++ ].guid = guid;
                }
                }
-               return results;
-       };
-}
 
 
-/**
- * For feature detection
- * @param {Function} fn The function to test for native support
- */
-function isNative( fn ) {
-       return rnative.test( fn + "" );
-}
-
-/**
- * Create key-value caches of limited size
- * @returns {Function(string, Object)} Returns the Object data after storing it on itself with
- *     property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)
- *     deleting the oldest entry
- */
-function createCache() {
-       var cache,
-               keys = [];
+               return this.click( toggler );
+       },
 
 
-       return (cache = function( key, value ) {
-               // Use (key + " ") to avoid collision with native prototype properties (see Issue #157)
-               if ( keys.push( key += " " ) > Expr.cacheLength ) {
-                       // Only keep the most recent entries
-                       delete cache[ keys.shift() ];
-               }
-               return (cache[ key ] = value);
-       });
-}
+       hover: function( fnOver, fnOut ) {
+               return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
+       }
+});
 
 
-/**
- * Mark a function for special use by Sizzle
- * @param {Function} fn The function to mark
- */
-function markFunction( fn ) {
-       fn[ expando ] = true;
-       return fn;
-}
+var liveMap = {
+       focus: "focusin",
+       blur: "focusout",
+       mouseenter: "mouseover",
+       mouseleave: "mouseout"
+};
 
 
-/**
- * Support testing using an element
- * @param {Function} fn Passed the created div and expects a boolean result
- */
-function assert( fn ) {
-       var div = document.createElement("div");
+jQuery.each(["live", "die"], function( i, name ) {
+       jQuery.fn[ name ] = function( types, data, fn, origSelector /* Internal Use Only */ ) {
+               var type, i = 0, match, namespaces, preType,
+                       selector = origSelector || this.selector,
+                       context = origSelector ? this : jQuery( this.context );
 
 
-       try {
-               return fn( div );
-       } catch (e) {
-               return false;
-       } finally {
-               // release memory in IE
-               div = null;
-       }
-}
+               if ( typeof types === "object" && !types.preventDefault ) {
+                       for ( var key in types ) {
+                               context[ name ]( key, data, types[key], selector );
+                       }
 
 
-function Sizzle( selector, context, results, seed ) {
-       var match, elem, m, nodeType,
-               // QSA vars
-               i, groups, old, nid, newContext, newSelector;
+                       return this;
+               }
 
 
-       if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) {
-               setDocument( context );
-       }
+               if ( name === "die" && !types &&
+                                       origSelector && origSelector.charAt(0) === "." ) {
 
 
-       context = context || document;
-       results = results || [];
+                       context.unbind( origSelector );
 
 
-       if ( !selector || typeof selector !== "string" ) {
-               return results;
-       }
+                       return this;
+               }
 
 
-       if ( (nodeType = context.nodeType) !== 1 && nodeType !== 9 ) {
-               return [];
-       }
+               if ( data === false || jQuery.isFunction( data ) ) {
+                       fn = data || returnFalse;
+                       data = undefined;
+               }
 
 
-       if ( !documentIsXML && !seed ) {
+               types = (types || "").split(" ");
 
 
-               // Shortcuts
-               if ( (match = rquickExpr.exec( selector )) ) {
-                       // Speed-up: Sizzle("#ID")
-                       if ( (m = match[1]) ) {
-                               if ( nodeType === 9 ) {
-                                       elem = context.getElementById( m );
-                                       // Check parentNode to catch when Blackberry 4.6 returns
-                                       // nodes that are no longer in the document #6963
-                                       if ( elem && elem.parentNode ) {
-                                               // Handle the case where IE, Opera, and Webkit return items
-                                               // by name instead of ID
-                                               if ( elem.id === m ) {
-                                                       results.push( elem );
-                                                       return results;
-                                               }
-                                       } else {
-                                               return results;
-                                       }
-                               } else {
-                                       // Context is not a document
-                                       if ( context.ownerDocument && (elem = context.ownerDocument.getElementById( m )) &&
-                                               contains( context, elem ) && elem.id === m ) {
-                                               results.push( elem );
-                                               return results;
-                                       }
-                               }
+               while ( (type = types[ i++ ]) != null ) {
+                       match = rnamespaces.exec( type );
+                       namespaces = "";
 
 
-                       // Speed-up: Sizzle("TAG")
-                       } else if ( match[2] ) {
-                               push.apply( results, slice.call(context.getElementsByTagName( selector ), 0) );
-                               return results;
-
-                       // Speed-up: Sizzle(".CLASS")
-                       } else if ( (m = match[3]) && support.getByClassName && context.getElementsByClassName ) {
-                               push.apply( results, slice.call(context.getElementsByClassName( m ), 0) );
-                               return results;
+                       if ( match )  {
+                               namespaces = match[0];
+                               type = type.replace( rnamespaces, "" );
                        }
                        }
-               }
 
 
-               // QSA path
-               if ( support.qsa && !rbuggyQSA.test(selector) ) {
-                       old = true;
-                       nid = expando;
-                       newContext = context;
-                       newSelector = nodeType === 9 && selector;
+                       if ( type === "hover" ) {
+                               types.push( "mouseenter" + namespaces, "mouseleave" + namespaces );
+                               continue;
+                       }
 
 
-                       // qSA works strangely on Element-rooted queries
-                       // We can work around this by specifying an extra ID on the root
-                       // and working up from there (Thanks to Andrew Dupont for the technique)
-                       // IE 8 doesn't work on object elements
-                       if ( nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) {
-                               groups = tokenize( selector );
+                       preType = type;
 
 
-                               if ( (old = context.getAttribute("id")) ) {
-                                       nid = old.replace( rescape, "\\$&" );
-                               } else {
-                                       context.setAttribute( "id", nid );
-                               }
-                               nid = "[id='" + nid + "'] ";
+                       if ( liveMap[ type ] ) {
+                               types.push( liveMap[ type ] + namespaces );
+                               type = type + namespaces;
 
 
-                               i = groups.length;
-                               while ( i-- ) {
-                                       groups[i] = nid + toSelector( groups[i] );
-                               }
-                               newContext = rsibling.test( selector ) && context.parentNode || context;
-                               newSelector = groups.join(",");
+                       } else {
+                               type = (liveMap[ type ] || type) + namespaces;
                        }
 
                        }
 
-                       if ( newSelector ) {
-                               try {
-                                       push.apply( results, slice.call( newContext.querySelectorAll(
-                                               newSelector
-                                       ), 0 ) );
-                                       return results;
-                               } catch(qsaError) {
-                               } finally {
-                                       if ( !old ) {
-                                               context.removeAttribute("id");
-                                       }
+                       if ( name === "live" ) {
+                               // bind live handler
+                               for ( var j = 0, l = context.length; j < l; j++ ) {
+                                       jQuery.event.add( context[j], "live." + liveConvert( type, selector ),
+                                               { data: data, selector: selector, handler: fn, origType: type, origHandler: fn, preType: preType } );
                                }
                                }
+
+                       } else {
+                               // unbind live handler
+                               context.unbind( "live." + liveConvert( type, selector ), fn );
                        }
                }
                        }
                }
-       }
 
 
-       // All others
-       return select( selector.replace( rtrim, "$1" ), context, results, seed );
-}
+               return this;
+       };
+});
 
 
-/**
- * Detect xml
- * @param {Element|Object} elem An element or a document
- */
-isXML = Sizzle.isXML = function( elem ) {
-       // documentElement is verified for cases where it doesn't yet exist
-       // (such as loading iframes in IE - #4833)
-       var documentElement = elem && (elem.ownerDocument || elem).documentElement;
-       return documentElement ? documentElement.nodeName !== "HTML" : false;
-};
+function liveHandler( event ) {
+       var stop, maxLevel, related, match, handleObj, elem, j, i, l, data, close, namespace, ret,
+               elems = [],
+               selectors = [],
+               events = jQuery._data( this, "events" );
 
 
-/**
- * Sets document-related variables once based on the current document
- * @param {Element|Object} [doc] An element or document object to use to set the document
- * @returns {Object} Returns the current document
- */
-setDocument = Sizzle.setDocument = function( node ) {
-       var doc = node ? node.ownerDocument || node : preferredDoc;
+       // Make sure we avoid non-left-click bubbling in Firefox (#3861) and disabled elements in IE (#6911)
+       if ( event.liveFired === this || !events || !events.live || event.target.disabled || event.button && event.type === "click" ) {
+               return;
+       }
 
 
-       // If no document and documentElement is available, return
-       if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) {
-               return document;
+       if ( event.namespace ) {
+               namespace = new RegExp("(^|\\.)" + event.namespace.split(".").join("\\.(?:.*\\.)?") + "(\\.|$)");
        }
 
        }
 
-       // Set our document
-       document = doc;
-       docElem = doc.documentElement;
+       event.liveFired = this;
 
 
-       // Support tests
-       documentIsXML = isXML( doc );
+       var live = events.live.slice(0);
 
 
-       // Check if getElementsByTagName("*") returns only elements
-       support.tagNameNoComments = assert(function( div ) {
-               div.appendChild( doc.createComment("") );
-               return !div.getElementsByTagName("*").length;
-       });
+       for ( j = 0; j < live.length; j++ ) {
+               handleObj = live[j];
 
 
-       // Check if attributes should be retrieved by attribute nodes
-       support.attributes = assert(function( div ) {
-               div.innerHTML = "<select></select>";
-               var type = typeof div.lastChild.getAttribute("multiple");
-               // IE8 returns a string for some attributes even when not present
-               return type !== "boolean" && type !== "string";
-       });
+               if ( handleObj.origType.replace( rnamespaces, "" ) === event.type ) {
+                       selectors.push( handleObj.selector );
 
 
-       // Check if getElementsByClassName can be trusted
-       support.getByClassName = assert(function( div ) {
-               // Opera can't find a second classname (in 9.6)
-               div.innerHTML = "<div class='hidden e'></div><div class='hidden'></div>";
-               if ( !div.getElementsByClassName || !div.getElementsByClassName("e").length ) {
-                       return false;
+               } else {
+                       live.splice( j--, 1 );
                }
                }
+       }
 
 
-               // Safari 3.2 caches class attributes and doesn't catch changes
-               div.lastChild.className = "e";
-               return div.getElementsByClassName("e").length === 2;
-       });
-
-       // Check if getElementById returns elements by name
-       // Check if getElementsByName privileges form controls or returns elements by ID
-       support.getByName = assert(function( div ) {
-               // Inject content
-               div.id = expando + 0;
-               div.innerHTML = "<a name='" + expando + "'></a><div name='" + expando + "'></div>";
-               docElem.insertBefore( div, docElem.firstChild );
-
-               // Test
-               var pass = doc.getElementsByName &&
-                       // buggy browsers will return fewer than the correct 2
-                       doc.getElementsByName( expando ).length === 2 +
-                       // buggy browsers will return more than the correct 0
-                       doc.getElementsByName( expando + 0 ).length;
-               support.getIdNotName = !doc.getElementById( expando );
-
-               // Cleanup
-               docElem.removeChild( div );
-
-               return pass;
-       });
+       match = jQuery( event.target ).closest( selectors, event.currentTarget );
 
 
-       // IE6/7 return modified attributes
-       Expr.attrHandle = assert(function( div ) {
-               div.innerHTML = "<a href='#'></a>";
-               return div.firstChild && typeof div.firstChild.getAttribute !== strundefined &&
-                       div.firstChild.getAttribute("href") === "#";
-       }) ?
-               {} :
-               {
-                       "href": function( elem ) {
-                               return elem.getAttribute( "href", 2 );
-                       },
-                       "type": function( elem ) {
-                               return elem.getAttribute("type");
-                       }
-               };
+       for ( i = 0, l = match.length; i < l; i++ ) {
+               close = match[i];
 
 
-       // ID find and filter
-       if ( support.getIdNotName ) {
-               Expr.find["ID"] = function( id, context ) {
-                       if ( typeof context.getElementById !== strundefined && !documentIsXML ) {
-                               var m = context.getElementById( id );
-                               // Check parentNode to catch when Blackberry 4.6 returns
-                               // nodes that are no longer in the document #6963
-                               return m && m.parentNode ? [m] : [];
-                       }
-               };
-               Expr.filter["ID"] = function( id ) {
-                       var attrId = id.replace( runescape, funescape );
-                       return function( elem ) {
-                               return elem.getAttribute("id") === attrId;
-                       };
-               };
-       } else {
-               Expr.find["ID"] = function( id, context ) {
-                       if ( typeof context.getElementById !== strundefined && !documentIsXML ) {
-                               var m = context.getElementById( id );
+               for ( j = 0; j < live.length; j++ ) {
+                       handleObj = live[j];
 
 
-                               return m ?
-                                       m.id === id || typeof m.getAttributeNode !== strundefined && m.getAttributeNode("id").value === id ?
-                                               [m] :
-                                               undefined :
-                                       [];
-                       }
-               };
-               Expr.filter["ID"] =  function( id ) {
-                       var attrId = id.replace( runescape, funescape );
-                       return function( elem ) {
-                               var node = typeof elem.getAttributeNode !== strundefined && elem.getAttributeNode("id");
-                               return node && node.value === attrId;
-                       };
-               };
-       }
+                       if ( close.selector === handleObj.selector && (!namespace || namespace.test( handleObj.namespace )) && !close.elem.disabled ) {
+                               elem = close.elem;
+                               related = null;
 
 
-       // Tag
-       Expr.find["TAG"] = support.tagNameNoComments ?
-               function( tag, context ) {
-                       if ( typeof context.getElementsByTagName !== strundefined ) {
-                               return context.getElementsByTagName( tag );
-                       }
-               } :
-               function( tag, context ) {
-                       var elem,
-                               tmp = [],
-                               i = 0,
-                               results = context.getElementsByTagName( tag );
+                               // Those two events require additional checking
+                               if ( handleObj.preType === "mouseenter" || handleObj.preType === "mouseleave" ) {
+                                       event.type = handleObj.preType;
+                                       related = jQuery( event.relatedTarget ).closest( handleObj.selector )[0];
 
 
-                       // Filter out possible comments
-                       if ( tag === "*" ) {
-                               while ( (elem = results[i++]) ) {
-                                       if ( elem.nodeType === 1 ) {
-                                               tmp.push( elem );
+                                       // Make sure not to accidentally match a child element with the same selector
+                                       if ( related && jQuery.contains( elem, related ) ) {
+                                               related = elem;
                                        }
                                }
 
                                        }
                                }
 
-                               return tmp;
+                               if ( !related || related !== elem ) {
+                                       elems.push({ elem: elem, handleObj: handleObj, level: close.level });
+                               }
                        }
                        }
-                       return results;
-               };
-
-       // Name
-       Expr.find["NAME"] = support.getByName && function( tag, context ) {
-               if ( typeof context.getElementsByName !== strundefined ) {
-                       return context.getElementsByName( name );
                }
                }
-       };
+       }
 
 
-       // Class
-       Expr.find["CLASS"] = support.getByClassName && function( className, context ) {
-               if ( typeof context.getElementsByClassName !== strundefined && !documentIsXML ) {
-                       return context.getElementsByClassName( className );
-               }
-       };
+       for ( i = 0, l = elems.length; i < l; i++ ) {
+               match = elems[i];
 
 
-       // QSA and matchesSelector support
+               if ( maxLevel && match.level > maxLevel ) {
+                       break;
+               }
 
 
-       // matchesSelector(:active) reports false when true (IE9/Opera 11.5)
-       rbuggyMatches = [];
+               event.currentTarget = match.elem;
+               event.data = match.handleObj.data;
+               event.handleObj = match.handleObj;
 
 
-       // qSa(:focus) reports false when true (Chrome 21),
-       // no need to also add to buggyMatches since matches checks buggyQSA
-       // A support test would require too much code (would include document ready)
-       rbuggyQSA = [ ":focus" ];
+               ret = match.handleObj.origHandler.apply( match.elem, arguments );
 
 
-       if ( (support.qsa = isNative(doc.querySelectorAll)) ) {
-               // Build QSA regex
-               // Regex strategy adopted from Diego Perini
-               assert(function( div ) {
-                       // Select is set to empty string on purpose
-                       // This is to test IE's treatment of not explictly
-                       // setting a boolean content attribute,
-                       // since its presence should be enough
-                       // http://bugs.jquery.com/ticket/12359
-                       div.innerHTML = "<select><option selected=''></option></select>";
+               if ( ret === false || event.isPropagationStopped() ) {
+                       maxLevel = match.level;
 
 
-                       // IE8 - Some boolean attributes are not treated correctly
-                       if ( !div.querySelectorAll("[selected]").length ) {
-                               rbuggyQSA.push( "\\[" + whitespace + "*(?:checked|disabled|ismap|multiple|readonly|selected|value)" );
+                       if ( ret === false ) {
+                               stop = false;
                        }
                        }
-
-                       // Webkit/Opera - :checked should return selected option elements
-                       // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
-                       // IE8 throws error here and will not see later tests
-                       if ( !div.querySelectorAll(":checked").length ) {
-                               rbuggyQSA.push(":checked");
+                       if ( event.isImmediatePropagationStopped() ) {
+                               break;
                        }
                        }
-               });
+               }
+       }
 
 
-               assert(function( div ) {
+       return stop;
+}
 
 
-                       // Opera 10-12/IE8 - ^= $= *= and empty values
-                       // Should not select anything
-                       div.innerHTML = "<input type='hidden' i=''/>";
-                       if ( div.querySelectorAll("[i^='']").length ) {
-                               rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:\"\"|'')" );
-                       }
+function liveConvert( type, selector ) {
+       return (type && type !== "*" ? type + "." : "") + selector.replace(rperiod, "`").replace(rspaces, "&");
+}
 
 
-                       // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)
-                       // IE8 throws error here and will not see later tests
-                       if ( !div.querySelectorAll(":enabled").length ) {
-                               rbuggyQSA.push( ":enabled", ":disabled" );
-                       }
+jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " +
+       "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
+       "change select submit keydown keypress keyup error").split(" "), function( i, name ) {
 
 
-                       // Opera 10-11 does not throw on post-comma invalid pseudos
-                       div.querySelectorAll("*,:x");
-                       rbuggyQSA.push(",.*:");
-               });
+       // Handle event binding
+       jQuery.fn[ name ] = function( data, fn ) {
+               if ( fn == null ) {
+                       fn = data;
+                       data = null;
+               }
+
+               return arguments.length > 0 ?
+                       this.bind( name, data, fn ) :
+                       this.trigger( name );
+       };
+
+       if ( jQuery.attrFn ) {
+               jQuery.attrFn[ name ] = true;
        }
        }
+});
 
 
-       if ( (support.matchesSelector = isNative( (matches = docElem.matchesSelector ||
-               docElem.mozMatchesSelector ||
-               docElem.webkitMatchesSelector ||
-               docElem.oMatchesSelector ||
-               docElem.msMatchesSelector) )) ) {
 
 
-               assert(function( div ) {
-                       // Check to see if it's possible to do matchesSelector
-                       // on a disconnected node (IE 9)
-                       support.disconnectedMatch = matches.call( div, "div" );
 
 
-                       // This should fail with an exception
-                       // Gecko does not error, returns false instead
-                       matches.call( div, "[s!='']:x" );
-                       rbuggyMatches.push( "!=", pseudos );
-               });
-       }
+/*!
+ * Sizzle CSS Selector Engine
+ *  Copyright 2011, The Dojo Foundation
+ *  Released under the MIT, BSD, and GPL Licenses.
+ *  More information: http://sizzlejs.com/
+ */
+(function(){
 
 
-       rbuggyQSA = new RegExp( rbuggyQSA.join("|") );
-       rbuggyMatches = new RegExp( rbuggyMatches.join("|") );
-
-       // Element contains another
-       // Purposefully does not implement inclusive descendent
-       // As in, an element does not contain itself
-       contains = isNative(docElem.contains) || docElem.compareDocumentPosition ?
-               function( a, b ) {
-                       var adown = a.nodeType === 9 ? a.documentElement : a,
-                               bup = b && b.parentNode;
-                       return a === bup || !!( bup && bup.nodeType === 1 && (
-                               adown.contains ?
-                                       adown.contains( bup ) :
-                                       a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16
-                       ));
-               } :
-               function( a, b ) {
-                       if ( b ) {
-                               while ( (b = b.parentNode) ) {
-                                       if ( b === a ) {
-                                               return true;
-                                       }
-                               }
-                       }
-                       return false;
-               };
+var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,
+       done = 0,
+       toString = Object.prototype.toString,
+       hasDuplicate = false,
+       baseHasDuplicate = true,
+       rBackslash = /\\/g,
+       rNonWord = /\W/;
+
+// Here we check if the JavaScript engine is using some sort of
+// optimization where it does not always call our comparision
+// function. If that is the case, discard the hasDuplicate value.
+//   Thus far that includes Google Chrome.
+[0, 0].sort(function() {
+       baseHasDuplicate = false;
+       return 0;
+});
 
 
-       // Document order sorting
-       sortOrder = docElem.compareDocumentPosition ?
-       function( a, b ) {
-               var compare;
+var Sizzle = function( selector, context, results, seed ) {
+       results = results || [];
+       context = context || document;
 
 
-               if ( a === b ) {
-                       hasDuplicate = true;
-                       return 0;
-               }
+       var origContext = context;
 
 
-               if ( (compare = b.compareDocumentPosition && a.compareDocumentPosition && a.compareDocumentPosition( b )) ) {
-                       if ( compare & 1 || a.parentNode && a.parentNode.nodeType === 11 ) {
-                               if ( a === doc || contains( preferredDoc, a ) ) {
-                                       return -1;
-                               }
-                               if ( b === doc || contains( preferredDoc, b ) ) {
-                                       return 1;
-                               }
-                               return 0;
+       if ( context.nodeType !== 1 && context.nodeType !== 9 ) {
+               return [];
+       }
+       
+       if ( !selector || typeof selector !== "string" ) {
+               return results;
+       }
+
+       var m, set, checkSet, extra, ret, cur, pop, i,
+               prune = true,
+               contextXML = Sizzle.isXML( context ),
+               parts = [],
+               soFar = selector;
+       
+       // Reset the position of the chunker regexp (start from head)
+       do {
+               chunker.exec( "" );
+               m = chunker.exec( soFar );
+
+               if ( m ) {
+                       soFar = m[3];
+               
+                       parts.push( m[1] );
+               
+                       if ( m[2] ) {
+                               extra = m[3];
+                               break;
                        }
                        }
-                       return compare & 4 ? -1 : 1;
                }
                }
+       } while ( m );
 
 
-               return a.compareDocumentPosition ? -1 : 1;
-       } :
-       function( a, b ) {
-               var cur,
-                       i = 0,
-                       aup = a.parentNode,
-                       bup = b.parentNode,
-                       ap = [ a ],
-                       bp = [ b ];
+       if ( parts.length > 1 && origPOS.exec( selector ) ) {
 
 
-               // Exit early if the nodes are identical
-               if ( a === b ) {
-                       hasDuplicate = true;
-                       return 0;
+               if ( parts.length === 2 && Expr.relative[ parts[0] ] ) {
+                       set = posProcess( parts[0] + parts[1], context );
 
 
-               // Parentless nodes are either documents or disconnected
-               } else if ( !aup || !bup ) {
-                       return a === doc ? -1 :
-                               b === doc ? 1 :
-                               aup ? -1 :
-                               bup ? 1 :
-                               0;
+               } else {
+                       set = Expr.relative[ parts[0] ] ?
+                               [ context ] :
+                               Sizzle( parts.shift(), context );
 
 
-               // If the nodes are siblings, we can do a quick check
-               } else if ( aup === bup ) {
-                       return siblingCheck( a, b );
-               }
+                       while ( parts.length ) {
+                               selector = parts.shift();
 
 
-               // Otherwise we need full lists of their ancestors for comparison
-               cur = a;
-               while ( (cur = cur.parentNode) ) {
-                       ap.unshift( cur );
-               }
-               cur = b;
-               while ( (cur = cur.parentNode) ) {
-                       bp.unshift( cur );
+                               if ( Expr.relative[ selector ] ) {
+                                       selector += parts.shift();
+                               }
+                               
+                               set = posProcess( selector, set );
+                       }
                }
 
                }
 
-               // Walk down the tree looking for a discrepancy
-               while ( ap[i] === bp[i] ) {
-                       i++;
-               }
+       } else {
+               // Take a shortcut and set the context if the root selector is an ID
+               // (but not if it'll be faster if the inner selector is an ID)
+               if ( !seed && parts.length > 1 && context.nodeType === 9 && !contextXML &&
+                               Expr.match.ID.test(parts[0]) && !Expr.match.ID.test(parts[parts.length - 1]) ) {
 
 
-               return i ?
-                       // Do a sibling check if the nodes have a common ancestor
-                       siblingCheck( ap[i], bp[i] ) :
+                       ret = Sizzle.find( parts.shift(), context, contextXML );
+                       context = ret.expr ?
+                               Sizzle.filter( ret.expr, ret.set )[0] :
+                               ret.set[0];
+               }
 
 
-                       // Otherwise nodes in our document sort first
-                       ap[i] === preferredDoc ? -1 :
-                       bp[i] === preferredDoc ? 1 :
-                       0;
-       };
+               if ( context ) {
+                       ret = seed ?
+                               { expr: parts.pop(), set: makeArray(seed) } :
+                               Sizzle.find( parts.pop(), parts.length === 1 && (parts[0] === "~" || parts[0] === "+") && context.parentNode ? context.parentNode : context, contextXML );
 
 
-       // Always assume the presence of duplicates if sort doesn't
-       // pass them to our comparison function (as in Google Chrome).
-       hasDuplicate = false;
-       [0, 0].sort( sortOrder );
-       support.detectDuplicates = hasDuplicate;
+                       set = ret.expr ?
+                               Sizzle.filter( ret.expr, ret.set ) :
+                               ret.set;
 
 
-       return document;
-};
+                       if ( parts.length > 0 ) {
+                               checkSet = makeArray( set );
 
 
-Sizzle.matches = function( expr, elements ) {
-       return Sizzle( expr, null, null, elements );
-};
+                       } else {
+                               prune = false;
+                       }
 
 
-Sizzle.matchesSelector = function( elem, expr ) {
-       // Set document vars if needed
-       if ( ( elem.ownerDocument || elem ) !== document ) {
-               setDocument( elem );
-       }
+                       while ( parts.length ) {
+                               cur = parts.pop();
+                               pop = cur;
 
 
-       // Make sure that attribute selectors are quoted
-       expr = expr.replace( rattributeQuotes, "='$1']" );
+                               if ( !Expr.relative[ cur ] ) {
+                                       cur = "";
+                               } else {
+                                       pop = parts.pop();
+                               }
 
 
-       // rbuggyQSA always contains :focus, so no need for an existence check
-       if ( support.matchesSelector && !documentIsXML && (!rbuggyMatches || !rbuggyMatches.test(expr)) && !rbuggyQSA.test(expr) ) {
-               try {
-                       var ret = matches.call( elem, expr );
+                               if ( pop == null ) {
+                                       pop = context;
+                               }
 
 
-                       // IE 9's matchesSelector returns false on disconnected nodes
-                       if ( ret || support.disconnectedMatch ||
-                                       // As well, disconnected nodes are said to be in a document
-                                       // fragment in IE 9
-                                       elem.document && elem.document.nodeType !== 11 ) {
-                               return ret;
+                               Expr.relative[ cur ]( checkSet, pop, contextXML );
                        }
                        }
-               } catch(e) {}
+
+               } else {
+                       checkSet = parts = [];
+               }
        }
 
        }
 
-       return Sizzle( expr, document, null, [elem] ).length > 0;
-};
+       if ( !checkSet ) {
+               checkSet = set;
+       }
 
 
-Sizzle.contains = function( context, elem ) {
-       // Set document vars if needed
-       if ( ( context.ownerDocument || context ) !== document ) {
-               setDocument( context );
+       if ( !checkSet ) {
+               Sizzle.error( cur || selector );
        }
        }
-       return contains( context, elem );
-};
 
 
-Sizzle.attr = function( elem, name ) {
-       var val;
+       if ( toString.call(checkSet) === "[object Array]" ) {
+               if ( !prune ) {
+                       results.push.apply( results, checkSet );
 
 
-       // Set document vars if needed
-       if ( ( elem.ownerDocument || elem ) !== document ) {
-               setDocument( elem );
-       }
+               } else if ( context && context.nodeType === 1 ) {
+                       for ( i = 0; checkSet[i] != null; i++ ) {
+                               if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && Sizzle.contains(context, checkSet[i])) ) {
+                                       results.push( set[i] );
+                               }
+                       }
 
 
-       if ( !documentIsXML ) {
-               name = name.toLowerCase();
-       }
-       if ( (val = Expr.attrHandle[ name ]) ) {
-               return val( elem );
+               } else {
+                       for ( i = 0; checkSet[i] != null; i++ ) {
+                               if ( checkSet[i] && checkSet[i].nodeType === 1 ) {
+                                       results.push( set[i] );
+                               }
+                       }
+               }
+
+       } else {
+               makeArray( checkSet, results );
        }
        }
-       if ( documentIsXML || support.attributes ) {
-               return elem.getAttribute( name );
+
+       if ( extra ) {
+               Sizzle( extra, origContext, results, seed );
+               Sizzle.uniqueSort( results );
        }
        }
-       return ( (val = elem.getAttributeNode( name )) || elem.getAttribute( name ) ) && elem[ name ] === true ?
-               name :
-               val && val.specified ? val.value : null;
-};
 
 
-Sizzle.error = function( msg ) {
-       throw new Error( "Syntax error, unrecognized expression: " + msg );
+       return results;
 };
 
 };
 
-// Document sorting and removing duplicates
 Sizzle.uniqueSort = function( results ) {
 Sizzle.uniqueSort = function( results ) {
-       var elem,
-               duplicates = [],
-               i = 1,
-               j = 0;
-
-       // Unless we *know* we can detect duplicates, assume their presence
-       hasDuplicate = !support.detectDuplicates;
-       results.sort( sortOrder );
+       if ( sortOrder ) {
+               hasDuplicate = baseHasDuplicate;
+               results.sort( sortOrder );
 
 
-       if ( hasDuplicate ) {
-               for ( ; (elem = results[i]); i++ ) {
-                       if ( elem === results[ i - 1 ] ) {
-                               j = duplicates.push( i );
+               if ( hasDuplicate ) {
+                       for ( var i = 1; i < results.length; i++ ) {
+                               if ( results[i] === results[ i - 1 ] ) {
+                                       results.splice( i--, 1 );
+                               }
                        }
                }
                        }
                }
-               while ( j-- ) {
-                       results.splice( duplicates[ j ], 1 );
-               }
        }
 
        return results;
 };
 
        }
 
        return results;
 };
 
-function siblingCheck( a, b ) {
-       var cur = b && a,
-               diff = cur && ( ~b.sourceIndex || MAX_NEGATIVE ) - ( ~a.sourceIndex || MAX_NEGATIVE );
+Sizzle.matches = function( expr, set ) {
+       return Sizzle( expr, null, null, set );
+};
+
+Sizzle.matchesSelector = function( node, expr ) {
+       return Sizzle( expr, null, null, [node] ).length > 0;
+};
+
+Sizzle.find = function( expr, context, isXML ) {
+       var set;
 
 
-       // Use IE sourceIndex if available on both nodes
-       if ( diff ) {
-               return diff;
+       if ( !expr ) {
+               return [];
        }
 
        }
 
-       // Check if b follows a
-       if ( cur ) {
-               while ( (cur = cur.nextSibling) ) {
-                       if ( cur === b ) {
-                               return -1;
+       for ( var i = 0, l = Expr.order.length; i < l; i++ ) {
+               var match,
+                       type = Expr.order[i];
+               
+               if ( (match = Expr.leftMatch[ type ].exec( expr )) ) {
+                       var left = match[1];
+                       match.splice( 1, 1 );
+
+                       if ( left.substr( left.length - 1 ) !== "\\" ) {
+                               match[1] = (match[1] || "").replace( rBackslash, "" );
+                               set = Expr.find[ type ]( match, context, isXML );
+
+                               if ( set != null ) {
+                                       expr = expr.replace( Expr.match[ type ], "" );
+                                       break;
+                               }
                        }
                }
        }
 
                        }
                }
        }
 
-       return a ? 1 : -1;
-}
+       if ( !set ) {
+               set = typeof context.getElementsByTagName !== "undefined" ?
+                       context.getElementsByTagName( "*" ) :
+                       [];
+       }
 
 
-// Returns a function to use in pseudos for input types
-function createInputPseudo( type ) {
-       return function( elem ) {
-               var name = elem.nodeName.toLowerCase();
-               return name === "input" && elem.type === type;
-       };
-}
+       return { set: set, expr: expr };
+};
 
 
-// Returns a function to use in pseudos for buttons
-function createButtonPseudo( type ) {
-       return function( elem ) {
-               var name = elem.nodeName.toLowerCase();
-               return (name === "input" || name === "button") && elem.type === type;
-       };
-}
+Sizzle.filter = function( expr, set, inplace, not ) {
+       var match, anyFound,
+               old = expr,
+               result = [],
+               curLoop = set,
+               isXMLFilter = set && set[0] && Sizzle.isXML( set[0] );
 
 
-// Returns a function to use in pseudos for positionals
-function createPositionalPseudo( fn ) {
-       return markFunction(function( argument ) {
-               argument = +argument;
-               return markFunction(function( seed, matches ) {
-                       var j,
-                               matchIndexes = fn( [], seed.length, argument ),
-                               i = matchIndexes.length;
+       while ( expr && set.length ) {
+               for ( var type in Expr.filter ) {
+                       if ( (match = Expr.leftMatch[ type ].exec( expr )) != null && match[2] ) {
+                               var found, item,
+                                       filter = Expr.filter[ type ],
+                                       left = match[1];
 
 
-                       // Match elements found at the specified indexes
-                       while ( i-- ) {
-                               if ( seed[ (j = matchIndexes[i]) ] ) {
-                                       seed[j] = !(matches[j] = seed[j]);
+                               anyFound = false;
+
+                               match.splice(1,1);
+
+                               if ( left.substr( left.length - 1 ) === "\\" ) {
+                                       continue;
+                               }
+
+                               if ( curLoop === result ) {
+                                       result = [];
+                               }
+
+                               if ( Expr.preFilter[ type ] ) {
+                                       match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter );
+
+                                       if ( !match ) {
+                                               anyFound = found = true;
+
+                                       } else if ( match === true ) {
+                                               continue;
+                                       }
+                               }
+
+                               if ( match ) {
+                                       for ( var i = 0; (item = curLoop[i]) != null; i++ ) {
+                                               if ( item ) {
+                                                       found = filter( item, match, i, curLoop );
+                                                       var pass = not ^ !!found;
+
+                                                       if ( inplace && found != null ) {
+                                                               if ( pass ) {
+                                                                       anyFound = true;
+
+                                                               } else {
+                                                                       curLoop[i] = false;
+                                                               }
+
+                                                       } else if ( pass ) {
+                                                               result.push( item );
+                                                               anyFound = true;
+                                                       }
+                                               }
+                                       }
+                               }
+
+                               if ( found !== undefined ) {
+                                       if ( !inplace ) {
+                                               curLoop = result;
+                                       }
+
+                                       expr = expr.replace( Expr.match[ type ], "" );
+
+                                       if ( !anyFound ) {
+                                               return [];
+                                       }
+
+                                       break;
                                }
                        }
                                }
                        }
-               });
-       });
-}
+               }
 
 
-/**
- * Utility function for retrieving the text value of an array of DOM nodes
- * @param {Array|Element} elem
- */
-getText = Sizzle.getText = function( elem ) {
-       var node,
-               ret = "",
-               i = 0,
-               nodeType = elem.nodeType;
-
-       if ( !nodeType ) {
-               // If no nodeType, this is expected to be an array
-               for ( ; (node = elem[i]); i++ ) {
-                       // Do not traverse comment nodes
-                       ret += getText( node );
-               }
-       } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {
-               // Use textContent for elements
-               // innerText usage removed for consistency of new lines (see #11153)
-               if ( typeof elem.textContent === "string" ) {
-                       return elem.textContent;
-               } else {
-                       // Traverse its children
-                       for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
-                               ret += getText( elem );
+               // Improper expression
+               if ( expr === old ) {
+                       if ( anyFound == null ) {
+                               Sizzle.error( expr );
+
+                       } else {
+                               break;
                        }
                }
                        }
                }
-       } else if ( nodeType === 3 || nodeType === 4 ) {
-               return elem.nodeValue;
+
+               old = expr;
        }
        }
-       // Do not include comment or processing instruction nodes
 
 
-       return ret;
+       return curLoop;
 };
 
 };
 
-Expr = Sizzle.selectors = {
+Sizzle.error = function( msg ) {
+       throw "Syntax error, unrecognized expression: " + msg;
+};
 
 
-       // Can be adjusted by the user
-       cacheLength: 50,
+var Expr = Sizzle.selectors = {
+       order: [ "ID", "NAME", "TAG" ],
 
 
-       createPseudo: markFunction,
+       match: {
+               ID: /#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,
+               CLASS: /\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,
+               NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,
+               ATTR: /\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/,
+               TAG: /^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,
+               CHILD: /:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/,
+               POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,
+               PSEUDO: /:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/
+       },
 
 
-       match: matchExpr,
+       leftMatch: {},
 
 
-       find: {},
+       attrMap: {
+               "class": "className",
+               "for": "htmlFor"
+       },
 
 
-       relative: {
-               ">": { dir: "parentNode", first: true },
-               " ": { dir: "parentNode" },
-               "+": { dir: "previousSibling", first: true },
-               "~": { dir: "previousSibling" }
+       attrHandle: {
+               href: function( elem ) {
+                       return elem.getAttribute( "href" );
+               },
+               type: function( elem ) {
+                       return elem.getAttribute( "type" );
+               }
        },
 
        },
 
-       preFilter: {
-               "ATTR": function( match ) {
-                       match[1] = match[1].replace( runescape, funescape );
+       relative: {
+               "+": function(checkSet, part){
+                       var isPartStr = typeof part === "string",
+                               isTag = isPartStr && !rNonWord.test( part ),
+                               isPartStrNotTag = isPartStr && !isTag;
 
 
-                       // Move the given value to match[3] whether quoted or unquoted
-                       match[3] = ( match[4] || match[5] || "" ).replace( runescape, funescape );
+                       if ( isTag ) {
+                               part = part.toLowerCase();
+                       }
 
 
-                       if ( match[2] === "~=" ) {
-                               match[3] = " " + match[3] + " ";
+                       for ( var i = 0, l = checkSet.length, elem; i < l; i++ ) {
+                               if ( (elem = checkSet[i]) ) {
+                                       while ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {}
+
+                                       checkSet[i] = isPartStrNotTag || elem && elem.nodeName.toLowerCase() === part ?
+                                               elem || false :
+                                               elem === part;
+                               }
                        }
 
                        }
 
-                       return match.slice( 0, 4 );
+                       if ( isPartStrNotTag ) {
+                               Sizzle.filter( part, checkSet, true );
+                       }
                },
 
                },
 
-               "CHILD": function( match ) {
-                       /* matches from matchExpr["CHILD"]
-                               1 type (only|nth|...)
-                               2 what (child|of-type)
-                               3 argument (even|odd|\d*|\d*n([+-]\d+)?|...)
-                               4 xn-component of xn+y argument ([+-]?\d*n|)
-                               5 sign of xn-component
-                               6 x of xn-component
-                               7 sign of y-component
-                               8 y of y-component
-                       */
-                       match[1] = match[1].toLowerCase();
-
-                       if ( match[1].slice( 0, 3 ) === "nth" ) {
-                               // nth-* requires argument
-                               if ( !match[3] ) {
-                                       Sizzle.error( match[0] );
+               ">": function( checkSet, part ) {
+                       var elem,
+                               isPartStr = typeof part === "string",
+                               i = 0,
+                               l = checkSet.length;
+
+                       if ( isPartStr && !rNonWord.test( part ) ) {
+                               part = part.toLowerCase();
+
+                               for ( ; i < l; i++ ) {
+                                       elem = checkSet[i];
+
+                                       if ( elem ) {
+                                               var parent = elem.parentNode;
+                                               checkSet[i] = parent.nodeName.toLowerCase() === part ? parent : false;
+                                       }
                                }
 
                                }
 
-                               // numeric x and y parameters for Expr.filter.CHILD
-                               // remember that false/true cast respectively to 0/1
-                               match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) );
-                               match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" );
+                       } else {
+                               for ( ; i < l; i++ ) {
+                                       elem = checkSet[i];
 
 
-                       // other types prohibit arguments
-                       } else if ( match[3] ) {
-                               Sizzle.error( match[0] );
+                                       if ( elem ) {
+                                               checkSet[i] = isPartStr ?
+                                                       elem.parentNode :
+                                                       elem.parentNode === part;
+                                       }
+                               }
+
+                               if ( isPartStr ) {
+                                       Sizzle.filter( part, checkSet, true );
+                               }
                        }
                        }
+               },
 
 
-                       return match;
+               "": function(checkSet, part, isXML){
+                       var nodeCheck,
+                               doneName = done++,
+                               checkFn = dirCheck;
+
+                       if ( typeof part === "string" && !rNonWord.test( part ) ) {
+                               part = part.toLowerCase();
+                               nodeCheck = part;
+                               checkFn = dirNodeCheck;
+                       }
+
+                       checkFn( "parentNode", part, doneName, checkSet, nodeCheck, isXML );
                },
 
                },
 
-               "PSEUDO": function( match ) {
-                       var excess,
-                               unquoted = !match[5] && match[2];
+               "~": function( checkSet, part, isXML ) {
+                       var nodeCheck,
+                               doneName = done++,
+                               checkFn = dirCheck;
 
 
-                       if ( matchExpr["CHILD"].test( match[0] ) ) {
-                               return null;
+                       if ( typeof part === "string" && !rNonWord.test( part ) ) {
+                               part = part.toLowerCase();
+                               nodeCheck = part;
+                               checkFn = dirNodeCheck;
                        }
 
                        }
 
-                       // Accept quoted arguments as-is
-                       if ( match[4] ) {
-                               match[2] = match[4];
+                       checkFn( "previousSibling", part, doneName, checkSet, nodeCheck, isXML );
+               }
+       },
 
 
-                       // Strip excess characters from unquoted arguments
-                       } else if ( unquoted && rpseudo.test( unquoted ) &&
-                               // Get excess from tokenize (recursively)
-                               (excess = tokenize( unquoted, true )) &&
-                               // advance to the next closing parenthesis
-                               (excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) {
+       find: {
+               ID: function( match, context, isXML ) {
+                       if ( typeof context.getElementById !== "undefined" && !isXML ) {
+                               var m = context.getElementById(match[1]);
+                               // Check parentNode to catch when Blackberry 4.6 returns
+                               // nodes that are no longer in the document #6963
+                               return m && m.parentNode ? [m] : [];
+                       }
+               },
+
+               NAME: function( match, context ) {
+                       if ( typeof context.getElementsByName !== "undefined" ) {
+                               var ret = [],
+                                       results = context.getElementsByName( match[1] );
+
+                               for ( var i = 0, l = results.length; i < l; i++ ) {
+                                       if ( results[i].getAttribute("name") === match[1] ) {
+                                               ret.push( results[i] );
+                                       }
+                               }
 
 
-                               // excess is a negative index
-                               match[0] = match[0].slice( 0, excess );
-                               match[2] = unquoted.slice( 0, excess );
+                               return ret.length === 0 ? null : ret;
                        }
                        }
+               },
 
 
-                       // Return only captures needed by the pseudo filter method (type and argument)
-                       return match.slice( 0, 3 );
+               TAG: function( match, context ) {
+                       if ( typeof context.getElementsByTagName !== "undefined" ) {
+                               return context.getElementsByTagName( match[1] );
+                       }
                }
        },
                }
        },
+       preFilter: {
+               CLASS: function( match, curLoop, inplace, result, not, isXML ) {
+                       match = " " + match[1].replace( rBackslash, "" ) + " ";
 
 
-       filter: {
+                       if ( isXML ) {
+                               return match;
+                       }
 
 
-               "TAG": function( nodeName ) {
-                       if ( nodeName === "*" ) {
-                               return function() { return true; };
+                       for ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) {
+                               if ( elem ) {
+                                       if ( not ^ (elem.className && (" " + elem.className + " ").replace(/[\t\n\r]/g, " ").indexOf(match) >= 0) ) {
+                                               if ( !inplace ) {
+                                                       result.push( elem );
+                                               }
+
+                                       } else if ( inplace ) {
+                                               curLoop[i] = false;
+                                       }
+                               }
                        }
 
                        }
 
-                       nodeName = nodeName.replace( runescape, funescape ).toLowerCase();
-                       return function( elem ) {
-                               return elem.nodeName && elem.nodeName.toLowerCase() === nodeName;
-                       };
+                       return false;
                },
 
                },
 
-               "CLASS": function( className ) {
-                       var pattern = classCache[ className + " " ];
-
-                       return pattern ||
-                               (pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) &&
-                               classCache( className, function( elem ) {
-                                       return pattern.test( elem.className || (typeof elem.getAttribute !== strundefined && elem.getAttribute("class")) || "" );
-                               });
+               ID: function( match ) {
+                       return match[1].replace( rBackslash, "" );
                },
 
                },
 
-               "ATTR": function( name, operator, check ) {
-                       return function( elem ) {
-                               var result = Sizzle.attr( elem, name );
+               TAG: function( match, curLoop ) {
+                       return match[1].replace( rBackslash, "" ).toLowerCase();
+               },
 
 
-                               if ( result == null ) {
-                                       return operator === "!=";
-                               }
-                               if ( !operator ) {
-                                       return true;
+               CHILD: function( match ) {
+                       if ( match[1] === "nth" ) {
+                               if ( !match[2] ) {
+                                       Sizzle.error( match[0] );
                                }
 
                                }
 
-                               result += "";
+                               match[2] = match[2].replace(/^\+|\s*/g, '');
 
 
-                               return operator === "=" ? result === check :
-                                       operator === "!=" ? result !== check :
-                                       operator === "^=" ? check && result.indexOf( check ) === 0 :
-                                       operator === "*=" ? check && result.indexOf( check ) > -1 :
-                                       operator === "$=" ? check && result.slice( -check.length ) === check :
-                                       operator === "~=" ? ( " " + result + " " ).indexOf( check ) > -1 :
-                                       operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" :
-                                       false;
-                       };
-               },
+                               // parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6'
+                               var test = /(-?)(\d*)(?:n([+\-]?\d*))?/.exec(
+                                       match[2] === "even" && "2n" || match[2] === "odd" && "2n+1" ||
+                                       !/\D/.test( match[2] ) && "0n+" + match[2] || match[2]);
 
 
-               "CHILD": function( type, what, argument, first, last ) {
-                       var simple = type.slice( 0, 3 ) !== "nth",
-                               forward = type.slice( -4 ) !== "last",
-                               ofType = what === "of-type";
-
-                       return first === 1 && last === 0 ?
-
-                               // Shortcut for :nth-*(n)
-                               function( elem ) {
-                                       return !!elem.parentNode;
-                               } :
-
-                               function( elem, context, xml ) {
-                                       var cache, outerCache, node, diff, nodeIndex, start,
-                                               dir = simple !== forward ? "nextSibling" : "previousSibling",
-                                               parent = elem.parentNode,
-                                               name = ofType && elem.nodeName.toLowerCase(),
-                                               useCache = !xml && !ofType;
-
-                                       if ( parent ) {
-
-                                               // :(first|last|only)-(child|of-type)
-                                               if ( simple ) {
-                                                       while ( dir ) {
-                                                               node = elem;
-                                                               while ( (node = node[ dir ]) ) {
-                                                                       if ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) {
-                                                                               return false;
-                                                                       }
-                                                               }
-                                                               // Reverse direction for :only-* (if we haven't yet done so)
-                                                               start = dir = type === "only" && !start && "nextSibling";
-                                                       }
-                                                       return true;
-                                               }
+                               // calculate the numbers (first)n+(last) including if they are negative
+                               match[2] = (test[1] + (test[2] || 1)) - 0;
+                               match[3] = test[3] - 0;
+                       }
+                       else if ( match[2] ) {
+                               Sizzle.error( match[0] );
+                       }
 
 
-                                               start = [ forward ? parent.firstChild : parent.lastChild ];
+                       // TODO: Move to normal caching system
+                       match[0] = done++;
 
 
-                                               // non-xml :nth-child(...) stores cache data on `parent`
-                                               if ( forward && useCache ) {
-                                                       // Seek `elem` from a previously-cached index
-                                                       outerCache = parent[ expando ] || (parent[ expando ] = {});
-                                                       cache = outerCache[ type ] || [];
-                                                       nodeIndex = cache[0] === dirruns && cache[1];
-                                                       diff = cache[0] === dirruns && cache[2];
-                                                       node = nodeIndex && parent.childNodes[ nodeIndex ];
+                       return match;
+               },
 
 
-                                                       while ( (node = ++nodeIndex && node && node[ dir ] ||
+               ATTR: function( match, curLoop, inplace, result, not, isXML ) {
+                       var name = match[1] = match[1].replace( rBackslash, "" );
+                       
+                       if ( !isXML && Expr.attrMap[name] ) {
+                               match[1] = Expr.attrMap[name];
+                       }
 
 
-                                                               // Fallback to seeking `elem` from the start
-                                                               (diff = nodeIndex = 0) || start.pop()) ) {
+                       // Handle if an un-quoted value was used
+                       match[4] = ( match[4] || match[5] || "" ).replace( rBackslash, "" );
 
 
-                                                               // When found, cache indexes on `parent` and break
-                                                               if ( node.nodeType === 1 && ++diff && node === elem ) {
-                                                                       outerCache[ type ] = [ dirruns, nodeIndex, diff ];
-                                                                       break;
-                                                               }
-                                                       }
+                       if ( match[2] === "~=" ) {
+                               match[4] = " " + match[4] + " ";
+                       }
 
 
-                                               // Use previously-cached element index if available
-                                               } else if ( useCache && (cache = (elem[ expando ] || (elem[ expando ] = {}))[ type ]) && cache[0] === dirruns ) {
-                                                       diff = cache[1];
+                       return match;
+               },
 
 
-                                               // xml :nth-child(...) or :nth-last-child(...) or :nth(-last)?-of-type(...)
-                                               } else {
-                                                       // Use the same loop as above to seek `elem` from the start
-                                                       while ( (node = ++nodeIndex && node && node[ dir ] ||
-                                                               (diff = nodeIndex = 0) || start.pop()) ) {
-
-                                                               if ( ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) && ++diff ) {
-                                                                       // Cache the index of each encountered element
-                                                                       if ( useCache ) {
-                                                                               (node[ expando ] || (node[ expando ] = {}))[ type ] = [ dirruns, diff ];
-                                                                       }
+               PSEUDO: function( match, curLoop, inplace, result, not ) {
+                       if ( match[1] === "not" ) {
+                               // If we're dealing with a complex expression, or a simple one
+                               if ( ( chunker.exec(match[3]) || "" ).length > 1 || /^\w/.test(match[3]) ) {
+                                       match[3] = Sizzle(match[3], null, null, curLoop);
 
 
-                                                                       if ( node === elem ) {
-                                                                               break;
-                                                                       }
-                                                               }
-                                                       }
-                                               }
+                               } else {
+                                       var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not);
 
 
-                                               // Incorporate the offset, then check against cycle size
-                                               diff -= last;
-                                               return diff === first || ( diff % first === 0 && diff / first >= 0 );
+                                       if ( !inplace ) {
+                                               result.push.apply( result, ret );
                                        }
                                        }
-                               };
-               },
 
 
-               "PSEUDO": function( pseudo, argument ) {
-                       // pseudo-class names are case-insensitive
-                       // http://www.w3.org/TR/selectors/#pseudo-classes
-                       // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters
-                       // Remember that setFilters inherits from pseudos
-                       var args,
-                               fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||
-                                       Sizzle.error( "unsupported pseudo: " + pseudo );
-
-                       // The user may use createPseudo to indicate that
-                       // arguments are needed to create the filter function
-                       // just as Sizzle does
-                       if ( fn[ expando ] ) {
-                               return fn( argument );
-                       }
-
-                       // But maintain support for old signatures
-                       if ( fn.length > 1 ) {
-                               args = [ pseudo, pseudo, "", argument ];
-                               return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?
-                                       markFunction(function( seed, matches ) {
-                                               var idx,
-                                                       matched = fn( seed, argument ),
-                                                       i = matched.length;
-                                               while ( i-- ) {
-                                                       idx = indexOf.call( seed, matched[i] );
-                                                       seed[ idx ] = !( matches[ idx ] = matched[i] );
-                                               }
-                                       }) :
-                                       function( elem ) {
-                                               return fn( elem, 0, args );
-                                       };
+                                       return false;
+                               }
+
+                       } else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) {
+                               return true;
                        }
                        }
+                       
+                       return match;
+               },
+
+               POS: function( match ) {
+                       match.unshift( true );
 
 
-                       return fn;
+                       return match;
                }
        },
                }
        },
+       
+       filters: {
+               enabled: function( elem ) {
+                       return elem.disabled === false && elem.type !== "hidden";
+               },
 
 
-       pseudos: {
-               // Potentially complex pseudos
-               "not": markFunction(function( selector ) {
-                       // Trim the selector passed to compile
-                       // to avoid treating leading and trailing
-                       // spaces as combinators
-                       var input = [],
-                               results = [],
-                               matcher = compile( selector.replace( rtrim, "$1" ) );
+               disabled: function( elem ) {
+                       return elem.disabled === true;
+               },
 
 
-                       return matcher[ expando ] ?
-                               markFunction(function( seed, matches, context, xml ) {
-                                       var elem,
-                                               unmatched = matcher( seed, null, xml, [] ),
-                                               i = seed.length;
+               checked: function( elem ) {
+                       return elem.checked === true;
+               },
+               
+               selected: function( elem ) {
+                       // Accessing this property makes selected-by-default
+                       // options in Safari work properly
+                       if ( elem.parentNode ) {
+                               elem.parentNode.selectedIndex;
+                       }
+                       
+                       return elem.selected === true;
+               },
 
 
-                                       // Match elements unmatched by `matcher`
-                                       while ( i-- ) {
-                                               if ( (elem = unmatched[i]) ) {
-                                                       seed[i] = !(matches[i] = elem);
-                                               }
-                                       }
-                               }) :
-                               function( elem, context, xml ) {
-                                       input[0] = elem;
-                                       matcher( input, null, xml, results );
-                                       return !results.pop();
-                               };
-               }),
+               parent: function( elem ) {
+                       return !!elem.firstChild;
+               },
 
 
-               "has": markFunction(function( selector ) {
-                       return function( elem ) {
-                               return Sizzle( selector, elem ).length > 0;
-                       };
-               }),
+               empty: function( elem ) {
+                       return !elem.firstChild;
+               },
 
 
-               "contains": markFunction(function( text ) {
-                       return function( elem ) {
-                               return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1;
-                       };
-               }),
-
-               // "Whether an element is represented by a :lang() selector
-               // is based solely on the element's language value
-               // being equal to the identifier C,
-               // or beginning with the identifier C immediately followed by "-".
-               // The matching of C against the element's language value is performed case-insensitively.
-               // The identifier C does not have to be a valid language name."
-               // http://www.w3.org/TR/selectors/#lang-pseudo
-               "lang": markFunction( function( lang ) {
-                       // lang value must be a valid identifider
-                       if ( !ridentifier.test(lang || "") ) {
-                               Sizzle.error( "unsupported lang: " + lang );
-                       }
-                       lang = lang.replace( runescape, funescape ).toLowerCase();
-                       return function( elem ) {
-                               var elemLang;
-                               do {
-                                       if ( (elemLang = documentIsXML ?
-                                               elem.getAttribute("xml:lang") || elem.getAttribute("lang") :
-                                               elem.lang) ) {
-
-                                               elemLang = elemLang.toLowerCase();
-                                               return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0;
-                                       }
-                               } while ( (elem = elem.parentNode) && elem.nodeType === 1 );
-                               return false;
-                       };
-               }),
+               has: function( elem, i, match ) {
+                       return !!Sizzle( match[3], elem ).length;
+               },
 
 
-               // Miscellaneous
-               "target": function( elem ) {
-                       var hash = window.location && window.location.hash;
-                       return hash && hash.slice( 1 ) === elem.id;
+               header: function( elem ) {
+                       return (/h\d/i).test( elem.nodeName );
                },
 
                },
 
-               "root": function( elem ) {
-                       return elem === docElem;
+               text: function( elem ) {
+                       var attr = elem.getAttribute( "type" ), type = elem.type;
+                       // IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc) 
+                       // use getAttribute instead to test this case
+                       return elem.nodeName.toLowerCase() === "input" && "text" === type && ( attr === type || attr === null );
                },
 
                },
 
-               "focus": function( elem ) {
-                       return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);
+               radio: function( elem ) {
+                       return elem.nodeName.toLowerCase() === "input" && "radio" === elem.type;
                },
 
                },
 
-               // Boolean properties
-               "enabled": function( elem ) {
-                       return elem.disabled === false;
+               checkbox: function( elem ) {
+                       return elem.nodeName.toLowerCase() === "input" && "checkbox" === elem.type;
                },
 
                },
 
-               "disabled": function( elem ) {
-                       return elem.disabled === true;
+               file: function( elem ) {
+                       return elem.nodeName.toLowerCase() === "input" && "file" === elem.type;
                },
 
                },
 
-               "checked": function( elem ) {
-                       // In CSS3, :checked should return both checked and selected elements
-                       // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
-                       var nodeName = elem.nodeName.toLowerCase();
-                       return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected);
+               password: function( elem ) {
+                       return elem.nodeName.toLowerCase() === "input" && "password" === elem.type;
                },
 
                },
 
-               "selected": function( elem ) {
-                       // Accessing this property makes selected-by-default
-                       // options in Safari work properly
-                       if ( elem.parentNode ) {
-                               elem.parentNode.selectedIndex;
-                       }
+               submit: function( elem ) {
+                       var name = elem.nodeName.toLowerCase();
+                       return (name === "input" || name === "button") && "submit" === elem.type;
+               },
 
 
-                       return elem.selected === true;
+               image: function( elem ) {
+                       return elem.nodeName.toLowerCase() === "input" && "image" === elem.type;
+               },
+
+               reset: function( elem ) {
+                       var name = elem.nodeName.toLowerCase();
+                       return (name === "input" || name === "button") && "reset" === elem.type;
+               },
+
+               button: function( elem ) {
+                       var name = elem.nodeName.toLowerCase();
+                       return name === "input" && "button" === elem.type || name === "button";
+               },
+
+               input: function( elem ) {
+                       return (/input|select|textarea|button/i).test( elem.nodeName );
+               },
+
+               focus: function( elem ) {
+                       return elem === elem.ownerDocument.activeElement;
+               }
+       },
+       setFilters: {
+               first: function( elem, i ) {
+                       return i === 0;
+               },
+
+               last: function( elem, i, match, array ) {
+                       return i === array.length - 1;
                },
 
                },
 
-               // Contents
-               "empty": function( elem ) {
-                       // http://www.w3.org/TR/selectors/#empty-pseudo
-                       // :empty is only affected by element nodes and content nodes(including text(3), cdata(4)),
-                       //   not comment, processing instructions, or others
-                       // Thanks to Diego Perini for the nodeName shortcut
-                       //   Greater than "@" means alpha characters (specifically not starting with "#" or "?")
-                       for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
-                               if ( elem.nodeName > "@" || elem.nodeType === 3 || elem.nodeType === 4 ) {
-                                       return false;
-                               }
+               even: function( elem, i ) {
+                       return i % 2 === 0;
+               },
+
+               odd: function( elem, i ) {
+                       return i % 2 === 1;
+               },
+
+               lt: function( elem, i, match ) {
+                       return i < match[3] - 0;
+               },
+
+               gt: function( elem, i, match ) {
+                       return i > match[3] - 0;
+               },
+
+               nth: function( elem, i, match ) {
+                       return match[3] - 0 === i;
+               },
+
+               eq: function( elem, i, match ) {
+                       return match[3] - 0 === i;
+               }
+       },
+       filter: {
+               PSEUDO: function( elem, match, i, array ) {
+                       var name = match[1],
+                               filter = Expr.filters[ name ];
+
+                       if ( filter ) {
+                               return filter( elem, i, match, array );
+
+                       } else if ( name === "contains" ) {
+                               return (elem.textContent || elem.innerText || Sizzle.getText([ elem ]) || "").indexOf(match[3]) >= 0;
+
+                       } else if ( name === "not" ) {
+                               var not = match[3];
+
+                               for ( var j = 0, l = not.length; j < l; j++ ) {
+                                       if ( not[j] === elem ) {
+                                               return false;
+                                       }
+                               }
+
+                               return true;
+
+                       } else {
+                               Sizzle.error( name );
+                       }
+               },
+
+               CHILD: function( elem, match ) {
+                       var type = match[1],
+                               node = elem;
+
+                       switch ( type ) {
+                               case "only":
+                               case "first":
+                                       while ( (node = node.previousSibling) )  {
+                                               if ( node.nodeType === 1 ) { 
+                                                       return false; 
+                                               }
+                                       }
+
+                                       if ( type === "first" ) { 
+                                               return true; 
+                                       }
+
+                                       node = elem;
+
+                               case "last":
+                                       while ( (node = node.nextSibling) )      {
+                                               if ( node.nodeType === 1 ) { 
+                                                       return false; 
+                                               }
+                                       }
+
+                                       return true;
+
+                               case "nth":
+                                       var first = match[2],
+                                               last = match[3];
+
+                                       if ( first === 1 && last === 0 ) {
+                                               return true;
+                                       }
+                                       
+                                       var doneName = match[0],
+                                               parent = elem.parentNode;
+       
+                                       if ( parent && (parent.sizcache !== doneName || !elem.nodeIndex) ) {
+                                               var count = 0;
+                                               
+                                               for ( node = parent.firstChild; node; node = node.nextSibling ) {
+                                                       if ( node.nodeType === 1 ) {
+                                                               node.nodeIndex = ++count;
+                                                       }
+                                               } 
+
+                                               parent.sizcache = doneName;
+                                       }
+                                       
+                                       var diff = elem.nodeIndex - last;
+
+                                       if ( first === 0 ) {
+                                               return diff === 0;
+
+                                       } else {
+                                               return ( diff % first === 0 && diff / first >= 0 );
+                                       }
                        }
                        }
-                       return true;
                },
 
                },
 
-               "parent": function( elem ) {
-                       return !Expr.pseudos["empty"]( elem );
+               ID: function( elem, match ) {
+                       return elem.nodeType === 1 && elem.getAttribute("id") === match;
                },
 
                },
 
-               // Element/input types
-               "header": function( elem ) {
-                       return rheader.test( elem.nodeName );
+               TAG: function( elem, match ) {
+                       return (match === "*" && elem.nodeType === 1) || elem.nodeName.toLowerCase() === match;
                },
                },
-
-               "input": function( elem ) {
-                       return rinputs.test( elem.nodeName );
+               
+               CLASS: function( elem, match ) {
+                       return (" " + (elem.className || elem.getAttribute("class")) + " ")
+                               .indexOf( match ) > -1;
                },
 
                },
 
-               "button": function( elem ) {
-                       var name = elem.nodeName.toLowerCase();
-                       return name === "input" && elem.type === "button" || name === "button";
+               ATTR: function( elem, match ) {
+                       var name = match[1],
+                               result = Expr.attrHandle[ name ] ?
+                                       Expr.attrHandle[ name ]( elem ) :
+                                       elem[ name ] != null ?
+                                               elem[ name ] :
+                                               elem.getAttribute( name ),
+                               value = result + "",
+                               type = match[2],
+                               check = match[4];
+
+                       return result == null ?
+                               type === "!=" :
+                               type === "=" ?
+                               value === check :
+                               type === "*=" ?
+                               value.indexOf(check) >= 0 :
+                               type === "~=" ?
+                               (" " + value + " ").indexOf(check) >= 0 :
+                               !check ?
+                               value && result !== false :
+                               type === "!=" ?
+                               value !== check :
+                               type === "^=" ?
+                               value.indexOf(check) === 0 :
+                               type === "$=" ?
+                               value.substr(value.length - check.length) === check :
+                               type === "|=" ?
+                               value === check || value.substr(0, check.length + 1) === check + "-" :
+                               false;
                },
 
                },
 
-               "text": function( elem ) {
-                       var attr;
-                       // IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc)
-                       // use getAttribute instead to test this case
-                       return elem.nodeName.toLowerCase() === "input" &&
-                               elem.type === "text" &&
-                               ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === elem.type );
-               },
+               POS: function( elem, match, i, array ) {
+                       var name = match[2],
+                               filter = Expr.setFilters[ name ];
+
+                       if ( filter ) {
+                               return filter( elem, i, match, array );
+                       }
+               }
+       }
+};
+
+var origPOS = Expr.match.POS,
+       fescape = function(all, num){
+               return "\\" + (num - 0 + 1);
+       };
 
 
-               // Position-in-collection
-               "first": createPositionalPseudo(function() {
-                       return [ 0 ];
-               }),
+for ( var type in Expr.match ) {
+       Expr.match[ type ] = new RegExp( Expr.match[ type ].source + (/(?![^\[]*\])(?![^\(]*\))/.source) );
+       Expr.leftMatch[ type ] = new RegExp( /(^(?:.|\r|\n)*?)/.source + Expr.match[ type ].source.replace(/\\(\d+)/g, fescape) );
+}
 
 
-               "last": createPositionalPseudo(function( matchIndexes, length ) {
-                       return [ length - 1 ];
-               }),
+var makeArray = function( array, results ) {
+       array = Array.prototype.slice.call( array, 0 );
 
 
-               "eq": createPositionalPseudo(function( matchIndexes, length, argument ) {
-                       return [ argument < 0 ? argument + length : argument ];
-               }),
+       if ( results ) {
+               results.push.apply( results, array );
+               return results;
+       }
+       
+       return array;
+};
 
 
-               "even": createPositionalPseudo(function( matchIndexes, length ) {
-                       var i = 0;
-                       for ( ; i < length; i += 2 ) {
-                               matchIndexes.push( i );
-                       }
-                       return matchIndexes;
-               }),
+// Perform a simple check to determine if the browser is capable of
+// converting a NodeList to an array using builtin methods.
+// Also verifies that the returned array holds DOM nodes
+// (which is not the case in the Blackberry browser)
+try {
+       Array.prototype.slice.call( document.documentElement.childNodes, 0 )[0].nodeType;
 
 
-               "odd": createPositionalPseudo(function( matchIndexes, length ) {
-                       var i = 1;
-                       for ( ; i < length; i += 2 ) {
-                               matchIndexes.push( i );
-                       }
-                       return matchIndexes;
-               }),
+// Provide a fallback method if it does not work
+} catch( e ) {
+       makeArray = function( array, results ) {
+               var i = 0,
+                       ret = results || [];
 
 
-               "lt": createPositionalPseudo(function( matchIndexes, length, argument ) {
-                       var i = argument < 0 ? argument + length : argument;
-                       for ( ; --i >= 0; ) {
-                               matchIndexes.push( i );
-                       }
-                       return matchIndexes;
-               }),
+               if ( toString.call(array) === "[object Array]" ) {
+                       Array.prototype.push.apply( ret, array );
+
+               } else {
+                       if ( typeof array.length === "number" ) {
+                               for ( var l = array.length; i < l; i++ ) {
+                                       ret.push( array[i] );
+                               }
 
 
-               "gt": createPositionalPseudo(function( matchIndexes, length, argument ) {
-                       var i = argument < 0 ? argument + length : argument;
-                       for ( ; ++i < length; ) {
-                               matchIndexes.push( i );
+                       } else {
+                               for ( ; array[i]; i++ ) {
+                                       ret.push( array[i] );
+                               }
                        }
                        }
-                       return matchIndexes;
-               })
-       }
-};
+               }
 
 
-// Add button/input type pseudos
-for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {
-       Expr.pseudos[ i ] = createInputPseudo( i );
-}
-for ( i in { submit: true, reset: true } ) {
-       Expr.pseudos[ i ] = createButtonPseudo( i );
+               return ret;
+       };
 }
 
 }
 
-function tokenize( selector, parseOnly ) {
-       var matched, match, tokens, type,
-               soFar, groups, preFilters,
-               cached = tokenCache[ selector + " " ];
+var sortOrder, siblingCheck;
 
 
-       if ( cached ) {
-               return parseOnly ? 0 : cached.slice( 0 );
-       }
+if ( document.documentElement.compareDocumentPosition ) {
+       sortOrder = function( a, b ) {
+               if ( a === b ) {
+                       hasDuplicate = true;
+                       return 0;
+               }
 
 
-       soFar = selector;
-       groups = [];
-       preFilters = Expr.preFilter;
+               if ( !a.compareDocumentPosition || !b.compareDocumentPosition ) {
+                       return a.compareDocumentPosition ? -1 : 1;
+               }
 
 
-       while ( soFar ) {
+               return a.compareDocumentPosition(b) & 4 ? -1 : 1;
+       };
 
 
-               // Comma and first run
-               if ( !matched || (match = rcomma.exec( soFar )) ) {
-                       if ( match ) {
-                               // Don't consume trailing commas as valid
-                               soFar = soFar.slice( match[0].length ) || soFar;
-                       }
-                       groups.push( tokens = [] );
+} else {
+       sortOrder = function( a, b ) {
+               // The nodes are identical, we can exit early
+               if ( a === b ) {
+                       hasDuplicate = true;
+                       return 0;
+
+               // Fallback to using sourceIndex (in IE) if it's available on both nodes
+               } else if ( a.sourceIndex && b.sourceIndex ) {
+                       return a.sourceIndex - b.sourceIndex;
                }
 
                }
 
-               matched = false;
+               var al, bl,
+                       ap = [],
+                       bp = [],
+                       aup = a.parentNode,
+                       bup = b.parentNode,
+                       cur = aup;
 
 
-               // Combinators
-               if ( (match = rcombinators.exec( soFar )) ) {
-                       matched = match.shift();
-                       tokens.push( {
-                               value: matched,
-                               // Cast descendant combinators to space
-                               type: match[0].replace( rtrim, " " )
-                       } );
-                       soFar = soFar.slice( matched.length );
-               }
+               // If the nodes are siblings (or identical) we can do a quick check
+               if ( aup === bup ) {
+                       return siblingCheck( a, b );
 
 
-               // Filters
-               for ( type in Expr.filter ) {
-                       if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||
-                               (match = preFilters[ type ]( match ))) ) {
-                               matched = match.shift();
-                               tokens.push( {
-                                       value: matched,
-                                       type: type,
-                                       matches: match
-                               } );
-                               soFar = soFar.slice( matched.length );
-                       }
+               // If no parents were found then the nodes are disconnected
+               } else if ( !aup ) {
+                       return -1;
+
+               } else if ( !bup ) {
+                       return 1;
                }
 
                }
 
-               if ( !matched ) {
-                       break;
+               // Otherwise they're somewhere else in the tree so we need
+               // to build up a full list of the parentNodes for comparison
+               while ( cur ) {
+                       ap.unshift( cur );
+                       cur = cur.parentNode;
                }
                }
-       }
 
 
-       // Return the length of the invalid excess
-       // if we're just parsing
-       // Otherwise, throw an error or return tokens
-       return parseOnly ?
-               soFar.length :
-               soFar ?
-                       Sizzle.error( selector ) :
-                       // Cache the tokens
-                       tokenCache( selector, groups ).slice( 0 );
-}
+               cur = bup;
 
 
-function toSelector( tokens ) {
-       var i = 0,
-               len = tokens.length,
-               selector = "";
-       for ( ; i < len; i++ ) {
-               selector += tokens[i].value;
-       }
-       return selector;
-}
+               while ( cur ) {
+                       bp.unshift( cur );
+                       cur = cur.parentNode;
+               }
 
 
-function addCombinator( matcher, combinator, base ) {
-       var dir = combinator.dir,
-               checkNonElements = base && dir === "parentNode",
-               doneName = done++;
+               al = ap.length;
+               bl = bp.length;
 
 
-       return combinator.first ?
-               // Check against closest ancestor/preceding element
-               function( elem, context, xml ) {
-                       while ( (elem = elem[ dir ]) ) {
-                               if ( elem.nodeType === 1 || checkNonElements ) {
-                                       return matcher( elem, context, xml );
-                               }
+               // Start walking down the tree looking for a discrepancy
+               for ( var i = 0; i < al && i < bl; i++ ) {
+                       if ( ap[i] !== bp[i] ) {
+                               return siblingCheck( ap[i], bp[i] );
                        }
                        }
-               } :
+               }
 
 
-               // Check against all ancestor/preceding elements
-               function( elem, context, xml ) {
-                       var data, cache, outerCache,
-                               dirkey = dirruns + " " + doneName;
-
-                       // We can't set arbitrary data on XML nodes, so they don't benefit from dir caching
-                       if ( xml ) {
-                               while ( (elem = elem[ dir ]) ) {
-                                       if ( elem.nodeType === 1 || checkNonElements ) {
-                                               if ( matcher( elem, context, xml ) ) {
-                                                       return true;
-                                               }
-                                       }
-                               }
-                       } else {
-                               while ( (elem = elem[ dir ]) ) {
-                                       if ( elem.nodeType === 1 || checkNonElements ) {
-                                               outerCache = elem[ expando ] || (elem[ expando ] = {});
-                                               if ( (cache = outerCache[ dir ]) && cache[0] === dirkey ) {
-                                                       if ( (data = cache[1]) === true || data === cachedruns ) {
-                                                               return data === true;
-                                                       }
-                                               } else {
-                                                       cache = outerCache[ dir ] = [ dirkey ];
-                                                       cache[1] = matcher( elem, context, xml ) || cachedruns;
-                                                       if ( cache[1] === true ) {
-                                                               return true;
-                                                       }
-                                               }
-                                       }
-                               }
-                       }
-               };
-}
+               // We ended someplace up the tree so do a sibling check
+               return i === al ?
+                       siblingCheck( a, bp[i], -1 ) :
+                       siblingCheck( ap[i], b, 1 );
+       };
 
 
-function elementMatcher( matchers ) {
-       return matchers.length > 1 ?
-               function( elem, context, xml ) {
-                       var i = matchers.length;
-                       while ( i-- ) {
-                               if ( !matchers[i]( elem, context, xml ) ) {
-                                       return false;
-                               }
-                       }
-                       return true;
-               } :
-               matchers[0];
-}
+       siblingCheck = function( a, b, ret ) {
+               if ( a === b ) {
+                       return ret;
+               }
 
 
-function condense( unmatched, map, filter, context, xml ) {
-       var elem,
-               newUnmatched = [],
-               i = 0,
-               len = unmatched.length,
-               mapped = map != null;
+               var cur = a.nextSibling;
 
 
-       for ( ; i < len; i++ ) {
-               if ( (elem = unmatched[i]) ) {
-                       if ( !filter || filter( elem, context, xml ) ) {
-                               newUnmatched.push( elem );
-                               if ( mapped ) {
-                                       map.push( i );
-                               }
+               while ( cur ) {
+                       if ( cur === b ) {
+                               return -1;
                        }
                        }
+
+                       cur = cur.nextSibling;
                }
                }
-       }
 
 
-       return newUnmatched;
+               return 1;
+       };
 }
 
 }
 
-function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {
-       if ( postFilter && !postFilter[ expando ] ) {
-               postFilter = setMatcher( postFilter );
-       }
-       if ( postFinder && !postFinder[ expando ] ) {
-               postFinder = setMatcher( postFinder, postSelector );
-       }
-       return markFunction(function( seed, results, context, xml ) {
-               var temp, i, elem,
-                       preMap = [],
-                       postMap = [],
-                       preexisting = results.length,
+// Utility function for retreiving the text value of an array of DOM nodes
+Sizzle.getText = function( elems ) {
+       var ret = "", elem;
 
 
-                       // Get initial elements from seed or context
-                       elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ),
+       for ( var i = 0; elems[i]; i++ ) {
+               elem = elems[i];
 
 
-                       // Prefilter to get matcher input, preserving a map for seed-results synchronization
-                       matcherIn = preFilter && ( seed || !selector ) ?
-                               condense( elems, preMap, preFilter, context, xml ) :
-                               elems,
+               // Get the text from text nodes and CDATA nodes
+               if ( elem.nodeType === 3 || elem.nodeType === 4 ) {
+                       ret += elem.nodeValue;
+
+               // Traverse everything else, except comment nodes
+               } else if ( elem.nodeType !== 8 ) {
+                       ret += Sizzle.getText( elem.childNodes );
+               }
+       }
 
 
-                       matcherOut = matcher ?
-                               // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,
-                               postFinder || ( seed ? preFilter : preexisting || postFilter ) ?
+       return ret;
+};
 
 
-                                       // ...intermediate processing is necessary
-                                       [] :
+// Check to see if the browser returns elements by name when
+// querying by getElementById (and provide a workaround)
+(function(){
+       // We're going to inject a fake input element with a specified name
+       var form = document.createElement("div"),
+               id = "script" + (new Date()).getTime(),
+               root = document.documentElement;
 
 
-                                       // ...otherwise use results directly
-                                       results :
-                               matcherIn;
+       form.innerHTML = "<a name='" + id + "'/>";
 
 
-               // Find primary matches
-               if ( matcher ) {
-                       matcher( matcherIn, matcherOut, context, xml );
-               }
+       // Inject it into the root element, check its status, and remove it quickly
+       root.insertBefore( form, root.firstChild );
 
 
-               // Apply postFilter
-               if ( postFilter ) {
-                       temp = condense( matcherOut, postMap );
-                       postFilter( temp, [], context, xml );
+       // The workaround has to do additional checks after a getElementById
+       // Which slows things down for other browsers (hence the branching)
+       if ( document.getElementById( id ) ) {
+               Expr.find.ID = function( match, context, isXML ) {
+                       if ( typeof context.getElementById !== "undefined" && !isXML ) {
+                               var m = context.getElementById(match[1]);
 
 
-                       // Un-match failing elements by moving them back to matcherIn
-                       i = temp.length;
-                       while ( i-- ) {
-                               if ( (elem = temp[i]) ) {
-                                       matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);
-                               }
+                               return m ?
+                                       m.id === match[1] || typeof m.getAttributeNode !== "undefined" && m.getAttributeNode("id").nodeValue === match[1] ?
+                                               [m] :
+                                               undefined :
+                                       [];
                        }
                        }
-               }
+               };
 
 
-               if ( seed ) {
-                       if ( postFinder || preFilter ) {
-                               if ( postFinder ) {
-                                       // Get the final matcherOut by condensing this intermediate into postFinder contexts
-                                       temp = [];
-                                       i = matcherOut.length;
-                                       while ( i-- ) {
-                                               if ( (elem = matcherOut[i]) ) {
-                                                       // Restore matcherIn since elem is not yet a final match
-                                                       temp.push( (matcherIn[i] = elem) );
-                                               }
-                                       }
-                                       postFinder( null, (matcherOut = []), temp, xml );
-                               }
+               Expr.filter.ID = function( elem, match ) {
+                       var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id");
 
 
-                               // Move matched elements from seed to results to keep them synchronized
-                               i = matcherOut.length;
-                               while ( i-- ) {
-                                       if ( (elem = matcherOut[i]) &&
-                                               (temp = postFinder ? indexOf.call( seed, elem ) : preMap[i]) > -1 ) {
+                       return elem.nodeType === 1 && node && node.nodeValue === match;
+               };
+       }
 
 
-                                               seed[temp] = !(results[temp] = elem);
-                                       }
-                               }
-                       }
+       root.removeChild( form );
 
 
-               // Add elements to results, through postFinder if defined
-               } else {
-                       matcherOut = condense(
-                               matcherOut === results ?
-                                       matcherOut.splice( preexisting, matcherOut.length ) :
-                                       matcherOut
-                       );
-                       if ( postFinder ) {
-                               postFinder( null, results, matcherOut, xml );
-                       } else {
-                               push.apply( results, matcherOut );
-                       }
-               }
-       });
-}
+       // release memory in IE
+       root = form = null;
+})();
 
 
-function matcherFromTokens( tokens ) {
-       var checkContext, matcher, j,
-               len = tokens.length,
-               leadingRelative = Expr.relative[ tokens[0].type ],
-               implicitRelative = leadingRelative || Expr.relative[" "],
-               i = leadingRelative ? 1 : 0,
-
-               // The foundational matcher ensures that elements are reachable from top-level context(s)
-               matchContext = addCombinator( function( elem ) {
-                       return elem === checkContext;
-               }, implicitRelative, true ),
-               matchAnyContext = addCombinator( function( elem ) {
-                       return indexOf.call( checkContext, elem ) > -1;
-               }, implicitRelative, true ),
-               matchers = [ function( elem, context, xml ) {
-                       return ( !leadingRelative && ( xml || context !== outermostContext ) ) || (
-                               (checkContext = context).nodeType ?
-                                       matchContext( elem, context, xml ) :
-                                       matchAnyContext( elem, context, xml ) );
-               } ];
-
-       for ( ; i < len; i++ ) {
-               if ( (matcher = Expr.relative[ tokens[i].type ]) ) {
-                       matchers = [ addCombinator(elementMatcher( matchers ), matcher) ];
-               } else {
-                       matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );
-
-                       // Return special upon seeing a positional matcher
-                       if ( matcher[ expando ] ) {
-                               // Find the next relative operator (if any) for proper handling
-                               j = ++i;
-                               for ( ; j < len; j++ ) {
-                                       if ( Expr.relative[ tokens[j].type ] ) {
-                                               break;
+(function(){
+       // Check to see if the browser returns only elements
+       // when doing getElementsByTagName("*")
+
+       // Create a fake element
+       var div = document.createElement("div");
+       div.appendChild( document.createComment("") );
+
+       // Make sure no comments are found
+       if ( div.getElementsByTagName("*").length > 0 ) {
+               Expr.find.TAG = function( match, context ) {
+                       var results = context.getElementsByTagName( match[1] );
+
+                       // Filter out possible comments
+                       if ( match[1] === "*" ) {
+                               var tmp = [];
+
+                               for ( var i = 0; results[i]; i++ ) {
+                                       if ( results[i].nodeType === 1 ) {
+                                               tmp.push( results[i] );
                                        }
                                }
                                        }
                                }
-                               return setMatcher(
-                                       i > 1 && elementMatcher( matchers ),
-                                       i > 1 && toSelector( tokens.slice( 0, i - 1 ) ).replace( rtrim, "$1" ),
-                                       matcher,
-                                       i < j && matcherFromTokens( tokens.slice( i, j ) ),
-                                       j < len && matcherFromTokens( (tokens = tokens.slice( j )) ),
-                                       j < len && toSelector( tokens )
-                               );
+
+                               results = tmp;
                        }
                        }
-                       matchers.push( matcher );
-               }
+
+                       return results;
+               };
        }
 
        }
 
-       return elementMatcher( matchers );
-}
+       // Check to see if an attribute returns normalized href attributes
+       div.innerHTML = "<a href='#'></a>";
 
 
-function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
-       // A counter to specify which element is currently being matched
-       var matcherCachedRuns = 0,
-               bySet = setMatchers.length > 0,
-               byElement = elementMatchers.length > 0,
-               superMatcher = function( seed, context, xml, results, expandContext ) {
-                       var elem, j, matcher,
-                               setMatched = [],
-                               matchedCount = 0,
-                               i = "0",
-                               unmatched = seed && [],
-                               outermost = expandContext != null,
-                               contextBackup = outermostContext,
-                               // We must always have either seed elements or context
-                               elems = seed || byElement && Expr.find["TAG"]( "*", expandContext && context.parentNode || context ),
-                               // Use integer dirruns iff this is the outermost matcher
-                               dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1);
-
-                       if ( outermost ) {
-                               outermostContext = context !== document && context;
-                               cachedruns = matcherCachedRuns;
-                       }
-
-                       // Add elements passing elementMatchers directly to results
-                       // Keep `i` a string if there are no elements so `matchedCount` will be "00" below
-                       for ( ; (elem = elems[i]) != null; i++ ) {
-                               if ( byElement && elem ) {
-                                       j = 0;
-                                       while ( (matcher = elementMatchers[j++]) ) {
-                                               if ( matcher( elem, context, xml ) ) {
-                                                       results.push( elem );
-                                                       break;
-                                               }
-                                       }
-                                       if ( outermost ) {
-                                               dirruns = dirrunsUnique;
-                                               cachedruns = ++matcherCachedRuns;
+       if ( div.firstChild && typeof div.firstChild.getAttribute !== "undefined" &&
+                       div.firstChild.getAttribute("href") !== "#" ) {
+
+               Expr.attrHandle.href = function( elem ) {
+                       return elem.getAttribute( "href", 2 );
+               };
+       }
+
+       // release memory in IE
+       div = null;
+})();
+
+if ( document.querySelectorAll ) {
+       (function(){
+               var oldSizzle = Sizzle,
+                       div = document.createElement("div"),
+                       id = "__sizzle__";
+
+               div.innerHTML = "<p class='TEST'></p>";
+
+               // Safari can't handle uppercase or unicode characters when
+               // in quirks mode.
+               if ( div.querySelectorAll && div.querySelectorAll(".TEST").length === 0 ) {
+                       return;
+               }
+       
+               Sizzle = function( query, context, extra, seed ) {
+                       context = context || document;
+
+                       // Only use querySelectorAll on non-XML documents
+                       // (ID selectors don't work in non-HTML documents)
+                       if ( !seed && !Sizzle.isXML(context) ) {
+                               // See if we find a selector to speed up
+                               var match = /^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec( query );
+                               
+                               if ( match && (context.nodeType === 1 || context.nodeType === 9) ) {
+                                       // Speed-up: Sizzle("TAG")
+                                       if ( match[1] ) {
+                                               return makeArray( context.getElementsByTagName( query ), extra );
+                                       
+                                       // Speed-up: Sizzle(".CLASS")
+                                       } else if ( match[2] && Expr.find.CLASS && context.getElementsByClassName ) {
+                                               return makeArray( context.getElementsByClassName( match[2] ), extra );
                                        }
                                }
                                        }
                                }
-
-                               // Track unmatched elements for set filters
-                               if ( bySet ) {
-                                       // They will have gone through all possible matchers
-                                       if ( (elem = !matcher && elem) ) {
-                                               matchedCount--;
+                               
+                               if ( context.nodeType === 9 ) {
+                                       // Speed-up: Sizzle("body")
+                                       // The body element only exists once, optimize finding it
+                                       if ( query === "body" && context.body ) {
+                                               return makeArray( [ context.body ], extra );
+                                               
+                                       // Speed-up: Sizzle("#ID")
+                                       } else if ( match && match[3] ) {
+                                               var elem = context.getElementById( match[3] );
+
+                                               // Check parentNode to catch when Blackberry 4.6 returns
+                                               // nodes that are no longer in the document #6963
+                                               if ( elem && elem.parentNode ) {
+                                                       // Handle the case where IE and Opera return items
+                                                       // by name instead of ID
+                                                       if ( elem.id === match[3] ) {
+                                                               return makeArray( [ elem ], extra );
+                                                       }
+                                                       
+                                               } else {
+                                                       return makeArray( [], extra );
+                                               }
                                        }
                                        }
+                                       
+                                       try {
+                                               return makeArray( context.querySelectorAll(query), extra );
+                                       } catch(qsaError) {}
+
+                               // qSA works strangely on Element-rooted queries
+                               // We can work around this by specifying an extra ID on the root
+                               // and working up from there (Thanks to Andrew Dupont for the technique)
+                               // IE 8 doesn't work on object elements
+                               } else if ( context.nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) {
+                                       var oldContext = context,
+                                               old = context.getAttribute( "id" ),
+                                               nid = old || id,
+                                               hasParent = context.parentNode,
+                                               relativeHierarchySelector = /^\s*[+~]/.test( query );
 
 
-                                       // Lengthen the array for every element, matched or not
-                                       if ( seed ) {
-                                               unmatched.push( elem );
+                                       if ( !old ) {
+                                               context.setAttribute( "id", nid );
+                                       } else {
+                                               nid = nid.replace( /'/g, "\\$&" );
+                                       }
+                                       if ( relativeHierarchySelector && hasParent ) {
+                                               context = context.parentNode;
                                        }
                                        }
-                               }
-                       }
 
 
-                       // Apply set filters to unmatched elements
-                       matchedCount += i;
-                       if ( bySet && i !== matchedCount ) {
-                               j = 0;
-                               while ( (matcher = setMatchers[j++]) ) {
-                                       matcher( unmatched, setMatched, context, xml );
-                               }
+                                       try {
+                                               if ( !relativeHierarchySelector || hasParent ) {
+                                                       return makeArray( context.querySelectorAll( "[id='" + nid + "'] " + query ), extra );
+                                               }
 
 
-                               if ( seed ) {
-                                       // Reintegrate element matches to eliminate the need for sorting
-                                       if ( matchedCount > 0 ) {
-                                               while ( i-- ) {
-                                                       if ( !(unmatched[i] || setMatched[i]) ) {
-                                                               setMatched[i] = pop.call( results );
-                                                       }
+                                       } catch(pseudoError) {
+                                       } finally {
+                                               if ( !old ) {
+                                                       oldContext.removeAttribute( "id" );
                                                }
                                        }
                                                }
                                        }
-
-                                       // Discard index placeholder values to get only actual matches
-                                       setMatched = condense( setMatched );
                                }
                                }
+                       }
+               
+                       return oldSizzle(query, context, extra, seed);
+               };
+
+               for ( var prop in oldSizzle ) {
+                       Sizzle[ prop ] = oldSizzle[ prop ];
+               }
 
 
-                               // Add matches to results
-                               push.apply( results, setMatched );
+               // release memory in IE
+               div = null;
+       })();
+}
 
 
-                               // Seedless set matches succeeding multiple successful matchers stipulate sorting
-                               if ( outermost && !seed && setMatched.length > 0 &&
-                                       ( matchedCount + setMatchers.length ) > 1 ) {
+(function(){
+       var html = document.documentElement,
+               matches = html.matchesSelector || html.mozMatchesSelector || html.webkitMatchesSelector || html.msMatchesSelector;
 
 
-                                       Sizzle.uniqueSort( results );
-                               }
-                       }
+       if ( matches ) {
+               // Check to see if it's possible to do matchesSelector
+               // on a disconnected node (IE 9 fails this)
+               var disconnectedMatch = !matches.call( document.createElement( "div" ), "div" ),
+                       pseudoWorks = false;
 
 
-                       // Override manipulation of globals by nested matchers
-                       if ( outermost ) {
-                               dirruns = dirrunsUnique;
-                               outermostContext = contextBackup;
+               try {
+                       // This should fail with an exception
+                       // Gecko does not error, returns false instead
+                       matches.call( document.documentElement, "[test!='']:sizzle" );
+       
+               } catch( pseudoError ) {
+                       pseudoWorks = true;
+               }
+
+               Sizzle.matchesSelector = function( node, expr ) {
+                       // Make sure that attribute selectors are quoted
+                       expr = expr.replace(/\=\s*([^'"\]]*)\s*\]/g, "='$1']");
+
+                       if ( !Sizzle.isXML( node ) ) {
+                               try { 
+                                       if ( pseudoWorks || !Expr.match.PSEUDO.test( expr ) && !/!=/.test( expr ) ) {
+                                               var ret = matches.call( node, expr );
+
+                                               // IE 9's matchesSelector returns false on disconnected nodes
+                                               if ( ret || !disconnectedMatch ||
+                                                               // As well, disconnected nodes are said to be in a document
+                                                               // fragment in IE 9, so check for that
+                                                               node.document && node.document.nodeType !== 11 ) {
+                                                       return ret;
+                                               }
+                                       }
+                               } catch(e) {}
                        }
 
                        }
 
-                       return unmatched;
+                       return Sizzle(expr, null, null, [node]).length > 0;
                };
                };
+       }
+})();
 
 
-       return bySet ?
-               markFunction( superMatcher ) :
-               superMatcher;
-}
+(function(){
+       var div = document.createElement("div");
 
 
-compile = Sizzle.compile = function( selector, group /* Internal Use Only */ ) {
-       var i,
-               setMatchers = [],
-               elementMatchers = [],
-               cached = compilerCache[ selector + " " ];
-
-       if ( !cached ) {
-               // Generate a function of recursive functions that can be used to check each element
-               if ( !group ) {
-                       group = tokenize( selector );
-               }
-               i = group.length;
-               while ( i-- ) {
-                       cached = matcherFromTokens( group[i] );
-                       if ( cached[ expando ] ) {
-                               setMatchers.push( cached );
-                       } else {
-                               elementMatchers.push( cached );
-                       }
-               }
+       div.innerHTML = "<div class='test e'></div><div class='test'></div>";
 
 
-               // Cache the compiled function
-               cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );
+       // Opera can't find a second classname (in 9.6)
+       // Also, make sure that getElementsByClassName actually exists
+       if ( !div.getElementsByClassName || div.getElementsByClassName("e").length === 0 ) {
+               return;
        }
        }
-       return cached;
-};
 
 
-function multipleContexts( selector, contexts, results ) {
-       var i = 0,
-               len = contexts.length;
-       for ( ; i < len; i++ ) {
-               Sizzle( selector, contexts[i], results );
+       // Safari caches class attributes, doesn't catch changes (in 3.2)
+       div.lastChild.className = "e";
+
+       if ( div.getElementsByClassName("e").length === 1 ) {
+               return;
        }
        }
-       return results;
-}
+       
+       Expr.order.splice(1, 0, "CLASS");
+       Expr.find.CLASS = function( match, context, isXML ) {
+               if ( typeof context.getElementsByClassName !== "undefined" && !isXML ) {
+                       return context.getElementsByClassName(match[1]);
+               }
+       };
+
+       // release memory in IE
+       div = null;
+})();
+
+function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
+       for ( var i = 0, l = checkSet.length; i < l; i++ ) {
+               var elem = checkSet[i];
 
 
-function select( selector, context, results, seed ) {
-       var i, tokens, token, type, find,
-               match = tokenize( selector );
+               if ( elem ) {
+                       var match = false;
+
+                       elem = elem[dir];
 
 
-       if ( !seed ) {
-               // Try to minimize operations if there is only one group
-               if ( match.length === 1 ) {
+                       while ( elem ) {
+                               if ( elem.sizcache === doneName ) {
+                                       match = checkSet[elem.sizset];
+                                       break;
+                               }
 
 
-                       // Take a shortcut and set the context if the root selector is an ID
-                       tokens = match[0] = match[0].slice( 0 );
-                       if ( tokens.length > 2 && (token = tokens[0]).type === "ID" &&
-                                       context.nodeType === 9 && !documentIsXML &&
-                                       Expr.relative[ tokens[1].type ] ) {
+                               if ( elem.nodeType === 1 && !isXML ){
+                                       elem.sizcache = doneName;
+                                       elem.sizset = i;
+                               }
 
 
-                               context = Expr.find["ID"]( token.matches[0].replace( runescape, funescape ), context )[0];
-                               if ( !context ) {
-                                       return results;
+                               if ( elem.nodeName.toLowerCase() === cur ) {
+                                       match = elem;
+                                       break;
                                }
 
                                }
 
-                               selector = selector.slice( tokens.shift().value.length );
+                               elem = elem[dir];
                        }
 
                        }
 
-                       // Fetch a seed set for right-to-left matching
-                       i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length;
-                       while ( i-- ) {
-                               token = tokens[i];
+                       checkSet[i] = match;
+               }
+       }
+}
+
+function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
+       for ( var i = 0, l = checkSet.length; i < l; i++ ) {
+               var elem = checkSet[i];
+
+               if ( elem ) {
+                       var match = false;
+                       
+                       elem = elem[dir];
 
 
-                               // Abort if we hit a combinator
-                               if ( Expr.relative[ (type = token.type) ] ) {
+                       while ( elem ) {
+                               if ( elem.sizcache === doneName ) {
+                                       match = checkSet[elem.sizset];
                                        break;
                                }
                                        break;
                                }
-                               if ( (find = Expr.find[ type ]) ) {
-                                       // Search, expanding context for leading sibling combinators
-                                       if ( (seed = find(
-                                               token.matches[0].replace( runescape, funescape ),
-                                               rsibling.test( tokens[0].type ) && context.parentNode || context
-                                       )) ) {
-
-                                               // If seed is empty or no tokens remain, we can return early
-                                               tokens.splice( i, 1 );
-                                               selector = seed.length && toSelector( tokens );
-                                               if ( !selector ) {
-                                                       push.apply( results, slice.call( seed, 0 ) );
-                                                       return results;
+
+                               if ( elem.nodeType === 1 ) {
+                                       if ( !isXML ) {
+                                               elem.sizcache = doneName;
+                                               elem.sizset = i;
+                                       }
+
+                                       if ( typeof cur !== "string" ) {
+                                               if ( elem === cur ) {
+                                                       match = true;
+                                                       break;
                                                }
 
                                                }
 
+                                       } else if ( Sizzle.filter( cur, [elem] ).length > 0 ) {
+                                               match = elem;
                                                break;
                                        }
                                }
                                                break;
                                        }
                                }
+
+                               elem = elem[dir];
                        }
                        }
+
+                       checkSet[i] = match;
                }
        }
                }
        }
+}
 
 
-       // Compile and execute a filtering function
-       // Provide `match` to avoid retokenization if we modified the selector above
-       compile( selector, match )(
-               seed,
-               context,
-               documentIsXML,
-               results,
-               rsibling.test( selector )
-       );
-       return results;
+if ( document.documentElement.contains ) {
+       Sizzle.contains = function( a, b ) {
+               return a !== b && (a.contains ? a.contains(b) : true);
+       };
+
+} else if ( document.documentElement.compareDocumentPosition ) {
+       Sizzle.contains = function( a, b ) {
+               return !!(a.compareDocumentPosition(b) & 16);
+       };
+
+} else {
+       Sizzle.contains = function() {
+               return false;
+       };
 }
 
 }
 
-// Deprecated
-Expr.pseudos["nth"] = Expr.pseudos["eq"];
+Sizzle.isXML = function( elem ) {
+       // documentElement is verified for cases where it doesn't yet exist
+       // (such as loading iframes in IE - #4833) 
+       var documentElement = (elem ? elem.ownerDocument || elem : 0).documentElement;
+
+       return documentElement ? documentElement.nodeName !== "HTML" : false;
+};
+
+var posProcess = function( selector, context ) {
+       var match,
+               tmpSet = [],
+               later = "",
+               root = context.nodeType ? [context] : context;
 
 
-// Easy API for creating new setFilters
-function setFilters() {}
-Expr.filters = setFilters.prototype = Expr.pseudos;
-Expr.setFilters = new setFilters();
+       // Position selectors must be done after the filter
+       // And so must :not(positional) so we move all PSEUDOs to the end
+       while ( (match = Expr.match.PSEUDO.exec( selector )) ) {
+               later += match[0];
+               selector = selector.replace( Expr.match.PSEUDO, "" );
+       }
+
+       selector = Expr.relative[selector] ? selector + "*" : selector;
+
+       for ( var i = 0, l = root.length; i < l; i++ ) {
+               Sizzle( selector, root[i], tmpSet );
+       }
 
 
-// Initialize with the default document
-setDocument();
+       return Sizzle.filter( later, tmpSet );
+};
 
 
-// Override sizzle attribute retrieval
-Sizzle.attr = jQuery.attr;
+// EXPOSE
 jQuery.find = Sizzle;
 jQuery.expr = Sizzle.selectors;
 jQuery.find = Sizzle;
 jQuery.expr = Sizzle.selectors;
-jQuery.expr[":"] = jQuery.expr.pseudos;
+jQuery.expr[":"] = jQuery.expr.filters;
 jQuery.unique = Sizzle.uniqueSort;
 jQuery.text = Sizzle.getText;
 jQuery.isXMLDoc = Sizzle.isXML;
 jQuery.contains = Sizzle.contains;
 
 
 jQuery.unique = Sizzle.uniqueSort;
 jQuery.text = Sizzle.getText;
 jQuery.isXMLDoc = Sizzle.isXML;
 jQuery.contains = Sizzle.contains;
 
 
-})( window );
+})();
+
+
 var runtil = /Until$/,
 var runtil = /Until$/,
-       rparentsprev = /^(?:parents|prev(?:Until|All))/,
+       rparentsprev = /^(?:parents|prevUntil|prevAll)/,
+       // Note: This RegExp should be improved, or likely pulled from Sizzle
+       rmultiselector = /,/,
        isSimple = /^.[^:#\[\.,]*$/,
        isSimple = /^.[^:#\[\.,]*$/,
-       rneedsContext = jQuery.expr.match.needsContext,
+       slice = Array.prototype.slice,
+       POS = jQuery.expr.match.POS,
        // methods guaranteed to produce a unique set when starting from a unique set
        guaranteedUnique = {
                children: true,
        // methods guaranteed to produce a unique set when starting from a unique set
        guaranteedUnique = {
                children: true,
@@ -5557,38 +5205,46 @@ var runtil = /Until$/,
 
 jQuery.fn.extend({
        find: function( selector ) {
 
 jQuery.fn.extend({
        find: function( selector ) {
-               var i, ret, self,
-                       len = this.length;
+               var self = this,
+                       i, l;
 
                if ( typeof selector !== "string" ) {
 
                if ( typeof selector !== "string" ) {
-                       self = this;
-                       return this.pushStack( jQuery( selector ).filter(function() {
-                               for ( i = 0; i < len; i++ ) {
+                       return jQuery( selector ).filter(function() {
+                               for ( i = 0, l = self.length; i < l; i++ ) {
                                        if ( jQuery.contains( self[ i ], this ) ) {
                                                return true;
                                        }
                                }
                                        if ( jQuery.contains( self[ i ], this ) ) {
                                                return true;
                                        }
                                }
-                       }) );
-               }
-
-               ret = [];
-               for ( i = 0; i < len; i++ ) {
-                       jQuery.find( selector, this[ i ], ret );
+                       });
+               }
+
+               var ret = this.pushStack( "", "find", selector ),
+                       length, n, r;
+
+               for ( i = 0, l = this.length; i < l; i++ ) {
+                       length = ret.length;
+                       jQuery.find( selector, this[i], ret );
+
+                       if ( i > 0 ) {
+                               // Make sure that the results are unique
+                               for ( n = length; n < ret.length; n++ ) {
+                                       for ( r = 0; r < length; r++ ) {
+                                               if ( ret[r] === ret[n] ) {
+                                                       ret.splice(n--, 1);
+                                                       break;
+                                               }
+                                       }
+                               }
+                       }
                }
 
                }
 
-               // Needed because $( selector, context ) becomes $( context ).find( selector )
-               ret = this.pushStack( len > 1 ? jQuery.unique( ret ) : ret );
-               ret.selector = ( this.selector ? this.selector + " " : "" ) + selector;
                return ret;
        },
 
        has: function( target ) {
                return ret;
        },
 
        has: function( target ) {
-               var i,
-                       targets = jQuery( target, this ),
-                       len = targets.length;
-
+               var targets = jQuery( target );
                return this.filter(function() {
                return this.filter(function() {
-                       for ( i = 0; i < len; i++ ) {
+                       for ( var i = 0, l = targets.length; i < l; i++ ) {
                                if ( jQuery.contains( this, targets[i] ) ) {
                                        return true;
                                }
                                if ( jQuery.contains( this, targets[i] ) ) {
                                        return true;
                                }
@@ -5597,46 +5253,81 @@ jQuery.fn.extend({
        },
 
        not: function( selector ) {
        },
 
        not: function( selector ) {
-               return this.pushStack( winnow(this, selector, false) );
+               return this.pushStack( winnow(this, selector, false), "not", selector);
        },
 
        filter: function( selector ) {
        },
 
        filter: function( selector ) {
-               return this.pushStack( winnow(this, selector, true) );
+               return this.pushStack( winnow(this, selector, true), "filter", selector );
        },
 
        is: function( selector ) {
        },
 
        is: function( selector ) {
-               return !!selector && (
-                       typeof selector === "string" ?
-                               // If this is a positional/relative selector, check membership in the returned set
-                               // so $("p:first").is("p:last") won't return true for a doc with two "p".
-                               rneedsContext.test( selector ) ?
-                                       jQuery( selector, this.context ).index( this[0] ) >= 0 :
-                                       jQuery.filter( selector, this ).length > 0 :
-                               this.filter( selector ).length > 0 );
+               return !!selector && ( typeof selector === "string" ?
+                       jQuery.filter( selector, this ).length > 0 :
+                       this.filter( selector ).length > 0 );
        },
 
        closest: function( selectors, context ) {
        },
 
        closest: function( selectors, context ) {
-               var cur,
-                       i = 0,
-                       l = this.length,
-                       ret = [],
-                       pos = rneedsContext.test( selectors ) || typeof selectors !== "string" ?
+               var ret = [], i, l, cur = this[0];
+               
+               // Array
+               if ( jQuery.isArray( selectors ) ) {
+                       var match, selector,
+                               matches = {},
+                               level = 1;
+
+                       if ( cur && selectors.length ) {
+                               for ( i = 0, l = selectors.length; i < l; i++ ) {
+                                       selector = selectors[i];
+
+                                       if ( !matches[ selector ] ) {
+                                               matches[ selector ] = POS.test( selector ) ?
+                                                       jQuery( selector, context || this.context ) :
+                                                       selector;
+                                       }
+                               }
+
+                               while ( cur && cur.ownerDocument && cur !== context ) {
+                                       for ( selector in matches ) {
+                                               match = matches[ selector ];
+
+                                               if ( match.jquery ? match.index( cur ) > -1 : jQuery( cur ).is( match ) ) {
+                                                       ret.push({ selector: selector, elem: cur, level: level });
+                                               }
+                                       }
+
+                                       cur = cur.parentNode;
+                                       level++;
+                               }
+                       }
+
+                       return ret;
+               }
+
+               // String
+               var pos = POS.test( selectors ) || typeof selectors !== "string" ?
                                jQuery( selectors, context || this.context ) :
                                0;
 
                                jQuery( selectors, context || this.context ) :
                                0;
 
-               for ( ; i < l; i++ ) {
+               for ( i = 0, l = this.length; i < l; i++ ) {
                        cur = this[i];
 
                        cur = this[i];
 
-                       while ( cur && cur.ownerDocument && cur !== context && cur.nodeType !== 11 ) {
+                       while ( cur ) {
                                if ( pos ? pos.index(cur) > -1 : jQuery.find.matchesSelector(cur, selectors) ) {
                                        ret.push( cur );
                                        break;
                                if ( pos ? pos.index(cur) > -1 : jQuery.find.matchesSelector(cur, selectors) ) {
                                        ret.push( cur );
                                        break;
+
+                               } else {
+                                       cur = cur.parentNode;
+                                       if ( !cur || !cur.ownerDocument || cur === context || cur.nodeType === 11 ) {
+                                               break;
+                                       }
                                }
                                }
-                               cur = cur.parentNode;
                        }
                }
 
                        }
                }
 
-               return this.pushStack( ret.length > 1 ? jQuery.unique( ret ) : ret );
+               ret = ret.length > 1 ? jQuery.unique( ret ) : ret;
+
+               return this.pushStack( ret, "closest", selectors );
        },
 
        // Determine the position of an element within
        },
 
        // Determine the position of an element within
@@ -5645,7 +5336,7 @@ jQuery.fn.extend({
 
                // No argument, return index in parent
                if ( !elem ) {
 
                // No argument, return index in parent
                if ( !elem ) {
-                       return ( this[0] && this[0].parentNode ) ? this.first().prevAll().length : -1;
+                       return ( this[0] && this[0].parentNode ) ? this.prevAll().length : -1;
                }
 
                // index in selector
                }
 
                // index in selector
@@ -5665,24 +5356,20 @@ jQuery.fn.extend({
                                jQuery.makeArray( selector && selector.nodeType ? [ selector ] : selector ),
                        all = jQuery.merge( this.get(), set );
 
                                jQuery.makeArray( selector && selector.nodeType ? [ selector ] : selector ),
                        all = jQuery.merge( this.get(), set );
 
-               return this.pushStack( jQuery.unique(all) );
+               return this.pushStack( isDisconnected( set[0] ) || isDisconnected( all[0] ) ?
+                       all :
+                       jQuery.unique( all ) );
        },
 
        },
 
-       addBack: function( selector ) {
-               return this.add( selector == null ?
-                       this.prevObject : this.prevObject.filter(selector)
-               );
+       andSelf: function() {
+               return this.add( this.prevObject );
        }
 });
 
        }
 });
 
-jQuery.fn.andSelf = jQuery.fn.addBack;
-
-function sibling( cur, dir ) {
-       do {
-               cur = cur[ dir ];
-       } while ( cur && cur.nodeType !== 1 );
-
-       return cur;
+// A painfully simple check to see if an element is disconnected
+// from a document (should be improved, where feasible).
+function isDisconnected( node ) {
+       return !node || !node.parentNode || node.parentNode.nodeType === 11;
 }
 
 jQuery.each({
 }
 
 jQuery.each({
@@ -5697,10 +5384,10 @@ jQuery.each({
                return jQuery.dir( elem, "parentNode", until );
        },
        next: function( elem ) {
                return jQuery.dir( elem, "parentNode", until );
        },
        next: function( elem ) {
-               return sibling( elem, "nextSibling" );
+               return jQuery.nth( elem, 2, "nextSibling" );
        },
        prev: function( elem ) {
        },
        prev: function( elem ) {
-               return sibling( elem, "previousSibling" );
+               return jQuery.nth( elem, 2, "previousSibling" );
        },
        nextAll: function( elem ) {
                return jQuery.dir( elem, "nextSibling" );
        },
        nextAll: function( elem ) {
                return jQuery.dir( elem, "nextSibling" );
@@ -5715,7 +5402,7 @@ jQuery.each({
                return jQuery.dir( elem, "previousSibling", until );
        },
        siblings: function( elem ) {
                return jQuery.dir( elem, "previousSibling", until );
        },
        siblings: function( elem ) {
-               return jQuery.sibling( ( elem.parentNode || {} ).firstChild, elem );
+               return jQuery.sibling( elem.parentNode.firstChild, elem );
        },
        children: function( elem ) {
                return jQuery.sibling( elem.firstChild );
        },
        children: function( elem ) {
                return jQuery.sibling( elem.firstChild );
@@ -5723,11 +5410,16 @@ jQuery.each({
        contents: function( elem ) {
                return jQuery.nodeName( elem, "iframe" ) ?
                        elem.contentDocument || elem.contentWindow.document :
        contents: function( elem ) {
                return jQuery.nodeName( elem, "iframe" ) ?
                        elem.contentDocument || elem.contentWindow.document :
-                       jQuery.merge( [], elem.childNodes );
+                       jQuery.makeArray( elem.childNodes );
        }
 }, function( name, fn ) {
        jQuery.fn[ name ] = function( until, selector ) {
        }
 }, function( name, fn ) {
        jQuery.fn[ name ] = function( until, selector ) {
-               var ret = jQuery.map( this, fn, until );
+               var ret = jQuery.map( this, fn, until ),
+                       // The variable 'args' was introduced in
+                       // https://github.com/jquery/jquery/commit/52a0238
+                       // to work around a bug in Chrome 10 (Dev) and should be removed when the bug is fixed.
+                       // http://code.google.com/p/v8/issues/detail?id=1050
+                       args = slice.call(arguments);
 
                if ( !runtil.test( name ) ) {
                        selector = until;
 
                if ( !runtil.test( name ) ) {
                        selector = until;
@@ -5739,11 +5431,11 @@ jQuery.each({
 
                ret = this.length > 1 && !guaranteedUnique[ name ] ? jQuery.unique( ret ) : ret;
 
 
                ret = this.length > 1 && !guaranteedUnique[ name ] ? jQuery.unique( ret ) : ret;
 
-               if ( this.length > 1 && rparentsprev.test( name ) ) {
+               if ( (this.length > 1 || rmultiselector.test( selector )) && rparentsprev.test( name ) ) {
                        ret = ret.reverse();
                }
 
                        ret = ret.reverse();
                }
 
-               return this.pushStack( ret );
+               return this.pushStack( ret, name, args.join(",") );
        };
 });
 
        };
 });
 
@@ -5771,6 +5463,19 @@ jQuery.extend({
                return matched;
        },
 
                return matched;
        },
 
+       nth: function( cur, result, dir, elem ) {
+               result = result || 1;
+               var num = 0;
+
+               for ( ; cur; cur = cur[dir] ) {
+                       if ( cur.nodeType === 1 && ++num === result ) {
+                               break;
+                       }
+               }
+
+               return cur;
+       },
+
        sibling: function( n, elem ) {
                var r = [];
 
        sibling: function( n, elem ) {
                var r = [];
 
@@ -5798,8 +5503,8 @@ function winnow( elements, qualifier, keep ) {
                });
 
        } else if ( qualifier.nodeType ) {
                });
 
        } else if ( qualifier.nodeType ) {
-               return jQuery.grep(elements, function( elem ) {
-                       return ( elem === qualifier ) === keep;
+               return jQuery.grep(elements, function( elem, i ) {
+                       return (elem === qualifier) === keep;
                });
 
        } else if ( typeof qualifier === "string" ) {
                });
 
        } else if ( typeof qualifier === "string" ) {
@@ -5814,70 +5519,60 @@ function winnow( elements, qualifier, keep ) {
                }
        }
 
                }
        }
 
-       return jQuery.grep(elements, function( elem ) {
-               return ( jQuery.inArray( elem, qualifier ) >= 0 ) === keep;
+       return jQuery.grep(elements, function( elem, i ) {
+               return (jQuery.inArray( elem, qualifier ) >= 0) === keep;
        });
 }
        });
 }
-function createSafeFragment( document ) {
-       var list = nodeNames.split( "|" ),
-               safeFrag = document.createDocumentFragment();
-
-       if ( safeFrag.createElement ) {
-               while ( list.length ) {
-                       safeFrag.createElement(
-                               list.pop()
-                       );
-               }
-       }
-       return safeFrag;
-}
 
 
-var nodeNames = "abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|" +
-               "header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",
-       rinlinejQuery = / jQuery\d+="(?:null|\d+)"/g,
-       rnoshimcache = new RegExp("<(?:" + nodeNames + ")[\\s/>]", "i"),
+
+
+
+var rinlinejQuery = / jQuery\d+="(?:\d+|null)"/g,
        rleadingWhitespace = /^\s+/,
        rleadingWhitespace = /^\s+/,
-       rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,
+       rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,
        rtagName = /<([\w:]+)/,
        rtbody = /<tbody/i,
        rhtml = /<|&#?\w+;/,
        rtagName = /<([\w:]+)/,
        rtbody = /<tbody/i,
        rhtml = /<|&#?\w+;/,
-       rnoInnerhtml = /<(?:script|style|link)/i,
-       manipulation_rcheckableType = /^(?:checkbox|radio)$/i,
+       rnocache = /<(?:script|object|embed|option|style)/i,
        // checked="checked" or checked
        rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
        // checked="checked" or checked
        rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
-       rscriptType = /^$|\/(?:java|ecma)script/i,
-       rscriptTypeMasked = /^true\/(.*)/,
-       rcleanScript = /^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,
-
-       // We have to close these tags to support XHTML (#13200)
+       rscriptType = /\/(java|ecma)script/i,
+       rcleanScript = /^\s*<!(?:\[CDATA\[|\-\-)/,
        wrapMap = {
                option: [ 1, "<select multiple='multiple'>", "</select>" ],
                legend: [ 1, "<fieldset>", "</fieldset>" ],
        wrapMap = {
                option: [ 1, "<select multiple='multiple'>", "</select>" ],
                legend: [ 1, "<fieldset>", "</fieldset>" ],
-               area: [ 1, "<map>", "</map>" ],
-               param: [ 1, "<object>", "</object>" ],
                thead: [ 1, "<table>", "</table>" ],
                tr: [ 2, "<table><tbody>", "</tbody></table>" ],
                thead: [ 1, "<table>", "</table>" ],
                tr: [ 2, "<table><tbody>", "</tbody></table>" ],
-               col: [ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ],
                td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],
                td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],
-
-               // IE6-8 can't serialize link, script, style, or any html5 (NoScope) tags,
-               // unless wrapped in a div with non-breaking characters in front of it.
-               _default: jQuery.support.htmlSerialize ? [ 0, "", "" ] : [ 1, "X<div>", "</div>"  ]
-       },
-       safeFragment = createSafeFragment( document ),
-       fragmentDiv = safeFragment.appendChild( document.createElement("div") );
+               col: [ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ],
+               area: [ 1, "<map>", "</map>" ],
+               _default: [ 0, "", "" ]
+       };
 
 wrapMap.optgroup = wrapMap.option;
 wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
 wrapMap.th = wrapMap.td;
 
 
 wrapMap.optgroup = wrapMap.option;
 wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
 wrapMap.th = wrapMap.td;
 
+// IE can't serialize <link> and <script> tags normally
+if ( !jQuery.support.htmlSerialize ) {
+       wrapMap._default = [ 1, "div<div>", "</div>" ];
+}
+
 jQuery.fn.extend({
 jQuery.fn.extend({
-       text: function( value ) {
-               return jQuery.access( this, function( value ) {
-                       return value === undefined ?
-                               jQuery.text( this ) :
-                               this.empty().append( ( this[0] && this[0].ownerDocument || document ).createTextNode( value ) );
-               }, null, value, arguments.length );
+       text: function( text ) {
+               if ( jQuery.isFunction(text) ) {
+                       return this.each(function(i) {
+                               var self = jQuery( this );
+
+                               self.text( text.call(this, i, self.text()) );
+                       });
+               }
+
+               if ( typeof text !== "object" && text !== undefined ) {
+                       return this.empty().append( (this[0] && this[0].ownerDocument || document).createTextNode( text ) );
+               }
+
+               return jQuery.text( this );
        },
 
        wrapAll: function( html ) {
        },
 
        wrapAll: function( html ) {
@@ -5930,10 +5625,8 @@ jQuery.fn.extend({
        },
 
        wrap: function( html ) {
        },
 
        wrap: function( html ) {
-               var isFunction = jQuery.isFunction( html );
-
-               return this.each(function(i) {
-                       jQuery( this ).wrapAll( isFunction ? html.call(this, i) : html );
+               return this.each(function() {
+                       jQuery( this ).wrapAll( html );
                });
        },
 
                });
        },
 
@@ -5947,7 +5640,7 @@ jQuery.fn.extend({
 
        append: function() {
                return this.domManip(arguments, true, function( elem ) {
 
        append: function() {
                return this.domManip(arguments, true, function( elem ) {
-                       if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
+                       if ( this.nodeType === 1 ) {
                                this.appendChild( elem );
                        }
                });
                                this.appendChild( elem );
                        }
                });
@@ -5955,43 +5648,46 @@ jQuery.fn.extend({
 
        prepend: function() {
                return this.domManip(arguments, true, function( elem ) {
 
        prepend: function() {
                return this.domManip(arguments, true, function( elem ) {
-                       if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
+                       if ( this.nodeType === 1 ) {
                                this.insertBefore( elem, this.firstChild );
                        }
                });
        },
 
        before: function() {
                                this.insertBefore( elem, this.firstChild );
                        }
                });
        },
 
        before: function() {
-               return this.domManip( arguments, false, function( elem ) {
-                       if ( this.parentNode ) {
+               if ( this[0] && this[0].parentNode ) {
+                       return this.domManip(arguments, false, function( elem ) {
                                this.parentNode.insertBefore( elem, this );
                                this.parentNode.insertBefore( elem, this );
-                       }
-               });
+                       });
+               } else if ( arguments.length ) {
+                       var set = jQuery(arguments[0]);
+                       set.push.apply( set, this.toArray() );
+                       return this.pushStack( set, "before", arguments );
+               }
        },
 
        after: function() {
        },
 
        after: function() {
-               return this.domManip( arguments, false, function( elem ) {
-                       if ( this.parentNode ) {
+               if ( this[0] && this[0].parentNode ) {
+                       return this.domManip(arguments, false, function( elem ) {
                                this.parentNode.insertBefore( elem, this.nextSibling );
                                this.parentNode.insertBefore( elem, this.nextSibling );
-                       }
-               });
+                       });
+               } else if ( arguments.length ) {
+                       var set = this.pushStack( this, "after", arguments );
+                       set.push.apply( set, jQuery(arguments[0]).toArray() );
+                       return set;
+               }
        },
 
        // keepData is for internal use only--do not document
        remove: function( selector, keepData ) {
        },
 
        // keepData is for internal use only--do not document
        remove: function( selector, keepData ) {
-               var elem,
-                       i = 0;
-
-               for ( ; (elem = this[i]) != null; i++ ) {
-                       if ( !selector || jQuery.filter( selector, [ elem ] ).length > 0 ) {
+               for ( var i = 0, elem; (elem = this[i]) != null; i++ ) {
+                       if ( !selector || jQuery.filter( selector, [ elem ] ).length ) {
                                if ( !keepData && elem.nodeType === 1 ) {
                                if ( !keepData && elem.nodeType === 1 ) {
-                                       jQuery.cleanData( getAll( elem ) );
+                                       jQuery.cleanData( elem.getElementsByTagName("*") );
+                                       jQuery.cleanData( [ elem ] );
                                }
 
                                if ( elem.parentNode ) {
                                }
 
                                if ( elem.parentNode ) {
-                                       if ( keepData && jQuery.contains( elem.ownerDocument, elem ) ) {
-                                               setGlobalEval( getAll( elem, "script" ) );
-                                       }
                                        elem.parentNode.removeChild( elem );
                                }
                        }
                                        elem.parentNode.removeChild( elem );
                                }
                        }
@@ -6001,25 +5697,16 @@ jQuery.fn.extend({
        },
 
        empty: function() {
        },
 
        empty: function() {
-               var elem,
-                       i = 0;
-
-               for ( ; (elem = this[i]) != null; i++ ) {
+               for ( var i = 0, elem; (elem = this[i]) != null; i++ ) {
                        // Remove element nodes and prevent memory leaks
                        if ( elem.nodeType === 1 ) {
                        // Remove element nodes and prevent memory leaks
                        if ( elem.nodeType === 1 ) {
-                               jQuery.cleanData( getAll( elem, false ) );
+                               jQuery.cleanData( elem.getElementsByTagName("*") );
                        }
 
                        // Remove any remaining nodes
                        while ( elem.firstChild ) {
                                elem.removeChild( elem.firstChild );
                        }
                        }
 
                        // Remove any remaining nodes
                        while ( elem.firstChild ) {
                                elem.removeChild( elem.firstChild );
                        }
-
-                       // If this is a select, ensure that it displays empty (#12336)
-                       // Support: IE<9
-                       if ( elem.options && jQuery.nodeName( elem, "select" ) ) {
-                               elem.options.length = 0;
-                       }
                }
 
                return this;
                }
 
                return this;
@@ -6035,65 +5722,78 @@ jQuery.fn.extend({
        },
 
        html: function( value ) {
        },
 
        html: function( value ) {
-               return jQuery.access( this, function( value ) {
-                       var elem = this[0] || {},
-                               i = 0,
-                               l = this.length;
+               if ( value === undefined ) {
+                       return this[0] && this[0].nodeType === 1 ?
+                               this[0].innerHTML.replace(rinlinejQuery, "") :
+                               null;
 
 
-                       if ( value === undefined ) {
-                               return elem.nodeType === 1 ?
-                                       elem.innerHTML.replace( rinlinejQuery, "" ) :
-                                       undefined;
-                       }
+               // See if we can take a shortcut and just use innerHTML
+               } else if ( typeof value === "string" && !rnocache.test( value ) &&
+                       (jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value )) &&
+                       !wrapMap[ (rtagName.exec( value ) || ["", ""])[1].toLowerCase() ] ) {
 
 
-                       // See if we can take a shortcut and just use innerHTML
-                       if ( typeof value === "string" && !rnoInnerhtml.test( value ) &&
-                               ( jQuery.support.htmlSerialize || !rnoshimcache.test( value )  ) &&
-                               ( jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value ) ) &&
-                               !wrapMap[ ( rtagName.exec( value ) || ["", ""] )[1].toLowerCase() ] ) {
+                       value = value.replace(rxhtmlTag, "<$1></$2>");
 
 
-                               value = value.replace( rxhtmlTag, "<$1></$2>" );
-
-                               try {
-                                       for (; i < l; i++ ) {
-                                               // Remove element nodes and prevent memory leaks
-                                               elem = this[i] || {};
-                                               if ( elem.nodeType === 1 ) {
-                                                       jQuery.cleanData( getAll( elem, false ) );
-                                                       elem.innerHTML = value;
-                                               }
+                       try {
+                               for ( var i = 0, l = this.length; i < l; i++ ) {
+                                       // Remove element nodes and prevent memory leaks
+                                       if ( this[i].nodeType === 1 ) {
+                                               jQuery.cleanData( this[i].getElementsByTagName("*") );
+                                               this[i].innerHTML = value;
                                        }
                                        }
+                               }
 
 
-                                       elem = 0;
-
-                               // If using innerHTML throws an exception, use the fallback method
-                               } catch(e) {}
-                       }
-
-                       if ( elem ) {
+                       // If using innerHTML throws an exception, use the fallback method
+                       } catch(e) {
                                this.empty().append( value );
                        }
                                this.empty().append( value );
                        }
-               }, null, value, arguments.length );
+
+               } else if ( jQuery.isFunction( value ) ) {
+                       this.each(function(i){
+                               var self = jQuery( this );
+
+                               self.html( value.call(this, i, self.html()) );
+                       });
+
+               } else {
+                       this.empty().append( value );
+               }
+
+               return this;
        },
 
        replaceWith: function( value ) {
        },
 
        replaceWith: function( value ) {
-               var isFunc = jQuery.isFunction( value );
+               if ( this[0] && this[0].parentNode ) {
+                       // Make sure that the elements are removed from the DOM before they are inserted
+                       // this can help fix replacing a parent with child elements
+                       if ( jQuery.isFunction( value ) ) {
+                               return this.each(function(i) {
+                                       var self = jQuery(this), old = self.html();
+                                       self.replaceWith( value.call( this, i, old ) );
+                               });
+                       }
 
 
-               // Make sure that the elements are removed from the DOM before they are inserted
-               // this can help fix replacing a parent with child elements
-               if ( !isFunc && typeof value !== "string" ) {
-                       value = jQuery( value ).not( this ).detach();
-               }
+                       if ( typeof value !== "string" ) {
+                               value = jQuery( value ).detach();
+                       }
 
 
-               return this.domManip( [ value ], true, function( elem ) {
-                       var next = this.nextSibling,
-                               parent = this.parentNode;
+                       return this.each(function() {
+                               var next = this.nextSibling,
+                                       parent = this.parentNode;
 
 
-                       if ( parent ) {
                                jQuery( this ).remove();
                                jQuery( this ).remove();
-                               parent.insertBefore( elem, next );
-                       }
-               });
+
+                               if ( next ) {
+                                       jQuery(next).before( value );
+                               } else {
+                                       jQuery(parent).append( value );
+                               }
+                       });
+               } else {
+                       return this.length ?
+                               this.pushStack( jQuery(jQuery.isFunction(value) ? value() : value), "replaceWith", value ) :
+                               this;
+               }
        },
 
        detach: function( selector ) {
        },
 
        detach: function( selector ) {
@@ -6101,97 +5801,68 @@ jQuery.fn.extend({
        },
 
        domManip: function( args, table, callback ) {
        },
 
        domManip: function( args, table, callback ) {
-
-               // Flatten any nested arrays
-               args = core_concat.apply( [], args );
-
-               var first, node, hasScripts,
-                       scripts, doc, fragment,
-                       i = 0,
-                       l = this.length,
-                       set = this,
-                       iNoClone = l - 1,
+               var results, first, fragment, parent,
                        value = args[0],
                        value = args[0],
-                       isFunction = jQuery.isFunction( value );
+                       scripts = [];
 
                // We can't cloneNode fragments that contain checked, in WebKit
 
                // We can't cloneNode fragments that contain checked, in WebKit
-               if ( isFunction || !( l <= 1 || typeof value !== "string" || jQuery.support.checkClone || !rchecked.test( value ) ) ) {
-                       return this.each(function( index ) {
-                               var self = set.eq( index );
-                               if ( isFunction ) {
-                                       args[0] = value.call( this, index, table ? self.html() : undefined );
-                               }
+               if ( !jQuery.support.checkClone && arguments.length === 3 && typeof value === "string" && rchecked.test( value ) ) {
+                       return this.each(function() {
+                               jQuery(this).domManip( args, table, callback, true );
+                       });
+               }
+
+               if ( jQuery.isFunction(value) ) {
+                       return this.each(function(i) {
+                               var self = jQuery(this);
+                               args[0] = value.call(this, i, table ? self.html() : undefined);
                                self.domManip( args, table, callback );
                        });
                }
 
                                self.domManip( args, table, callback );
                        });
                }
 
-               if ( l ) {
-                       fragment = jQuery.buildFragment( args, this[ 0 ].ownerDocument, false, this );
-                       first = fragment.firstChild;
+               if ( this[0] ) {
+                       parent = value && value.parentNode;
+
+                       // If we're in a fragment, just use that instead of building a new one
+                       if ( jQuery.support.parentNode && parent && parent.nodeType === 11 && parent.childNodes.length === this.length ) {
+                               results = { fragment: parent };
+
+                       } else {
+                               results = jQuery.buildFragment( args, this, scripts );
+                       }
+
+                       fragment = results.fragment;
 
                        if ( fragment.childNodes.length === 1 ) {
 
                        if ( fragment.childNodes.length === 1 ) {
-                               fragment = first;
+                               first = fragment = fragment.firstChild;
+                       } else {
+                               first = fragment.firstChild;
                        }
 
                        if ( first ) {
                                table = table && jQuery.nodeName( first, "tr" );
                        }
 
                        if ( first ) {
                                table = table && jQuery.nodeName( first, "tr" );
-                               scripts = jQuery.map( getAll( fragment, "script" ), disableScript );
-                               hasScripts = scripts.length;
-
-                               // Use the original fragment for the last item instead of the first because it can end up
-                               // being emptied incorrectly in certain situations (#8070).
-                               for ( ; i < l; i++ ) {
-                                       node = fragment;
-
-                                       if ( i !== iNoClone ) {
-                                               node = jQuery.clone( node, true, true );
-
-                                               // Keep references to cloned scripts for later restoration
-                                               if ( hasScripts ) {
-                                                       jQuery.merge( scripts, getAll( node, "script" ) );
-                                               }
-                                       }
 
 
+                               for ( var i = 0, l = this.length, lastIndex = l - 1; i < l; i++ ) {
                                        callback.call(
                                        callback.call(
-                                               table && jQuery.nodeName( this[i], "table" ) ?
-                                                       findOrAppend( this[i], "tbody" ) :
+                                               table ?
+                                                       root(this[i], first) :
                                                        this[i],
                                                        this[i],
-                                               node,
-                                               i
+                                               // Make sure that we do not leak memory by inadvertently discarding
+                                               // the original fragment (which might have attached data) instead of
+                                               // using it; in addition, use the original fragment object for the last
+                                               // item instead of first because it can end up being emptied incorrectly
+                                               // in certain situations (Bug #8070).
+                                               // Fragments from the fragment cache must always be cloned and never used
+                                               // in place.
+                                               results.cacheable || (l > 1 && i < lastIndex) ?
+                                                       jQuery.clone( fragment, true, true ) :
+                                                       fragment
                                        );
                                }
                                        );
                                }
+                       }
 
 
-                               if ( hasScripts ) {
-                                       doc = scripts[ scripts.length - 1 ].ownerDocument;
-
-                                       // Reenable scripts
-                                       jQuery.map( scripts, restoreScript );
-
-                                       // Evaluate executable scripts on first document insertion
-                                       for ( i = 0; i < hasScripts; i++ ) {
-                                               node = scripts[ i ];
-                                               if ( rscriptType.test( node.type || "" ) &&
-                                                       !jQuery._data( node, "globalEval" ) && jQuery.contains( doc, node ) ) {
-
-                                                       if ( node.src ) {
-                                                               // Hope ajax is available...
-                                                               jQuery.ajax({
-                                                                       url: node.src,
-                                                                       type: "GET",
-                                                                       dataType: "script",
-                                                                       async: false,
-                                                                       global: false,
-                                                                       "throws": true
-                                                               });
-                                                       } else {
-                                                               jQuery.globalEval( ( node.text || node.textContent || node.innerHTML || "" ).replace( rcleanScript, "" ) );
-                                                       }
-                                               }
-                                       }
-                               }
-
-                               // Fix #11809: Avoid leaking memory
-                               fragment = first = null;
+                       if ( scripts.length ) {
+                               jQuery.each( scripts, evalScript );
                        }
                }
 
                        }
                }
 
@@ -6199,33 +5870,11 @@ jQuery.fn.extend({
        }
 });
 
        }
 });
 
-function findOrAppend( elem, tag ) {
-       return elem.getElementsByTagName( tag )[0] || elem.appendChild( elem.ownerDocument.createElement( tag ) );
-}
-
-// Replace/restore the type attribute of script elements for safe DOM manipulation
-function disableScript( elem ) {
-       var attr = elem.getAttributeNode("type");
-       elem.type = ( attr && attr.specified ) + "/" + elem.type;
-       return elem;
-}
-function restoreScript( elem ) {
-       var match = rscriptTypeMasked.exec( elem.type );
-       if ( match ) {
-               elem.type = match[1];
-       } else {
-               elem.removeAttribute("type");
-       }
-       return elem;
-}
-
-// Mark scripts as having already been evaluated
-function setGlobalEval( elems, refElements ) {
-       var elem,
-               i = 0;
-       for ( ; (elem = elems[i]) != null; i++ ) {
-               jQuery._data( elem, "globalEval", !refElements || jQuery._data( refElements[i], "globalEval" ) );
-       }
+function root( elem, cur ) {
+       return jQuery.nodeName(elem, "table") ?
+               (elem.getElementsByTagName("tbody")[0] ||
+               elem.appendChild(elem.ownerDocument.createElement("tbody"))) :
+               elem;
 }
 
 function cloneCopyEvent( src, dest ) {
 }
 
 function cloneCopyEvent( src, dest ) {
@@ -6234,76 +5883,64 @@ function cloneCopyEvent( src, dest ) {
                return;
        }
 
                return;
        }
 
-       var type, i, l,
-               oldData = jQuery._data( src ),
-               curData = jQuery._data( dest, oldData ),
-               events = oldData.events;
+       var internalKey = jQuery.expando,
+               oldData = jQuery.data( src ),
+               curData = jQuery.data( dest, oldData );
 
 
-       if ( events ) {
-               delete curData.handle;
-               curData.events = {};
+       // Switch to use the internal data object, if it exists, for the next
+       // stage of data copying
+       if ( (oldData = oldData[ internalKey ]) ) {
+               var events = oldData.events;
+                               curData = curData[ internalKey ] = jQuery.extend({}, oldData);
 
 
-               for ( type in events ) {
-                       for ( i = 0, l = events[ type ].length; i < l; i++ ) {
-                               jQuery.event.add( dest, type, events[ type ][ i ] );
+               if ( events ) {
+                       delete curData.handle;
+                       curData.events = {};
+
+                       for ( var type in events ) {
+                               for ( var i = 0, l = events[ type ].length; i < l; i++ ) {
+                                       jQuery.event.add( dest, type + ( events[ type ][ i ].namespace ? "." : "" ) + events[ type ][ i ].namespace, events[ type ][ i ], events[ type ][ i ].data );
+                               }
                        }
                }
        }
                        }
                }
        }
-
-       // make the cloned public data object a copy from the original
-       if ( curData.data ) {
-               curData.data = jQuery.extend( {}, curData.data );
-       }
 }
 
 }
 
-function fixCloneNodeIssues( src, dest ) {
-       var nodeName, e, data;
+function cloneFixAttributes( src, dest ) {
+       var nodeName;
 
        // We do not need to do anything for non-Elements
        if ( dest.nodeType !== 1 ) {
                return;
        }
 
 
        // We do not need to do anything for non-Elements
        if ( dest.nodeType !== 1 ) {
                return;
        }
 
-       nodeName = dest.nodeName.toLowerCase();
-
-       // IE6-8 copies events bound via attachEvent when using cloneNode.
-       if ( !jQuery.support.noCloneEvent && dest[ jQuery.expando ] ) {
-               data = jQuery._data( dest );
-
-               for ( e in data.events ) {
-                       jQuery.removeEvent( dest, e, data.handle );
-               }
-
-               // Event data gets referenced instead of copied if the expando gets copied too
-               dest.removeAttribute( jQuery.expando );
+       // clearAttributes removes the attributes, which we don't want,
+       // but also removes the attachEvent events, which we *do* want
+       if ( dest.clearAttributes ) {
+               dest.clearAttributes();
        }
 
        }
 
-       // IE blanks contents when cloning scripts, and tries to evaluate newly-set text
-       if ( nodeName === "script" && dest.text !== src.text ) {
-               disableScript( dest ).text = src.text;
-               restoreScript( dest );
+       // mergeAttributes, in contrast, only merges back on the
+       // original attributes, not the events
+       if ( dest.mergeAttributes ) {
+               dest.mergeAttributes( src );
+       }
 
 
-       // IE6-10 improperly clones children of object elements using classid.
-       // IE10 throws NoModificationAllowedError if parent is null, #12132.
-       } else if ( nodeName === "object" ) {
-               if ( dest.parentNode ) {
-                       dest.outerHTML = src.outerHTML;
-               }
+       nodeName = dest.nodeName.toLowerCase();
 
 
-               // This path appears unavoidable for IE9. When cloning an object
-               // element in IE9, the outerHTML strategy above is not sufficient.
-               // If the src has innerHTML and the destination does not,
-               // copy the src.innerHTML into the dest.innerHTML. #10324
-               if ( jQuery.support.html5Clone && ( src.innerHTML && !jQuery.trim(dest.innerHTML) ) ) {
-                       dest.innerHTML = src.innerHTML;
-               }
+       // IE6-8 fail to clone children inside object elements that use
+       // the proprietary classid attribute value (rather than the type
+       // attribute) to identify the type of content to display
+       if ( nodeName === "object" ) {
+               dest.outerHTML = src.outerHTML;
 
 
-       } else if ( nodeName === "input" && manipulation_rcheckableType.test( src.type ) ) {
+       } else if ( nodeName === "input" && (src.type === "checkbox" || src.type === "radio") ) {
                // IE6-8 fails to persist the checked state of a cloned checkbox
                // or radio button. Worse, IE6-7 fail to give the cloned element
                // a checked appearance if the defaultChecked value isn't also set
                // IE6-8 fails to persist the checked state of a cloned checkbox
                // or radio button. Worse, IE6-7 fail to give the cloned element
                // a checked appearance if the defaultChecked value isn't also set
-
-               dest.defaultChecked = dest.checked = src.checked;
+               if ( src.checked ) {
+                       dest.defaultChecked = dest.checked = src.checked;
+               }
 
                // IE6-7 get confused and end up setting the value of a cloned
                // checkbox/radio button to an empty string instead of "on"
 
                // IE6-7 get confused and end up setting the value of a cloned
                // checkbox/radio button to an empty string instead of "on"
@@ -6314,15 +5951,65 @@ function fixCloneNodeIssues( src, dest ) {
        // IE6-8 fails to return the selected option to the default selected
        // state when cloning options
        } else if ( nodeName === "option" ) {
        // IE6-8 fails to return the selected option to the default selected
        // state when cloning options
        } else if ( nodeName === "option" ) {
-               dest.defaultSelected = dest.selected = src.defaultSelected;
+               dest.selected = src.defaultSelected;
 
        // IE6-8 fails to set the defaultValue to the correct value when
        // cloning other types of input fields
        } else if ( nodeName === "input" || nodeName === "textarea" ) {
                dest.defaultValue = src.defaultValue;
        }
 
        // IE6-8 fails to set the defaultValue to the correct value when
        // cloning other types of input fields
        } else if ( nodeName === "input" || nodeName === "textarea" ) {
                dest.defaultValue = src.defaultValue;
        }
+
+       // Event data gets referenced instead of copied if the expando
+       // gets copied too
+       dest.removeAttribute( jQuery.expando );
 }
 
 }
 
+jQuery.buildFragment = function( args, nodes, scripts ) {
+       var fragment, cacheable, cacheresults, doc;
+
+  // nodes may contain either an explicit document object,
+  // a jQuery collection or context object.
+  // If nodes[0] contains a valid object to assign to doc
+  if ( nodes && nodes[0] ) {
+    doc = nodes[0].ownerDocument || nodes[0];
+  }
+
+  // Ensure that an attr object doesn't incorrectly stand in as a document object
+       // Chrome and Firefox seem to allow this to occur and will throw exception
+       // Fixes #8950
+       if ( !doc.createDocumentFragment ) {
+               doc = document;
+       }
+
+       // Only cache "small" (1/2 KB) HTML strings that are associated with the main document
+       // Cloning options loses the selected state, so don't cache them
+       // IE 6 doesn't like it when you put <object> or <embed> elements in a fragment
+       // Also, WebKit does not clone 'checked' attributes on cloneNode, so don't cache
+       if ( args.length === 1 && typeof args[0] === "string" && args[0].length < 512 && doc === document &&
+               args[0].charAt(0) === "<" && !rnocache.test( args[0] ) && (jQuery.support.checkClone || !rchecked.test( args[0] )) ) {
+
+               cacheable = true;
+
+               cacheresults = jQuery.fragments[ args[0] ];
+               if ( cacheresults && cacheresults !== 1 ) {
+                       fragment = cacheresults;
+               }
+       }
+
+       if ( !fragment ) {
+               fragment = doc.createDocumentFragment();
+               jQuery.clean( args, doc, fragment, scripts );
+       }
+
+       if ( cacheable ) {
+               jQuery.fragments[ args[0] ] = cacheresults ? fragment : 1;
+       }
+
+       return { fragment: fragment, cacheable: cacheable };
+};
+
+jQuery.fragments = {};
+
 jQuery.each({
        appendTo: "append",
        prependTo: "prepend",
 jQuery.each({
        appendTo: "append",
        prependTo: "prepend",
@@ -6331,436 +6018,311 @@ jQuery.each({
        replaceAll: "replaceWith"
 }, function( name, original ) {
        jQuery.fn[ name ] = function( selector ) {
        replaceAll: "replaceWith"
 }, function( name, original ) {
        jQuery.fn[ name ] = function( selector ) {
-               var elems,
-                       i = 0,
-                       ret = [],
+               var ret = [],
                        insert = jQuery( selector ),
                        insert = jQuery( selector ),
-                       last = insert.length - 1;
+                       parent = this.length === 1 && this[0].parentNode;
 
 
-               for ( ; i <= last; i++ ) {
-                       elems = i === last ? this : this.clone(true);
-                       jQuery( insert[i] )[ original ]( elems );
+               if ( parent && parent.nodeType === 11 && parent.childNodes.length === 1 && insert.length === 1 ) {
+                       insert[ original ]( this[0] );
+                       return this;
 
 
-                       // Modern browsers can apply jQuery collections as arrays, but oldIE needs a .get()
-                       core_push.apply( ret, elems.get() );
-               }
+               } else {
+                       for ( var i = 0, l = insert.length; i < l; i++ ) {
+                               var elems = (i > 0 ? this.clone(true) : this).get();
+                               jQuery( insert[i] )[ original ]( elems );
+                               ret = ret.concat( elems );
+                       }
 
 
-               return this.pushStack( ret );
+                       return this.pushStack( ret, name, insert.selector );
+               }
        };
 });
 
        };
 });
 
-function getAll( context, tag ) {
-       var elems, elem,
-               i = 0,
-               found = typeof context.getElementsByTagName !== core_strundefined ? context.getElementsByTagName( tag || "*" ) :
-                       typeof context.querySelectorAll !== core_strundefined ? context.querySelectorAll( tag || "*" ) :
-                       undefined;
+function getAll( elem ) {
+       if ( "getElementsByTagName" in elem ) {
+               return elem.getElementsByTagName( "*" );
 
 
-       if ( !found ) {
-               for ( found = [], elems = context.childNodes || context; (elem = elems[i]) != null; i++ ) {
-                       if ( !tag || jQuery.nodeName( elem, tag ) ) {
-                               found.push( elem );
-                       } else {
-                               jQuery.merge( found, getAll( elem, tag ) );
-                       }
-               }
-       }
+       } else if ( "querySelectorAll" in elem ) {
+               return elem.querySelectorAll( "*" );
 
 
-       return tag === undefined || tag && jQuery.nodeName( context, tag ) ?
-               jQuery.merge( [ context ], found ) :
-               found;
+       } else {
+               return [];
+       }
 }
 
 }
 
-// Used in buildFragment, fixes the defaultChecked property
+// Used in clean, fixes the defaultChecked property
 function fixDefaultChecked( elem ) {
 function fixDefaultChecked( elem ) {
-       if ( manipulation_rcheckableType.test( elem.type ) ) {
+       if ( elem.type === "checkbox" || elem.type === "radio" ) {
                elem.defaultChecked = elem.checked;
        }
 }
                elem.defaultChecked = elem.checked;
        }
 }
+// Finds all inputs and passes them to fixDefaultChecked
+function findInputs( elem ) {
+       if ( jQuery.nodeName( elem, "input" ) ) {
+               fixDefaultChecked( elem );
+       } else if ( "getElementsByTagName" in elem ) {
+               jQuery.grep( elem.getElementsByTagName("input"), fixDefaultChecked );
+       }
+}
 
 jQuery.extend({
        clone: function( elem, dataAndEvents, deepDataAndEvents ) {
 
 jQuery.extend({
        clone: function( elem, dataAndEvents, deepDataAndEvents ) {
-               var destElements, node, clone, i, srcElements,
-                       inPage = jQuery.contains( elem.ownerDocument, elem );
-
-               if ( jQuery.support.html5Clone || jQuery.isXMLDoc(elem) || !rnoshimcache.test( "<" + elem.nodeName + ">" ) ) {
-                       clone = elem.cloneNode( true );
-
-               // IE<=8 does not properly clone detached, unknown element nodes
-               } else {
-                       fragmentDiv.innerHTML = elem.outerHTML;
-                       fragmentDiv.removeChild( clone = fragmentDiv.firstChild );
-               }
+               var clone = elem.cloneNode(true),
+                               srcElements,
+                               destElements,
+                               i;
 
                if ( (!jQuery.support.noCloneEvent || !jQuery.support.noCloneChecked) &&
                                (elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem) ) {
 
                if ( (!jQuery.support.noCloneEvent || !jQuery.support.noCloneChecked) &&
                                (elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem) ) {
+                       // IE copies events bound via attachEvent when using cloneNode.
+                       // Calling detachEvent on the clone will also remove the events
+                       // from the original. In order to get around this, we use some
+                       // proprietary methods to clear the events. Thanks to MooTools
+                       // guys for this hotness.
 
 
-                       // We eschew Sizzle here for performance reasons: http://jsperf.com/getall-vs-sizzle/2
-                       destElements = getAll( clone );
+                       cloneFixAttributes( elem, clone );
+
+                       // Using Sizzle here is crazy slow, so we use getElementsByTagName
+                       // instead
                        srcElements = getAll( elem );
                        srcElements = getAll( elem );
+                       destElements = getAll( clone );
 
 
-                       // Fix all IE cloning issues
-                       for ( i = 0; (node = srcElements[i]) != null; ++i ) {
+                       // Weird iteration because IE will replace the length property
+                       // with an element if you are cloning the body and one of the
+                       // elements on the page has a name or id of "length"
+                       for ( i = 0; srcElements[i]; ++i ) {
                                // Ensure that the destination node is not null; Fixes #9587
                                if ( destElements[i] ) {
                                // Ensure that the destination node is not null; Fixes #9587
                                if ( destElements[i] ) {
-                                       fixCloneNodeIssues( node, destElements[i] );
+                                       cloneFixAttributes( srcElements[i], destElements[i] );
                                }
                        }
                }
 
                // Copy the events from the original to the clone
                if ( dataAndEvents ) {
                                }
                        }
                }
 
                // Copy the events from the original to the clone
                if ( dataAndEvents ) {
+                       cloneCopyEvent( elem, clone );
+
                        if ( deepDataAndEvents ) {
                        if ( deepDataAndEvents ) {
-                               srcElements = srcElements || getAll( elem );
-                               destElements = destElements || getAll( clone );
+                               srcElements = getAll( elem );
+                               destElements = getAll( clone );
 
 
-                               for ( i = 0; (node = srcElements[i]) != null; i++ ) {
-                                       cloneCopyEvent( node, destElements[i] );
+                               for ( i = 0; srcElements[i]; ++i ) {
+                                       cloneCopyEvent( srcElements[i], destElements[i] );
                                }
                                }
-                       } else {
-                               cloneCopyEvent( elem, clone );
                        }
                }
 
                        }
                }
 
-               // Preserve script evaluation history
-               destElements = getAll( clone, "script" );
-               if ( destElements.length > 0 ) {
-                       setGlobalEval( destElements, !inPage && getAll( elem, "script" ) );
-               }
-
-               destElements = srcElements = node = null;
+               srcElements = destElements = null;
 
                // Return the cloned set
                return clone;
        },
 
 
                // Return the cloned set
                return clone;
        },
 
-       buildFragment: function( elems, context, scripts, selection ) {
-               var j, elem, contains,
-                       tmp, tag, tbody, wrap,
-                       l = elems.length,
-
-                       // Ensure a safe fragment
-                       safe = createSafeFragment( context ),
-
-                       nodes = [],
-                       i = 0;
-
-               for ( ; i < l; i++ ) {
-                       elem = elems[ i ];
-
-                       if ( elem || elem === 0 ) {
-
-                               // Add nodes directly
-                               if ( jQuery.type( elem ) === "object" ) {
-                                       jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );
-
-                               // Convert non-html into a text node
-                               } else if ( !rhtml.test( elem ) ) {
-                                       nodes.push( context.createTextNode( elem ) );
-
-                               // Convert html into DOM nodes
-                               } else {
-                                       tmp = tmp || safe.appendChild( context.createElement("div") );
-
-                                       // Deserialize a standard representation
-                                       tag = ( rtagName.exec( elem ) || ["", ""] )[1].toLowerCase();
-                                       wrap = wrapMap[ tag ] || wrapMap._default;
-
-                                       tmp.innerHTML = wrap[1] + elem.replace( rxhtmlTag, "<$1></$2>" ) + wrap[2];
-
-                                       // Descend through wrappers to the right content
-                                       j = wrap[0];
-                                       while ( j-- ) {
-                                               tmp = tmp.lastChild;
-                                       }
-
-                                       // Manually add leading whitespace removed by IE
-                                       if ( !jQuery.support.leadingWhitespace && rleadingWhitespace.test( elem ) ) {
-                                               nodes.push( context.createTextNode( rleadingWhitespace.exec( elem )[0] ) );
-                                       }
-
-                                       // Remove IE's autoinserted <tbody> from table fragments
-                                       if ( !jQuery.support.tbody ) {
-
-                                               // String was a <table>, *may* have spurious <tbody>
-                                               elem = tag === "table" && !rtbody.test( elem ) ?
-                                                       tmp.firstChild :
-
-                                                       // String was a bare <thead> or <tfoot>
-                                                       wrap[1] === "<table>" && !rtbody.test( elem ) ?
-                                                               tmp :
-                                                               0;
-
-                                               j = elem && elem.childNodes.length;
-                                               while ( j-- ) {
-                                                       if ( jQuery.nodeName( (tbody = elem.childNodes[j]), "tbody" ) && !tbody.childNodes.length ) {
-                                                               elem.removeChild( tbody );
-                                                       }
-                                               }
-                                       }
-
-                                       jQuery.merge( nodes, tmp.childNodes );
+       clean: function( elems, context, fragment, scripts ) {
+               var checkScriptType;
 
 
-                                       // Fix #12392 for WebKit and IE > 9
-                                       tmp.textContent = "";
-
-                                       // Fix #12392 for oldIE
-                                       while ( tmp.firstChild ) {
-                                               tmp.removeChild( tmp.firstChild );
-                                       }
-
-                                       // Remember the top-level container for proper cleanup
-                                       tmp = safe.lastChild;
-                               }
-                       }
-               }
+               context = context || document;
 
 
-               // Fix #11356: Clear elements from fragment
-               if ( tmp ) {
-                       safe.removeChild( tmp );
+               // !context.createElement fails in IE with an error but returns typeof 'object'
+               if ( typeof context.createElement === "undefined" ) {
+                       context = context.ownerDocument || context[0] && context[0].ownerDocument || document;
                }
 
                }
 
-               // Reset defaultChecked for any radios and checkboxes
-               // about to be appended to the DOM in IE 6/7 (#8060)
-               if ( !jQuery.support.appendChecked ) {
-                       jQuery.grep( getAll( nodes, "input" ), fixDefaultChecked );
-               }
+               var ret = [], j;
 
 
-               i = 0;
-               while ( (elem = nodes[ i++ ]) ) {
+               for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
+                       if ( typeof elem === "number" ) {
+                               elem += "";
+                       }
 
 
-                       // #4087 - If origin and destination elements are the same, and this is
-                       // that element, do not do anything
-                       if ( selection && jQuery.inArray( elem, selection ) !== -1 ) {
+                       if ( !elem ) {
                                continue;
                        }
 
                                continue;
                        }
 
-                       contains = jQuery.contains( elem.ownerDocument, elem );
+                       // Convert html string into DOM nodes
+                       if ( typeof elem === "string" ) {
+                               if ( !rhtml.test( elem ) ) {
+                                       elem = context.createTextNode( elem );
+                               } else {
+                                       // Fix "XHTML"-style tags in all browsers
+                                       elem = elem.replace(rxhtmlTag, "<$1></$2>");
 
 
-                       // Append to fragment
-                       tmp = getAll( safe.appendChild( elem ), "script" );
+                                       // Trim whitespace, otherwise indexOf won't work as expected
+                                       var tag = (rtagName.exec( elem ) || ["", ""])[1].toLowerCase(),
+                                               wrap = wrapMap[ tag ] || wrapMap._default,
+                                               depth = wrap[0],
+                                               div = context.createElement("div");
 
 
-                       // Preserve script evaluation history
-                       if ( contains ) {
-                               setGlobalEval( tmp );
-                       }
+                                       // Go to html and back, then peel off extra wrappers
+                                       div.innerHTML = wrap[1] + elem + wrap[2];
 
 
-                       // Capture executables
-                       if ( scripts ) {
-                               j = 0;
-                               while ( (elem = tmp[ j++ ]) ) {
-                                       if ( rscriptType.test( elem.type || "" ) ) {
-                                               scripts.push( elem );
+                                       // Move to the right depth
+                                       while ( depth-- ) {
+                                               div = div.lastChild;
                                        }
                                        }
-                               }
-                       }
-               }
-
-               tmp = null;
-
-               return safe;
-       },
-
-       cleanData: function( elems, /* internal */ acceptData ) {
-               var elem, type, id, data,
-                       i = 0,
-                       internalKey = jQuery.expando,
-                       cache = jQuery.cache,
-                       deleteExpando = jQuery.support.deleteExpando,
-                       special = jQuery.event.special;
 
 
-               for ( ; (elem = elems[i]) != null; i++ ) {
-
-                       if ( acceptData || jQuery.acceptData( elem ) ) {
-
-                               id = elem[ internalKey ];
-                               data = id && cache[ id ];
-
-                               if ( data ) {
-                                       if ( data.events ) {
-                                               for ( type in data.events ) {
-                                                       if ( special[ type ] ) {
-                                                               jQuery.event.remove( elem, type );
+                                       // Remove IE's autoinserted <tbody> from table fragments
+                                       if ( !jQuery.support.tbody ) {
 
 
-                                                       // This is a shortcut to avoid jQuery.event.remove's overhead
-                                                       } else {
-                                                               jQuery.removeEvent( elem, type, data.handle );
+                                               // String was a <table>, *may* have spurious <tbody>
+                                               var hasBody = rtbody.test(elem),
+                                                       tbody = tag === "table" && !hasBody ?
+                                                               div.firstChild && div.firstChild.childNodes :
+
+                                                               // String was a bare <thead> or <tfoot>
+                                                               wrap[1] === "<table>" && !hasBody ?
+                                                                       div.childNodes :
+                                                                       [];
+
+                                               for ( j = tbody.length - 1; j >= 0 ; --j ) {
+                                                       if ( jQuery.nodeName( tbody[ j ], "tbody" ) && !tbody[ j ].childNodes.length ) {
+                                                               tbody[ j ].parentNode.removeChild( tbody[ j ] );
                                                        }
                                                }
                                        }
 
                                                        }
                                                }
                                        }
 
-                                       // Remove cache only if it was not already removed by jQuery.event.remove
-                                       if ( cache[ id ] ) {
+                                       // IE completely kills leading whitespace when innerHTML is used
+                                       if ( !jQuery.support.leadingWhitespace && rleadingWhitespace.test( elem ) ) {
+                                               div.insertBefore( context.createTextNode( rleadingWhitespace.exec(elem)[0] ), div.firstChild );
+                                       }
 
 
-                                               delete cache[ id ];
+                                       elem = div.childNodes;
+                               }
+                       }
 
 
-                                               // IE does not allow us to delete expando properties from nodes,
-                                               // nor does it have a removeAttribute function on Document nodes;
-                                               // we must handle all of these cases
-                                               if ( deleteExpando ) {
-                                                       delete elem[ internalKey ];
+                       // Resets defaultChecked for any radios and checkboxes
+                       // about to be appended to the DOM in IE 6/7 (#8060)
+                       var len;
+                       if ( !jQuery.support.appendChecked ) {
+                               if ( elem[0] && typeof (len = elem.length) === "number" ) {
+                                       for ( j = 0; j < len; j++ ) {
+                                               findInputs( elem[j] );
+                                       }
+                               } else {
+                                       findInputs( elem );
+                               }
+                       }
 
 
-                                               } else if ( typeof elem.removeAttribute !== core_strundefined ) {
-                                                       elem.removeAttribute( internalKey );
+                       if ( elem.nodeType ) {
+                               ret.push( elem );
+                       } else {
+                               ret = jQuery.merge( ret, elem );
+                       }
+               }
 
 
-                                               } else {
-                                                       elem[ internalKey ] = null;
-                                               }
+               if ( fragment ) {
+                       checkScriptType = function( elem ) {
+                               return !elem.type || rscriptType.test( elem.type );
+                       };
+                       for ( i = 0; ret[i]; i++ ) {
+                               if ( scripts && jQuery.nodeName( ret[i], "script" ) && (!ret[i].type || ret[i].type.toLowerCase() === "text/javascript") ) {
+                                       scripts.push( ret[i].parentNode ? ret[i].parentNode.removeChild( ret[i] ) : ret[i] );
+
+                               } else {
+                                       if ( ret[i].nodeType === 1 ) {
+                                               var jsTags = jQuery.grep( ret[i].getElementsByTagName( "script" ), checkScriptType );
 
 
-                                               core_deletedIds.push( id );
+                                               ret.splice.apply( ret, [i + 1, 0].concat( jsTags ) );
                                        }
                                        }
+                                       fragment.appendChild( ret[i] );
                                }
                        }
                }
                                }
                        }
                }
-       }
-});
-var iframe, getStyles, curCSS,
-       ralpha = /alpha\([^)]*\)/i,
-       ropacity = /opacity\s*=\s*([^)]*)/,
-       rposition = /^(top|right|bottom|left)$/,
-       // swappable if display is none or starts with table except "table", "table-cell", or "table-caption"
-       // see here for display values: https://developer.mozilla.org/en-US/docs/CSS/display
-       rdisplayswap = /^(none|table(?!-c[ea]).+)/,
-       rmargin = /^margin/,
-       rnumsplit = new RegExp( "^(" + core_pnum + ")(.*)$", "i" ),
-       rnumnonpx = new RegExp( "^(" + core_pnum + ")(?!px)[a-z%]+$", "i" ),
-       rrelNum = new RegExp( "^([+-])=(" + core_pnum + ")", "i" ),
-       elemdisplay = { BODY: "block" },
 
 
-       cssShow = { position: "absolute", visibility: "hidden", display: "block" },
-       cssNormalTransform = {
-               letterSpacing: 0,
-               fontWeight: 400
+               return ret;
        },
 
        },
 
-       cssExpand = [ "Top", "Right", "Bottom", "Left" ],
-       cssPrefixes = [ "Webkit", "O", "Moz", "ms" ];
-
-// return a css property mapped to a potentially vendor prefixed property
-function vendorPropName( style, name ) {
+       cleanData: function( elems ) {
+               var data, id, cache = jQuery.cache, internalKey = jQuery.expando, special = jQuery.event.special,
+                       deleteExpando = jQuery.support.deleteExpando;
 
 
-       // shortcut for names that are not vendor prefixed
-       if ( name in style ) {
-               return name;
-       }
-
-       // check for vendor prefixed names
-       var capName = name.charAt(0).toUpperCase() + name.slice(1),
-               origName = name,
-               i = cssPrefixes.length;
-
-       while ( i-- ) {
-               name = cssPrefixes[ i ] + capName;
-               if ( name in style ) {
-                       return name;
-               }
-       }
-
-       return origName;
-}
+               for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
+                       if ( elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()] ) {
+                               continue;
+                       }
 
 
-function isHidden( elem, el ) {
-       // isHidden might be called from jQuery#filter function;
-       // in that case, element will be second argument
-       elem = el || elem;
-       return jQuery.css( elem, "display" ) === "none" || !jQuery.contains( elem.ownerDocument, elem );
-}
+                       id = elem[ jQuery.expando ];
 
 
-function showHide( elements, show ) {
-       var display, elem, hidden,
-               values = [],
-               index = 0,
-               length = elements.length;
+                       if ( id ) {
+                               data = cache[ id ] && cache[ id ][ internalKey ];
 
 
-       for ( ; index < length; index++ ) {
-               elem = elements[ index ];
-               if ( !elem.style ) {
-                       continue;
-               }
+                               if ( data && data.events ) {
+                                       for ( var type in data.events ) {
+                                               if ( special[ type ] ) {
+                                                       jQuery.event.remove( elem, type );
 
 
-               values[ index ] = jQuery._data( elem, "olddisplay" );
-               display = elem.style.display;
-               if ( show ) {
-                       // Reset the inline display of this element to learn if it is
-                       // being hidden by cascaded rules or not
-                       if ( !values[ index ] && display === "none" ) {
-                               elem.style.display = "";
-                       }
+                                               // This is a shortcut to avoid jQuery.event.remove's overhead
+                                               } else {
+                                                       jQuery.removeEvent( elem, type, data.handle );
+                                               }
+                                       }
 
 
-                       // Set elements which have been overridden with display: none
-                       // in a stylesheet to whatever the default browser style is
-                       // for such an element
-                       if ( elem.style.display === "" && isHidden( elem ) ) {
-                               values[ index ] = jQuery._data( elem, "olddisplay", css_defaultDisplay(elem.nodeName) );
-                       }
-               } else {
+                                       // Null the DOM reference to avoid IE6/7/8 leak (#7054)
+                                       if ( data.handle ) {
+                                               data.handle.elem = null;
+                                       }
+                               }
 
 
-                       if ( !values[ index ] ) {
-                               hidden = isHidden( elem );
+                               if ( deleteExpando ) {
+                                       delete elem[ jQuery.expando ];
 
 
-                               if ( display && display !== "none" || !hidden ) {
-                                       jQuery._data( elem, "olddisplay", hidden ? display : jQuery.css( elem, "display" ) );
+                               } else if ( elem.removeAttribute ) {
+                                       elem.removeAttribute( jQuery.expando );
                                }
                                }
+
+                               delete cache[ id ];
                        }
                }
        }
                        }
                }
        }
+});
 
 
-       // Set the display of most of the elements in a second loop
-       // to avoid the constant reflow
-       for ( index = 0; index < length; index++ ) {
-               elem = elements[ index ];
-               if ( !elem.style ) {
-                       continue;
-               }
-               if ( !show || elem.style.display === "none" || elem.style.display === "" ) {
-                       elem.style.display = show ? values[ index ] || "" : "none";
-               }
+function evalScript( i, elem ) {
+       if ( elem.src ) {
+               jQuery.ajax({
+                       url: elem.src,
+                       async: false,
+                       dataType: "script"
+               });
+       } else {
+               jQuery.globalEval( ( elem.text || elem.textContent || elem.innerHTML || "" ).replace( rcleanScript, "/*$0*/" ) );
        }
 
        }
 
-       return elements;
+       if ( elem.parentNode ) {
+               elem.parentNode.removeChild( elem );
+       }
 }
 
 }
 
-jQuery.fn.extend({
-       css: function( name, value ) {
-               return jQuery.access( this, function( elem, name, value ) {
-                       var len, styles,
-                               map = {},
-                               i = 0;
 
 
-                       if ( jQuery.isArray( name ) ) {
-                               styles = getStyles( elem );
-                               len = name.length;
 
 
-                               for ( ; i < len; i++ ) {
-                                       map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );
-                               }
 
 
-                               return map;
-                       }
+var ralpha = /alpha\([^)]*\)/i,
+       ropacity = /opacity=([^)]*)/,
+       // fixed for IE9, see #8346
+       rupper = /([A-Z]|^ms)/g,
+       rnumpx = /^-?\d+(?:px)?$/i,
+       rnum = /^-?\d/,
+       rrelNum = /^([\-+])=([\-+.\de]+)/,
 
 
-                       return value !== undefined ?
-                               jQuery.style( elem, name, value ) :
-                               jQuery.css( elem, name );
-               }, name, value, arguments.length > 1 );
-       },
-       show: function() {
-               return showHide( this, true );
-       },
-       hide: function() {
-               return showHide( this );
-       },
-       toggle: function( state ) {
-               var bool = typeof state === "boolean";
+       cssShow = { position: "absolute", visibility: "hidden", display: "block" },
+       cssWidth = [ "Left", "Right" ],
+       cssHeight = [ "Top", "Bottom" ],
+       curCSS,
 
 
-               return this.each(function() {
-                       if ( bool ? state : isHidden( this ) ) {
-                               jQuery( this ).show();
-                       } else {
-                               jQuery( this ).hide();
-                       }
-               });
+       getComputedStyle,
+       currentStyle;
+
+jQuery.fn.css = function( name, value ) {
+       // Setting 'undefined' is a no-op
+       if ( arguments.length === 2 && value === undefined ) {
+               return this;
        }
        }
-});
+
+       return jQuery.access( this, name, value, true, function( elem, name, value ) {
+               return value !== undefined ?
+                       jQuery.style( elem, name, value ) :
+                       jQuery.css( elem, name );
+       });
+};
 
 jQuery.extend({
        // Add in style property hooks for overriding the default
 
 jQuery.extend({
        // Add in style property hooks for overriding the default
@@ -6770,8 +6332,11 @@ jQuery.extend({
                        get: function( elem, computed ) {
                                if ( computed ) {
                                        // We should always get a number back from opacity
                        get: function( elem, computed ) {
                                if ( computed ) {
                                        // We should always get a number back from opacity
-                                       var ret = curCSS( elem, "opacity" );
+                                       var ret = curCSS( elem, "opacity", "opacity" );
                                        return ret === "" ? "1" : ret;
                                        return ret === "" ? "1" : ret;
+
+                               } else {
+                                       return elem.style.opacity;
                                }
                        }
                }
                                }
                        }
                }
@@ -6779,7 +6344,6 @@ jQuery.extend({
 
        // Exclude the following css properties to add px
        cssNumber: {
 
        // Exclude the following css properties to add px
        cssNumber: {
-               "columnCount": true,
                "fillOpacity": true,
                "fontWeight": true,
                "lineHeight": true,
                "fillOpacity": true,
                "fontWeight": true,
                "lineHeight": true,
@@ -6805,15 +6369,10 @@ jQuery.extend({
                }
 
                // Make sure that we're working with the right name
                }
 
                // Make sure that we're working with the right name
-               var ret, type, hooks,
-                       origName = jQuery.camelCase( name ),
-                       style = elem.style;
+               var ret, type, origName = jQuery.camelCase( name ),
+                       style = elem.style, hooks = jQuery.cssHooks[ origName ];
 
 
-               name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( style, origName ) );
-
-               // gets hook for the prefixed version
-               // followed by the unprefixed version
-               hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
+               name = jQuery.cssProps[ origName ] || origName;
 
                // Check if we're setting a value
                if ( value !== undefined ) {
 
                // Check if we're setting a value
                if ( value !== undefined ) {
@@ -6821,7 +6380,7 @@ jQuery.extend({
 
                        // convert relative number strings (+= or -=) to relative numbers. #7345
                        if ( type === "string" && (ret = rrelNum.exec( value )) ) {
 
                        // convert relative number strings (+= or -=) to relative numbers. #7345
                        if ( type === "string" && (ret = rrelNum.exec( value )) ) {
-                               value = ( ret[1] + 1 ) * ret[2] + parseFloat( jQuery.css( elem, name ) );
+                               value = ( +( ret[1] + 1) * +ret[2] ) + parseFloat( jQuery.css( elem, name ) );
                                // Fixes bug #9237
                                type = "number";
                        }
                                // Fixes bug #9237
                                type = "number";
                        }
@@ -6836,15 +6395,8 @@ jQuery.extend({
                                value += "px";
                        }
 
                                value += "px";
                        }
 
-                       // Fixes #8908, it can be done more correctly by specifing setters in cssHooks,
-                       // but it would mean to define eight (for every problematic property) identical functions
-                       if ( !jQuery.support.clearCloneStyle && value === "" && name.indexOf("background") === 0 ) {
-                               style[ name ] = "inherit";
-                       }
-
                        // If a hook was provided, use that value, otherwise just set the specified value
                        // If a hook was provided, use that value, otherwise just set the specified value
-                       if ( !hooks || !("set" in hooks) || (value = hooks.set( elem, value, extra )) !== undefined ) {
-
+                       if ( !hooks || !("set" in hooks) || (value = hooks.set( elem, value )) !== undefined ) {
                                // Wrapped to prevent IE from throwing errors when 'invalid' values are provided
                                // Fixes bug #5509
                                try {
                                // Wrapped to prevent IE from throwing errors when 'invalid' values are provided
                                // Fixes bug #5509
                                try {
@@ -6863,311 +6415,81 @@ jQuery.extend({
                }
        },
 
                }
        },
 
-       css: function( elem, name, extra, styles ) {
-               var num, val, hooks,
-                       origName = jQuery.camelCase( name );
+       css: function( elem, name, extra ) {
+               var ret, hooks;
 
                // Make sure that we're working with the right name
 
                // Make sure that we're working with the right name
-               name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( elem.style, origName ) );
+               name = jQuery.camelCase( name );
+               hooks = jQuery.cssHooks[ name ];
+               name = jQuery.cssProps[ name ] || name;
 
 
-               // gets hook for the prefixed version
-               // followed by the unprefixed version
-               hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
+               // cssFloat needs a special treatment
+               if ( name === "cssFloat" ) {
+                       name = "float";
+               }
 
                // If a hook was provided get the computed value from there
 
                // If a hook was provided get the computed value from there
-               if ( hooks && "get" in hooks ) {
-                       val = hooks.get( elem, true, extra );
-               }
+               if ( hooks && "get" in hooks && (ret = hooks.get( elem, true, extra )) !== undefined ) {
+                       return ret;
 
                // Otherwise, if a way to get the computed value exists, use that
 
                // Otherwise, if a way to get the computed value exists, use that
-               if ( val === undefined ) {
-                       val = curCSS( elem, name, styles );
-               }
-
-               //convert "normal" to computed value
-               if ( val === "normal" && name in cssNormalTransform ) {
-                       val = cssNormalTransform[ name ];
-               }
-
-               // Return, converting to number if forced or a qualifier was provided and val looks numeric
-               if ( extra === "" || extra ) {
-                       num = parseFloat( val );
-                       return extra === true || jQuery.isNumeric( num ) ? num || 0 : val;
+               } else if ( curCSS ) {
+                       return curCSS( elem, name );
                }
                }
-               return val;
        },
 
        // A method for quickly swapping in/out CSS properties to get correct calculations
        },
 
        // A method for quickly swapping in/out CSS properties to get correct calculations
-       swap: function( elem, options, callback, args ) {
-               var ret, name,
-                       old = {};
+       swap: function( elem, options, callback ) {
+               var old = {};
 
                // Remember the old values, and insert the new ones
 
                // Remember the old values, and insert the new ones
-               for ( name in options ) {
+               for ( var name in options ) {
                        old[ name ] = elem.style[ name ];
                        elem.style[ name ] = options[ name ];
                }
 
                        old[ name ] = elem.style[ name ];
                        elem.style[ name ] = options[ name ];
                }
 
-               ret = callback.apply( elem, args || [] );
+               callback.call( elem );
 
                // Revert the old values
                for ( name in options ) {
                        elem.style[ name ] = old[ name ];
                }
 
                // Revert the old values
                for ( name in options ) {
                        elem.style[ name ] = old[ name ];
                }
-
-               return ret;
        }
 });
 
        }
 });
 
-// NOTE: we've included the "window" in window.getComputedStyle
-// because jsdom on node.js will break without it.
-if ( window.getComputedStyle ) {
-       getStyles = function( elem ) {
-               return window.getComputedStyle( elem, null );
-       };
-
-       curCSS = function( elem, name, _computed ) {
-               var width, minWidth, maxWidth,
-                       computed = _computed || getStyles( elem ),
-
-                       // getPropertyValue is only needed for .css('filter') in IE9, see #12537
-                       ret = computed ? computed.getPropertyValue( name ) || computed[ name ] : undefined,
-                       style = elem.style;
-
-               if ( computed ) {
-
-                       if ( ret === "" && !jQuery.contains( elem.ownerDocument, elem ) ) {
-                               ret = jQuery.style( elem, name );
-                       }
-
-                       // A tribute to the "awesome hack by Dean Edwards"
-                       // Chrome < 17 and Safari 5.0 uses "computed value" instead of "used value" for margin-right
-                       // Safari 5.1.7 (at least) returns percentage for a larger set of values, but width seems to be reliably pixels
-                       // this is against the CSSOM draft spec: http://dev.w3.org/csswg/cssom/#resolved-values
-                       if ( rnumnonpx.test( ret ) && rmargin.test( name ) ) {
-
-                               // Remember the original values
-                               width = style.width;
-                               minWidth = style.minWidth;
-                               maxWidth = style.maxWidth;
-
-                               // Put in the new values to get a computed value out
-                               style.minWidth = style.maxWidth = style.width = ret;
-                               ret = computed.width;
-
-                               // Revert the changed values
-                               style.width = width;
-                               style.minWidth = minWidth;
-                               style.maxWidth = maxWidth;
-                       }
-               }
-
-               return ret;
-       };
-} else if ( document.documentElement.currentStyle ) {
-       getStyles = function( elem ) {
-               return elem.currentStyle;
-       };
-
-       curCSS = function( elem, name, _computed ) {
-               var left, rs, rsLeft,
-                       computed = _computed || getStyles( elem ),
-                       ret = computed ? computed[ name ] : undefined,
-                       style = elem.style;
-
-               // Avoid setting ret to empty string here
-               // so we don't default to auto
-               if ( ret == null && style && style[ name ] ) {
-                       ret = style[ name ];
-               }
-
-               // From the awesome hack by Dean Edwards
-               // http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291
-
-               // If we're not dealing with a regular pixel number
-               // but a number that has a weird ending, we need to convert it to pixels
-               // but not position css attributes, as those are proportional to the parent element instead
-               // and we can't measure the parent instead because it might trigger a "stacking dolls" problem
-               if ( rnumnonpx.test( ret ) && !rposition.test( name ) ) {
-
-                       // Remember the original values
-                       left = style.left;
-                       rs = elem.runtimeStyle;
-                       rsLeft = rs && rs.left;
-
-                       // Put in the new values to get a computed value out
-                       if ( rsLeft ) {
-                               rs.left = elem.currentStyle.left;
-                       }
-                       style.left = name === "fontSize" ? "1em" : ret;
-                       ret = style.pixelLeft + "px";
-
-                       // Revert the changed values
-                       style.left = left;
-                       if ( rsLeft ) {
-                               rs.left = rsLeft;
-                       }
-               }
-
-               return ret === "" ? "auto" : ret;
-       };
-}
-
-function setPositiveNumber( elem, value, subtract ) {
-       var matches = rnumsplit.exec( value );
-       return matches ?
-               // Guard against undefined "subtract", e.g., when used as in cssHooks
-               Math.max( 0, matches[ 1 ] - ( subtract || 0 ) ) + ( matches[ 2 ] || "px" ) :
-               value;
-}
-
-function augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) {
-       var i = extra === ( isBorderBox ? "border" : "content" ) ?
-               // If we already have the right measurement, avoid augmentation
-               4 :
-               // Otherwise initialize for horizontal or vertical properties
-               name === "width" ? 1 : 0,
-
-               val = 0;
-
-       for ( ; i < 4; i += 2 ) {
-               // both box models exclude margin, so add it if we want it
-               if ( extra === "margin" ) {
-                       val += jQuery.css( elem, extra + cssExpand[ i ], true, styles );
-               }
-
-               if ( isBorderBox ) {
-                       // border-box includes padding, so remove it if we want content
-                       if ( extra === "content" ) {
-                               val -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
-                       }
-
-                       // at this point, extra isn't border nor margin, so remove border
-                       if ( extra !== "margin" ) {
-                               val -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
-                       }
-               } else {
-                       // at this point, extra isn't content, so add padding
-                       val += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
-
-                       // at this point, extra isn't content nor padding, so add border
-                       if ( extra !== "padding" ) {
-                               val += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
-                       }
-               }
-       }
-
-       return val;
-}
-
-function getWidthOrHeight( elem, name, extra ) {
-
-       // Start with offset property, which is equivalent to the border-box value
-       var valueIsBorderBox = true,
-               val = name === "width" ? elem.offsetWidth : elem.offsetHeight,
-               styles = getStyles( elem ),
-               isBorderBox = jQuery.support.boxSizing && jQuery.css( elem, "boxSizing", false, styles ) === "border-box";
-
-       // some non-html elements return undefined for offsetWidth, so check for null/undefined
-       // svg - https://bugzilla.mozilla.org/show_bug.cgi?id=649285
-       // MathML - https://bugzilla.mozilla.org/show_bug.cgi?id=491668
-       if ( val <= 0 || val == null ) {
-               // Fall back to computed then uncomputed css if necessary
-               val = curCSS( elem, name, styles );
-               if ( val < 0 || val == null ) {
-                       val = elem.style[ name ];
-               }
-
-               // Computed unit is not pixels. Stop here and return.
-               if ( rnumnonpx.test(val) ) {
-                       return val;
-               }
-
-               // we need the check for style in case a browser which returns unreliable values
-               // for getComputedStyle silently falls back to the reliable elem.style
-               valueIsBorderBox = isBorderBox && ( jQuery.support.boxSizingReliable || val === elem.style[ name ] );
-
-               // Normalize "", auto, and prepare for extra
-               val = parseFloat( val ) || 0;
-       }
-
-       // use the active box-sizing model to add/subtract irrelevant styles
-       return ( val +
-               augmentWidthOrHeight(
-                       elem,
-                       name,
-                       extra || ( isBorderBox ? "border" : "content" ),
-                       valueIsBorderBox,
-                       styles
-               )
-       ) + "px";
-}
-
-// Try to determine the default display value of an element
-function css_defaultDisplay( nodeName ) {
-       var doc = document,
-               display = elemdisplay[ nodeName ];
-
-       if ( !display ) {
-               display = actualDisplay( nodeName, doc );
-
-               // If the simple way fails, read from inside an iframe
-               if ( display === "none" || !display ) {
-                       // Use the already-created iframe if possible
-                       iframe = ( iframe ||
-                               jQuery("<iframe frameborder='0' width='0' height='0'/>")
-                               .css( "cssText", "display:block !important" )
-                       ).appendTo( doc.documentElement );
-
-                       // Always write a new HTML skeleton so Webkit and Firefox don't choke on reuse
-                       doc = ( iframe[0].contentWindow || iframe[0].contentDocument ).document;
-                       doc.write("<!doctype html><html><body>");
-                       doc.close();
-
-                       display = actualDisplay( nodeName, doc );
-                       iframe.detach();
-               }
-
-               // Store the correct default display
-               elemdisplay[ nodeName ] = display;
-       }
+// DEPRECATED, Use jQuery.css() instead
+jQuery.curCSS = jQuery.css;
 
 
-       return display;
-}
-
-// Called ONLY from within css_defaultDisplay
-function actualDisplay( name, doc ) {
-       var elem = jQuery( doc.createElement( name ) ).appendTo( doc.body ),
-               display = jQuery.css( elem[0], "display" );
-       elem.remove();
-       return display;
-}
-
-jQuery.each([ "height", "width" ], function( i, name ) {
+jQuery.each(["height", "width"], function( i, name ) {
        jQuery.cssHooks[ name ] = {
                get: function( elem, computed, extra ) {
        jQuery.cssHooks[ name ] = {
                get: function( elem, computed, extra ) {
+                       var val;
+
                        if ( computed ) {
                        if ( computed ) {
-                               // certain elements can have dimension info if we invisibly show them
-                               // however, it must have a current display style that would benefit from this
-                               return elem.offsetWidth === 0 && rdisplayswap.test( jQuery.css( elem, "display" ) ) ?
+                               if ( elem.offsetWidth !== 0 ) {
+                                       return getWH( elem, name, extra );
+                               } else {
                                        jQuery.swap( elem, cssShow, function() {
                                        jQuery.swap( elem, cssShow, function() {
-                                               return getWidthOrHeight( elem, name, extra );
-                                       }) :
-                                       getWidthOrHeight( elem, name, extra );
+                                               val = getWH( elem, name, extra );
+                                       });
+                               }
+
+                               return val;
                        }
                },
 
                        }
                },
 
-               set: function( elem, value, extra ) {
-                       var styles = extra && getStyles( elem );
-                       return setPositiveNumber( elem, value, extra ?
-                               augmentWidthOrHeight(
-                                       elem,
-                                       name,
-                                       extra,
-                                       jQuery.support.boxSizing && jQuery.css( elem, "boxSizing", false, styles ) === "border-box",
-                                       styles
-                               ) : 0
-                       );
+               set: function( elem, value ) {
+                       if ( rnumpx.test( value ) ) {
+                               // ignore negative width and height values #1599
+                               value = parseFloat( value );
+
+                               if ( value >= 0 ) {
+                                       return value + "px";
+                               }
+
+                       } else {
+                               return value;
+                       }
                }
        };
 });
                }
        };
 });
@@ -7177,14 +6499,14 @@ if ( !jQuery.support.opacity ) {
                get: function( elem, computed ) {
                        // IE uses filters for opacity
                        return ropacity.test( (computed && elem.currentStyle ? elem.currentStyle.filter : elem.style.filter) || "" ) ?
                get: function( elem, computed ) {
                        // IE uses filters for opacity
                        return ropacity.test( (computed && elem.currentStyle ? elem.currentStyle.filter : elem.style.filter) || "" ) ?
-                               ( 0.01 * parseFloat( RegExp.$1 ) ) + "" :
+                               ( parseFloat( RegExp.$1 ) / 100 ) + "" :
                                computed ? "1" : "";
                },
 
                set: function( elem, value ) {
                        var style = elem.style,
                                currentStyle = elem.currentStyle,
                                computed ? "1" : "";
                },
 
                set: function( elem, value ) {
                        var style = elem.style,
                                currentStyle = elem.currentStyle,
-                               opacity = jQuery.isNumeric( value ) ? "alpha(opacity=" + value * 100 + ")" : "",
+                               opacity = jQuery.isNaN( value ) ? "" : "alpha(opacity=" + value * 100 + ")",
                                filter = currentStyle && currentStyle.filter || style.filter || "";
 
                        // IE has trouble with opacity if it does not have layout
                                filter = currentStyle && currentStyle.filter || style.filter || "";
 
                        // IE has trouble with opacity if it does not have layout
@@ -7192,18 +6514,15 @@ if ( !jQuery.support.opacity ) {
                        style.zoom = 1;
 
                        // if setting opacity to 1, and no other filters exist - attempt to remove filter attribute #6652
                        style.zoom = 1;
 
                        // if setting opacity to 1, and no other filters exist - attempt to remove filter attribute #6652
-                       // if value === "", then remove inline opacity #12685
-                       if ( ( value >= 1 || value === "" ) &&
-                                       jQuery.trim( filter.replace( ralpha, "" ) ) === "" &&
-                                       style.removeAttribute ) {
+                       if ( value >= 1 && jQuery.trim( filter.replace( ralpha, "" ) ) === "" ) {
 
                                // Setting style.filter to null, "" & " " still leave "filter:" in the cssText
                                // if "filter:" is present at all, clearType is disabled, we want to avoid this
                                // style.removeAttribute is IE Only, but so apparently is this code path...
                                style.removeAttribute( "filter" );
 
 
                                // Setting style.filter to null, "" & " " still leave "filter:" in the cssText
                                // if "filter:" is present at all, clearType is disabled, we want to avoid this
                                // style.removeAttribute is IE Only, but so apparently is this code path...
                                style.removeAttribute( "filter" );
 
-                               // if there is no filter style applied in a css rule or unset inline opacity, we are done
-                               if ( value === "" || currentStyle && !currentStyle.filter ) {
+                               // if there there is no filter style applied in a css rule, we are done
+                               if ( currentStyle && !currentStyle.filter ) {
                                        return;
                                }
                        }
                                        return;
                                }
                        }
@@ -7216,212 +6535,164 @@ if ( !jQuery.support.opacity ) {
        };
 }
 
        };
 }
 
-// These hooks cannot be added until DOM ready because the support test
-// for it is not run until after DOM ready
 jQuery(function() {
 jQuery(function() {
+       // This hook cannot be added until DOM ready because the support test
+       // for it is not run until after DOM ready
        if ( !jQuery.support.reliableMarginRight ) {
                jQuery.cssHooks.marginRight = {
                        get: function( elem, computed ) {
        if ( !jQuery.support.reliableMarginRight ) {
                jQuery.cssHooks.marginRight = {
                        get: function( elem, computed ) {
-                               if ( computed ) {
-                                       // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
-                                       // Work around by temporarily setting element display to inline-block
-                                       return jQuery.swap( elem, { "display": "inline-block" },
-                                               curCSS, [ elem, "marginRight" ] );
-                               }
+                               // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
+                               // Work around by temporarily setting element display to inline-block
+                               var ret;
+                               jQuery.swap( elem, { "display": "inline-block" }, function() {
+                                       if ( computed ) {
+                                               ret = curCSS( elem, "margin-right", "marginRight" );
+                                       } else {
+                                               ret = elem.style.marginRight;
+                                       }
+                               });
+                               return ret;
                        }
                };
        }
                        }
                };
        }
+});
 
 
-       // Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084
-       // getComputedStyle returns percent when specified for top/left/bottom/right
-       // rather than make the css module depend on the offset module, we just check for it here
-       if ( !jQuery.support.pixelPosition && jQuery.fn.position ) {
-               jQuery.each( [ "top", "left" ], function( i, prop ) {
-                       jQuery.cssHooks[ prop ] = {
-                               get: function( elem, computed ) {
-                                       if ( computed ) {
-                                               computed = curCSS( elem, prop );
-                                               // if curCSS returns percentage, fallback to offset
-                                               return rnumnonpx.test( computed ) ?
-                                                       jQuery( elem ).position()[ prop ] + "px" :
-                                                       computed;
-                                       }
-                               }
-                       };
-               });
-       }
+if ( document.defaultView && document.defaultView.getComputedStyle ) {
+       getComputedStyle = function( elem, name ) {
+               var ret, defaultView, computedStyle;
 
 
-});
+               name = name.replace( rupper, "-$1" ).toLowerCase();
 
 
-if ( jQuery.expr && jQuery.expr.filters ) {
-       jQuery.expr.filters.hidden = function( elem ) {
-               // Support: Opera <= 12.12
-               // Opera reports offsetWidths and offsetHeights less than zero on some elements
-               return elem.offsetWidth <= 0 && elem.offsetHeight <= 0 ||
-                       (!jQuery.support.reliableHiddenOffsets && ((elem.style && elem.style.display) || jQuery.css( elem, "display" )) === "none");
-       };
+               if ( !(defaultView = elem.ownerDocument.defaultView) ) {
+                       return undefined;
+               }
 
 
-       jQuery.expr.filters.visible = function( elem ) {
-               return !jQuery.expr.filters.hidden( elem );
+               if ( (computedStyle = defaultView.getComputedStyle( elem, null )) ) {
+                       ret = computedStyle.getPropertyValue( name );
+                       if ( ret === "" && !jQuery.contains( elem.ownerDocument.documentElement, elem ) ) {
+                               ret = jQuery.style( elem, name );
+                       }
+               }
+
+               return ret;
        };
 }
 
        };
 }
 
-// These hooks are used by animate to expand properties
-jQuery.each({
-       margin: "",
-       padding: "",
-       border: "Width"
-}, function( prefix, suffix ) {
-       jQuery.cssHooks[ prefix + suffix ] = {
-               expand: function( value ) {
-                       var i = 0,
-                               expanded = {},
+if ( document.documentElement.currentStyle ) {
+       currentStyle = function( elem, name ) {
+               var left,
+                       ret = elem.currentStyle && elem.currentStyle[ name ],
+                       rsLeft = elem.runtimeStyle && elem.runtimeStyle[ name ],
+                       style = elem.style;
+
+               // From the awesome hack by Dean Edwards
+               // http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291
 
 
-                               // assumes a single number if not a string
-                               parts = typeof value === "string" ? value.split(" ") : [ value ];
+               // If we're not dealing with a regular pixel number
+               // but a number that has a weird ending, we need to convert it to pixels
+               if ( !rnumpx.test( ret ) && rnum.test( ret ) ) {
+                       // Remember the original values
+                       left = style.left;
 
 
-                       for ( ; i < 4; i++ ) {
-                               expanded[ prefix + cssExpand[ i ] + suffix ] =
-                                       parts[ i ] || parts[ i - 2 ] || parts[ 0 ];
+                       // Put in the new values to get a computed value out
+                       if ( rsLeft ) {
+                               elem.runtimeStyle.left = elem.currentStyle.left;
                        }
                        }
+                       style.left = name === "fontSize" ? "1em" : (ret || 0);
+                       ret = style.pixelLeft + "px";
 
 
-                       return expanded;
+                       // Revert the changed values
+                       style.left = left;
+                       if ( rsLeft ) {
+                               elem.runtimeStyle.left = rsLeft;
+                       }
                }
                }
-       };
-
-       if ( !rmargin.test( prefix ) ) {
-               jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;
-       }
-});
-var r20 = /%20/g,
-       rbracket = /\[\]$/,
-       rCRLF = /\r?\n/g,
-       rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,
-       rsubmittable = /^(?:input|select|textarea|keygen)/i;
-
-jQuery.fn.extend({
-       serialize: function() {
-               return jQuery.param( this.serializeArray() );
-       },
-       serializeArray: function() {
-               return this.map(function(){
-                       // Can add propHook for "elements" to filter or add form elements
-                       var elements = jQuery.prop( this, "elements" );
-                       return elements ? jQuery.makeArray( elements ) : this;
-               })
-               .filter(function(){
-                       var type = this.type;
-                       // Use .is(":disabled") so that fieldset[disabled] works
-                       return this.name && !jQuery( this ).is( ":disabled" ) &&
-                               rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&
-                               ( this.checked || !manipulation_rcheckableType.test( type ) );
-               })
-               .map(function( i, elem ){
-                       var val = jQuery( this ).val();
 
 
-                       return val == null ?
-                               null :
-                               jQuery.isArray( val ) ?
-                                       jQuery.map( val, function( val ){
-                                               return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
-                                       }) :
-                                       { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
-               }).get();
-       }
-});
+               return ret === "" ? "auto" : ret;
+       };
+}
 
 
-//Serialize an array of form elements or a set of
-//key/values into a query string
-jQuery.param = function( a, traditional ) {
-       var prefix,
-               s = [],
-               add = function( key, value ) {
-                       // If value is a function, invoke it and return its value
-                       value = jQuery.isFunction( value ) ? value() : ( value == null ? "" : value );
-                       s[ s.length ] = encodeURIComponent( key ) + "=" + encodeURIComponent( value );
-               };
+curCSS = getComputedStyle || currentStyle;
 
 
-       // Set traditional to true for jQuery <= 1.3.2 behavior.
-       if ( traditional === undefined ) {
-               traditional = jQuery.ajaxSettings && jQuery.ajaxSettings.traditional;
-       }
+function getWH( elem, name, extra ) {
 
 
-       // If an array was passed in, assume that it is an array of form elements.
-       if ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
-               // Serialize the form elements
-               jQuery.each( a, function() {
-                       add( this.name, this.value );
-               });
+       // Start with offset property
+       var val = name === "width" ? elem.offsetWidth : elem.offsetHeight,
+               which = name === "width" ? cssWidth : cssHeight;
 
 
-       } else {
-               // If traditional, encode the "old" way (the way 1.3.2 or older
-               // did it), otherwise encode params recursively.
-               for ( prefix in a ) {
-                       buildParams( prefix, a[ prefix ], traditional, add );
+       if ( val > 0 ) {
+               if ( extra !== "border" ) {
+                       jQuery.each( which, function() {
+                               if ( !extra ) {
+                                       val -= parseFloat( jQuery.css( elem, "padding" + this ) ) || 0;
+                               }
+                               if ( extra === "margin" ) {
+                                       val += parseFloat( jQuery.css( elem, extra + this ) ) || 0;
+                               } else {
+                                       val -= parseFloat( jQuery.css( elem, "border" + this + "Width" ) ) || 0;
+                               }
+                       });
                }
                }
-       }
-
-       // Return the resulting serialization
-       return s.join( "&" ).replace( r20, "+" );
-};
 
 
-function buildParams( prefix, obj, traditional, add ) {
-       var name;
+               return val + "px";
+       }
 
 
-       if ( jQuery.isArray( obj ) ) {
-               // Serialize array item.
-               jQuery.each( obj, function( i, v ) {
-                       if ( traditional || rbracket.test( prefix ) ) {
-                               // Treat each array item as a scalar.
-                               add( prefix, v );
+       // Fall back to computed then uncomputed css if necessary
+       val = curCSS( elem, name, name );
+       if ( val < 0 || val == null ) {
+               val = elem.style[ name ] || 0;
+       }
+       // Normalize "", auto, and prepare for extra
+       val = parseFloat( val ) || 0;
 
 
-                       } else {
-                               // Item is non-scalar (array or object), encode its numeric index.
-                               buildParams( prefix + "[" + ( typeof v === "object" ? i : "" ) + "]", v, traditional, add );
+       // Add padding, border, margin
+       if ( extra ) {
+               jQuery.each( which, function() {
+                       val += parseFloat( jQuery.css( elem, "padding" + this ) ) || 0;
+                       if ( extra !== "padding" ) {
+                               val += parseFloat( jQuery.css( elem, "border" + this + "Width" ) ) || 0;
+                       }
+                       if ( extra === "margin" ) {
+                               val += parseFloat( jQuery.css( elem, extra + this ) ) || 0;
                        }
                });
                        }
                });
-
-       } else if ( !traditional && jQuery.type( obj ) === "object" ) {
-               // Serialize object item.
-               for ( name in obj ) {
-                       buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );
-               }
-
-       } else {
-               // Serialize scalar item.
-               add( prefix, obj );
        }
        }
+
+       return val + "px";
 }
 }
-jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " +
-       "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
-       "change select submit keydown keypress keyup error contextmenu").split(" "), function( i, name ) {
 
 
-       // Handle event binding
-       jQuery.fn[ name ] = function( data, fn ) {
-               return arguments.length > 0 ?
-                       this.on( name, null, data, fn ) :
-                       this.trigger( name );
+if ( jQuery.expr && jQuery.expr.filters ) {
+       jQuery.expr.filters.hidden = function( elem ) {
+               var width = elem.offsetWidth,
+                       height = elem.offsetHeight;
+
+               return (width === 0 && height === 0) || (!jQuery.support.reliableHiddenOffsets && (elem.style.display || jQuery.css( elem, "display" )) === "none");
        };
        };
-});
 
 
-jQuery.fn.hover = function( fnOver, fnOut ) {
-       return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
-};
-var
-       // Document location
-       ajaxLocParts,
-       ajaxLocation,
-       ajax_nonce = jQuery.now(),
+       jQuery.expr.filters.visible = function( elem ) {
+               return !jQuery.expr.filters.hidden( elem );
+       };
+}
+
+
 
 
-       ajax_rquery = /\?/,
+
+var r20 = /%20/g,
+       rbracket = /\[\]$/,
+       rCRLF = /\r?\n/g,
        rhash = /#.*$/,
        rhash = /#.*$/,
-       rts = /([?&])_=[^&]*/,
        rheaders = /^(.*?):[ \t]*([^\r\n]*)\r?$/mg, // IE leaves an \r character at EOL
        rheaders = /^(.*?):[ \t]*([^\r\n]*)\r?$/mg, // IE leaves an \r character at EOL
+       rinput = /^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,
        // #7653, #8125, #8152: local protocol detection
        // #7653, #8125, #8152: local protocol detection
-       rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,
+       rlocalProtocol = /^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,
        rnoContent = /^(?:GET|HEAD)$/,
        rprotocol = /^\/\//,
        rnoContent = /^(?:GET|HEAD)$/,
        rprotocol = /^\/\//,
-       rurl = /^([\w.+-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/,
+       rquery = /\?/,
+       rscript = /<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,
+       rselectTextarea = /^(?:select|textarea)/i,
+       rspacesAjax = /\s+/,
+       rts = /([?&])_=[^&]*/,
+       rurl = /^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,
 
        // Keep a copy of the old load method
        _load = jQuery.fn.load,
 
        // Keep a copy of the old load method
        _load = jQuery.fn.load,
@@ -7444,8 +6715,14 @@ var
         */
        transports = {},
 
         */
        transports = {},
 
+       // Document location
+       ajaxLocation,
+
+       // Document location segments
+       ajaxLocParts,
+       
        // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression
        // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression
-       allTypes = "*/".concat("*");
+       allTypes = ["*/"] + ["*"];
 
 // #8138, IE may throw an exception when accessing
 // a field from window.location if document.domain has been set
 
 // #8138, IE may throw an exception when accessing
 // a field from window.location if document.domain has been set
@@ -7473,132 +6750,195 @@ function addToPrefiltersOrTransports( structure ) {
                        dataTypeExpression = "*";
                }
 
                        dataTypeExpression = "*";
                }
 
-               var dataType,
-                       i = 0,
-                       dataTypes = dataTypeExpression.toLowerCase().match( core_rnotwhite ) || [];
-
                if ( jQuery.isFunction( func ) ) {
                if ( jQuery.isFunction( func ) ) {
-                       // For each dataType in the dataTypeExpression
-                       while ( (dataType = dataTypes[i++]) ) {
-                               // Prepend if requested
-                               if ( dataType[0] === "+" ) {
-                                       dataType = dataType.slice( 1 ) || "*";
-                                       (structure[ dataType ] = structure[ dataType ] || []).unshift( func );
+                       var dataTypes = dataTypeExpression.toLowerCase().split( rspacesAjax ),
+                               i = 0,
+                               length = dataTypes.length,
+                               dataType,
+                               list,
+                               placeBefore;
 
 
-                               // Otherwise append
-                               } else {
-                                       (structure[ dataType ] = structure[ dataType ] || []).push( func );
+                       // For each dataType in the dataTypeExpression
+                       for(; i < length; i++ ) {
+                               dataType = dataTypes[ i ];
+                               // We control if we're asked to add before
+                               // any existing element
+                               placeBefore = /^\+/.test( dataType );
+                               if ( placeBefore ) {
+                                       dataType = dataType.substr( 1 ) || "*";
                                }
                                }
+                               list = structure[ dataType ] = structure[ dataType ] || [];
+                               // then we add to the structure accordingly
+                               list[ placeBefore ? "unshift" : "push" ]( func );
                        }
                }
        };
 }
 
 // Base inspection function for prefilters and transports
                        }
                }
        };
 }
 
 // Base inspection function for prefilters and transports
-function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {
-
-       var inspected = {},
-               seekingTransport = ( structure === transports );
-
-       function inspect( dataType ) {
-               var selected;
-               inspected[ dataType ] = true;
-               jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {
-                       var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );
-                       if( typeof dataTypeOrTransport === "string" && !seekingTransport && !inspected[ dataTypeOrTransport ] ) {
-                               options.dataTypes.unshift( dataTypeOrTransport );
-                               inspect( dataTypeOrTransport );
-                               return false;
-                       } else if ( seekingTransport ) {
-                               return !( selected = dataTypeOrTransport );
+function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR,
+               dataType /* internal */, inspected /* internal */ ) {
+
+       dataType = dataType || options.dataTypes[ 0 ];
+       inspected = inspected || {};
+
+       inspected[ dataType ] = true;
+
+       var list = structure[ dataType ],
+               i = 0,
+               length = list ? list.length : 0,
+               executeOnly = ( structure === prefilters ),
+               selection;
+
+       for(; i < length && ( executeOnly || !selection ); i++ ) {
+               selection = list[ i ]( options, originalOptions, jqXHR );
+               // If we got redirected to another dataType
+               // we try there if executing only and not done already
+               if ( typeof selection === "string" ) {
+                       if ( !executeOnly || inspected[ selection ] ) {
+                               selection = undefined;
+                       } else {
+                               options.dataTypes.unshift( selection );
+                               selection = inspectPrefiltersOrTransports(
+                                               structure, options, originalOptions, jqXHR, selection, inspected );
                        }
                        }
-               });
-               return selected;
+               }
        }
        }
-
-       return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" );
+       // If we're only executing or nothing was selected
+       // we try the catchall dataType if not done already
+       if ( ( executeOnly || !selection ) && !inspected[ "*" ] ) {
+               selection = inspectPrefiltersOrTransports(
+                               structure, options, originalOptions, jqXHR, "*", inspected );
+       }
+       // unnecessary when only executing (prefilters)
+       // but it'll be ignored by the caller in that case
+       return selection;
 }
 
 // A special extend for ajax options
 // that takes "flat" options (not to be deep extended)
 // Fixes #9887
 function ajaxExtend( target, src ) {
 }
 
 // A special extend for ajax options
 // that takes "flat" options (not to be deep extended)
 // Fixes #9887
 function ajaxExtend( target, src ) {
-       var deep, key,
+       var key, deep,
                flatOptions = jQuery.ajaxSettings.flatOptions || {};
                flatOptions = jQuery.ajaxSettings.flatOptions || {};
-
-       for ( key in src ) {
+       for( key in src ) {
                if ( src[ key ] !== undefined ) {
                if ( src[ key ] !== undefined ) {
-                       ( flatOptions[ key ] ? target : ( deep || (deep = {}) ) )[ key ] = src[ key ];
+                       ( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ];
                }
        }
        if ( deep ) {
                jQuery.extend( true, target, deep );
        }
                }
        }
        if ( deep ) {
                jQuery.extend( true, target, deep );
        }
-
-       return target;
 }
 
 }
 
-jQuery.fn.load = function( url, params, callback ) {
-       if ( typeof url !== "string" && _load ) {
-               return _load.apply( this, arguments );
-       }
+jQuery.fn.extend({
+       load: function( url, params, callback ) {
+               if ( typeof url !== "string" && _load ) {
+                       return _load.apply( this, arguments );
+
+               // Don't do a request if no elements are being requested
+               } else if ( !this.length ) {
+                       return this;
+               }
 
 
-       var selector, response, type,
-               self = this,
-               off = url.indexOf(" ");
+               var off = url.indexOf( " " );
+               if ( off >= 0 ) {
+                       var selector = url.slice( off, url.length );
+                       url = url.slice( 0, off );
+               }
 
 
-       if ( off >= 0 ) {
-               selector = url.slice( off, url.length );
-               url = url.slice( 0, off );
-       }
+               // Default to a GET request
+               var type = "GET";
 
 
-       // If it's a function
-       if ( jQuery.isFunction( params ) ) {
+               // If the second parameter was provided
+               if ( params ) {
+                       // If it's a function
+                       if ( jQuery.isFunction( params ) ) {
+                               // We assume that it's the callback
+                               callback = params;
+                               params = undefined;
 
 
-               // We assume that it's the callback
-               callback = params;
-               params = undefined;
+                       // Otherwise, build a param string
+                       } else if ( typeof params === "object" ) {
+                               params = jQuery.param( params, jQuery.ajaxSettings.traditional );
+                               type = "POST";
+                       }
+               }
 
 
-       // Otherwise, build a param string
-       } else if ( params && typeof params === "object" ) {
-               type = "POST";
-       }
+               var self = this;
 
 
-       // If we have elements to modify, make the request
-       if ( self.length > 0 ) {
+               // Request the remote document
                jQuery.ajax({
                        url: url,
                jQuery.ajax({
                        url: url,
-
-                       // if "type" variable is undefined, then "GET" method will be used
                        type: type,
                        dataType: "html",
                        type: type,
                        dataType: "html",
-                       data: params
-               }).done(function( responseText ) {
+                       data: params,
+                       // Complete callback (responseText is used internally)
+                       complete: function( jqXHR, status, responseText ) {
+                               // Store the response as specified by the jqXHR object
+                               responseText = jqXHR.responseText;
+                               // If successful, inject the HTML into all the matched elements
+                               if ( jqXHR.isResolved() ) {
+                                       // #4825: Get the actual response in case
+                                       // a dataFilter is present in ajaxSettings
+                                       jqXHR.done(function( r ) {
+                                               responseText = r;
+                                       });
+                                       // See if a selector was specified
+                                       self.html( selector ?
+                                               // Create a dummy div to hold the results
+                                               jQuery("<div>")
+                                                       // inject the contents of the document in, removing the scripts
+                                                       // to avoid any 'Permission Denied' errors in IE
+                                                       .append(responseText.replace(rscript, ""))
 
 
-                       // Save response for use in complete callback
-                       response = arguments;
+                                                       // Locate the specified elements
+                                                       .find(selector) :
 
 
-                       self.html( selector ?
+                                               // If not, just inject the full result
+                                               responseText );
+                               }
 
 
-                               // If a selector was specified, locate the right elements in a dummy div
-                               // Exclude scripts to avoid IE 'Permission Denied' errors
-                               jQuery("<div>").append( jQuery.parseHTML( responseText ) ).find( selector ) :
+                               if ( callback ) {
+                                       self.each( callback, [ responseText, status, jqXHR ] );
+                               }
+                       }
+               });
 
 
-                               // Otherwise use the full result
-                               responseText );
+               return this;
+       },
 
 
-               }).complete( callback && function( jqXHR, status ) {
-                       self.each( callback, response || [ jqXHR.responseText, status, jqXHR ] );
-               });
-       }
+       serialize: function() {
+               return jQuery.param( this.serializeArray() );
+       },
 
 
-       return this;
-};
+       serializeArray: function() {
+               return this.map(function(){
+                       return this.elements ? jQuery.makeArray( this.elements ) : this;
+               })
+               .filter(function(){
+                       return this.name && !this.disabled &&
+                               ( this.checked || rselectTextarea.test( this.nodeName ) ||
+                                       rinput.test( this.type ) );
+               })
+               .map(function( i, elem ){
+                       var val = jQuery( this ).val();
+
+                       return val == null ?
+                               null :
+                               jQuery.isArray( val ) ?
+                                       jQuery.map( val, function( val, i ){
+                                               return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
+                                       }) :
+                                       { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
+               }).get();
+       }
+});
 
 // Attach a bunch of functions for handling common AJAX events
 
 // Attach a bunch of functions for handling common AJAX events
-jQuery.each( [ "ajaxStart", "ajaxStop", "ajaxComplete", "ajaxError", "ajaxSuccess", "ajaxSend" ], function( i, type ){
-       jQuery.fn[ type ] = function( fn ){
-               return this.on( type, fn );
+jQuery.each( "ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split( " " ), function( i, o ){
+       jQuery.fn[ o ] = function( f ){
+               return this.bind( o, f );
        };
 });
 
        };
 });
 
@@ -7612,32 +6952,49 @@ jQuery.each( [ "get", "post" ], function( i, method ) {
                }
 
                return jQuery.ajax({
                }
 
                return jQuery.ajax({
-                       url: url,
                        type: method,
                        type: method,
-                       dataType: type,
+                       url: url,
                        data: data,
                        data: data,
-                       success: callback
+                       success: callback,
+                       dataType: type
                });
        };
 });
 
 jQuery.extend({
 
                });
        };
 });
 
 jQuery.extend({
 
-       // Counter for holding the number of active queries
-       active: 0,
+       getScript: function( url, callback ) {
+               return jQuery.get( url, undefined, callback, "script" );
+       },
 
 
-       // Last-Modified header cache for next request
-       lastModified: {},
-       etag: {},
+       getJSON: function( url, data, callback ) {
+               return jQuery.get( url, data, callback, "json" );
+       },
+
+       // Creates a full fledged settings object into target
+       // with both ajaxSettings and settings fields.
+       // If target is omitted, writes into ajaxSettings.
+       ajaxSetup: function( target, settings ) {
+               if ( settings ) {
+                       // Building a settings object
+                       ajaxExtend( target, jQuery.ajaxSettings );
+               } else {
+                       // Extending ajaxSettings
+                       settings = target;
+                       target = jQuery.ajaxSettings;
+               }
+               ajaxExtend( target, settings );
+               return target;
+       },
 
        ajaxSettings: {
                url: ajaxLocation,
 
        ajaxSettings: {
                url: ajaxLocation,
-               type: "GET",
                isLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ),
                global: true,
                isLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ),
                global: true,
+               type: "GET",
+               contentType: "application/x-www-form-urlencoded",
                processData: true,
                async: true,
                processData: true,
                async: true,
-               contentType: "application/x-www-form-urlencoded; charset=UTF-8",
                /*
                timeout: 0,
                data: null,
                /*
                timeout: 0,
                data: null,
@@ -7645,17 +7002,16 @@ jQuery.extend({
                username: null,
                password: null,
                cache: null,
                username: null,
                password: null,
                cache: null,
-               throws: false,
                traditional: false,
                headers: {},
                */
 
                accepts: {
                traditional: false,
                headers: {},
                */
 
                accepts: {
-                       "*": allTypes,
-                       text: "text/plain",
-                       html: "text/html",
                        xml: "application/xml, text/xml",
                        xml: "application/xml, text/xml",
-                       json: "application/json, text/javascript"
+                       html: "text/html",
+                       text: "text/plain",
+                       json: "application/json, text/javascript",
+                       "*": allTypes
                },
 
                contents: {
                },
 
                contents: {
@@ -7669,8 +7025,9 @@ jQuery.extend({
                        text: "responseText"
                },
 
                        text: "responseText"
                },
 
-               // Data converters
-               // Keys separate source (or catchall "*") and destination types with a single space
+               // List of data converters
+               // 1) key format is "source_type destination_type" (a single space in-between)
+               // 2) the catchall symbol "*" can be used for source_type
                converters: {
 
                        // Convert anything to text
                converters: {
 
                        // Convert anything to text
@@ -7691,24 +7048,11 @@ jQuery.extend({
                // and when you create one that shouldn't be
                // deep extended (see ajaxExtend)
                flatOptions: {
                // and when you create one that shouldn't be
                // deep extended (see ajaxExtend)
                flatOptions: {
-                       url: true,
-                       context: true
+                       context: true,
+                       url: true
                }
        },
 
                }
        },
 
-       // Creates a full fledged settings object into target
-       // with both ajaxSettings and settings fields.
-       // If target is omitted, writes into ajaxSettings.
-       ajaxSetup: function( target, settings ) {
-               return settings ?
-
-                       // Building a settings object
-                       ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :
-
-                       // Extending ajaxSettings
-                       ajaxExtend( jQuery.ajaxSettings, target );
-       },
-
        ajaxPrefilter: addToPrefiltersOrTransports( prefilters ),
        ajaxTransport: addToPrefiltersOrTransports( transports ),
 
        ajaxPrefilter: addToPrefiltersOrTransports( prefilters ),
        ajaxTransport: addToPrefiltersOrTransports( transports ),
 
@@ -7724,135 +7068,243 @@ jQuery.extend({
                // Force options to be an object
                options = options || {};
 
                // Force options to be an object
                options = options || {};
 
-               var // Cross-domain detection vars
-                       parts,
-                       // Loop variable
-                       i,
-                       // URL without anti-cache param
-                       cacheURL,
-                       // Response headers as string
-                       responseHeadersString,
-                       // timeout handle
-                       timeoutTimer,
-
-                       // To know if global events are to be dispatched
-                       fireGlobals,
-
-                       transport,
-                       // Response headers
-                       responseHeaders,
-                       // Create the final options object
+               var // Create the final options object
                        s = jQuery.ajaxSetup( {}, options ),
                        // Callbacks context
                        callbackContext = s.context || s,
                        s = jQuery.ajaxSetup( {}, options ),
                        // Callbacks context
                        callbackContext = s.context || s,
-                       // Context for global events is callbackContext if it is a DOM node or jQuery collection
-                       globalEventContext = s.context && ( callbackContext.nodeType || callbackContext.jquery ) ?
-                               jQuery( callbackContext ) :
-                               jQuery.event,
+                       // Context for global events
+                       // It's the callbackContext if one was provided in the options
+                       // and if it's a DOM node or a jQuery collection
+                       globalEventContext = callbackContext !== s &&
+                               ( callbackContext.nodeType || callbackContext instanceof jQuery ) ?
+                                               jQuery( callbackContext ) : jQuery.event,
                        // Deferreds
                        deferred = jQuery.Deferred(),
                        // Deferreds
                        deferred = jQuery.Deferred(),
-                       completeDeferred = jQuery.Callbacks("once memory"),
+                       completeDeferred = jQuery._Deferred(),
                        // Status-dependent callbacks
                        statusCode = s.statusCode || {},
                        // Status-dependent callbacks
                        statusCode = s.statusCode || {},
+                       // ifModified key
+                       ifModifiedKey,
                        // Headers (they are sent all at once)
                        requestHeaders = {},
                        requestHeadersNames = {},
                        // Headers (they are sent all at once)
                        requestHeaders = {},
                        requestHeadersNames = {},
+                       // Response headers
+                       responseHeadersString,
+                       responseHeaders,
+                       // transport
+                       transport,
+                       // timeout handle
+                       timeoutTimer,
+                       // Cross-domain detection vars
+                       parts,
                        // The jqXHR state
                        state = 0,
                        // The jqXHR state
                        state = 0,
-                       // Default abort message
-                       strAbort = "canceled",
+                       // To know if global events are to be dispatched
+                       fireGlobals,
+                       // Loop variable
+                       i,
                        // Fake xhr
                        jqXHR = {
                        // Fake xhr
                        jqXHR = {
+
                                readyState: 0,
 
                                readyState: 0,
 
+                               // Caches the header
+                               setRequestHeader: function( name, value ) {
+                                       if ( !state ) {
+                                               var lname = name.toLowerCase();
+                                               name = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name;
+                                               requestHeaders[ name ] = value;
+                                       }
+                                       return this;
+                               },
+
+                               // Raw string
+                               getAllResponseHeaders: function() {
+                                       return state === 2 ? responseHeadersString : null;
+                               },
+
                                // Builds headers hashtable if needed
                                getResponseHeader: function( key ) {
                                        var match;
                                        if ( state === 2 ) {
                                                if ( !responseHeaders ) {
                                                        responseHeaders = {};
                                // Builds headers hashtable if needed
                                getResponseHeader: function( key ) {
                                        var match;
                                        if ( state === 2 ) {
                                                if ( !responseHeaders ) {
                                                        responseHeaders = {};
-                                                       while ( (match = rheaders.exec( responseHeadersString )) ) {
+                                                       while( ( match = rheaders.exec( responseHeadersString ) ) ) {
                                                                responseHeaders[ match[1].toLowerCase() ] = match[ 2 ];
                                                        }
                                                }
                                                match = responseHeaders[ key.toLowerCase() ];
                                        }
                                                                responseHeaders[ match[1].toLowerCase() ] = match[ 2 ];
                                                        }
                                                }
                                                match = responseHeaders[ key.toLowerCase() ];
                                        }
-                                       return match == null ? null : match;
+                                       return match === undefined ? null : match;
+                               },
+
+                               // Overrides response content-type header
+                               overrideMimeType: function( type ) {
+                                       if ( !state ) {
+                                               s.mimeType = type;
+                                       }
+                                       return this;
                                },
 
                                },
 
-                               // Raw string
-                               getAllResponseHeaders: function() {
-                                       return state === 2 ? responseHeadersString : null;
-                               },
+                               // Cancel the request
+                               abort: function( statusText ) {
+                                       statusText = statusText || "abort";
+                                       if ( transport ) {
+                                               transport.abort( statusText );
+                                       }
+                                       done( 0, statusText );
+                                       return this;
+                               }
+                       };
+
+               // Callback for when everything is done
+               // It is defined here because jslint complains if it is declared
+               // at the end of the function (which would be more logical and readable)
+               function done( status, nativeStatusText, responses, headers ) {
+
+                       // Called once
+                       if ( state === 2 ) {
+                               return;
+                       }
+
+                       // State is "done" now
+                       state = 2;
+
+                       // Clear timeout if it exists
+                       if ( timeoutTimer ) {
+                               clearTimeout( timeoutTimer );
+                       }
+
+                       // Dereference transport for early garbage collection
+                       // (no matter how long the jqXHR object will be used)
+                       transport = undefined;
+
+                       // Cache response headers
+                       responseHeadersString = headers || "";
+
+                       // Set readyState
+                       jqXHR.readyState = status > 0 ? 4 : 0;
+
+                       var isSuccess,
+                               success,
+                               error,
+                               statusText = nativeStatusText,
+                               response = responses ? ajaxHandleResponses( s, jqXHR, responses ) : undefined,
+                               lastModified,
+                               etag;
+
+                       // If successful, handle type chaining
+                       if ( status >= 200 && status < 300 || status === 304 ) {
+
+                               // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
+                               if ( s.ifModified ) {
 
 
-                               // Caches the header
-                               setRequestHeader: function( name, value ) {
-                                       var lname = name.toLowerCase();
-                                       if ( !state ) {
-                                               name = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name;
-                                               requestHeaders[ name ] = value;
+                                       if ( ( lastModified = jqXHR.getResponseHeader( "Last-Modified" ) ) ) {
+                                               jQuery.lastModified[ ifModifiedKey ] = lastModified;
                                        }
                                        }
-                                       return this;
-                               },
-
-                               // Overrides response content-type header
-                               overrideMimeType: function( type ) {
-                                       if ( !state ) {
-                                               s.mimeType = type;
+                                       if ( ( etag = jqXHR.getResponseHeader( "Etag" ) ) ) {
+                                               jQuery.etag[ ifModifiedKey ] = etag;
                                        }
                                        }
-                                       return this;
-                               },
+                               }
 
 
-                               // Status-dependent callbacks
-                               statusCode: function( map ) {
-                                       var code;
-                                       if ( map ) {
-                                               if ( state < 2 ) {
-                                                       for ( code in map ) {
-                                                               // Lazy-add the new callback in a way that preserves old ones
-                                                               statusCode[ code ] = [ statusCode[ code ], map[ code ] ];
-                                                       }
-                                               } else {
-                                                       // Execute the appropriate callbacks
-                                                       jqXHR.always( map[ jqXHR.status ] );
-                                               }
-                                       }
-                                       return this;
-                               },
+                               // If not modified
+                               if ( status === 304 ) {
 
 
-                               // Cancel the request
-                               abort: function( statusText ) {
-                                       var finalText = statusText || strAbort;
-                                       if ( transport ) {
-                                               transport.abort( finalText );
+                                       statusText = "notmodified";
+                                       isSuccess = true;
+
+                               // If we have data
+                               } else {
+
+                                       try {
+                                               success = ajaxConvert( s, response );
+                                               statusText = "success";
+                                               isSuccess = true;
+                                       } catch(e) {
+                                               // We have a parsererror
+                                               statusText = "parsererror";
+                                               error = e;
                                        }
                                        }
-                                       done( 0, finalText );
-                                       return this;
                                }
                                }
-                       };
+                       } else {
+                               // We extract error from statusText
+                               // then normalize statusText and status for non-aborts
+                               error = statusText;
+                               if( !statusText || status ) {
+                                       statusText = "error";
+                                       if ( status < 0 ) {
+                                               status = 0;
+                                       }
+                               }
+                       }
+
+                       // Set data for the fake xhr object
+                       jqXHR.status = status;
+                       jqXHR.statusText = "" + ( nativeStatusText || statusText );
+
+                       // Success/Error
+                       if ( isSuccess ) {
+                               deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );
+                       } else {
+                               deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );
+                       }
+
+                       // Status-dependent callbacks
+                       jqXHR.statusCode( statusCode );
+                       statusCode = undefined;
+
+                       if ( fireGlobals ) {
+                               globalEventContext.trigger( "ajax" + ( isSuccess ? "Success" : "Error" ),
+                                               [ jqXHR, s, isSuccess ? success : error ] );
+                       }
+
+                       // Complete
+                       completeDeferred.resolveWith( callbackContext, [ jqXHR, statusText ] );
+
+                       if ( fireGlobals ) {
+                               globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] );
+                               // Handle the global AJAX counter
+                               if ( !( --jQuery.active ) ) {
+                                       jQuery.event.trigger( "ajaxStop" );
+                               }
+                       }
+               }
 
                // Attach deferreds
 
                // Attach deferreds
-               deferred.promise( jqXHR ).complete = completeDeferred.add;
+               deferred.promise( jqXHR );
                jqXHR.success = jqXHR.done;
                jqXHR.error = jqXHR.fail;
                jqXHR.success = jqXHR.done;
                jqXHR.error = jqXHR.fail;
+               jqXHR.complete = completeDeferred.done;
+
+               // Status-dependent callbacks
+               jqXHR.statusCode = function( map ) {
+                       if ( map ) {
+                               var tmp;
+                               if ( state < 2 ) {
+                                       for( tmp in map ) {
+                                               statusCode[ tmp ] = [ statusCode[tmp], map[tmp] ];
+                                       }
+                               } else {
+                                       tmp = map[ jqXHR.status ];
+                                       jqXHR.then( tmp, tmp );
+                               }
+                       }
+                       return this;
+               };
 
                // Remove hash character (#7531: and string promotion)
                // Add protocol if not provided (#5866: IE7 issue with protocol-less urls)
 
                // Remove hash character (#7531: and string promotion)
                // Add protocol if not provided (#5866: IE7 issue with protocol-less urls)
-               // Handle falsy url in the settings object (#10093: consistency with old signature)
                // We also use the url parameter if available
                // We also use the url parameter if available
-               s.url = ( ( url || s.url || ajaxLocation ) + "" ).replace( rhash, "" ).replace( rprotocol, ajaxLocParts[ 1 ] + "//" );
-
-               // Alias method option to type as per ticket #12004
-               s.type = options.method || options.type || s.method || s.type;
+               s.url = ( ( url || s.url ) + "" ).replace( rhash, "" ).replace( rprotocol, ajaxLocParts[ 1 ] + "//" );
 
                // Extract dataTypes list
 
                // Extract dataTypes list
-               s.dataTypes = jQuery.trim( s.dataType || "*" ).toLowerCase().match( core_rnotwhite ) || [""];
+               s.dataTypes = jQuery.trim( s.dataType || "*" ).toLowerCase().split( rspacesAjax );
 
 
-               // A cross-domain request is in order when we have a protocol:host:port mismatch
+               // Determine if a cross-domain request is in order
                if ( s.crossDomain == null ) {
                        parts = rurl.exec( s.url.toLowerCase() );
                        s.crossDomain = !!( parts &&
                if ( s.crossDomain == null ) {
                        parts = rurl.exec( s.url.toLowerCase() );
                        s.crossDomain = !!( parts &&
-                               ( parts[ 1 ] !== ajaxLocParts[ 1 ] || parts[ 2 ] !== ajaxLocParts[ 2 ] ||
+                               ( parts[ 1 ] != ajaxLocParts[ 1 ] || parts[ 2 ] != ajaxLocParts[ 2 ] ||
                                        ( parts[ 3 ] || ( parts[ 1 ] === "http:" ? 80 : 443 ) ) !=
                                                ( ajaxLocParts[ 3 ] || ( ajaxLocParts[ 1 ] === "http:" ? 80 : 443 ) ) )
                        );
                                        ( parts[ 3 ] || ( parts[ 1 ] === "http:" ? 80 : 443 ) ) !=
                                                ( ajaxLocParts[ 3 ] || ( ajaxLocParts[ 1 ] === "http:" ? 80 : 443 ) ) )
                        );
@@ -7866,66 +7318,66 @@ jQuery.extend({
                // Apply prefilters
                inspectPrefiltersOrTransports( prefilters, s, options, jqXHR );
 
                // Apply prefilters
                inspectPrefiltersOrTransports( prefilters, s, options, jqXHR );
 
-               // If request was aborted inside a prefilter, stop there
+               // If request was aborted inside a prefiler, stop there
                if ( state === 2 ) {
                if ( state === 2 ) {
-                       return jqXHR;
+                       return false;
                }
 
                // We can fire global events as of now if asked to
                fireGlobals = s.global;
 
                }
 
                // We can fire global events as of now if asked to
                fireGlobals = s.global;
 
-               // Watch for a new set of requests
-               if ( fireGlobals && jQuery.active++ === 0 ) {
-                       jQuery.event.trigger("ajaxStart");
-               }
-
                // Uppercase the type
                s.type = s.type.toUpperCase();
 
                // Determine if request has content
                s.hasContent = !rnoContent.test( s.type );
 
                // Uppercase the type
                s.type = s.type.toUpperCase();
 
                // Determine if request has content
                s.hasContent = !rnoContent.test( s.type );
 
-               // Save the URL in case we're toying with the If-Modified-Since
-               // and/or If-None-Match header later on
-               cacheURL = s.url;
+               // Watch for a new set of requests
+               if ( fireGlobals && jQuery.active++ === 0 ) {
+                       jQuery.event.trigger( "ajaxStart" );
+               }
 
                // More options handling for requests with no content
                if ( !s.hasContent ) {
 
                        // If data is available, append data to url
                        if ( s.data ) {
 
                // More options handling for requests with no content
                if ( !s.hasContent ) {
 
                        // If data is available, append data to url
                        if ( s.data ) {
-                               cacheURL = ( s.url += ( ajax_rquery.test( cacheURL ) ? "&" : "?" ) + s.data );
+                               s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.data;
                                // #9682: remove data so that it's not used in an eventual retry
                                delete s.data;
                        }
 
                                // #9682: remove data so that it's not used in an eventual retry
                                delete s.data;
                        }
 
+                       // Get ifModifiedKey before adding the anti-cache parameter
+                       ifModifiedKey = s.url;
+
                        // Add anti-cache in url if needed
                        if ( s.cache === false ) {
                        // Add anti-cache in url if needed
                        if ( s.cache === false ) {
-                               s.url = rts.test( cacheURL ) ?
 
 
-                                       // If there is already a '_' parameter, set its value
-                                       cacheURL.replace( rts, "$1_=" + ajax_nonce++ ) :
+                               var ts = jQuery.now(),
+                                       // try replacing _= if it is there
+                                       ret = s.url.replace( rts, "$1_=" + ts );
 
 
-                                       // Otherwise add one to the end
-                                       cacheURL + ( ajax_rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ajax_nonce++;
+                               // if nothing was replaced, add timestamp to the end
+                               s.url = ret + ( (ret === s.url ) ? ( rquery.test( s.url ) ? "&" : "?" ) + "_=" + ts : "" );
                        }
                }
 
                        }
                }
 
+               // Set the correct header, if data is being sent
+               if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {
+                       jqXHR.setRequestHeader( "Content-Type", s.contentType );
+               }
+
                // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
                if ( s.ifModified ) {
                // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
                if ( s.ifModified ) {
-                       if ( jQuery.lastModified[ cacheURL ] ) {
-                               jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] );
+                       ifModifiedKey = ifModifiedKey || s.url;
+                       if ( jQuery.lastModified[ ifModifiedKey ] ) {
+                               jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ ifModifiedKey ] );
                        }
                        }
-                       if ( jQuery.etag[ cacheURL ] ) {
-                               jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] );
+                       if ( jQuery.etag[ ifModifiedKey ] ) {
+                               jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ ifModifiedKey ] );
                        }
                }
 
                        }
                }
 
-               // Set the correct header, if data is being sent
-               if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {
-                       jqXHR.setRequestHeader( "Content-Type", s.contentType );
-               }
-
                // Set the Accepts header for the server, depending on the dataType
                jqXHR.setRequestHeader(
                        "Accept",
                // Set the Accepts header for the server, depending on the dataType
                jqXHR.setRequestHeader(
                        "Accept",
@@ -7941,12 +7393,11 @@ jQuery.extend({
 
                // Allow custom headers/mimetypes and early abort
                if ( s.beforeSend && ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) {
 
                // Allow custom headers/mimetypes and early abort
                if ( s.beforeSend && ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) {
-                       // Abort if not done already and return
-                       return jqXHR.abort();
-               }
+                               // Abort if not done already
+                               jqXHR.abort();
+                               return false;
 
 
-               // aborting is no longer a cancellation
-               strAbort = "abort";
+               }
 
                // Install callbacks on deferreds
                for ( i in { success: 1, error: 1, complete: 1 } ) {
 
                // Install callbacks on deferreds
                for ( i in { success: 1, error: 1, complete: 1 } ) {
@@ -7961,152 +7412,112 @@ jQuery.extend({
                        done( -1, "No Transport" );
                } else {
                        jqXHR.readyState = 1;
                        done( -1, "No Transport" );
                } else {
                        jqXHR.readyState = 1;
-
                        // Send global event
                        if ( fireGlobals ) {
                                globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] );
                        }
                        // Timeout
                        if ( s.async && s.timeout > 0 ) {
                        // Send global event
                        if ( fireGlobals ) {
                                globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] );
                        }
                        // Timeout
                        if ( s.async && s.timeout > 0 ) {
-                               timeoutTimer = setTimeout(function() {
-                                       jqXHR.abort("timeout");
+                               timeoutTimer = setTimeout( function(){
+                                       jqXHR.abort( "timeout" );
                                }, s.timeout );
                        }
 
                        try {
                                state = 1;
                                transport.send( requestHeaders, done );
                                }, s.timeout );
                        }
 
                        try {
                                state = 1;
                                transport.send( requestHeaders, done );
-                       } catch ( e ) {
+                       } catch (e) {
                                // Propagate exception as error if not done
                                if ( state < 2 ) {
                                        done( -1, e );
                                // Simply rethrow otherwise
                                } else {
                                // Propagate exception as error if not done
                                if ( state < 2 ) {
                                        done( -1, e );
                                // Simply rethrow otherwise
                                } else {
-                                       throw e;
+                                       jQuery.error( e );
                                }
                        }
                }
 
                                }
                        }
                }
 
-               // Callback for when everything is done
-               function done( status, nativeStatusText, responses, headers ) {
-                       var isSuccess, success, error, response, modified,
-                               statusText = nativeStatusText;
-
-                       // Called once
-                       if ( state === 2 ) {
-                               return;
-                       }
-
-                       // State is "done" now
-                       state = 2;
-
-                       // Clear timeout if it exists
-                       if ( timeoutTimer ) {
-                               clearTimeout( timeoutTimer );
-                       }
+               return jqXHR;
+       },
 
 
-                       // Dereference transport for early garbage collection
-                       // (no matter how long the jqXHR object will be used)
-                       transport = undefined;
+       // Serialize an array of form elements or a set of
+       // key/values into a query string
+       param: function( a, traditional ) {
+               var s = [],
+                       add = function( key, value ) {
+                               // If value is a function, invoke it and return its value
+                               value = jQuery.isFunction( value ) ? value() : value;
+                               s[ s.length ] = encodeURIComponent( key ) + "=" + encodeURIComponent( value );
+                       };
 
 
-                       // Cache response headers
-                       responseHeadersString = headers || "";
+               // Set traditional to true for jQuery <= 1.3.2 behavior.
+               if ( traditional === undefined ) {
+                       traditional = jQuery.ajaxSettings.traditional;
+               }
 
 
-                       // Set readyState
-                       jqXHR.readyState = status > 0 ? 4 : 0;
+               // If an array was passed in, assume that it is an array of form elements.
+               if ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
+                       // Serialize the form elements
+                       jQuery.each( a, function() {
+                               add( this.name, this.value );
+                       });
 
 
-                       // Get response data
-                       if ( responses ) {
-                               response = ajaxHandleResponses( s, jqXHR, responses );
+               } else {
+                       // If traditional, encode the "old" way (the way 1.3.2 or older
+                       // did it), otherwise encode params recursively.
+                       for ( var prefix in a ) {
+                               buildParams( prefix, a[ prefix ], traditional, add );
                        }
                        }
+               }
 
 
-                       // If successful, handle type chaining
-                       if ( status >= 200 && status < 300 || status === 304 ) {
-
-                               // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
-                               if ( s.ifModified ) {
-                                       modified = jqXHR.getResponseHeader("Last-Modified");
-                                       if ( modified ) {
-                                               jQuery.lastModified[ cacheURL ] = modified;
-                                       }
-                                       modified = jqXHR.getResponseHeader("etag");
-                                       if ( modified ) {
-                                               jQuery.etag[ cacheURL ] = modified;
-                                       }
-                               }
-
-                               // if no content
-                               if ( status === 204 ) {
-                                       isSuccess = true;
-                                       statusText = "nocontent";
-
-                               // if not modified
-                               } else if ( status === 304 ) {
-                                       isSuccess = true;
-                                       statusText = "notmodified";
-
-                               // If we have data, let's convert it
-                               } else {
-                                       isSuccess = ajaxConvert( s, response );
-                                       statusText = isSuccess.state;
-                                       success = isSuccess.data;
-                                       error = isSuccess.error;
-                                       isSuccess = !error;
-                               }
-                       } else {
-                               // We extract error from statusText
-                               // then normalize statusText and status for non-aborts
-                               error = statusText;
-                               if ( status || !statusText ) {
-                                       statusText = "error";
-                                       if ( status < 0 ) {
-                                               status = 0;
-                                       }
-                               }
-                       }
+               // Return the resulting serialization
+               return s.join( "&" ).replace( r20, "+" );
+       }
+});
 
 
-                       // Set data for the fake xhr object
-                       jqXHR.status = status;
-                       jqXHR.statusText = ( nativeStatusText || statusText ) + "";
+function buildParams( prefix, obj, traditional, add ) {
+       if ( jQuery.isArray( obj ) ) {
+               // Serialize array item.
+               jQuery.each( obj, function( i, v ) {
+                       if ( traditional || rbracket.test( prefix ) ) {
+                               // Treat each array item as a scalar.
+                               add( prefix, v );
 
 
-                       // Success/Error
-                       if ( isSuccess ) {
-                               deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );
                        } else {
                        } else {
-                               deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );
+                               // If array item is non-scalar (array or object), encode its
+                               // numeric index to resolve deserialization ambiguity issues.
+                               // Note that rack (as of 1.0.0) can't currently deserialize
+                               // nested arrays properly, and attempting to do so may cause
+                               // a server error. Possible fixes are to modify rack's
+                               // deserialization algorithm or to provide an option or flag
+                               // to force array serialization to be shallow.
+                               buildParams( prefix + "[" + ( typeof v === "object" || jQuery.isArray(v) ? i : "" ) + "]", v, traditional, add );
                        }
                        }
+               });
 
 
-                       // Status-dependent callbacks
-                       jqXHR.statusCode( statusCode );
-                       statusCode = undefined;
-
-                       if ( fireGlobals ) {
-                               globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError",
-                                       [ jqXHR, s, isSuccess ? success : error ] );
-                       }
+       } else if ( !traditional && obj != null && typeof obj === "object" ) {
+               // Serialize object item.
+               for ( var name in obj ) {
+                       buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );
+               }
 
 
-                       // Complete
-                       completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );
+       } else {
+               // Serialize scalar item.
+               add( prefix, obj );
+       }
+}
 
 
-                       if ( fireGlobals ) {
-                               globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] );
-                               // Handle the global AJAX counter
-                               if ( !( --jQuery.active ) ) {
-                                       jQuery.event.trigger("ajaxStop");
-                               }
-                       }
-               }
+// This is still on the jQuery object... for now
+// Want to move this to jQuery.ajax some day
+jQuery.extend({
 
 
-               return jqXHR;
-       },
+       // Counter for holding the number of active queries
+       active: 0,
 
 
-       getScript: function( url, callback ) {
-               return jQuery.get( url, undefined, callback, "script" );
-       },
+       // Last-Modified header cache for next request
+       lastModified: {},
+       etag: {}
 
 
-       getJSON: function( url, data, callback ) {
-               return jQuery.get( url, data, callback, "json" );
-       }
 });
 
 /* Handles responses to an ajax request:
 });
 
 /* Handles responses to an ajax request:
@@ -8115,13 +7526,17 @@ jQuery.extend({
  * - returns the corresponding response
  */
 function ajaxHandleResponses( s, jqXHR, responses ) {
  * - returns the corresponding response
  */
 function ajaxHandleResponses( s, jqXHR, responses ) {
-       var firstDataType, ct, finalDataType, type,
-               contents = s.contents,
+
+       var contents = s.contents,
                dataTypes = s.dataTypes,
                dataTypes = s.dataTypes,
-               responseFields = s.responseFields;
+               responseFields = s.responseFields,
+               ct,
+               type,
+               finalDataType,
+               firstDataType;
 
        // Fill responseXXX fields
 
        // Fill responseXXX fields
-       for ( type in responseFields ) {
+       for( type in responseFields ) {
                if ( type in responses ) {
                        jqXHR[ responseFields[type] ] = responses[ type ];
                }
                if ( type in responses ) {
                        jqXHR[ responseFields[type] ] = responses[ type ];
                }
@@ -8131,7 +7546,7 @@ function ajaxHandleResponses( s, jqXHR, responses ) {
        while( dataTypes[ 0 ] === "*" ) {
                dataTypes.shift();
                if ( ct === undefined ) {
        while( dataTypes[ 0 ] === "*" ) {
                dataTypes.shift();
                if ( ct === undefined ) {
-                       ct = s.mimeType || jqXHR.getResponseHeader("Content-Type");
+                       ct = s.mimeType || jqXHR.getResponseHeader( "content-type" );
                }
        }
 
                }
        }
 
@@ -8176,95 +7591,178 @@ function ajaxHandleResponses( s, jqXHR, responses ) {
 
 // Chain conversions given the request and the original response
 function ajaxConvert( s, response ) {
 
 // Chain conversions given the request and the original response
 function ajaxConvert( s, response ) {
-       var conv2, current, conv, tmp,
-               converters = {},
-               i = 0,
-               // Work with a copy of dataTypes in case we need to modify it for conversion
-               dataTypes = s.dataTypes.slice(),
-               prev = dataTypes[ 0 ];
 
        // Apply the dataFilter if provided
        if ( s.dataFilter ) {
                response = s.dataFilter( response, s.dataType );
        }
 
 
        // Apply the dataFilter if provided
        if ( s.dataFilter ) {
                response = s.dataFilter( response, s.dataType );
        }
 
-       // Create converters map with lowercased keys
-       if ( dataTypes[ 1 ] ) {
-               for ( conv in s.converters ) {
-                       converters[ conv.toLowerCase() ] = s.converters[ conv ];
+       var dataTypes = s.dataTypes,
+               converters = {},
+               i,
+               key,
+               length = dataTypes.length,
+               tmp,
+               // Current and previous dataTypes
+               current = dataTypes[ 0 ],
+               prev,
+               // Conversion expression
+               conversion,
+               // Conversion function
+               conv,
+               // Conversion functions (transitive conversion)
+               conv1,
+               conv2;
+
+       // For each dataType in the chain
+       for( i = 1; i < length; i++ ) {
+
+               // Create converters map
+               // with lowercased keys
+               if ( i === 1 ) {
+                       for( key in s.converters ) {
+                               if( typeof key === "string" ) {
+                                       converters[ key.toLowerCase() ] = s.converters[ key ];
+                               }
+                       }
+               }
+
+               // Get the dataTypes
+               prev = current;
+               current = dataTypes[ i ];
+
+               // If current is auto dataType, update it to prev
+               if( current === "*" ) {
+                       current = prev;
+               // If no auto and dataTypes are actually different
+               } else if ( prev !== "*" && prev !== current ) {
+
+                       // Get the converter
+                       conversion = prev + " " + current;
+                       conv = converters[ conversion ] || converters[ "* " + current ];
+
+                       // If there is no direct converter, search transitively
+                       if ( !conv ) {
+                               conv2 = undefined;
+                               for( conv1 in converters ) {
+                                       tmp = conv1.split( " " );
+                                       if ( tmp[ 0 ] === prev || tmp[ 0 ] === "*" ) {
+                                               conv2 = converters[ tmp[1] + " " + current ];
+                                               if ( conv2 ) {
+                                                       conv1 = converters[ conv1 ];
+                                                       if ( conv1 === true ) {
+                                                               conv = conv2;
+                                                       } else if ( conv2 === true ) {
+                                                               conv = conv1;
+                                                       }
+                                                       break;
+                                               }
+                                       }
+                               }
+                       }
+                       // If we found no converter, dispatch an error
+                       if ( !( conv || conv2 ) ) {
+                               jQuery.error( "No conversion from " + conversion.replace(" "," to ") );
+                       }
+                       // If found converter is not an equivalence
+                       if ( conv !== true ) {
+                               // Convert with 1 or 2 converters accordingly
+                               response = conv ? conv( response ) : conv2( conv1(response) );
+                       }
                }
        }
                }
        }
+       return response;
+}
+
+
+
+
+var jsc = jQuery.now(),
+       jsre = /(\=)\?(&|$)|\?\?/i;
+
+// Default jsonp settings
+jQuery.ajaxSetup({
+       jsonp: "callback",
+       jsonpCallback: function() {
+               return jQuery.expando + "_" + ( jsc++ );
+       }
+});
+
+// Detect, normalize options and install callbacks for jsonp requests
+jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
+
+       var inspectData = s.contentType === "application/x-www-form-urlencoded" &&
+               ( typeof s.data === "string" );
 
 
-       // Convert to each sequential dataType, tolerating list modification
-       for ( ; (current = dataTypes[++i]); ) {
+       if ( s.dataTypes[ 0 ] === "jsonp" ||
+               s.jsonp !== false && ( jsre.test( s.url ) ||
+                               inspectData && jsre.test( s.data ) ) ) {
 
 
-               // There's only work to do if current dataType is non-auto
-               if ( current !== "*" ) {
+               var responseContainer,
+                       jsonpCallback = s.jsonpCallback =
+                               jQuery.isFunction( s.jsonpCallback ) ? s.jsonpCallback() : s.jsonpCallback,
+                       previous = window[ jsonpCallback ],
+                       url = s.url,
+                       data = s.data,
+                       replace = "$1" + jsonpCallback + "$2";
 
 
-                       // Convert response if prev dataType is non-auto and differs from current
-                       if ( prev !== "*" && prev !== current ) {
+               if ( s.jsonp !== false ) {
+                       url = url.replace( jsre, replace );
+                       if ( s.url === url ) {
+                               if ( inspectData ) {
+                                       data = data.replace( jsre, replace );
+                               }
+                               if ( s.data === data ) {
+                                       // Add callback manually
+                                       url += (/\?/.test( url ) ? "&" : "?") + s.jsonp + "=" + jsonpCallback;
+                               }
+                       }
+               }
 
 
-                               // Seek a direct converter
-                               conv = converters[ prev + " " + current ] || converters[ "* " + current ];
+               s.url = url;
+               s.data = data;
 
 
-                               // If none found, seek a pair
-                               if ( !conv ) {
-                                       for ( conv2 in converters ) {
+               // Install callback
+               window[ jsonpCallback ] = function( response ) {
+                       responseContainer = [ response ];
+               };
 
 
-                                               // If conv2 outputs current
-                                               tmp = conv2.split(" ");
-                                               if ( tmp[ 1 ] === current ) {
+               // Clean-up function
+               jqXHR.always(function() {
+                       // Set callback back to previous value
+                       window[ jsonpCallback ] = previous;
+                       // Call if it was a function and we have a response
+                       if ( responseContainer && jQuery.isFunction( previous ) ) {
+                               window[ jsonpCallback ]( responseContainer[ 0 ] );
+                       }
+               });
 
 
-                                                       // If prev can be converted to accepted input
-                                                       conv = converters[ prev + " " + tmp[ 0 ] ] ||
-                                                               converters[ "* " + tmp[ 0 ] ];
-                                                       if ( conv ) {
-                                                               // Condense equivalence converters
-                                                               if ( conv === true ) {
-                                                                       conv = converters[ conv2 ];
+               // Use data converter to retrieve json after script execution
+               s.converters["script json"] = function() {
+                       if ( !responseContainer ) {
+                               jQuery.error( jsonpCallback + " was not called" );
+                       }
+                       return responseContainer[ 0 ];
+               };
 
 
-                                                               // Otherwise, insert the intermediate dataType
-                                                               } else if ( converters[ conv2 ] !== true ) {
-                                                                       current = tmp[ 0 ];
-                                                                       dataTypes.splice( i--, 0, current );
-                                                               }
+               // force json dataType
+               s.dataTypes[ 0 ] = "json";
 
 
-                                                               break;
-                                                       }
-                                               }
-                                       }
-                               }
+               // Delegate to script
+               return "script";
+       }
+});
 
 
-                               // Apply converter (if not an equivalence)
-                               if ( conv !== true ) {
 
 
-                                       // Unless errors are allowed to bubble, catch and return them
-                                       if ( conv && s["throws"] ) {
-                                               response = conv( response );
-                                       } else {
-                                               try {
-                                                       response = conv( response );
-                                               } catch ( e ) {
-                                                       return { state: "parsererror", error: conv ? e : "No conversion from " + prev + " to " + current };
-                                               }
-                                       }
-                               }
-                       }
 
 
-                       // Update prev for next iteration
-                       prev = current;
-               }
-       }
 
 
-       return { state: "success", data: response };
-}
 // Install script dataType
 jQuery.ajaxSetup({
        accepts: {
                script: "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"
        },
        contents: {
 // Install script dataType
 jQuery.ajaxSetup({
        accepts: {
                script: "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"
        },
        contents: {
-               script: /(?:java|ecma)script/
+               script: /javascript|ecmascript/
        },
        converters: {
                "text script": function( text ) {
        },
        converters: {
                "text script": function( text ) {
@@ -8292,15 +7790,15 @@ jQuery.ajaxTransport( "script", function(s) {
        if ( s.crossDomain ) {
 
                var script,
        if ( s.crossDomain ) {
 
                var script,
-                       head = document.head || jQuery("head")[0] || document.documentElement;
+                       head = document.head || document.getElementsByTagName( "head" )[0] || document.documentElement;
 
                return {
 
                        send: function( _, callback ) {
 
 
                return {
 
                        send: function( _, callback ) {
 
-                               script = document.createElement("script");
+                               script = document.createElement( "script" );
 
 
-                               script.async = true;
+                               script.async = "async";
 
                                if ( s.scriptCharset ) {
                                        script.charset = s.scriptCharset;
 
                                if ( s.scriptCharset ) {
                                        script.charset = s.scriptCharset;
@@ -8317,12 +7815,12 @@ jQuery.ajaxTransport( "script", function(s) {
                                                script.onload = script.onreadystatechange = null;
 
                                                // Remove the script
                                                script.onload = script.onreadystatechange = null;
 
                                                // Remove the script
-                                               if ( script.parentNode ) {
-                                                       script.parentNode.removeChild( script );
+                                               if ( head && script.parentNode ) {
+                                                       head.removeChild( script );
                                                }
 
                                                // Dereference the script
                                                }
 
                                                // Dereference the script
-                                               script = null;
+                                               script = undefined;
 
                                                // Callback if not abort
                                                if ( !isAbort ) {
 
                                                // Callback if not abort
                                                if ( !isAbort ) {
@@ -8330,110 +7828,32 @@ jQuery.ajaxTransport( "script", function(s) {
                                                }
                                        }
                                };
                                                }
                                        }
                                };
-
-                               // Circumvent IE6 bugs with base elements (#2709 and #4378) by prepending
-                               // Use native DOM manipulation to avoid our domManip AJAX trickery
+                               // Use insertBefore instead of appendChild  to circumvent an IE6 bug.
+                               // This arises when a base node is used (#2709 and #4378).
                                head.insertBefore( script, head.firstChild );
                        },
 
                        abort: function() {
                                if ( script ) {
                                head.insertBefore( script, head.firstChild );
                        },
 
                        abort: function() {
                                if ( script ) {
-                                       script.onload( undefined, true );
+                                       script.onload( 0, 1 );
                                }
                        }
                };
        }
 });
                                }
                        }
                };
        }
 });
-var oldCallbacks = [],
-       rjsonp = /(=)\?(?=&|$)|\?\?/;
-
-// Default jsonp settings
-jQuery.ajaxSetup({
-       jsonp: "callback",
-       jsonpCallback: function() {
-               var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( ajax_nonce++ ) );
-               this[ callback ] = true;
-               return callback;
-       }
-});
-
-// Detect, normalize options and install callbacks for jsonp requests
-jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
-
-       var callbackName, overwritten, responseContainer,
-               jsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ?
-                       "url" :
-                       typeof s.data === "string" && !( s.contentType || "" ).indexOf("application/x-www-form-urlencoded") && rjsonp.test( s.data ) && "data"
-               );
-
-       // Handle iff the expected data type is "jsonp" or we have a parameter to set
-       if ( jsonProp || s.dataTypes[ 0 ] === "jsonp" ) {
-
-               // Get callback name, remembering preexisting value associated with it
-               callbackName = s.jsonpCallback = jQuery.isFunction( s.jsonpCallback ) ?
-                       s.jsonpCallback() :
-                       s.jsonpCallback;
-
-               // Insert callback into url or form data
-               if ( jsonProp ) {
-                       s[ jsonProp ] = s[ jsonProp ].replace( rjsonp, "$1" + callbackName );
-               } else if ( s.jsonp !== false ) {
-                       s.url += ( ajax_rquery.test( s.url ) ? "&" : "?" ) + s.jsonp + "=" + callbackName;
-               }
-
-               // Use data converter to retrieve json after script execution
-               s.converters["script json"] = function() {
-                       if ( !responseContainer ) {
-                               jQuery.error( callbackName + " was not called" );
-                       }
-                       return responseContainer[ 0 ];
-               };
-
-               // force json dataType
-               s.dataTypes[ 0 ] = "json";
-
-               // Install callback
-               overwritten = window[ callbackName ];
-               window[ callbackName ] = function() {
-                       responseContainer = arguments;
-               };
 
 
-               // Clean-up function (fires after converters)
-               jqXHR.always(function() {
-                       // Restore preexisting value
-                       window[ callbackName ] = overwritten;
-
-                       // Save back as free
-                       if ( s[ callbackName ] ) {
-                               // make sure that re-using the options doesn't screw things around
-                               s.jsonpCallback = originalSettings.jsonpCallback;
-
-                               // save the callback name for future use
-                               oldCallbacks.push( callbackName );
-                       }
 
 
-                       // Call if it was a function and we have a response
-                       if ( responseContainer && jQuery.isFunction( overwritten ) ) {
-                               overwritten( responseContainer[ 0 ] );
-                       }
 
 
-                       responseContainer = overwritten = undefined;
-               });
 
 
-               // Delegate to script
-               return "script";
-       }
-});
-var xhrCallbacks, xhrSupported,
-       xhrId = 0,
-       // #5280: Internet Explorer will keep connections alive if we don't abort on unload
-       xhrOnUnloadAbort = window.ActiveXObject && function() {
+var // #5280: Internet Explorer will keep connections alive if we don't abort on unload
+       xhrOnUnloadAbort = window.ActiveXObject ? function() {
                // Abort all pending requests
                // Abort all pending requests
-               var key;
-               for ( key in xhrCallbacks ) {
-                       xhrCallbacks[ key ]( undefined, true );
+               for ( var key in xhrCallbacks ) {
+                       xhrCallbacks[ key ]( 0, 1 );
                }
                }
-       };
+       } : false,
+       xhrId = 0,
+       xhrCallbacks;
 
 // Functions to create xhrs
 function createStandardXHR() {
 
 // Functions to create xhrs
 function createStandardXHR() {
@@ -8444,7 +7864,7 @@ function createStandardXHR() {
 
 function createActiveXHR() {
        try {
 
 function createActiveXHR() {
        try {
-               return new window.ActiveXObject("Microsoft.XMLHTTP");
+               return new window.ActiveXObject( "Microsoft.XMLHTTP" );
        } catch( e ) {}
 }
 
        } catch( e ) {}
 }
 
@@ -8464,12 +7884,15 @@ jQuery.ajaxSettings.xhr = window.ActiveXObject ?
        createStandardXHR;
 
 // Determine support properties
        createStandardXHR;
 
 // Determine support properties
-xhrSupported = jQuery.ajaxSettings.xhr();
-jQuery.support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported );
-xhrSupported = jQuery.support.ajax = !!xhrSupported;
+(function( xhr ) {
+       jQuery.extend( jQuery.support, {
+               ajax: !!xhr,
+               cors: !!xhr && ( "withCredentials" in xhr )
+       });
+})( jQuery.ajaxSettings.xhr() );
 
 // Create transport if the browser can provide an xhr
 
 // Create transport if the browser can provide an xhr
-if ( xhrSupported ) {
+if ( jQuery.support.ajax ) {
 
        jQuery.ajaxTransport(function( s ) {
                // Cross domain only allowed if supported through XMLHttpRequest
 
        jQuery.ajaxTransport(function( s ) {
                // Cross domain only allowed if supported through XMLHttpRequest
@@ -8481,8 +7904,9 @@ if ( xhrSupported ) {
                                send: function( headers, complete ) {
 
                                        // Get a new xhr
                                send: function( headers, complete ) {
 
                                        // Get a new xhr
-                                       var handle, i,
-                                               xhr = s.xhr();
+                                       var xhr = s.xhr(),
+                                               handle,
+                                               i;
 
                                        // Open the socket
                                        // Passing null username, generates a login popup on Opera (#2865)
 
                                        // Open the socket
                                        // Passing null username, generates a login popup on Opera (#2865)
@@ -8510,7 +7934,7 @@ if ( xhrSupported ) {
                                        // (it can always be set on a per-request basis or even using ajaxSetup)
                                        // For same-domain requests, won't change header if already provided.
                                        if ( !s.crossDomain && !headers["X-Requested-With"] ) {
                                        // (it can always be set on a per-request basis or even using ajaxSetup)
                                        // For same-domain requests, won't change header if already provided.
                                        if ( !s.crossDomain && !headers["X-Requested-With"] ) {
-                                               headers["X-Requested-With"] = "XMLHttpRequest";
+                                               headers[ "X-Requested-With" ] = "XMLHttpRequest";
                                        }
 
                                        // Need an extra try/catch for cross domain requests in Firefox 3
                                        }
 
                                        // Need an extra try/catch for cross domain requests in Firefox 3
@@ -8518,7 +7942,7 @@ if ( xhrSupported ) {
                                                for ( i in headers ) {
                                                        xhr.setRequestHeader( i, headers[ i ] );
                                                }
                                                for ( i in headers ) {
                                                        xhr.setRequestHeader( i, headers[ i ] );
                                                }
-                                       } catch( err ) {}
+                                       } catch( _ ) {}
 
                                        // Do send the request
                                        // This may raise an exception which is actually
 
                                        // Do send the request
                                        // This may raise an exception which is actually
@@ -8527,10 +7951,15 @@ if ( xhrSupported ) {
 
                                        // Listener
                                        callback = function( _, isAbort ) {
 
                                        // Listener
                                        callback = function( _, isAbort ) {
-                                               var status, responseHeaders, statusText, responses;
+
+                                               var status,
+                                                       statusText,
+                                                       responseHeaders,
+                                                       responses,
+                                                       xml;
 
                                                // Firefox throws exceptions when accessing properties
 
                                                // Firefox throws exceptions when accessing properties
-                                               // of an xhr when a network error occurred
+                                               // of an xhr when a network error occured
                                                // http://helpful.knobs-dials.com/index.php/Component_returned_failure_code:_0x80040111_(NS_ERROR_NOT_AVAILABLE)
                                                try {
 
                                                // http://helpful.knobs-dials.com/index.php/Component_returned_failure_code:_0x80040111_(NS_ERROR_NOT_AVAILABLE)
                                                try {
 
@@ -8555,15 +7984,16 @@ if ( xhrSupported ) {
                                                                                xhr.abort();
                                                                        }
                                                                } else {
                                                                                xhr.abort();
                                                                        }
                                                                } else {
-                                                                       responses = {};
                                                                        status = xhr.status;
                                                                        responseHeaders = xhr.getAllResponseHeaders();
                                                                        status = xhr.status;
                                                                        responseHeaders = xhr.getAllResponseHeaders();
+                                                                       responses = {};
+                                                                       xml = xhr.responseXML;
 
 
-                                                                       // When requesting binary data, IE6-9 will throw an exception
-                                                                       // on any attempt to access responseText (#11426)
-                                                                       if ( typeof xhr.responseText === "string" ) {
-                                                                               responses.text = xhr.responseText;
+                                                                       // Construct response list
+                                                                       if ( xml && xml.documentElement /* #4958 */ ) {
+                                                                               responses.xml = xml;
                                                                        }
                                                                        }
+                                                                       responses.text = xhr.responseText;
 
                                                                        // Firefox throws an exception when accessing
                                                                        // statusText for faulty cross-domain requests
 
                                                                        // Firefox throws an exception when accessing
                                                                        // statusText for faulty cross-domain requests
@@ -8599,13 +8029,11 @@ if ( xhrSupported ) {
                                                }
                                        };
 
                                                }
                                        };
 
-                                       if ( !s.async ) {
-                                               // if we're in sync mode we fire the callback
+                                       // if we're in sync mode or it's in cache
+                                       // and has been retrieved directly (IE6 & IE7)
+                                       // we need to manually fire the callback
+                                       if ( !s.async || xhr.readyState === 4 ) {
                                                callback();
                                                callback();
-                                       } else if ( xhr.readyState === 4 ) {
-                                               // (IE6 & IE7) if it's in cache and has been
-                                               // retrieved directly we need to fire the callback
-                                               setTimeout( callback );
                                        } else {
                                                handle = ++xhrId;
                                                if ( xhrOnUnloadAbort ) {
                                        } else {
                                                handle = ++xhrId;
                                                if ( xhrOnUnloadAbort ) {
@@ -8624,781 +8052,786 @@ if ( xhrSupported ) {
 
                                abort: function() {
                                        if ( callback ) {
 
                                abort: function() {
                                        if ( callback ) {
-                                               callback( undefined, true );
+                                               callback(0,1);
                                        }
                                }
                        };
                }
        });
 }
                                        }
                                }
                        };
                }
        });
 }
-var fxNow, timerId,
+
+
+
+
+var elemdisplay = {},
+       iframe, iframeDoc,
        rfxtypes = /^(?:toggle|show|hide)$/,
        rfxtypes = /^(?:toggle|show|hide)$/,
-       rfxnum = new RegExp( "^(?:([+-])=|)(" + core_pnum + ")([a-z%]*)$", "i" ),
-       rrun = /queueHooks$/,
-       animationPrefilters = [ defaultPrefilter ],
-       tweeners = {
-               "*": [function( prop, value ) {
-                       var end, unit,
-                               tween = this.createTween( prop, value ),
-                               parts = rfxnum.exec( value ),
-                               target = tween.cur(),
-                               start = +target || 0,
-                               scale = 1,
-                               maxIterations = 20;
-
-                       if ( parts ) {
-                               end = +parts[2];
-                               unit = parts[3] || ( jQuery.cssNumber[ prop ] ? "" : "px" );
-
-                               // We need to compute starting value
-                               if ( unit !== "px" && start ) {
-                                       // Iteratively approximate from a nonzero starting point
-                                       // Prefer the current property, because this process will be trivial if it uses the same units
-                                       // Fallback to end or a simple constant
-                                       start = jQuery.css( tween.elem, prop, true ) || end || 1;
-
-                                       do {
-                                               // If previous iteration zeroed out, double until we get *something*
-                                               // Use a string for doubling factor so we don't accidentally see scale as unchanged below
-                                               scale = scale || ".5";
-
-                                               // Adjust and apply
-                                               start = start / scale;
-                                               jQuery.style( tween.elem, prop, start + unit );
-
-                                       // Update scale, tolerating zero or NaN from tween.cur()
-                                       // And breaking the loop if scale is unchanged or perfect, or if we've just had enough
-                                       } while ( scale !== (scale = tween.cur() / target) && scale !== 1 && --maxIterations );
-                               }
-
-                               tween.unit = unit;
-                               tween.start = start;
-                               // If a +=/-= token was provided, we're doing a relative animation
-                               tween.end = parts[1] ? start + ( parts[1] + 1 ) * end : end;
-                       }
-                       return tween;
-               }]
-       };
+       rfxnum = /^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,
+       timerId,
+       fxAttrs = [
+               // height animations
+               [ "height", "marginTop", "marginBottom", "paddingTop", "paddingBottom" ],
+               // width animations
+               [ "width", "marginLeft", "marginRight", "paddingLeft", "paddingRight" ],
+               // opacity animations
+               [ "opacity" ]
+       ],
+       fxNow;
 
 
-// Animations created synchronously will run synchronously
-function createFxNow() {
-       setTimeout(function() {
-               fxNow = undefined;
-       });
-       return ( fxNow = jQuery.now() );
-}
+jQuery.fn.extend({
+       show: function( speed, easing, callback ) {
+               var elem, display;
 
 
-function createTweens( animation, props ) {
-       jQuery.each( props, function( prop, value ) {
-               var collection = ( tweeners[ prop ] || [] ).concat( tweeners[ "*" ] ),
-                       index = 0,
-                       length = collection.length;
-               for ( ; index < length; index++ ) {
-                       if ( collection[ index ].call( animation, prop, value ) ) {
+               if ( speed || speed === 0 ) {
+                       return this.animate( genFx("show", 3), speed, easing, callback);
 
 
-                               // we're done with this property
-                               return;
+               } else {
+                       for ( var i = 0, j = this.length; i < j; i++ ) {
+                               elem = this[i];
+
+                               if ( elem.style ) {
+                                       display = elem.style.display;
+
+                                       // Reset the inline display of this element to learn if it is
+                                       // being hidden by cascaded rules or not
+                                       if ( !jQuery._data(elem, "olddisplay") && display === "none" ) {
+                                               display = elem.style.display = "";
+                                       }
+
+                                       // Set elements which have been overridden with display: none
+                                       // in a stylesheet to whatever the default browser style is
+                                       // for such an element
+                                       if ( display === "" && jQuery.css( elem, "display" ) === "none" ) {
+                                               jQuery._data(elem, "olddisplay", defaultDisplay(elem.nodeName));
+                                       }
+                               }
+                       }
+
+                       // Set the display of most of the elements in a second loop
+                       // to avoid the constant reflow
+                       for ( i = 0; i < j; i++ ) {
+                               elem = this[i];
+
+                               if ( elem.style ) {
+                                       display = elem.style.display;
+
+                                       if ( display === "" || display === "none" ) {
+                                               elem.style.display = jQuery._data(elem, "olddisplay") || "";
+                                       }
+                               }
                        }
                        }
+
+                       return this;
                }
                }
-       });
-}
+       },
 
 
-function Animation( elem, properties, options ) {
-       var result,
-               stopped,
-               index = 0,
-               length = animationPrefilters.length,
-               deferred = jQuery.Deferred().always( function() {
-                       // don't match elem in the :animated selector
-                       delete tick.elem;
-               }),
-               tick = function() {
-                       if ( stopped ) {
-                               return false;
+       hide: function( speed, easing, callback ) {
+               if ( speed || speed === 0 ) {
+                       return this.animate( genFx("hide", 3), speed, easing, callback);
+
+               } else {
+                       for ( var i = 0, j = this.length; i < j; i++ ) {
+                               if ( this[i].style ) {
+                                       var display = jQuery.css( this[i], "display" );
+
+                                       if ( display !== "none" && !jQuery._data( this[i], "olddisplay" ) ) {
+                                               jQuery._data( this[i], "olddisplay", display );
+                                       }
+                               }
                        }
                        }
-                       var currentTime = fxNow || createFxNow(),
-                               remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),
-                               // archaic crash bug won't allow us to use 1 - ( 0.5 || 0 ) (#12497)
-                               temp = remaining / animation.duration || 0,
-                               percent = 1 - temp,
-                               index = 0,
-                               length = animation.tweens.length;
 
 
-                       for ( ; index < length ; index++ ) {
-                               animation.tweens[ index ].run( percent );
+                       // Set the display of the elements in a second loop
+                       // to avoid the constant reflow
+                       for ( i = 0; i < j; i++ ) {
+                               if ( this[i].style ) {
+                                       this[i].style.display = "none";
+                               }
                        }
 
                        }
 
-                       deferred.notifyWith( elem, [ animation, percent, remaining ]);
+                       return this;
+               }
+       },
 
 
-                       if ( percent < 1 && length ) {
-                               return remaining;
-                       } else {
-                               deferred.resolveWith( elem, [ animation ] );
-                               return false;
+       // Save the old toggle function
+       _toggle: jQuery.fn.toggle,
+
+       toggle: function( fn, fn2, callback ) {
+               var bool = typeof fn === "boolean";
+
+               if ( jQuery.isFunction(fn) && jQuery.isFunction(fn2) ) {
+                       this._toggle.apply( this, arguments );
+
+               } else if ( fn == null || bool ) {
+                       this.each(function() {
+                               var state = bool ? fn : jQuery(this).is(":hidden");
+                               jQuery(this)[ state ? "show" : "hide" ]();
+                       });
+
+               } else {
+                       this.animate(genFx("toggle", 3), fn, fn2, callback);
+               }
+
+               return this;
+       },
+
+       fadeTo: function( speed, to, easing, callback ) {
+               return this.filter(":hidden").css("opacity", 0).show().end()
+                                       .animate({opacity: to}, speed, easing, callback);
+       },
+
+       animate: function( prop, speed, easing, callback ) {
+               var optall = jQuery.speed(speed, easing, callback);
+
+               if ( jQuery.isEmptyObject( prop ) ) {
+                       return this.each( optall.complete, [ false ] );
+               }
+
+               // Do not change referenced properties as per-property easing will be lost
+               prop = jQuery.extend( {}, prop );
+
+               return this[ optall.queue === false ? "each" : "queue" ](function() {
+                       // XXX 'this' does not always have a nodeName when running the
+                       // test suite
+
+                       if ( optall.queue === false ) {
+                               jQuery._mark( this );
                        }
                        }
-               },
-               animation = deferred.promise({
-                       elem: elem,
-                       props: jQuery.extend( {}, properties ),
-                       opts: jQuery.extend( true, { specialEasing: {} }, options ),
-                       originalProperties: properties,
-                       originalOptions: options,
-                       startTime: fxNow || createFxNow(),
-                       duration: options.duration,
-                       tweens: [],
-                       createTween: function( prop, end ) {
-                               var tween = jQuery.Tween( elem, animation.opts, prop, end,
-                                               animation.opts.specialEasing[ prop ] || animation.opts.easing );
-                               animation.tweens.push( tween );
-                               return tween;
-                       },
-                       stop: function( gotoEnd ) {
-                               var index = 0,
-                                       // if we are going to the end, we want to run all the tweens
-                                       // otherwise we skip this part
-                                       length = gotoEnd ? animation.tweens.length : 0;
-                               if ( stopped ) {
-                                       return this;
+
+                       var opt = jQuery.extend( {}, optall ),
+                               isElement = this.nodeType === 1,
+                               hidden = isElement && jQuery(this).is(":hidden"),
+                               name, val, p,
+                               display, e,
+                               parts, start, end, unit;
+
+                       // will store per property easing and be used to determine when an animation is complete
+                       opt.animatedProperties = {};
+
+                       for ( p in prop ) {
+
+                               // property name normalization
+                               name = jQuery.camelCase( p );
+                               if ( p !== name ) {
+                                       prop[ name ] = prop[ p ];
+                                       delete prop[ p ];
+                               }
+
+                               val = prop[ name ];
+
+                               // easing resolution: per property > opt.specialEasing > opt.easing > 'swing' (default)
+                               if ( jQuery.isArray( val ) ) {
+                                       opt.animatedProperties[ name ] = val[ 1 ];
+                                       val = prop[ name ] = val[ 0 ];
+                               } else {
+                                       opt.animatedProperties[ name ] = opt.specialEasing && opt.specialEasing[ name ] || opt.easing || 'swing';
+                               }
+
+                               if ( val === "hide" && hidden || val === "show" && !hidden ) {
+                                       return opt.complete.call( this );
                                }
                                }
-                               stopped = true;
-                               for ( ; index < length ; index++ ) {
-                                       animation.tweens[ index ].run( 1 );
+
+                               if ( isElement && ( name === "height" || name === "width" ) ) {
+                                       // Make sure that nothing sneaks out
+                                       // Record all 3 overflow attributes because IE does not
+                                       // change the overflow attribute when overflowX and
+                                       // overflowY are set to the same value
+                                       opt.overflow = [ this.style.overflow, this.style.overflowX, this.style.overflowY ];
+
+                                       // Set display property to inline-block for height/width
+                                       // animations on inline elements that are having width/height
+                                       // animated
+                                       if ( jQuery.css( this, "display" ) === "inline" &&
+                                                       jQuery.css( this, "float" ) === "none" ) {
+                                               if ( !jQuery.support.inlineBlockNeedsLayout ) {
+                                                       this.style.display = "inline-block";
+
+                                               } else {
+                                                       display = defaultDisplay( this.nodeName );
+
+                                                       // inline-level elements accept inline-block;
+                                                       // block-level elements need to be inline with layout
+                                                       if ( display === "inline" ) {
+                                                               this.style.display = "inline-block";
+
+                                                       } else {
+                                                               this.style.display = "inline";
+                                                               this.style.zoom = 1;
+                                                       }
+                                               }
+                                       }
                                }
                                }
+                       }
+
+                       if ( opt.overflow != null ) {
+                               this.style.overflow = "hidden";
+                       }
+
+                       for ( p in prop ) {
+                               e = new jQuery.fx( this, opt, p );
+                               val = prop[ p ];
+
+                               if ( rfxtypes.test(val) ) {
+                                       e[ val === "toggle" ? hidden ? "show" : "hide" : val ]();
 
 
-                               // resolve when we played the last frame
-                               // otherwise, reject
-                               if ( gotoEnd ) {
-                                       deferred.resolveWith( elem, [ animation, gotoEnd ] );
                                } else {
                                } else {
-                                       deferred.rejectWith( elem, [ animation, gotoEnd ] );
+                                       parts = rfxnum.exec( val );
+                                       start = e.cur();
+
+                                       if ( parts ) {
+                                               end = parseFloat( parts[2] );
+                                               unit = parts[3] || ( jQuery.cssNumber[ p ] ? "" : "px" );
+
+                                               // We need to compute starting value
+                                               if ( unit !== "px" ) {
+                                                       jQuery.style( this, p, (end || 1) + unit);
+                                                       start = ((end || 1) / e.cur()) * start;
+                                                       jQuery.style( this, p, start + unit);
+                                               }
+
+                                               // If a +=/-= token was provided, we're doing a relative animation
+                                               if ( parts[1] ) {
+                                                       end = ( (parts[ 1 ] === "-=" ? -1 : 1) * end ) + start;
+                                               }
+
+                                               e.custom( start, end, unit );
+
+                                       } else {
+                                               e.custom( start, val, "" );
+                                       }
                                }
                                }
-                               return this;
                        }
                        }
-               }),
-               props = animation.props;
 
 
-       propFilter( props, animation.opts.specialEasing );
+                       // For JS strict compliance
+                       return true;
+               });
+       },
 
 
-       for ( ; index < length ; index++ ) {
-               result = animationPrefilters[ index ].call( animation, elem, props, animation.opts );
-               if ( result ) {
-                       return result;
+       stop: function( clearQueue, gotoEnd ) {
+               if ( clearQueue ) {
+                       this.queue([]);
                }
                }
-       }
 
 
-       createTweens( animation, props );
+               this.each(function() {
+                       var timers = jQuery.timers,
+                               i = timers.length;
+                       // clear marker counters if we know they won't be
+                       if ( !gotoEnd ) {
+                               jQuery._unmark( true, this );
+                       }
+                       while ( i-- ) {
+                               if ( timers[i].elem === this ) {
+                                       if (gotoEnd) {
+                                               // force the next step to be the last
+                                               timers[i](true);
+                                       }
+
+                                       timers.splice(i, 1);
+                               }
+                       }
+               });
+
+               // start the next in the queue if the last step wasn't forced
+               if ( !gotoEnd ) {
+                       this.dequeue();
+               }
 
 
-       if ( jQuery.isFunction( animation.opts.start ) ) {
-               animation.opts.start.call( elem, animation );
+               return this;
        }
 
        }
 
-       jQuery.fx.timer(
-               jQuery.extend( tick, {
-                       elem: elem,
-                       anim: animation,
-                       queue: animation.opts.queue
-               })
-       );
+});
 
 
-       // attach callbacks from options
-       return animation.progress( animation.opts.progress )
-               .done( animation.opts.done, animation.opts.complete )
-               .fail( animation.opts.fail )
-               .always( animation.opts.always );
+// Animations created synchronously will run synchronously
+function createFxNow() {
+       setTimeout( clearFxNow, 0 );
+       return ( fxNow = jQuery.now() );
 }
 
 }
 
-function propFilter( props, specialEasing ) {
-       var value, name, index, easing, hooks;
+function clearFxNow() {
+       fxNow = undefined;
+}
 
 
-       // camelCase, specialEasing and expand cssHook pass
-       for ( index in props ) {
-               name = jQuery.camelCase( index );
-               easing = specialEasing[ name ];
-               value = props[ index ];
-               if ( jQuery.isArray( value ) ) {
-                       easing = value[ 1 ];
-                       value = props[ index ] = value[ 0 ];
-               }
+// Generate parameters to create a standard animation
+function genFx( type, num ) {
+       var obj = {};
 
 
-               if ( index !== name ) {
-                       props[ name ] = value;
-                       delete props[ index ];
-               }
+       jQuery.each( fxAttrs.concat.apply([], fxAttrs.slice(0,num)), function() {
+               obj[ this ] = type;
+       });
 
 
-               hooks = jQuery.cssHooks[ name ];
-               if ( hooks && "expand" in hooks ) {
-                       value = hooks.expand( value );
-                       delete props[ name ];
+       return obj;
+}
 
 
-                       // not quite $.extend, this wont overwrite keys already present.
-                       // also - reusing 'index' from above because we have the correct "name"
-                       for ( index in value ) {
-                               if ( !( index in props ) ) {
-                                       props[ index ] = value[ index ];
-                                       specialEasing[ index ] = easing;
-                               }
+// Generate shortcuts for custom animations
+jQuery.each({
+       slideDown: genFx("show", 1),
+       slideUp: genFx("hide", 1),
+       slideToggle: genFx("toggle", 1),
+       fadeIn: { opacity: "show" },
+       fadeOut: { opacity: "hide" },
+       fadeToggle: { opacity: "toggle" }
+}, function( name, props ) {
+       jQuery.fn[ name ] = function( speed, easing, callback ) {
+               return this.animate( props, speed, easing, callback );
+       };
+});
+
+jQuery.extend({
+       speed: function( speed, easing, fn ) {
+               var opt = speed && typeof speed === "object" ? jQuery.extend({}, speed) : {
+                       complete: fn || !fn && easing ||
+                               jQuery.isFunction( speed ) && speed,
+                       duration: speed,
+                       easing: fn && easing || easing && !jQuery.isFunction(easing) && easing
+               };
+
+               opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration :
+                       opt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[opt.duration] : jQuery.fx.speeds._default;
+
+               // Queueing
+               opt.old = opt.complete;
+               opt.complete = function( noUnmark ) {
+                       if ( jQuery.isFunction( opt.old ) ) {
+                               opt.old.call( this );
                        }
                        }
-               } else {
-                       specialEasing[ name ] = easing;
+
+                       if ( opt.queue !== false ) {
+                               jQuery.dequeue( this );
+                       } else if ( noUnmark !== false ) {
+                               jQuery._unmark( this );
+                       }
+               };
+
+               return opt;
+       },
+
+       easing: {
+               linear: function( p, n, firstNum, diff ) {
+                       return firstNum + diff * p;
+               },
+               swing: function( p, n, firstNum, diff ) {
+                       return ((-Math.cos(p*Math.PI)/2) + 0.5) * diff + firstNum;
                }
                }
+       },
+
+       timers: [],
+
+       fx: function( elem, options, prop ) {
+               this.options = options;
+               this.elem = elem;
+               this.prop = prop;
+
+               options.orig = options.orig || {};
        }
        }
-}
 
 
-jQuery.Animation = jQuery.extend( Animation, {
+});
 
 
-       tweener: function( props, callback ) {
-               if ( jQuery.isFunction( props ) ) {
-                       callback = props;
-                       props = [ "*" ];
-               } else {
-                       props = props.split(" ");
+jQuery.fx.prototype = {
+       // Simple function for setting a style value
+       update: function() {
+               if ( this.options.step ) {
+                       this.options.step.call( this.elem, this.now, this );
+               }
+
+               (jQuery.fx.step[this.prop] || jQuery.fx.step._default)( this );
+       },
+
+       // Get the current size
+       cur: function() {
+               if ( this.elem[this.prop] != null && (!this.elem.style || this.elem.style[this.prop] == null) ) {
+                       return this.elem[ this.prop ];
+               }
+
+               var parsed,
+                       r = jQuery.css( this.elem, this.prop );
+               // Empty strings, null, undefined and "auto" are converted to 0,
+               // complex values such as "rotate(1rad)" are returned as is,
+               // simple values such as "10px" are parsed to Float.
+               return isNaN( parsed = parseFloat( r ) ) ? !r || r === "auto" ? 0 : r : parsed;
+       },
+
+       // Start an animation from one number to another
+       custom: function( from, to, unit ) {
+               var self = this,
+                       fx = jQuery.fx;
+
+               this.startTime = fxNow || createFxNow();
+               this.start = from;
+               this.end = to;
+               this.unit = unit || this.unit || ( jQuery.cssNumber[ this.prop ] ? "" : "px" );
+               this.now = this.start;
+               this.pos = this.state = 0;
+
+               function t( gotoEnd ) {
+                       return self.step(gotoEnd);
                }
 
                }
 
-               var prop,
-                       index = 0,
-                       length = props.length;
+               t.elem = this.elem;
 
 
-               for ( ; index < length ; index++ ) {
-                       prop = props[ index ];
-                       tweeners[ prop ] = tweeners[ prop ] || [];
-                       tweeners[ prop ].unshift( callback );
+               if ( t() && jQuery.timers.push(t) && !timerId ) {
+                       timerId = setInterval( fx.tick, fx.interval );
                }
        },
 
                }
        },
 
-       prefilter: function( callback, prepend ) {
-               if ( prepend ) {
-                       animationPrefilters.unshift( callback );
-               } else {
-                       animationPrefilters.push( callback );
-               }
-       }
-});
+       // Simple 'show' function
+       show: function() {
+               // Remember where we started, so that we can go back to it later
+               this.options.orig[this.prop] = jQuery.style( this.elem, this.prop );
+               this.options.show = true;
+
+               // Begin the animation
+               // Make sure that we start at a small width/height to avoid any
+               // flash of content
+               this.custom(this.prop === "width" || this.prop === "height" ? 1 : 0, this.cur());
+
+               // Start by showing the element
+               jQuery( this.elem ).show();
+       },
+
+       // Simple 'hide' function
+       hide: function() {
+               // Remember where we started, so that we can go back to it later
+               this.options.orig[this.prop] = jQuery.style( this.elem, this.prop );
+               this.options.hide = true;
+
+               // Begin the animation
+               this.custom(this.cur(), 0);
+       },
+
+       // Each step of an animation
+       step: function( gotoEnd ) {
+               var t = fxNow || createFxNow(),
+                       done = true,
+                       elem = this.elem,
+                       options = this.options,
+                       i, n;
+
+               if ( gotoEnd || t >= options.duration + this.startTime ) {
+                       this.now = this.end;
+                       this.pos = this.state = 1;
+                       this.update();
+
+                       options.animatedProperties[ this.prop ] = true;
+
+                       for ( i in options.animatedProperties ) {
+                               if ( options.animatedProperties[i] !== true ) {
+                                       done = false;
+                               }
+                       }
 
 
-function defaultPrefilter( elem, props, opts ) {
-       /*jshint validthis:true */
-       var prop, index, length,
-               value, dataShow, toggle,
-               tween, hooks, oldfire,
-               anim = this,
-               style = elem.style,
-               orig = {},
-               handled = [],
-               hidden = elem.nodeType && isHidden( elem );
-
-       // handle queue: false promises
-       if ( !opts.queue ) {
-               hooks = jQuery._queueHooks( elem, "fx" );
-               if ( hooks.unqueued == null ) {
-                       hooks.unqueued = 0;
-                       oldfire = hooks.empty.fire;
-                       hooks.empty.fire = function() {
-                               if ( !hooks.unqueued ) {
-                                       oldfire();
+                       if ( done ) {
+                               // Reset the overflow
+                               if ( options.overflow != null && !jQuery.support.shrinkWrapBlocks ) {
+
+                                       jQuery.each( [ "", "X", "Y" ], function (index, value) {
+                                               elem.style[ "overflow" + value ] = options.overflow[index];
+                                       });
                                }
                                }
-                       };
-               }
-               hooks.unqueued++;
 
 
-               anim.always(function() {
-                       // doing this makes sure that the complete handler will be called
-                       // before this completes
-                       anim.always(function() {
-                               hooks.unqueued--;
-                               if ( !jQuery.queue( elem, "fx" ).length ) {
-                                       hooks.empty.fire();
+                               // Hide the element if the "hide" operation was done
+                               if ( options.hide ) {
+                                       jQuery(elem).hide();
                                }
                                }
-                       });
-               });
-       }
 
 
-       // height/width overflow pass
-       if ( elem.nodeType === 1 && ( "height" in props || "width" in props ) ) {
-               // Make sure that nothing sneaks out
-               // Record all 3 overflow attributes because IE does not
-               // change the overflow attribute when overflowX and
-               // overflowY are set to the same value
-               opts.overflow = [ style.overflow, style.overflowX, style.overflowY ];
+                               // Reset the properties, if the item has been hidden or shown
+                               if ( options.hide || options.show ) {
+                                       for ( var p in options.animatedProperties ) {
+                                               jQuery.style( elem, p, options.orig[p] );
+                                       }
+                               }
 
 
-               // Set display property to inline-block for height/width
-               // animations on inline elements that are having width/height animated
-               if ( jQuery.css( elem, "display" ) === "inline" &&
-                               jQuery.css( elem, "float" ) === "none" ) {
+                               // Execute the complete function
+                               options.complete.call( elem );
+                       }
 
 
-                       // inline-level elements accept inline-block;
-                       // block-level elements need to be inline with layout
-                       if ( !jQuery.support.inlineBlockNeedsLayout || css_defaultDisplay( elem.nodeName ) === "inline" ) {
-                               style.display = "inline-block";
+                       return false;
 
 
+               } else {
+                       // classical easing cannot be used with an Infinity duration
+                       if ( options.duration == Infinity ) {
+                               this.now = t;
                        } else {
                        } else {
-                               style.zoom = 1;
+                               n = t - this.startTime;
+                               this.state = n / options.duration;
+
+                               // Perform the easing function, defaults to swing
+                               this.pos = jQuery.easing[ options.animatedProperties[ this.prop ] ]( this.state, n, 0, 1, options.duration );
+                               this.now = this.start + ((this.end - this.start) * this.pos);
                        }
                        }
+                       // Perform the next step of the animation
+                       this.update();
                }
                }
-       }
 
 
-       if ( opts.overflow ) {
-               style.overflow = "hidden";
-               if ( !jQuery.support.shrinkWrapBlocks ) {
-                       anim.always(function() {
-                               style.overflow = opts.overflow[ 0 ];
-                               style.overflowX = opts.overflow[ 1 ];
-                               style.overflowY = opts.overflow[ 2 ];
-                       });
-               }
+               return true;
        }
        }
+};
 
 
-
-       // show/hide pass
-       for ( index in props ) {
-               value = props[ index ];
-               if ( rfxtypes.exec( value ) ) {
-                       delete props[ index ];
-                       toggle = toggle || value === "toggle";
-                       if ( value === ( hidden ? "hide" : "show" ) ) {
-                               continue;
+jQuery.extend( jQuery.fx, {
+       tick: function() {
+               for ( var timers = jQuery.timers, i = 0 ; i < timers.length ; ++i ) {
+                       if ( !timers[i]() ) {
+                               timers.splice(i--, 1);
                        }
                        }
-                       handled.push( index );
                }
                }
-       }
 
 
-       length = handled.length;
-       if ( length ) {
-               dataShow = jQuery._data( elem, "fxshow" ) || jQuery._data( elem, "fxshow", {} );
-               if ( "hidden" in dataShow ) {
-                       hidden = dataShow.hidden;
+               if ( !timers.length ) {
+                       jQuery.fx.stop();
                }
                }
+       },
 
 
-               // store state if its toggle - enables .stop().toggle() to "reverse"
-               if ( toggle ) {
-                       dataShow.hidden = !hidden;
-               }
-               if ( hidden ) {
-                       jQuery( elem ).show();
-               } else {
-                       anim.done(function() {
-                               jQuery( elem ).hide();
-                       });
-               }
-               anim.done(function() {
-                       var prop;
-                       jQuery._removeData( elem, "fxshow" );
-                       for ( prop in orig ) {
-                               jQuery.style( elem, prop, orig[ prop ] );
-                       }
-               });
-               for ( index = 0 ; index < length ; index++ ) {
-                       prop = handled[ index ];
-                       tween = anim.createTween( prop, hidden ? dataShow[ prop ] : 0 );
-                       orig[ prop ] = dataShow[ prop ] || jQuery.style( elem, prop );
+       interval: 13,
 
 
-                       if ( !( prop in dataShow ) ) {
-                               dataShow[ prop ] = tween.start;
-                               if ( hidden ) {
-                                       tween.end = tween.start;
-                                       tween.start = prop === "width" || prop === "height" ? 1 : 0;
-                               }
+       stop: function() {
+               clearInterval( timerId );
+               timerId = null;
+       },
+
+       speeds: {
+               slow: 600,
+               fast: 200,
+               // Default speed
+               _default: 400
+       },
+
+       step: {
+               opacity: function( fx ) {
+                       jQuery.style( fx.elem, "opacity", fx.now );
+               },
+
+               _default: function( fx ) {
+                       if ( fx.elem.style && fx.elem.style[ fx.prop ] != null ) {
+                               fx.elem.style[ fx.prop ] = (fx.prop === "width" || fx.prop === "height" ? Math.max(0, fx.now) : fx.now) + fx.unit;
+                       } else {
+                               fx.elem[ fx.prop ] = fx.now;
                        }
                }
        }
                        }
                }
        }
-}
+});
 
 
-function Tween( elem, options, prop, end, easing ) {
-       return new Tween.prototype.init( elem, options, prop, end, easing );
+if ( jQuery.expr && jQuery.expr.filters ) {
+       jQuery.expr.filters.animated = function( elem ) {
+               return jQuery.grep(jQuery.timers, function( fn ) {
+                       return elem === fn.elem;
+               }).length;
+       };
 }
 }
-jQuery.Tween = Tween;
-
-Tween.prototype = {
-       constructor: Tween,
-       init: function( elem, options, prop, end, easing, unit ) {
-               this.elem = elem;
-               this.prop = prop;
-               this.easing = easing || "swing";
-               this.options = options;
-               this.start = this.now = this.cur();
-               this.end = end;
-               this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" );
-       },
-       cur: function() {
-               var hooks = Tween.propHooks[ this.prop ];
 
 
-               return hooks && hooks.get ?
-                       hooks.get( this ) :
-                       Tween.propHooks._default.get( this );
-       },
-       run: function( percent ) {
-               var eased,
-                       hooks = Tween.propHooks[ this.prop ];
+// Try to restore the default display value of an element
+function defaultDisplay( nodeName ) {
 
 
-               if ( this.options.duration ) {
-                       this.pos = eased = jQuery.easing[ this.easing ](
-                               percent, this.options.duration * percent, 0, 1, this.options.duration
-                       );
-               } else {
-                       this.pos = eased = percent;
-               }
-               this.now = ( this.end - this.start ) * eased + this.start;
+       if ( !elemdisplay[ nodeName ] ) {
 
 
-               if ( this.options.step ) {
-                       this.options.step.call( this.elem, this.now, this );
-               }
+               var body = document.body,
+                       elem = jQuery( "<" + nodeName + ">" ).appendTo( body ),
+                       display = elem.css( "display" );
 
 
-               if ( hooks && hooks.set ) {
-                       hooks.set( this );
-               } else {
-                       Tween.propHooks._default.set( this );
-               }
-               return this;
-       }
-};
+               elem.remove();
 
 
-Tween.prototype.init.prototype = Tween.prototype;
+               // If the simple way fails,
+               // get element's real default display by attaching it to a temp iframe
+               if ( display === "none" || display === "" ) {
+                       // No iframe to use yet, so create it
+                       if ( !iframe ) {
+                               iframe = document.createElement( "iframe" );
+                               iframe.frameBorder = iframe.width = iframe.height = 0;
+                       }
 
 
-Tween.propHooks = {
-       _default: {
-               get: function( tween ) {
-                       var result;
+                       body.appendChild( iframe );
 
 
-                       if ( tween.elem[ tween.prop ] != null &&
-                               (!tween.elem.style || tween.elem.style[ tween.prop ] == null) ) {
-                               return tween.elem[ tween.prop ];
+                       // Create a cacheable copy of the iframe document on first call.
+                       // IE and Opera will allow us to reuse the iframeDoc without re-writing the fake HTML
+                       // document to it; WebKit & Firefox won't allow reusing the iframe document.
+                       if ( !iframeDoc || !iframe.createElement ) {
+                               iframeDoc = ( iframe.contentWindow || iframe.contentDocument ).document;
+                               iframeDoc.write( ( document.compatMode === "CSS1Compat" ? "<!doctype html>" : "" ) + "<html><body>" );
+                               iframeDoc.close();
                        }
 
                        }
 
-                       // passing an empty string as a 3rd parameter to .css will automatically
-                       // attempt a parseFloat and fallback to a string if the parse fails
-                       // so, simple values such as "10px" are parsed to Float.
-                       // complex values such as "rotate(1rad)" are returned as is.
-                       result = jQuery.css( tween.elem, tween.prop, "" );
-                       // Empty strings, null, undefined and "auto" are converted to 0.
-                       return !result || result === "auto" ? 0 : result;
-               },
-               set: function( tween ) {
-                       // use step hook for back compat - use cssHook if its there - use .style if its
-                       // available and use plain properties where available
-                       if ( jQuery.fx.step[ tween.prop ] ) {
-                               jQuery.fx.step[ tween.prop ]( tween );
-                       } else if ( tween.elem.style && ( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null || jQuery.cssHooks[ tween.prop ] ) ) {
-                               jQuery.style( tween.elem, tween.prop, tween.now + tween.unit );
-                       } else {
-                               tween.elem[ tween.prop ] = tween.now;
-                       }
-               }
-       }
-};
+                       elem = iframeDoc.createElement( nodeName );
+
+                       iframeDoc.body.appendChild( elem );
 
 
-// Remove in 2.0 - this supports IE8's panic based approach
-// to setting things on disconnected nodes
+                       display = jQuery.css( elem, "display" );
 
 
-Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {
-       set: function( tween ) {
-               if ( tween.elem.nodeType && tween.elem.parentNode ) {
-                       tween.elem[ tween.prop ] = tween.now;
+                       body.removeChild( iframe );
                }
                }
+
+               // Store the correct default display
+               elemdisplay[ nodeName ] = display;
        }
        }
-};
 
 
-jQuery.each([ "toggle", "show", "hide" ], function( i, name ) {
-       var cssFn = jQuery.fn[ name ];
-       jQuery.fn[ name ] = function( speed, easing, callback ) {
-               return speed == null || typeof speed === "boolean" ?
-                       cssFn.apply( this, arguments ) :
-                       this.animate( genFx( name, true ), speed, easing, callback );
-       };
-});
+       return elemdisplay[ nodeName ];
+}
 
 
-jQuery.fn.extend({
-       fadeTo: function( speed, to, easing, callback ) {
 
 
-               // show any hidden elements after setting opacity to 0
-               return this.filter( isHidden ).css( "opacity", 0 ).show()
 
 
-                       // animate to the value specified
-                       .end().animate({ opacity: to }, speed, easing, callback );
-       },
-       animate: function( prop, speed, easing, callback ) {
-               var empty = jQuery.isEmptyObject( prop ),
-                       optall = jQuery.speed( speed, easing, callback ),
-                       doAnimation = function() {
-                               // Operate on a copy of prop so per-property easing won't be lost
-                               var anim = Animation( this, jQuery.extend( {}, prop ), optall );
-                               doAnimation.finish = function() {
-                                       anim.stop( true );
-                               };
-                               // Empty animations, or finishing resolves immediately
-                               if ( empty || jQuery._data( this, "finish" ) ) {
-                                       anim.stop( true );
-                               }
-                       };
-                       doAnimation.finish = doAnimation;
 
 
-               return empty || optall.queue === false ?
-                       this.each( doAnimation ) :
-                       this.queue( optall.queue, doAnimation );
-       },
-       stop: function( type, clearQueue, gotoEnd ) {
-               var stopQueue = function( hooks ) {
-                       var stop = hooks.stop;
-                       delete hooks.stop;
-                       stop( gotoEnd );
-               };
+var rtable = /^t(?:able|d|h)$/i,
+       rroot = /^(?:body|html)$/i;
 
 
-               if ( typeof type !== "string" ) {
-                       gotoEnd = clearQueue;
-                       clearQueue = type;
-                       type = undefined;
+if ( "getBoundingClientRect" in document.documentElement ) {
+       jQuery.fn.offset = function( options ) {
+               var elem = this[0], box;
+
+               if ( options ) {
+                       return this.each(function( i ) {
+                               jQuery.offset.setOffset( this, options, i );
+                       });
                }
                }
-               if ( clearQueue && type !== false ) {
-                       this.queue( type || "fx", [] );
+
+               if ( !elem || !elem.ownerDocument ) {
+                       return null;
                }
 
                }
 
-               return this.each(function() {
-                       var dequeue = true,
-                               index = type != null && type + "queueHooks",
-                               timers = jQuery.timers,
-                               data = jQuery._data( this );
+               if ( elem === elem.ownerDocument.body ) {
+                       return jQuery.offset.bodyOffset( elem );
+               }
 
 
-                       if ( index ) {
-                               if ( data[ index ] && data[ index ].stop ) {
-                                       stopQueue( data[ index ] );
-                               }
-                       } else {
-                               for ( index in data ) {
-                                       if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {
-                                               stopQueue( data[ index ] );
-                                       }
-                               }
-                       }
+               try {
+                       box = elem.getBoundingClientRect();
+               } catch(e) {}
 
 
-                       for ( index = timers.length; index--; ) {
-                               if ( timers[ index ].elem === this && (type == null || timers[ index ].queue === type) ) {
-                                       timers[ index ].anim.stop( gotoEnd );
-                                       dequeue = false;
-                                       timers.splice( index, 1 );
-                               }
-                       }
+               var doc = elem.ownerDocument,
+                       docElem = doc.documentElement;
 
 
-                       // start the next in the queue if the last step wasn't forced
-                       // timers currently will call their complete callbacks, which will dequeue
-                       // but only if they were gotoEnd
-                       if ( dequeue || !gotoEnd ) {
-                               jQuery.dequeue( this, type );
-                       }
-               });
-       },
-       finish: function( type ) {
-               if ( type !== false ) {
-                       type = type || "fx";
+               // Make sure we're not dealing with a disconnected DOM node
+               if ( !box || !jQuery.contains( docElem, elem ) ) {
+                       return box ? { top: box.top, left: box.left } : { top: 0, left: 0 };
                }
                }
-               return this.each(function() {
-                       var index,
-                               data = jQuery._data( this ),
-                               queue = data[ type + "queue" ],
-                               hooks = data[ type + "queueHooks" ],
-                               timers = jQuery.timers,
-                               length = queue ? queue.length : 0;
 
 
-                       // enable finishing flag on private data
-                       data.finish = true;
+               var body = doc.body,
+                       win = getWindow(doc),
+                       clientTop  = docElem.clientTop  || body.clientTop  || 0,
+                       clientLeft = docElem.clientLeft || body.clientLeft || 0,
+                       scrollTop  = win.pageYOffset || jQuery.support.boxModel && docElem.scrollTop  || body.scrollTop,
+                       scrollLeft = win.pageXOffset || jQuery.support.boxModel && docElem.scrollLeft || body.scrollLeft,
+                       top  = box.top  + scrollTop  - clientTop,
+                       left = box.left + scrollLeft - clientLeft;
 
 
-                       // empty the queue first
-                       jQuery.queue( this, type, [] );
+               return { top: top, left: left };
+       };
 
 
-                       if ( hooks && hooks.cur && hooks.cur.finish ) {
-                               hooks.cur.finish.call( this );
-                       }
+} else {
+       jQuery.fn.offset = function( options ) {
+               var elem = this[0];
 
 
-                       // look for any active animations, and finish them
-                       for ( index = timers.length; index--; ) {
-                               if ( timers[ index ].elem === this && timers[ index ].queue === type ) {
-                                       timers[ index ].anim.stop( true );
-                                       timers.splice( index, 1 );
-                               }
-                       }
+               if ( options ) {
+                       return this.each(function( i ) {
+                               jQuery.offset.setOffset( this, options, i );
+                       });
+               }
 
 
-                       // look for any animations in the old queue and finish them
-                       for ( index = 0; index < length; index++ ) {
-                               if ( queue[ index ] && queue[ index ].finish ) {
-                                       queue[ index ].finish.call( this );
-                               }
-                       }
+               if ( !elem || !elem.ownerDocument ) {
+                       return null;
+               }
 
 
-                       // turn off finishing flag
-                       delete data.finish;
-               });
-       }
-});
+               if ( elem === elem.ownerDocument.body ) {
+                       return jQuery.offset.bodyOffset( elem );
+               }
 
 
-// Generate parameters to create a standard animation
-function genFx( type, includeWidth ) {
-       var which,
-               attrs = { height: type },
-               i = 0;
-
-       // if we include width, step value is 1 to do all cssExpand values,
-       // if we don't include width, step value is 2 to skip over Left and Right
-       includeWidth = includeWidth? 1 : 0;
-       for( ; i < 4 ; i += 2 - includeWidth ) {
-               which = cssExpand[ i ];
-               attrs[ "margin" + which ] = attrs[ "padding" + which ] = type;
-       }
+               jQuery.offset.initialize();
 
 
-       if ( includeWidth ) {
-               attrs.opacity = attrs.width = type;
-       }
+               var computedStyle,
+                       offsetParent = elem.offsetParent,
+                       prevOffsetParent = elem,
+                       doc = elem.ownerDocument,
+                       docElem = doc.documentElement,
+                       body = doc.body,
+                       defaultView = doc.defaultView,
+                       prevComputedStyle = defaultView ? defaultView.getComputedStyle( elem, null ) : elem.currentStyle,
+                       top = elem.offsetTop,
+                       left = elem.offsetLeft;
 
 
-       return attrs;
-}
+               while ( (elem = elem.parentNode) && elem !== body && elem !== docElem ) {
+                       if ( jQuery.offset.supportsFixedPosition && prevComputedStyle.position === "fixed" ) {
+                               break;
+                       }
 
 
-// Generate shortcuts for custom animations
-jQuery.each({
-       slideDown: genFx("show"),
-       slideUp: genFx("hide"),
-       slideToggle: genFx("toggle"),
-       fadeIn: { opacity: "show" },
-       fadeOut: { opacity: "hide" },
-       fadeToggle: { opacity: "toggle" }
-}, function( name, props ) {
-       jQuery.fn[ name ] = function( speed, easing, callback ) {
-               return this.animate( props, speed, easing, callback );
-       };
-});
+                       computedStyle = defaultView ? defaultView.getComputedStyle(elem, null) : elem.currentStyle;
+                       top  -= elem.scrollTop;
+                       left -= elem.scrollLeft;
 
 
-jQuery.speed = function( speed, easing, fn ) {
-       var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : {
-               complete: fn || !fn && easing ||
-                       jQuery.isFunction( speed ) && speed,
-               duration: speed,
-               easing: fn && easing || easing && !jQuery.isFunction( easing ) && easing
-       };
+                       if ( elem === offsetParent ) {
+                               top  += elem.offsetTop;
+                               left += elem.offsetLeft;
 
 
-       opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration :
-               opt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[ opt.duration ] : jQuery.fx.speeds._default;
+                               if ( jQuery.offset.doesNotAddBorder && !(jQuery.offset.doesAddBorderForTableAndCells && rtable.test(elem.nodeName)) ) {
+                                       top  += parseFloat( computedStyle.borderTopWidth  ) || 0;
+                                       left += parseFloat( computedStyle.borderLeftWidth ) || 0;
+                               }
 
 
-       // normalize opt.queue - true/undefined/null -> "fx"
-       if ( opt.queue == null || opt.queue === true ) {
-               opt.queue = "fx";
-       }
+                               prevOffsetParent = offsetParent;
+                               offsetParent = elem.offsetParent;
+                       }
 
 
-       // Queueing
-       opt.old = opt.complete;
+                       if ( jQuery.offset.subtractsBorderForOverflowNotVisible && computedStyle.overflow !== "visible" ) {
+                               top  += parseFloat( computedStyle.borderTopWidth  ) || 0;
+                               left += parseFloat( computedStyle.borderLeftWidth ) || 0;
+                       }
 
 
-       opt.complete = function() {
-               if ( jQuery.isFunction( opt.old ) ) {
-                       opt.old.call( this );
+                       prevComputedStyle = computedStyle;
                }
 
                }
 
-               if ( opt.queue ) {
-                       jQuery.dequeue( this, opt.queue );
+               if ( prevComputedStyle.position === "relative" || prevComputedStyle.position === "static" ) {
+                       top  += body.offsetTop;
+                       left += body.offsetLeft;
                }
                }
-       };
-
-       return opt;
-};
-
-jQuery.easing = {
-       linear: function( p ) {
-               return p;
-       },
-       swing: function( p ) {
-               return 0.5 - Math.cos( p*Math.PI ) / 2;
-       }
-};
-
-jQuery.timers = [];
-jQuery.fx = Tween.prototype.init;
-jQuery.fx.tick = function() {
-       var timer,
-               timers = jQuery.timers,
-               i = 0;
 
 
-       fxNow = jQuery.now();
-
-       for ( ; i < timers.length; i++ ) {
-               timer = timers[ i ];
-               // Checks the timer has not already been removed
-               if ( !timer() && timers[ i ] === timer ) {
-                       timers.splice( i--, 1 );
+               if ( jQuery.offset.supportsFixedPosition && prevComputedStyle.position === "fixed" ) {
+                       top  += Math.max( docElem.scrollTop, body.scrollTop );
+                       left += Math.max( docElem.scrollLeft, body.scrollLeft );
                }
                }
-       }
 
 
-       if ( !timers.length ) {
-               jQuery.fx.stop();
-       }
-       fxNow = undefined;
-};
+               return { top: top, left: left };
+       };
+}
 
 
-jQuery.fx.timer = function( timer ) {
-       if ( timer() && jQuery.timers.push( timer ) ) {
-               jQuery.fx.start();
-       }
-};
+jQuery.offset = {
+       initialize: function() {
+               var body = document.body, container = document.createElement("div"), innerDiv, checkDiv, table, td, bodyMarginTop = parseFloat( jQuery.css(body, "marginTop") ) || 0,
+                       html = "<div style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;'><div></div></div><table style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;' cellpadding='0' cellspacing='0'><tr><td></td></tr></table>";
 
 
-jQuery.fx.interval = 13;
+               jQuery.extend( container.style, { position: "absolute", top: 0, left: 0, margin: 0, border: 0, width: "1px", height: "1px", visibility: "hidden" } );
 
 
-jQuery.fx.start = function() {
-       if ( !timerId ) {
-               timerId = setInterval( jQuery.fx.tick, jQuery.fx.interval );
-       }
-};
+               container.innerHTML = html;
+               body.insertBefore( container, body.firstChild );
+               innerDiv = container.firstChild;
+               checkDiv = innerDiv.firstChild;
+               td = innerDiv.nextSibling.firstChild.firstChild;
 
 
-jQuery.fx.stop = function() {
-       clearInterval( timerId );
-       timerId = null;
-};
+               this.doesNotAddBorder = (checkDiv.offsetTop !== 5);
+               this.doesAddBorderForTableAndCells = (td.offsetTop === 5);
 
 
-jQuery.fx.speeds = {
-       slow: 600,
-       fast: 200,
-       // Default speed
-       _default: 400
-};
+               checkDiv.style.position = "fixed";
+               checkDiv.style.top = "20px";
 
 
-// Back Compat <1.8 extension point
-jQuery.fx.step = {};
+               // safari subtracts parent border width here which is 5px
+               this.supportsFixedPosition = (checkDiv.offsetTop === 20 || checkDiv.offsetTop === 15);
+               checkDiv.style.position = checkDiv.style.top = "";
 
 
-if ( jQuery.expr && jQuery.expr.filters ) {
-       jQuery.expr.filters.animated = function( elem ) {
-               return jQuery.grep(jQuery.timers, function( fn ) {
-                       return elem === fn.elem;
-               }).length;
-       };
-}
-jQuery.fn.offset = function( options ) {
-       if ( arguments.length ) {
-               return options === undefined ?
-                       this :
-                       this.each(function( i ) {
-                               jQuery.offset.setOffset( this, options, i );
-                       });
-       }
+               innerDiv.style.overflow = "hidden";
+               innerDiv.style.position = "relative";
 
 
-       var docElem, win,
-               box = { top: 0, left: 0 },
-               elem = this[ 0 ],
-               doc = elem && elem.ownerDocument;
+               this.subtractsBorderForOverflowNotVisible = (checkDiv.offsetTop === -5);
 
 
-       if ( !doc ) {
-               return;
-       }
+               this.doesNotIncludeMarginInBodyOffset = (body.offsetTop !== bodyMarginTop);
+
+               body.removeChild( container );
+               jQuery.offset.initialize = jQuery.noop;
+       },
 
 
-       docElem = doc.documentElement;
+       bodyOffset: function( body ) {
+               var top = body.offsetTop,
+                       left = body.offsetLeft;
 
 
-       // Make sure it's not a disconnected DOM node
-       if ( !jQuery.contains( docElem, elem ) ) {
-               return box;
-       }
+               jQuery.offset.initialize();
 
 
-       // If we don't have gBCR, just use 0,0 rather than error
-       // BlackBerry 5, iOS 3 (original iPhone)
-       if ( typeof elem.getBoundingClientRect !== core_strundefined ) {
-               box = elem.getBoundingClientRect();
-       }
-       win = getWindow( doc );
-       return {
-               top: box.top  + ( win.pageYOffset || docElem.scrollTop )  - ( docElem.clientTop  || 0 ),
-               left: box.left + ( win.pageXOffset || docElem.scrollLeft ) - ( docElem.clientLeft || 0 )
-       };
-};
+               if ( jQuery.offset.doesNotIncludeMarginInBodyOffset ) {
+                       top  += parseFloat( jQuery.css(body, "marginTop") ) || 0;
+                       left += parseFloat( jQuery.css(body, "marginLeft") ) || 0;
+               }
 
 
-jQuery.offset = {
+               return { top: top, left: left };
+       },
 
        setOffset: function( elem, options, i ) {
                var position = jQuery.css( elem, "position" );
 
        setOffset: function( elem, options, i ) {
                var position = jQuery.css( elem, "position" );
@@ -9412,7 +8845,7 @@ jQuery.offset = {
                        curOffset = curElem.offset(),
                        curCSSTop = jQuery.css( elem, "top" ),
                        curCSSLeft = jQuery.css( elem, "left" ),
                        curOffset = curElem.offset(),
                        curCSSTop = jQuery.css( elem, "top" ),
                        curCSSLeft = jQuery.css( elem, "left" ),
-                       calculatePosition = ( position === "absolute" || position === "fixed" ) && jQuery.inArray("auto", [curCSSTop, curCSSLeft]) > -1,
+                       calculatePosition = (position === "absolute" || position === "fixed") && jQuery.inArray("auto", [curCSSTop, curCSSLeft]) > -1,
                        props = {}, curPosition = {}, curTop, curLeft;
 
                // need to be able to calculate position if either top or left is auto and position is either absolute or fixed
                        props = {}, curPosition = {}, curTop, curLeft;
 
                // need to be able to calculate position if either top or left is auto and position is either absolute or fixed
@@ -9429,11 +8862,11 @@ jQuery.offset = {
                        options = options.call( elem, i, curOffset );
                }
 
                        options = options.call( elem, i, curOffset );
                }
 
-               if ( options.top != null ) {
-                       props.top = ( options.top - curOffset.top ) + curTop;
+               if (options.top != null) {
+                       props.top = (options.top - curOffset.top) + curTop;
                }
                }
-               if ( options.left != null ) {
-                       props.left = ( options.left - curOffset.left ) + curLeft;
+               if (options.left != null) {
+                       props.left = (options.left - curOffset.left) + curLeft;
                }
 
                if ( "using" in options ) {
                }
 
                if ( "using" in options ) {
@@ -9446,80 +8879,86 @@ jQuery.offset = {
 
 
 jQuery.fn.extend({
 
 
 jQuery.fn.extend({
-
        position: function() {
        position: function() {
-               if ( !this[ 0 ] ) {
-                       return;
+               if ( !this[0] ) {
+                       return null;
                }
 
                }
 
-               var offsetParent, offset,
-                       parentOffset = { top: 0, left: 0 },
-                       elem = this[ 0 ];
-
-               // fixed elements are offset from window (parentOffset = {top:0, left: 0}, because it is it's only offset parent
-               if ( jQuery.css( elem, "position" ) === "fixed" ) {
-                       // we assume that getBoundingClientRect is available when computed position is fixed
-                       offset = elem.getBoundingClientRect();
-               } else {
-                       // Get *real* offsetParent
-                       offsetParent = this.offsetParent();
+               var elem = this[0],
 
 
-                       // Get correct offsets
-                       offset = this.offset();
-                       if ( !jQuery.nodeName( offsetParent[ 0 ], "html" ) ) {
-                               parentOffset = offsetParent.offset();
-                       }
+               // Get *real* offsetParent
+               offsetParent = this.offsetParent(),
 
 
-                       // Add offsetParent borders
-                       parentOffset.top  += jQuery.css( offsetParent[ 0 ], "borderTopWidth", true );
-                       parentOffset.left += jQuery.css( offsetParent[ 0 ], "borderLeftWidth", true );
-               }
+               // Get correct offsets
+               offset       = this.offset(),
+               parentOffset = rroot.test(offsetParent[0].nodeName) ? { top: 0, left: 0 } : offsetParent.offset();
 
 
-               // Subtract parent offsets and element margins
+               // Subtract element margins
                // note: when an element has margin: auto the offsetLeft and marginLeft
                // are the same in Safari causing offset.left to incorrectly be 0
                // note: when an element has margin: auto the offsetLeft and marginLeft
                // are the same in Safari causing offset.left to incorrectly be 0
+               offset.top  -= parseFloat( jQuery.css(elem, "marginTop") ) || 0;
+               offset.left -= parseFloat( jQuery.css(elem, "marginLeft") ) || 0;
+
+               // Add offsetParent borders
+               parentOffset.top  += parseFloat( jQuery.css(offsetParent[0], "borderTopWidth") ) || 0;
+               parentOffset.left += parseFloat( jQuery.css(offsetParent[0], "borderLeftWidth") ) || 0;
+
+               // Subtract the two offsets
                return {
                return {
-                       top:  offset.top  - parentOffset.top - jQuery.css( elem, "marginTop", true ),
-                       left: offset.left - parentOffset.left - jQuery.css( elem, "marginLeft", true)
+                       top:  offset.top  - parentOffset.top,
+                       left: offset.left - parentOffset.left
                };
        },
 
        offsetParent: function() {
                return this.map(function() {
                };
        },
 
        offsetParent: function() {
                return this.map(function() {
-                       var offsetParent = this.offsetParent || document.documentElement;
-                       while ( offsetParent && ( !jQuery.nodeName( offsetParent, "html" ) && jQuery.css( offsetParent, "position") === "static" ) ) {
+                       var offsetParent = this.offsetParent || document.body;
+                       while ( offsetParent && (!rroot.test(offsetParent.nodeName) && jQuery.css(offsetParent, "position") === "static") ) {
                                offsetParent = offsetParent.offsetParent;
                        }
                                offsetParent = offsetParent.offsetParent;
                        }
-                       return offsetParent || document.documentElement;
+                       return offsetParent;
                });
        }
 });
 
 
 // Create scrollLeft and scrollTop methods
                });
        }
 });
 
 
 // Create scrollLeft and scrollTop methods
-jQuery.each( {scrollLeft: "pageXOffset", scrollTop: "pageYOffset"}, function( method, prop ) {
-       var top = /Y/.test( prop );
+jQuery.each( ["Left", "Top"], function( i, name ) {
+       var method = "scroll" + name;
 
        jQuery.fn[ method ] = function( val ) {
 
        jQuery.fn[ method ] = function( val ) {
-               return jQuery.access( this, function( elem, method, val ) {
-                       var win = getWindow( elem );
+               var elem, win;
+
+               if ( val === undefined ) {
+                       elem = this[ 0 ];
 
 
-                       if ( val === undefined ) {
-                               return win ? (prop in win) ? win[ prop ] :
-                                       win.document.documentElement[ method ] :
-                                       elem[ method ];
+                       if ( !elem ) {
+                               return null;
                        }
 
                        }
 
+                       win = getWindow( elem );
+
+                       // Return the scroll offset
+                       return win ? ("pageXOffset" in win) ? win[ i ? "pageYOffset" : "pageXOffset" ] :
+                               jQuery.support.boxModel && win.document.documentElement[ method ] ||
+                                       win.document.body[ method ] :
+                               elem[ method ];
+               }
+
+               // Set the scroll offset
+               return this.each(function() {
+                       win = getWindow( this );
+
                        if ( win ) {
                                win.scrollTo(
                        if ( win ) {
                                win.scrollTo(
-                                       !top ? val : jQuery( win ).scrollLeft(),
-                                       top ? val : jQuery( win ).scrollTop()
+                                       !i ? val : jQuery( win ).scrollLeft(),
+                                        i ? val : jQuery( win ).scrollTop()
                                );
 
                        } else {
                                );
 
                        } else {
-                               elem[ method ] = val;
+                               this[ method ] = val;
                        }
                        }
-               }, method, val, arguments.length, null );
+               });
        };
 });
 
        };
 });
 
@@ -9530,68 +8969,78 @@ function getWindow( elem ) {
                        elem.defaultView || elem.parentWindow :
                        false;
 }
                        elem.defaultView || elem.parentWindow :
                        false;
 }
-// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods
-jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
-       jQuery.each( { padding: "inner" + name, content: type, "": "outer" + name }, function( defaultExtra, funcName ) {
-               // margin is only for outerHeight, outerWidth
-               jQuery.fn[ funcName ] = function( margin, value ) {
-                       var chainable = arguments.length && ( defaultExtra || typeof margin !== "boolean" ),
-                               extra = defaultExtra || ( margin === true || value === true ? "margin" : "border" );
-
-                       return jQuery.access( this, function( elem, type, value ) {
-                               var doc;
-
-                               if ( jQuery.isWindow( elem ) ) {
-                                       // As of 5/8/2012 this will yield incorrect results for Mobile Safari, but there
-                                       // isn't a whole lot we can do. See pull request at this URL for discussion:
-                                       // https://github.com/jquery/jquery/pull/764
-                                       return elem.document.documentElement[ "client" + name ];
-                               }
-
-                               // Get document width or height
-                               if ( elem.nodeType === 9 ) {
-                                       doc = elem.documentElement;
-
-                                       // Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height], whichever is greatest
-                                       // unfortunately, this causes bug #3838 in IE6/8 only, but there is currently no good, small way to fix it.
-                                       return Math.max(
-                                               elem.body[ "scroll" + name ], doc[ "scroll" + name ],
-                                               elem.body[ "offset" + name ], doc[ "offset" + name ],
-                                               doc[ "client" + name ]
-                                       );
-                               }
 
 
-                               return value === undefined ?
-                                       // Get width or height on the element, requesting but not forcing parseFloat
-                                       jQuery.css( elem, type, extra ) :
 
 
-                                       // Set width or height on the element
-                                       jQuery.style( elem, type, value, extra );
-                       }, type, chainable ? margin : undefined, chainable, null );
-               };
-       });
+
+
+// Create width, height, innerHeight, innerWidth, outerHeight and outerWidth methods
+jQuery.each([ "Height", "Width" ], function( i, name ) {
+
+       var type = name.toLowerCase();
+
+       // innerHeight and innerWidth
+       jQuery.fn[ "inner" + name ] = function() {
+               var elem = this[0];
+               return elem && elem.style ?
+                       parseFloat( jQuery.css( elem, type, "padding" ) ) :
+                       null;
+       };
+
+       // outerHeight and outerWidth
+       jQuery.fn[ "outer" + name ] = function( margin ) {
+               var elem = this[0];
+               return elem && elem.style ?
+                       parseFloat( jQuery.css( elem, type, margin ? "margin" : "border" ) ) :
+                       null;
+       };
+
+       jQuery.fn[ type ] = function( size ) {
+               // Get window width or height
+               var elem = this[0];
+               if ( !elem ) {
+                       return size == null ? null : this;
+               }
+
+               if ( jQuery.isFunction( size ) ) {
+                       return this.each(function( i ) {
+                               var self = jQuery( this );
+                               self[ type ]( size.call( this, i, self[ type ]() ) );
+                       });
+               }
+
+               if ( jQuery.isWindow( elem ) ) {
+                       // Everyone else use document.documentElement or document.body depending on Quirks vs Standards mode
+                       // 3rd condition allows Nokia support, as it supports the docElem prop but not CSS1Compat
+                       var docElemProp = elem.document.documentElement[ "client" + name ],
+                               body = elem.document.body;
+                       return elem.document.compatMode === "CSS1Compat" && docElemProp ||
+                               body && body[ "client" + name ] || docElemProp;
+
+               // Get document width or height
+               } else if ( elem.nodeType === 9 ) {
+                       // Either scroll[Width/Height] or offset[Width/Height], whichever is greater
+                       return Math.max(
+                               elem.documentElement["client" + name],
+                               elem.body["scroll" + name], elem.documentElement["scroll" + name],
+                               elem.body["offset" + name], elem.documentElement["offset" + name]
+                       );
+
+               // Get or set width or height on the element
+               } else if ( size === undefined ) {
+                       var orig = jQuery.css( elem, type ),
+                               ret = parseFloat( orig );
+
+                       return jQuery.isNaN( ret ) ? orig : ret;
+
+               // Set the width or height on the element (default to pixels if value is unitless)
+               } else {
+                       return this.css( type, typeof size === "string" ? size : size + "px" );
+               }
+       };
+
 });
 });
-// Limit scope pollution from any deprecated API
-// (function() {
 
 
-// })();
+
 // Expose jQuery to the global object
 window.jQuery = window.$ = jQuery;
 // Expose jQuery to the global object
 window.jQuery = window.$ = jQuery;
-
-// Expose jQuery as an AMD module, but only for AMD loaders that
-// understand the issues with loading multiple versions of jQuery
-// in a page that all might call define(). The loader will indicate
-// they have special allowances for multiple jQuery versions by
-// specifying define.amd.jQuery = true. Register as a named module,
-// since jQuery can be concatenated with other files that may use define,
-// but not use a proper concatenation script that understands anonymous
-// AMD modules. A named AMD is safest and most robust way to register.
-// Lowercase jquery is used because AMD module names are derived from
-// file names, and jQuery is normally delivered in a lowercase file name.
-// Do this after creating the global so that if an AMD module wants to call
-// noConflict to hide this version of jQuery, it will work.
-if ( typeof define === "function" && define.amd && define.amd.jQuery ) {
-       define( "jquery", [], function () { return jQuery; } );
-}
-
-})( window );
+})(window);
diff --git a/www/monitor.html b/www/monitor.html
new file mode 100644 (file)
index 0000000..04d5303
--- /dev/null
@@ -0,0 +1,111 @@
+<html>
+  <head>
+    <meta charset="utf-8">
+    <title>Psensor Server Monitoring</title>
+
+    <link type="text/css"
+         rel="stylesheet"
+href="http://fonts.googleapis.com/css?family=Ubuntu:regular,bold&subset=Latin">
+
+    <link type="text/css" href="style.css" rel="stylesheet" /> 
+    <script type="text/javascript" src="jquery.js"></script>
+    <script type="text/javascript" src="psensor.js"></script>
+    <script>  
+       $(document).ready(function() {          
+               update_menu();
+
+               update_summary_sensors();
+               update_summary_sysinfo();      
+
+               $(document).ready(function() {
+                       setInterval(function() {
+                               update_summary_sensors();
+                               update_summary_sysinfo();
+                       }, 5000);
+               });
+         
+
+      });
+    </script>
+  </head>
+  <body>
+
+    <div id="menu">
+      <ul id="menu-list">
+       <li><em><a href="monitor.html">All</a></em></li>
+      </ul>
+    </div>
+      
+    <div id="main">
+      <h1>System Monitoring</h1>
+      
+      <p><em>Uptime</em>: <span id='uptime'></span></p>
+      
+      <h2>CPU</h2>
+      
+      <table id='cpu'>
+       <thead>
+         <tr>
+           <th>Current usage</th>
+           <th>Load 1mn</th>
+           <th>Load 5mn</th>
+           <th>Load 15mn</th>
+         </tr>
+       </thead>
+       <tbody></tbody>
+      </table>
+      
+      <h2>Memory</h2>
+      
+      <table>
+       <thead>
+         <tr>
+           <th></th>
+           <th>Total</th>
+           <th>Used</th>
+           <th>Free</th>
+           <th>Shared</th>
+           <th>Buffer</th>
+         </tr>
+       </thead>
+       <tbody>
+       <tr id='memory'></tr>
+       <tr id='swap'></tr>
+       </tbody>
+      </table>
+      
+      <h2>Network</h2>
+      
+      <table id='net'>
+       <thead>
+         <tr>
+           <th>Interface</th>
+           <th>Bytes In</th>
+           <th>Bytes Out</th>
+         </tr>
+       </thead>
+       <tbody>
+       </tbody>
+      </table>
+      
+      <h2>Sensors</h2>
+      
+      <table id='sensors'>
+       <thead>
+         <tr>
+           <th>Name</th>
+           <th>Value</th>
+         <th>Min</th>
+           <th>Max</th>
+           <th>Type</th>
+         </tr>
+       </thead>
+      <tbody id ="sensors"></tbody>
+      </table>
+    </div>
+
+    <div id="footer">
+      Generated by <a href='http://wpitchoune.net/psensor'>psensor-server</a>
+    </div>
+  </body>
+</html>
index 3e90285..6f4ef7e 100644 (file)
@@ -169,17 +169,8 @@ function update_menu() {
     str = "";
 
     $.getJSON("/api/1.1/sensors", function(data) {
     str = "";
 
     $.getJSON("/api/1.1/sensors", function(data) {
-       str += "<li><a href=\"index.html#cpu\">CPU</a><ul>";
-       url = "details.html?id="+escape("/api/1.1/cpu/usage");
-       link = "<a href='"+url+"'>usage</a>";
-       str += "<li>"+link+"</li>";
-       str += "</li></ul>";    
+       str += "<li><em>Sensors</em>\n<ul>";
 
 
-       str += "<li><a href=\"index.html#network\">Network</a></li>";
-
-       str += "<li><a href=\"index.html#memory\">Memory</a></li>";
-
-       str += "<li><a href=\"index.html#sensors\">Sensors</a>\n<ul>";
        $.each(data, function(i, item) {
             name = item["name"];
            url = "details.html?id="+escape("/api/1.1/sensors/"+item["id"]);
        $.each(data, function(i, item) {
             name = item["name"];
            url = "details.html?id="+escape("/api/1.1/sensors/"+item["id"]);
@@ -187,6 +178,13 @@ function update_menu() {
            str += "<li>"+link+"</li>";
        });
        str += "</li></ul>";
            str += "<li>"+link+"</li>";
        });
        str += "</li></ul>";
+
+       str += "<li><em>CPU</em><ul>";
+       url = "details.html?id="+escape("/api/1.1/cpu/usage");
+       link = "<a href='"+url+"'>usage</a>";
+       str += "<li>"+link+"</li>";
+       
+       str += "</li></ul>";
        
        $("#menu-list").append(str);
 
        
        $("#menu-list").append(str);
 
index 865c3d2..456a739 100644 (file)
-
 body {
 body {
-    background: #e2e2e2;
-    color: #333333;
-    font-family: Ubuntu,Arial,sans-serif;
-    line-height: 1.6;
-    font-weight: lighter;
-    margin: 1em 2em 2em 2em;
-    padding: 0 0 0 0;
-}
-
-h1 {
-    font-size: 2.813em;
-    margin: 0 0 0.267em 0;
-    padding: 0 0 0 0;
+    padding: 1em 1em 1em 1em;
+    font-family: "Ubuntu", sans-serif;
+    font-size: 100%;
+    font-style: normal;
     font-weight: normal;
     font-weight: normal;
+    color: #000;
+    background-color: #fff;
+    margin: 0 0 0 0;
 }
 
 }
 
-h2 {
-    font-size: 2em;
-    margin: 0 0 0.375em;
-    padding: 0 0 0 0;
-    font-weight: normal;
+a {
+    color: #1982D1;
+    font-style: normal;
+    text-decoration: none;
 }
 
 }
 
-h3 {
-    font-size: 1.438em;
-    margin: 0 0 0.522em;
-    padding: 0 0 0 0;
-    font-weight: normal;
+a:hover {
+    text-decoration: underline;
 }
 
 }
 
-h4 {
-    font-size: 1.219em;
-    margin: 0 0 0.615em;
+h1 {
+    font-size: 140%;
+    font-style: normal;
+    font-weight: bold;
+    text-transform: uppercase;
+    margin: 0 0 1em 0;
     padding: 0 0 0 0;
     padding: 0 0 0 0;
-    font-weight: normal;
 }
 
 }
 
-h5 {
-    font-size: 1em;
-    margin: 0 0 0.75em;
-    padding: 0 0 0 0;
-    font-weight: bold;
-}
 
 
-h6 {
-    font-weight: normal;
-    font-size: 0.813em;
-    letter-spacing: 0.1em;
-    margin: 0 0 0.923em;
+h2, #toctitle{
+    font-size: 110%;
+    font-style: normal;
+    font-weight: bold;
     text-transform: uppercase;
     text-transform: uppercase;
+    margin: 2em 0em 1em 0em;
     padding: 0 0 0 0;
 }
 
     padding: 0 0 0 0;
 }
 
-li {
-    margin: 0 0 0 1em;
-    line-height: 1.6;
+#footer {
+    padding-top: 2em;
+    color: #666;
+    clear: both;
+    text-align: right;
+    font-size: 75%;
 }
 
 }
 
-li p {
-    margin: 0 0 0 0;
+p {
+    font-size: 100%;
+    margin-bottom: 8px;
 }
 
 }
 
-ul {
-    margin: 0 0 0 0;
+table {
+    text-align: left;
     padding: 0 0 0 0;
     padding: 0 0 0 0;
+    min-width: 50%;
+    border-spacing: 0;
+    border: 0;
 }
 
 }
 
-a:link, a:visited {
-    color: #19B6EE;
-    text-decoration: none;
+thead {
+    background-color: #000;
+    color: #fff;
+    padding: 0 0 0 0;    
 }
 
 }
 
-a:hover {
-    text-decoration: underline;
+tbody {
+    padding: 0 0 0 0;
 }
 
 }
 
-code, pre, tt {
-    font-family: "Ubuntu Mono","Courier New",Courier,monospace;
+th {
+    padding: 0.25em 0.5em 0.25em 0.5em;
+    font-style: normal;
     font-weight: normal;
     font-weight: normal;
-    color: #333333;
 }
 
 }
 
-pre {
-    background: none repeat scroll 0 0 #e0e0e0;
-    border-radius: 4px;
-    padding: 0.5em 0.5em;
-    margin: 0 0 0 0;
-    white-space: pre-wrap;
-    word-wrap: break-word;
+td {
+    padding: 0.25em 0.25em 0em 0.25em;
 }
 
 }
 
-table {
+#chart {
+    color: #000;
+    font-style: normal;
+    font-weight: normal;
     width: 100%;
     width: 100%;
-    text-align: left;
+    height: 300px;
 }
 
 }
 
-#footer {
-    margin: 0 0 0 0;
-    font-size: 0.8em;
-    font-weight: lighter;
-    clear: both;
-    text-align: right;
+ul#menu-list li {
+    list-style: none;
 }
 
 }
 
-#page {
+#menu-list {
+    padding: 0 0 0 0;
     margin: 0 0 0 0;
     margin: 0 0 0 0;
+}
+
+#menu {
+    float: left;
+    width: 20%;
     padding: 0 0 0 0;
     padding: 0 0 0 0;
+    margin: 0 0 0 0;
 }
 
 #main {
 }
 
 #main {
-    background: #ffffff;
-
-   -moz-box-sizing: border-box;
-
-    padding: 2em 2em 2em 2em;
-
-    -moz-border-radius: 4px;
-    -webkit-border-radius: 4px;
-    border-radius: 4px;
-    
-    -webkit-box-shadow: 0 2px 2px 0 #C2C2C2;
-    box-shadow: 0 2px 2px 0 #C2C2C2;
+    float: right;
+    width: 80%;
+    padding: 0 0 0 0;
+    margin: 0 0em 0 0;
 }
 
 }
 
-#menu {
-    background: #ffffff;
-   -moz-box-sizing: border-box;
-    padding: 2em 2em 2em 2em;
-
-    -moz-border-radius: 4px;
-    -webkit-border-radius: 4px;
-    border-radius: 4px;
-    
-    -webkit-box-shadow: 0 2px 2px 0 #C2C2C2;
-    box-shadow: 0 2px 2px 0 #C2C2C2;
+em {
+    font-weight: bold;
+    font-style: normal;
 }
 
 }
 
-#menu-list, #menu-list > li > ul  {
-    list-style-type: none;
+#uptime {
+    font-weight: normal;
 }
 
 }
 
-/* menu on left col, content on right col */
-
-#menu {
-    float: left;
-    width: 18%;
+#menu-list em {
+    text-transform: uppercase;
 }
 
 }
 
-#main {
-    float: right;
-    width: 80%;
+#menu ul li {
+    padding-bottom: 1em;
 }
 
 }
 
-/* asciidoc */
-
-#toc, #content {
-    margin: 0em 0em 2em 0em;
-    
-    background: #ffffff;
-   -moz-box-sizing: border-box;
-    padding: 2em 2em 2em 2em;
+#menu-list ul li {
+    padding: 0 0 0 0em;
+}
 
 
-    -moz-border-radius: 4px;
-    -webkit-border-radius: 4px;
-    border-radius: 4px;
-    
-    -webkit-box-shadow: 0 2px 2px 0 #C2C2C2;
-    box-shadow: 0 2px 2px 0 #C2C2C2;
-}
\ No newline at end of file