From 1211e9a39c7d79e8753a8c8c8af528be63f901f9 Mon Sep 17 00:00:00 2001 From: SJ Date: Wed, 8 Feb 2012 23:14:28 +0100 Subject: [PATCH] added the webui to the tarball --- src/defs.h | 3 + src/message.c | 15 +- src/parser.c | 9 +- src/parser.h | 1 + src/parser_utils.c | 21 + src/test.c | 1 + util/db-mysql.sql | 8 +- webui/.htaccess | 9 + webui/config.php | 197 ++ webui/controller/audit/audit.php | 70 + webui/controller/audit/helper.php | 103 + webui/controller/common/error.php | 33 + webui/controller/common/footer.php | 18 + webui/controller/common/layout-empty.php | 16 + webui/controller/common/layout-health.php | 26 + webui/controller/common/layout-search.php | 37 + webui/controller/common/layout.php | 26 + webui/controller/common/menu.php | 30 + webui/controller/common/not_found.php | 23 + webui/controller/domain/domain.php | 122 ++ webui/controller/domain/remove.php | 75 + webui/controller/health/health.php | 32 + webui/controller/health/worker.php | 101 + webui/controller/login/login.php | 70 + webui/controller/login/logout.php | 29 + webui/controller/message/download.php | 50 + webui/controller/message/headers.php | 44 + webui/controller/message/remove.php | 57 + webui/controller/message/restore.php | 65 + webui/controller/message/view.php | 70 + webui/controller/policy/archiving.php | 41 + webui/controller/policy/removearchiving.php | 76 + webui/controller/search/helper.php | 202 ++ webui/controller/search/save.php | 41 + webui/controller/search/search.php | 95 + webui/controller/stat/chart.php | 45 + webui/controller/stat/counter.php | 51 + webui/controller/stat/graph.php | 47 + webui/controller/stat/stat.php | 33 + webui/controller/user/add.php | 136 ++ webui/controller/user/edit.php | 142 ++ webui/controller/user/list.php | 101 + webui/controller/user/remove.php | 76 + webui/controller/user/settings.php | 78 + webui/index.php | 89 + webui/language/en/messages.php | 308 +++ webui/language/hu/messages.iso-8859-2.php | 309 +++ webui/language/hu/messages.php | 309 +++ webui/log/.htaccess | 2 + webui/log/lock | 1 + webui/model/audit/audit.php | 121 ++ webui/model/domain/domain.php | 47 + webui/model/health/health.php | 114 ++ webui/model/mail/mail.php | 51 + webui/model/policy/archiving.php | 39 + webui/model/search/message.php | 420 ++++ webui/model/search/search.php | 502 +++++ webui/model/stat/chart.php | 139 ++ webui/model/stat/counter.php | 43 + webui/model/user/auth.php | 78 + webui/model/user/import.php | 344 ++++ webui/model/user/prefs.php | 45 + webui/model/user/user.php | 421 ++++ webui/sign.php | 36 + webui/system/controller.php | 119 ++ webui/system/database/ldap.php | 101 + webui/system/database/mysql.php | 88 + webui/system/database/sphinx.php | 92 + webui/system/database/sqlite.php | 93 + webui/system/db.php | 38 + webui/system/document.php | 12 + webui/system/front.php | 59 + webui/system/helper/fpdf16/font/courier.php | 7 + webui/system/helper/fpdf16/font/desktop.ini | 4 + webui/system/helper/fpdf16/font/helvetica.php | 15 + .../system/helper/fpdf16/font/helveticab.php | 15 + .../system/helper/fpdf16/font/helveticabi.php | 15 + .../system/helper/fpdf16/font/helveticai.php | 15 + .../helper/fpdf16/font/makefont/cp1250.map | 251 +++ .../helper/fpdf16/font/makefont/cp1251.map | 255 +++ .../helper/fpdf16/font/makefont/cp1252.map | 251 +++ .../helper/fpdf16/font/makefont/cp1253.map | 239 +++ .../helper/fpdf16/font/makefont/cp1254.map | 249 +++ .../helper/fpdf16/font/makefont/cp1255.map | 233 +++ .../helper/fpdf16/font/makefont/cp1257.map | 244 +++ .../helper/fpdf16/font/makefont/cp1258.map | 247 +++ .../helper/fpdf16/font/makefont/cp874.map | 225 +++ .../fpdf16/font/makefont/iso-8859-1.map | 256 +++ .../fpdf16/font/makefont/iso-8859-11.map | 248 +++ .../fpdf16/font/makefont/iso-8859-15.map | 256 +++ .../fpdf16/font/makefont/iso-8859-16.map | 256 +++ .../fpdf16/font/makefont/iso-8859-2.map | 256 +++ .../fpdf16/font/makefont/iso-8859-4.map | 256 +++ .../fpdf16/font/makefont/iso-8859-5.map | 256 +++ .../fpdf16/font/makefont/iso-8859-7.map | 250 +++ .../fpdf16/font/makefont/iso-8859-9.map | 256 +++ .../helper/fpdf16/font/makefont/koi8-r.map | 256 +++ .../helper/fpdf16/font/makefont/koi8-u.map | 256 +++ .../helper/fpdf16/font/makefont/makefont.php | 419 ++++ webui/system/helper/fpdf16/font/symbol.php | 15 + webui/system/helper/fpdf16/font/times.php | 15 + webui/system/helper/fpdf16/font/timesb.php | 15 + webui/system/helper/fpdf16/font/timesbi.php | 15 + webui/system/helper/fpdf16/font/timesi.php | 15 + .../helper/fpdf16/font/zapfdingbats.php | 15 + webui/system/helper/fpdf16/fpdf.css | 21 + webui/system/helper/fpdf16/fpdf.php | 1732 +++++++++++++++++ webui/system/helper/libchart/COPYING | 674 +++++++ webui/system/helper/libchart/ChangeLog | 57 + webui/system/helper/libchart/README | 47 + .../helper/libchart/classes/libchart.php | 42 + .../helper/libchart/classes/model/DataSet.php | 28 + .../helper/libchart/classes/model/Point.php | 59 + .../libchart/classes/model/XYDataSet.php | 56 + .../classes/model/XYSeriesDataSet.php | 76 + .../libchart/classes/view/axis/Axis.php | 130 ++ .../libchart/classes/view/axis/Bound.php | 156 ++ .../libchart/classes/view/caption/Caption.php | 112 ++ .../libchart/classes/view/chart/BarChart.php | 183 ++ .../libchart/classes/view/chart/Chart.php | 102 + .../classes/view/chart/HorizontalBarChart.php | 217 +++ .../libchart/classes/view/chart/LineChart.php | 200 ++ .../libchart/classes/view/chart/PieChart.php | 261 +++ .../classes/view/chart/VerticalBarChart.php | 217 +++ .../libchart/classes/view/color/Color.php | 99 + .../libchart/classes/view/color/ColorSet.php | 88 + .../libchart/classes/view/color/Palette.php | 156 ++ .../libchart/classes/view/plot/Plot.php | 443 +++++ .../classes/view/primitive/Padding.php | 68 + .../classes/view/primitive/Primitive.php | 70 + .../classes/view/primitive/Rectangle.php | 80 + .../libchart/classes/view/text/Text.php | 129 ++ .../fonts/DejaVuSansCondensed-Bold.ttf | Bin 0 -> 62716 bytes .../libchart/fonts/DejaVuSansCondensed.ttf | Bin 0 -> 73144 bytes .../helper/libchart/images/PoweredBy.png | Bin 0 -> 1608 bytes webui/system/language.php | 40 + webui/system/ldap.php | 50 + webui/system/loader.php | 85 + webui/system/mail.php | 128 ++ webui/system/misc.php | 439 +++++ webui/system/model.php | 17 + webui/system/registry.php | 25 + webui/system/request.php | 42 + webui/system/router.php | 50 + webui/system/startup.php | 20 + webui/view/javascript/colorbox.js | 888 +++++++++ webui/view/javascript/jquery-1.4.2.min.js | 154 ++ webui/view/javascript/jquery-1.7.1.min.js | 4 + .../javascript/jquery-ui-1.8.13.custom.min.js | 784 ++++++++ webui/view/javascript/jquery-ui-i18n.js | 1379 +++++++++++++ webui/view/javascript/jquery.dropdownPlain.js | 17 + webui/view/javascript/piler.js | 353 ++++ webui/view/javascript/tip_balloon.js | 221 +++ webui/view/javascript/tip_balloon/b.gif | Bin 0 -> 46 bytes .../javascript/tip_balloon/background.gif | Bin 0 -> 43 bytes webui/view/javascript/tip_balloon/l.gif | Bin 0 -> 46 bytes webui/view/javascript/tip_balloon/lb.gif | Bin 0 -> 85 bytes webui/view/javascript/tip_balloon/lt.gif | Bin 0 -> 86 bytes webui/view/javascript/tip_balloon/r.gif | Bin 0 -> 46 bytes webui/view/javascript/tip_balloon/rb.gif | Bin 0 -> 86 bytes webui/view/javascript/tip_balloon/rt.gif | Bin 0 -> 85 bytes webui/view/javascript/tip_balloon/stemb.gif | Bin 0 -> 165 bytes webui/view/javascript/tip_balloon/stemt.gif | Bin 0 -> 167 bytes webui/view/javascript/tip_balloon/t.gif | Bin 0 -> 46 bytes webui/view/javascript/tip_centerwindow.js | 104 + webui/view/javascript/tip_followscroll.js | 88 + webui/view/javascript/wz_tooltip.js | 1301 +++++++++++++ webui/view/theme/default/images/arrowdown.gif | Bin 0 -> 73 bytes webui/view/theme/default/images/arrowup.gif | Bin 0 -> 74 bytes .../theme/default/images/attachment_icon.png | Bin 0 -> 893 bytes webui/view/theme/default/images/calendar.png | Bin 0 -> 639 bytes .../theme/default/images/fileicons/audio.png | Bin 0 -> 727 bytes .../theme/default/images/fileicons/doc.png | Bin 0 -> 659 bytes .../theme/default/images/fileicons/file.png | Bin 0 -> 720 bytes .../theme/default/images/fileicons/image.png | Bin 0 -> 906 bytes .../theme/default/images/fileicons/odf.png | Bin 0 -> 807 bytes .../theme/default/images/fileicons/pdf.png | Bin 0 -> 663 bytes .../theme/default/images/fileicons/ppt.png | Bin 0 -> 762 bytes .../theme/default/images/fileicons/rar.png | Bin 0 -> 631 bytes .../theme/default/images/fileicons/swf.png | Bin 0 -> 843 bytes .../theme/default/images/fileicons/txt.png | Bin 0 -> 542 bytes .../theme/default/images/fileicons/vcf.png | Bin 0 -> 711 bytes .../theme/default/images/fileicons/video.png | Bin 0 -> 740 bytes .../theme/default/images/fileicons/xls.png | Bin 0 -> 731 bytes webui/view/theme/default/images/green_ok.png | Bin 0 -> 984 bytes webui/view/theme/default/images/line.png | Bin 0 -> 95 bytes .../view/theme/default/images/navigation.png | Bin 0 -> 1264 bytes webui/view/theme/default/images/red_x.png | Bin 0 -> 1004 bytes webui/view/theme/default/images/remote.gif | Bin 0 -> 71 bytes webui/view/theme/default/images/search.png | Bin 0 -> 738 bytes webui/view/theme/default/images/spinner.gif | Bin 0 -> 3208 bytes webui/view/theme/default/images/spinner1.gif | Bin 0 -> 1924 bytes webui/view/theme/default/images/tag_blue.png | Bin 0 -> 495 bytes .../theme/default/stylesheet/colorbox.css | 37 + .../default/stylesheet/images/border.png | Bin 0 -> 112 bytes .../default/stylesheet/images/controls.png | Bin 0 -> 1633 bytes .../images/ie6/borderBottomCenter.png | Bin 0 -> 111 bytes .../images/ie6/borderBottomLeft.png | Bin 0 -> 215 bytes .../images/ie6/borderBottomRight.png | Bin 0 -> 217 bytes .../images/ie6/borderMiddleLeft.png | Bin 0 -> 108 bytes .../images/ie6/borderMiddleRight.png | Bin 0 -> 108 bytes .../stylesheet/images/ie6/borderTopCenter.png | Bin 0 -> 111 bytes .../stylesheet/images/ie6/borderTopLeft.png | Bin 0 -> 216 bytes .../stylesheet/images/ie6/borderTopRight.png | Bin 0 -> 214 bytes .../default/stylesheet/images/loading.gif | Bin 0 -> 9427 bytes .../stylesheet/images/loading_background.png | Bin 0 -> 157 bytes .../default/stylesheet/images/overlay.png | Bin 0 -> 182 bytes .../images/ui-bg_flat_0_aaaaaa_40x100.png | Bin 0 -> 180 bytes .../images/ui-bg_flat_75_ffffff_40x100.png | Bin 0 -> 178 bytes .../images/ui-bg_glass_55_fbf9ee_1x400.png | Bin 0 -> 120 bytes .../images/ui-bg_glass_65_ffffff_1x400.png | Bin 0 -> 105 bytes .../images/ui-bg_glass_75_dadada_1x400.png | Bin 0 -> 111 bytes .../images/ui-bg_glass_75_e6e6e6_1x400.png | Bin 0 -> 110 bytes .../images/ui-bg_glass_95_fef1ec_1x400.png | Bin 0 -> 119 bytes .../ui-bg_highlight-soft_75_cccccc_1x100.png | Bin 0 -> 101 bytes .../images/ui-icons_222222_256x240.png | Bin 0 -> 4369 bytes .../images/ui-icons_2e83ff_256x240.png | Bin 0 -> 4369 bytes .../images/ui-icons_454545_256x240.png | Bin 0 -> 4369 bytes .../images/ui-icons_888888_256x240.png | Bin 0 -> 4369 bytes .../images/ui-icons_cd0a0a_256x240.png | Bin 0 -> 4369 bytes .../stylesheet/jquery.ui.accordion.css | 19 + .../default/stylesheet/jquery.ui.all.css | 11 + .../stylesheet/jquery.ui.autocomplete.css | 53 + .../default/stylesheet/jquery.ui.base.css | 11 + .../default/stylesheet/jquery.ui.button.css | 38 + .../default/stylesheet/jquery.ui.core.css | 41 + .../stylesheet/jquery.ui.datepicker.css | 68 + .../default/stylesheet/jquery.ui.dialog.css | 21 + .../stylesheet/jquery.ui.progressbar.css | 11 + .../stylesheet/jquery.ui.resizable.css | 25 + .../stylesheet/jquery.ui.selectable.css | 10 + .../default/stylesheet/jquery.ui.slider.css | 24 + .../default/stylesheet/jquery.ui.tabs.css | 18 + .../default/stylesheet/jquery.ui.theme.css | 252 +++ .../default/stylesheet/style-default.css | 183 ++ .../theme/default/templates/audit/audit.tpl | 100 + .../theme/default/templates/audit/helper.tpl | 118 ++ .../theme/default/templates/common/error.tpl | 3 + .../theme/default/templates/common/footer.tpl | 1 + .../default/templates/common/layout-empty.tpl | 1 + .../templates/common/layout-health.tpl | 59 + .../templates/common/layout-search.tpl | 59 + .../theme/default/templates/common/layout.tpl | 50 + .../default/templates/common/menu-admin.tpl | 42 + .../theme/default/templates/common/menu.tpl | 24 + .../default/templates/common/not_found.tpl | 2 + .../theme/default/templates/domain/list.tpl | 50 + .../theme/default/templates/domain/remove.tpl | 13 + .../health/counter-reset-confirm.tpl | 28 + .../theme/default/templates/health/health.tpl | 1 + .../theme/default/templates/health/worker.tpl | 125 ++ .../default/templates/health/worker.tpl-old | 131 ++ .../theme/default/templates/login/login.tpl | 36 + .../theme/default/templates/login/logout.tpl | 5 + .../default/templates/message/headers.tpl | 24 + .../default/templates/message/remove.tpl | 22 + .../default/templates/message/restore.tpl | 24 + .../theme/default/templates/message/view.tpl | 36 + .../default/templates/policy/archiving.tpl | 90 + .../templates/policy/removearchiving.tpl | 22 + .../default/templates/search/advanced.tpl | 127 ++ .../theme/default/templates/search/expert.tpl | 65 + .../theme/default/templates/search/helper.tpl | 117 ++ .../theme/default/templates/search/save.tpl | 20 + .../theme/default/templates/search/search.tpl | 69 + .../theme/default/templates/stat/counter.tpl | 20 + .../theme/default/templates/stat/stat.tpl | 15 + .../view/theme/default/templates/user/add.tpl | 81 + .../theme/default/templates/user/edit.tpl | 99 + .../theme/default/templates/user/list.tpl | 67 + .../theme/default/templates/user/remove.tpl | 13 + .../theme/default/templates/user/settings.tpl | 73 + 272 files changed, 26456 insertions(+), 11 deletions(-) create mode 100644 webui/.htaccess create mode 100644 webui/config.php create mode 100644 webui/controller/audit/audit.php create mode 100644 webui/controller/audit/helper.php create mode 100644 webui/controller/common/error.php create mode 100644 webui/controller/common/footer.php create mode 100644 webui/controller/common/layout-empty.php create mode 100644 webui/controller/common/layout-health.php create mode 100644 webui/controller/common/layout-search.php create mode 100644 webui/controller/common/layout.php create mode 100644 webui/controller/common/menu.php create mode 100644 webui/controller/common/not_found.php create mode 100644 webui/controller/domain/domain.php create mode 100644 webui/controller/domain/remove.php create mode 100644 webui/controller/health/health.php create mode 100644 webui/controller/health/worker.php create mode 100644 webui/controller/login/login.php create mode 100644 webui/controller/login/logout.php create mode 100644 webui/controller/message/download.php create mode 100644 webui/controller/message/headers.php create mode 100644 webui/controller/message/remove.php create mode 100644 webui/controller/message/restore.php create mode 100644 webui/controller/message/view.php create mode 100644 webui/controller/policy/archiving.php create mode 100644 webui/controller/policy/removearchiving.php create mode 100644 webui/controller/search/helper.php create mode 100644 webui/controller/search/save.php create mode 100644 webui/controller/search/search.php create mode 100644 webui/controller/stat/chart.php create mode 100644 webui/controller/stat/counter.php create mode 100644 webui/controller/stat/graph.php create mode 100644 webui/controller/stat/stat.php create mode 100644 webui/controller/user/add.php create mode 100644 webui/controller/user/edit.php create mode 100644 webui/controller/user/list.php create mode 100644 webui/controller/user/remove.php create mode 100644 webui/controller/user/settings.php create mode 100644 webui/index.php create mode 100644 webui/language/en/messages.php create mode 100644 webui/language/hu/messages.iso-8859-2.php create mode 100644 webui/language/hu/messages.php create mode 100644 webui/log/.htaccess create mode 100644 webui/log/lock create mode 100644 webui/model/audit/audit.php create mode 100644 webui/model/domain/domain.php create mode 100644 webui/model/health/health.php create mode 100644 webui/model/mail/mail.php create mode 100644 webui/model/policy/archiving.php create mode 100644 webui/model/search/message.php create mode 100644 webui/model/search/search.php create mode 100644 webui/model/stat/chart.php create mode 100644 webui/model/stat/counter.php create mode 100644 webui/model/user/auth.php create mode 100644 webui/model/user/import.php create mode 100644 webui/model/user/prefs.php create mode 100644 webui/model/user/user.php create mode 100644 webui/sign.php create mode 100644 webui/system/controller.php create mode 100644 webui/system/database/ldap.php create mode 100644 webui/system/database/mysql.php create mode 100644 webui/system/database/sphinx.php create mode 100644 webui/system/database/sqlite.php create mode 100644 webui/system/db.php create mode 100644 webui/system/document.php create mode 100644 webui/system/front.php create mode 100755 webui/system/helper/fpdf16/font/courier.php create mode 100755 webui/system/helper/fpdf16/font/desktop.ini create mode 100755 webui/system/helper/fpdf16/font/helvetica.php create mode 100755 webui/system/helper/fpdf16/font/helveticab.php create mode 100755 webui/system/helper/fpdf16/font/helveticabi.php create mode 100755 webui/system/helper/fpdf16/font/helveticai.php create mode 100755 webui/system/helper/fpdf16/font/makefont/cp1250.map create mode 100755 webui/system/helper/fpdf16/font/makefont/cp1251.map create mode 100755 webui/system/helper/fpdf16/font/makefont/cp1252.map create mode 100755 webui/system/helper/fpdf16/font/makefont/cp1253.map create mode 100755 webui/system/helper/fpdf16/font/makefont/cp1254.map create mode 100755 webui/system/helper/fpdf16/font/makefont/cp1255.map create mode 100755 webui/system/helper/fpdf16/font/makefont/cp1257.map create mode 100755 webui/system/helper/fpdf16/font/makefont/cp1258.map create mode 100755 webui/system/helper/fpdf16/font/makefont/cp874.map create mode 100755 webui/system/helper/fpdf16/font/makefont/iso-8859-1.map create mode 100755 webui/system/helper/fpdf16/font/makefont/iso-8859-11.map create mode 100755 webui/system/helper/fpdf16/font/makefont/iso-8859-15.map create mode 100755 webui/system/helper/fpdf16/font/makefont/iso-8859-16.map create mode 100755 webui/system/helper/fpdf16/font/makefont/iso-8859-2.map create mode 100755 webui/system/helper/fpdf16/font/makefont/iso-8859-4.map create mode 100755 webui/system/helper/fpdf16/font/makefont/iso-8859-5.map create mode 100755 webui/system/helper/fpdf16/font/makefont/iso-8859-7.map create mode 100755 webui/system/helper/fpdf16/font/makefont/iso-8859-9.map create mode 100755 webui/system/helper/fpdf16/font/makefont/koi8-r.map create mode 100755 webui/system/helper/fpdf16/font/makefont/koi8-u.map create mode 100755 webui/system/helper/fpdf16/font/makefont/makefont.php create mode 100755 webui/system/helper/fpdf16/font/symbol.php create mode 100755 webui/system/helper/fpdf16/font/times.php create mode 100755 webui/system/helper/fpdf16/font/timesb.php create mode 100755 webui/system/helper/fpdf16/font/timesbi.php create mode 100755 webui/system/helper/fpdf16/font/timesi.php create mode 100755 webui/system/helper/fpdf16/font/zapfdingbats.php create mode 100755 webui/system/helper/fpdf16/fpdf.css create mode 100755 webui/system/helper/fpdf16/fpdf.php create mode 100644 webui/system/helper/libchart/COPYING create mode 100644 webui/system/helper/libchart/ChangeLog create mode 100644 webui/system/helper/libchart/README create mode 100644 webui/system/helper/libchart/classes/libchart.php create mode 100644 webui/system/helper/libchart/classes/model/DataSet.php create mode 100644 webui/system/helper/libchart/classes/model/Point.php create mode 100644 webui/system/helper/libchart/classes/model/XYDataSet.php create mode 100644 webui/system/helper/libchart/classes/model/XYSeriesDataSet.php create mode 100644 webui/system/helper/libchart/classes/view/axis/Axis.php create mode 100644 webui/system/helper/libchart/classes/view/axis/Bound.php create mode 100644 webui/system/helper/libchart/classes/view/caption/Caption.php create mode 100644 webui/system/helper/libchart/classes/view/chart/BarChart.php create mode 100644 webui/system/helper/libchart/classes/view/chart/Chart.php create mode 100644 webui/system/helper/libchart/classes/view/chart/HorizontalBarChart.php create mode 100644 webui/system/helper/libchart/classes/view/chart/LineChart.php create mode 100644 webui/system/helper/libchart/classes/view/chart/PieChart.php create mode 100644 webui/system/helper/libchart/classes/view/chart/VerticalBarChart.php create mode 100644 webui/system/helper/libchart/classes/view/color/Color.php create mode 100644 webui/system/helper/libchart/classes/view/color/ColorSet.php create mode 100644 webui/system/helper/libchart/classes/view/color/Palette.php create mode 100644 webui/system/helper/libchart/classes/view/plot/Plot.php create mode 100644 webui/system/helper/libchart/classes/view/primitive/Padding.php create mode 100644 webui/system/helper/libchart/classes/view/primitive/Primitive.php create mode 100644 webui/system/helper/libchart/classes/view/primitive/Rectangle.php create mode 100644 webui/system/helper/libchart/classes/view/text/Text.php create mode 100644 webui/system/helper/libchart/fonts/DejaVuSansCondensed-Bold.ttf create mode 100644 webui/system/helper/libchart/fonts/DejaVuSansCondensed.ttf create mode 100644 webui/system/helper/libchart/images/PoweredBy.png create mode 100644 webui/system/language.php create mode 100644 webui/system/ldap.php create mode 100644 webui/system/loader.php create mode 100644 webui/system/mail.php create mode 100644 webui/system/misc.php create mode 100644 webui/system/model.php create mode 100644 webui/system/registry.php create mode 100644 webui/system/request.php create mode 100644 webui/system/router.php create mode 100644 webui/system/startup.php create mode 100644 webui/view/javascript/colorbox.js create mode 100644 webui/view/javascript/jquery-1.4.2.min.js create mode 100644 webui/view/javascript/jquery-1.7.1.min.js create mode 100644 webui/view/javascript/jquery-ui-1.8.13.custom.min.js create mode 100644 webui/view/javascript/jquery-ui-i18n.js create mode 100644 webui/view/javascript/jquery.dropdownPlain.js create mode 100644 webui/view/javascript/piler.js create mode 100644 webui/view/javascript/tip_balloon.js create mode 100644 webui/view/javascript/tip_balloon/b.gif create mode 100644 webui/view/javascript/tip_balloon/background.gif create mode 100644 webui/view/javascript/tip_balloon/l.gif create mode 100644 webui/view/javascript/tip_balloon/lb.gif create mode 100644 webui/view/javascript/tip_balloon/lt.gif create mode 100644 webui/view/javascript/tip_balloon/r.gif create mode 100644 webui/view/javascript/tip_balloon/rb.gif create mode 100644 webui/view/javascript/tip_balloon/rt.gif create mode 100644 webui/view/javascript/tip_balloon/stemb.gif create mode 100644 webui/view/javascript/tip_balloon/stemt.gif create mode 100644 webui/view/javascript/tip_balloon/t.gif create mode 100644 webui/view/javascript/tip_centerwindow.js create mode 100644 webui/view/javascript/tip_followscroll.js create mode 100644 webui/view/javascript/wz_tooltip.js create mode 100644 webui/view/theme/default/images/arrowdown.gif create mode 100644 webui/view/theme/default/images/arrowup.gif create mode 100644 webui/view/theme/default/images/attachment_icon.png create mode 100644 webui/view/theme/default/images/calendar.png create mode 100644 webui/view/theme/default/images/fileicons/audio.png create mode 100644 webui/view/theme/default/images/fileicons/doc.png create mode 100644 webui/view/theme/default/images/fileicons/file.png create mode 100644 webui/view/theme/default/images/fileicons/image.png create mode 100644 webui/view/theme/default/images/fileicons/odf.png create mode 100644 webui/view/theme/default/images/fileicons/pdf.png create mode 100644 webui/view/theme/default/images/fileicons/ppt.png create mode 100644 webui/view/theme/default/images/fileicons/rar.png create mode 100644 webui/view/theme/default/images/fileicons/swf.png create mode 100644 webui/view/theme/default/images/fileicons/txt.png create mode 100644 webui/view/theme/default/images/fileicons/vcf.png create mode 100644 webui/view/theme/default/images/fileicons/video.png create mode 100644 webui/view/theme/default/images/fileicons/xls.png create mode 100644 webui/view/theme/default/images/green_ok.png create mode 100644 webui/view/theme/default/images/line.png create mode 100644 webui/view/theme/default/images/navigation.png create mode 100644 webui/view/theme/default/images/red_x.png create mode 100644 webui/view/theme/default/images/remote.gif create mode 100644 webui/view/theme/default/images/search.png create mode 100644 webui/view/theme/default/images/spinner.gif create mode 100644 webui/view/theme/default/images/spinner1.gif create mode 100644 webui/view/theme/default/images/tag_blue.png create mode 100644 webui/view/theme/default/stylesheet/colorbox.css create mode 100644 webui/view/theme/default/stylesheet/images/border.png create mode 100644 webui/view/theme/default/stylesheet/images/controls.png create mode 100644 webui/view/theme/default/stylesheet/images/ie6/borderBottomCenter.png create mode 100644 webui/view/theme/default/stylesheet/images/ie6/borderBottomLeft.png create mode 100644 webui/view/theme/default/stylesheet/images/ie6/borderBottomRight.png create mode 100644 webui/view/theme/default/stylesheet/images/ie6/borderMiddleLeft.png create mode 100644 webui/view/theme/default/stylesheet/images/ie6/borderMiddleRight.png create mode 100644 webui/view/theme/default/stylesheet/images/ie6/borderTopCenter.png create mode 100644 webui/view/theme/default/stylesheet/images/ie6/borderTopLeft.png create mode 100644 webui/view/theme/default/stylesheet/images/ie6/borderTopRight.png create mode 100644 webui/view/theme/default/stylesheet/images/loading.gif create mode 100644 webui/view/theme/default/stylesheet/images/loading_background.png create mode 100644 webui/view/theme/default/stylesheet/images/overlay.png create mode 100644 webui/view/theme/default/stylesheet/images/ui-bg_flat_0_aaaaaa_40x100.png create mode 100644 webui/view/theme/default/stylesheet/images/ui-bg_flat_75_ffffff_40x100.png create mode 100644 webui/view/theme/default/stylesheet/images/ui-bg_glass_55_fbf9ee_1x400.png create mode 100644 webui/view/theme/default/stylesheet/images/ui-bg_glass_65_ffffff_1x400.png create mode 100644 webui/view/theme/default/stylesheet/images/ui-bg_glass_75_dadada_1x400.png create mode 100644 webui/view/theme/default/stylesheet/images/ui-bg_glass_75_e6e6e6_1x400.png create mode 100644 webui/view/theme/default/stylesheet/images/ui-bg_glass_95_fef1ec_1x400.png create mode 100644 webui/view/theme/default/stylesheet/images/ui-bg_highlight-soft_75_cccccc_1x100.png create mode 100644 webui/view/theme/default/stylesheet/images/ui-icons_222222_256x240.png create mode 100644 webui/view/theme/default/stylesheet/images/ui-icons_2e83ff_256x240.png create mode 100644 webui/view/theme/default/stylesheet/images/ui-icons_454545_256x240.png create mode 100644 webui/view/theme/default/stylesheet/images/ui-icons_888888_256x240.png create mode 100644 webui/view/theme/default/stylesheet/images/ui-icons_cd0a0a_256x240.png create mode 100644 webui/view/theme/default/stylesheet/jquery.ui.accordion.css create mode 100644 webui/view/theme/default/stylesheet/jquery.ui.all.css create mode 100644 webui/view/theme/default/stylesheet/jquery.ui.autocomplete.css create mode 100644 webui/view/theme/default/stylesheet/jquery.ui.base.css create mode 100644 webui/view/theme/default/stylesheet/jquery.ui.button.css create mode 100644 webui/view/theme/default/stylesheet/jquery.ui.core.css create mode 100644 webui/view/theme/default/stylesheet/jquery.ui.datepicker.css create mode 100644 webui/view/theme/default/stylesheet/jquery.ui.dialog.css create mode 100644 webui/view/theme/default/stylesheet/jquery.ui.progressbar.css create mode 100644 webui/view/theme/default/stylesheet/jquery.ui.resizable.css create mode 100644 webui/view/theme/default/stylesheet/jquery.ui.selectable.css create mode 100644 webui/view/theme/default/stylesheet/jquery.ui.slider.css create mode 100644 webui/view/theme/default/stylesheet/jquery.ui.tabs.css create mode 100644 webui/view/theme/default/stylesheet/jquery.ui.theme.css create mode 100644 webui/view/theme/default/stylesheet/style-default.css create mode 100644 webui/view/theme/default/templates/audit/audit.tpl create mode 100644 webui/view/theme/default/templates/audit/helper.tpl create mode 100644 webui/view/theme/default/templates/common/error.tpl create mode 100644 webui/view/theme/default/templates/common/footer.tpl create mode 100644 webui/view/theme/default/templates/common/layout-empty.tpl create mode 100644 webui/view/theme/default/templates/common/layout-health.tpl create mode 100644 webui/view/theme/default/templates/common/layout-search.tpl create mode 100644 webui/view/theme/default/templates/common/layout.tpl create mode 100644 webui/view/theme/default/templates/common/menu-admin.tpl create mode 100644 webui/view/theme/default/templates/common/menu.tpl create mode 100644 webui/view/theme/default/templates/common/not_found.tpl create mode 100644 webui/view/theme/default/templates/domain/list.tpl create mode 100644 webui/view/theme/default/templates/domain/remove.tpl create mode 100644 webui/view/theme/default/templates/health/counter-reset-confirm.tpl create mode 100644 webui/view/theme/default/templates/health/health.tpl create mode 100644 webui/view/theme/default/templates/health/worker.tpl create mode 100644 webui/view/theme/default/templates/health/worker.tpl-old create mode 100644 webui/view/theme/default/templates/login/login.tpl create mode 100644 webui/view/theme/default/templates/login/logout.tpl create mode 100644 webui/view/theme/default/templates/message/headers.tpl create mode 100644 webui/view/theme/default/templates/message/remove.tpl create mode 100644 webui/view/theme/default/templates/message/restore.tpl create mode 100644 webui/view/theme/default/templates/message/view.tpl create mode 100644 webui/view/theme/default/templates/policy/archiving.tpl create mode 100644 webui/view/theme/default/templates/policy/removearchiving.tpl create mode 100644 webui/view/theme/default/templates/search/advanced.tpl create mode 100644 webui/view/theme/default/templates/search/expert.tpl create mode 100644 webui/view/theme/default/templates/search/helper.tpl create mode 100644 webui/view/theme/default/templates/search/save.tpl create mode 100644 webui/view/theme/default/templates/search/search.tpl create mode 100644 webui/view/theme/default/templates/stat/counter.tpl create mode 100644 webui/view/theme/default/templates/stat/stat.tpl create mode 100644 webui/view/theme/default/templates/user/add.tpl create mode 100644 webui/view/theme/default/templates/user/edit.tpl create mode 100644 webui/view/theme/default/templates/user/list.tpl create mode 100644 webui/view/theme/default/templates/user/remove.tpl create mode 100644 webui/view/theme/default/templates/user/settings.tpl diff --git a/src/defs.h b/src/defs.h index 772fc3db..35818dc3 100644 --- a/src/defs.h +++ b/src/defs.h @@ -38,6 +38,7 @@ #define MSG_CONTENT_TRANSFER_ENCODING 7 #define MSG_CONTENT_DISPOSITION 8 #define MSG_MESSAGE_ID 9 +#define MSG_REFERENCES 10 #define MAXHASH 8171 @@ -144,6 +145,8 @@ struct _state { int n_attachments; struct attachment attachments[MAX_ATTACHMENTS]; + char reference[SMALLBUFSIZE]; + char b_from[SMALLBUFSIZE], b_from_domain[SMALLBUFSIZE], b_to[MAXBUFSIZE], b_to_domain[SMALLBUFSIZE], b_subject[MAXBUFSIZE], b_body[BIGBUFSIZE]; }; diff --git a/src/message.c b/src/message.c index 8879251c..4b8ded6f 100644 --- a/src/message.c +++ b/src/message.c @@ -252,10 +252,6 @@ int store_recipients(struct session_data *sdata, char *to, uint64 id, struct __c syslog(LOG_PRIORITY, "%s: %s.mysql_stmt_execute error: *%s*", sdata->ttmpfile, SQL_RECIPIENT_TABLE, mysql_error(&(sdata->mysql))); ret = ERR; } - - } else { - syslog(LOG_PRIORITY, "%s: invalid email address: %s", sdata->ttmpfile, puf); - continue; } } while(p); @@ -273,8 +269,8 @@ int store_meta_data(struct session_data *sdata, struct _state *state, struct __c char *subj, *p, s[MAXBUFSIZE], s2[SMALLBUFSIZE], vcode[2*DIGEST_LENGTH+1]; MYSQL_STMT *stmt; - MYSQL_BIND bind[4]; - unsigned long len[4]; + MYSQL_BIND bind[5]; + unsigned long len[5]; my_ulonglong id=0; @@ -286,7 +282,7 @@ int store_meta_data(struct session_data *sdata, struct _state *state, struct __c digest_string(s, &vcode[0]); - snprintf(s, MAXBUFSIZE-1, "INSERT INTO %s (`from`,`fromdomain`,`subject`,`spam`,`arrived`,`sent`,`size`,`hlen`,`direction`,`attachments`,`piler_id`,`message_id`,`digest`,`bodydigest`,`vcode`) VALUES(?,?,?,%d,%ld,%ld,%d,%d,%d,%d,'%s',?,'%s','%s','%s')", SQL_METADATA_TABLE, sdata->spam_message, sdata->now, sdata->sent, sdata->tot_len, sdata->hdr_len, sdata->direction, state->n_attachments, sdata->ttmpfile, sdata->digest, sdata->bodydigest, vcode); + snprintf(s, MAXBUFSIZE-1, "INSERT INTO %s (`from`,`fromdomain`,`subject`,`spam`,`arrived`,`sent`,`size`,`hlen`,`direction`,`attachments`,`piler_id`,`message_id`,`reference`,`digest`,`bodydigest`,`vcode`) VALUES(?,?,?,%d,%ld,%ld,%d,%d,%d,%d,'%s',?,?,'%s','%s','%s')", SQL_METADATA_TABLE, sdata->spam_message, sdata->now, sdata->sent, sdata->tot_len, sdata->hdr_len, sdata->direction, state->n_attachments, sdata->ttmpfile, sdata->digest, sdata->bodydigest, vcode); if(cfg->verbosity >= _LOG_DEBUG) syslog(LOG_PRIORITY, "%s: meta sql: *%s*", sdata->ttmpfile, s); @@ -335,6 +331,11 @@ int store_meta_data(struct session_data *sdata, struct _state *state, struct __c bind[3].is_null = 0; len[3] = strlen(state->message_id); bind[3].length = &len[3]; + bind[4].buffer_type = MYSQL_TYPE_STRING; + bind[4].buffer = state->reference; + bind[4].is_null = 0; + len[4] = strlen(state->reference); bind[4].length = &len[4]; + if(mysql_stmt_bind_param(stmt, bind)){ syslog(LOG_PRIORITY, "%s: %s.mysql_stmt_bind_param() error: %s", sdata->ttmpfile, SQL_METADATA_TABLE, mysql_stmt_error(stmt)); goto CLOSE; diff --git a/src/parser.c b/src/parser.c index 5b98e2e4..121cf387 100644 --- a/src/parser.c +++ b/src/parser.c @@ -90,7 +90,7 @@ void post_parse(struct session_data *sdata, struct _state *state, struct __confi len = strlen(state->b_to); if(state->b_to[len-1] == ' ') state->b_to[len-1] = '\0'; - syslog(LOG_PRIORITY, "%s: from=%s, to=%s, subj=%s, message-id=%s", sdata->ttmpfile, state->b_from, state->b_to, state->b_subject, state->message_id); + syslog(LOG_PRIORITY, "%s: from=%s, to=%s, subj=%s, message-id=%s, reference=%s", sdata->ttmpfile, state->b_from, state->b_to, state->b_subject, state->message_id, state->reference); } @@ -210,6 +210,7 @@ int parse_line(char *buf, struct _state *state, struct session_data *sdata, stru else if(strncasecmp(buf, "To:", 3) == 0) state->message_state = MSG_TO; else if(strncasecmp(buf, "Cc:", 3) == 0) state->message_state = MSG_CC; else if(strncasecmp(buf, "Message-Id:", 11) == 0) state->message_state = MSG_MESSAGE_ID; + else if(strncasecmp(buf, "References:", 11) == 0) state->message_state = MSG_REFERENCES; else if(strncasecmp(buf, "Subject:", strlen("Subject:")) == 0) state->message_state = MSG_SUBJECT; else if(strncasecmp(buf, "Date:", strlen("Date:")) == 0 && sdata->sent == 0) sdata->sent = parse_date_header(buf); @@ -231,6 +232,12 @@ int parse_line(char *buf, struct _state *state, struct session_data *sdata, stru } + if(state->is_1st_header == 1 && state->message_state == MSG_REFERENCES){ + if(strncasecmp(buf, "References:", 11) == 0) parse_reference(state, buf+11); + else parse_reference(state, buf); + } + + if(state->is_1st_header == 1 && state->message_state == MSG_SUBJECT && strlen(state->b_subject) + strlen(buf) < MAXBUFSIZE-1){ if(state->b_subject[0] == '\0'){ diff --git a/src/parser.h b/src/parser.h index 495f77e9..f2371254 100644 --- a/src/parser.h +++ b/src/parser.h @@ -31,5 +31,6 @@ void degenerateToken(unsigned char *p); void fixURL(char *url); int extractNameFromHeaderLine(char *s, char *name, char *resultbuf); char *determine_attachment_type(char *filename, char *type); +void parse_reference(struct _state *state, char *s); #endif /* _PARSER_H */ diff --git a/src/parser_utils.c b/src/parser_utils.c index cd330096..bc4acd7e 100644 --- a/src/parser_utils.c +++ b/src/parser_utils.c @@ -74,6 +74,8 @@ void init_state(struct _state *state){ memset(state->attachments[i].digest, 0, 2*DIGEST_LENGTH+1); } + memset(state->reference, 0, SMALLBUFSIZE); + memset(state->b_from, 0, SMALLBUFSIZE); memset(state->b_from_domain, 0, SMALLBUFSIZE); memset(state->b_to, 0, MAXBUFSIZE); @@ -679,3 +681,22 @@ char *determine_attachment_type(char *filename, char *type){ return "other,"; } + +void parse_reference(struct _state *state, char *s){ + int len; + char puf[SMALLBUFSIZE]; + + if(strlen(state->reference) > 10) return; + + do { + s = split_str(s, " ", puf, sizeof(puf)-1); + len = strlen(puf); + + if(len > 10 && len < SMALLBUFSIZE-1){ + memcpy(&(state->reference[strlen(state->reference)]), puf, len); + return; + } + } while(s); + +} + diff --git a/src/test.c b/src/test.c index 80928644..c25f655a 100644 --- a/src/test.c +++ b/src/test.c @@ -72,6 +72,7 @@ int main(int argc, char **argv){ printf("message-id: %s\n", state.message_id); printf("from: *%s (%s)*\n", state.b_from, state.b_from_domain); printf("to: *%s (%s)*\n", state.b_to, state.b_to_domain); + printf("reference: *%s*\n", state.reference); printf("subject: *%s*\n", state.b_subject); //printf("body: *%s*\n", state.b_body); diff --git a/util/db-mysql.sql b/util/db-mysql.sql index 97b270ec..5af4a09f 100644 --- a/util/db-mysql.sql +++ b/util/db-mysql.sql @@ -45,6 +45,7 @@ create table if not exists `metadata` ( `attachments` int default 0, `piler_id` char(36) not null, `message_id` char(128) character set 'latin1' not null, + `reference` char(128) character set 'latin1' not null, `digest` char(64) not null, `bodydigest` char(64) not null, `vcode` char(64) default null, @@ -53,9 +54,10 @@ create table if not exists `metadata` ( create index metadata_idx on metadata(`piler_id`); create index metadata_idx2 on metadata(`message_id`); -create index metadata_idx3 on metadata(`bodydigest`); -create index metadata_idx4 on metadata(`deleted`); -create index metadata_idx5 on metadata(`arrived`); +create index metadata_idx3 on metadata(`reference`); +create index metadata_idx4 on metadata(`bodydigest`); +create index metadata_idx5 on metadata(`deleted`); +create index metadata_idx6 on metadata(`arrived`); drop table if exists `rcpt`; diff --git a/webui/.htaccess b/webui/.htaccess new file mode 100644 index 00000000..e93410fc --- /dev/null +++ b/webui/.htaccess @@ -0,0 +1,9 @@ +RewriteEngine On +RewriteRule ^search.php /index.php?route=search/search&type=simple [L] +RewriteRule ^advanced.php /index.php?route=search/search&type=advanced [L] +RewriteRule ^expert.php /index.php?route=search/search&type=expert [L] +RewriteRule ^search-helper.php /index.php?route=search/helper [L] +RewriteRule ^audit-helper.php /index.php?route=audit/helper [L] +RewriteRule ^message.php /index.php?route=message/view [L] +RewriteRule ^settings.php /index.php?route=user/settings [L] + diff --git a/webui/config.php b/webui/config.php new file mode 100644 index 00000000..5d1a7182 --- /dev/null +++ b/webui/config.php @@ -0,0 +1,197 @@ + diff --git a/webui/controller/audit/audit.php b/webui/controller/audit/audit.php new file mode 100644 index 00000000..ee6948e9 --- /dev/null +++ b/webui/controller/audit/audit.php @@ -0,0 +1,70 @@ +id = "content"; + $this->template = "audit/audit.tpl"; + $this->layout = "common/layout-search"; + + $request = Registry::get('request'); + $db = Registry::get('db'); + + $this->load->model('audit/audit'); + + + /*if(isset($this->request->post['searchterm'])) { + $this->fixup_post_request(); + + $a = preg_replace("/\&loaded=1$/", "", $this->request->post['searchterm']); + }*/ + + + $this->render(); + } + + + private function fixup_post_request() { + $i = 0; + $a = array(); + + $this->data['blocks'] = array(); + + $this->data['searchterm'] = $this->request->post['searchterm']; + + parse_str($this->request->post['searchterm'], $a); + + foreach($a['f'] as $f) { + $val = array_shift($a['v']); + + if($val == '') { continue; } + + if($i == 0) { + $this->data['key0'] = 0; + + if($f == 'user') { $this->data['key0'] = 0; } + else if($f == 'ipaddr') { $this->data['key0'] = 1; } + else if($f == 'ref') { $this->data['key0'] = 2; } + + $this->data['val0'] = $val; + } + + $i++; + } + + if(isset($a['date1'])) { $this->data['date1'] = $a['date1']; } + if(isset($a['date2'])) { $this->data['date2'] = $a['date2']; } + + if(isset($a['action'])) { $this->data['action'] = $a['action']; } + + } + + + + + +} + +?> diff --git a/webui/controller/audit/helper.php b/webui/controller/audit/helper.php new file mode 100644 index 00000000..feec6cdf --- /dev/null +++ b/webui/controller/audit/helper.php @@ -0,0 +1,103 @@ +id = "content"; + $this->template = "audit/helper.tpl"; + $this->layout = "common/layout-empty"; + + + $request = Registry::get('request'); + $db = Registry::get('db'); + + $this->load->model('audit/audit'); + + + $this->data['page'] = 0; + if(isset($this->request->post['page'])) { $this->data['page'] = $this->request->post['page']; } + + $this->data['page_len'] = get_page_length(); + + $this->data['n'] = -1; + + + + if(isset($this->request->post)) { + $a = $this->fixup_request($this->request->post); + list($this->data['n'], $this->data['messages']) = $this->model_audit_audit->search_audit($a); + } + + $this->data['actions'][ACTION_UNKNOWN] = '??'; + $this->data['actions'][ACTION_LOGIN] = $this->data['text_login2']; + $this->data['actions'][ACTION_LOGIN_FAILED] = $this->data['text_login_failed']; + $this->data['actions'][ACTION_LOGOUT] = $this->data['text_logout2']; + $this->data['actions'][ACTION_VIEW_MESSAGE] = $this->data['text_view_message2']; + $this->data['actions'][ACTION_VIEW_HEADER] = $this->data['text_view_header']; + $this->data['actions'][ACTION_UNAUTHORIZED_VIEW_MESSAGE] = $this->data['text_unauthorized_view_message']; + $this->data['actions'][ACTION_RESTORE_MESSAGE] = $this->data['text_restore_message']; + $this->data['actions'][ACTION_DOWNLOAD_MESSAGE] = $this->data['text_download_message2']; + $this->data['actions'][ACTION_SEARCH] = $this->data['text_search2']; + $this->data['actions'][ACTION_SAVE_SEARCH] = $this->data['text_save_search']; + $this->data['actions'][ACTION_CHANGE_USER_SETTINGS] = $this->data['text_change_user_settings']; + $this->data['actions'][ACTION_REMOVE_MESSAGE] = $this->data['text_remove_message2']; + $this->data['actions'][ACTION_UNAUTHORIZED_REMOVE_MESSAGE] = $this->data['text_unauthorized_remove_message']; + + + + + /* paging info */ + + $this->data['prev_page'] = $this->data['page'] - 1; + $this->data['next_page'] = $this->data['page'] + 1; + + $this->data['total_pages'] = ceil($this->data['n'] / $this->data['page_len'])-1; + + $this->data['hits_from'] = $this->data['page'] * $this->data['page_len'] + 1; + $this->data['hits_to'] = ($this->data['page']+1) * $this->data['page_len']; + + if($this->data['hits_to'] > $this->data['n']) { $this->data['hits_to'] = $this->data['n']; } + + + $this->render(); + } + + + private function fixup_request($data = array()) { + $arr = array(); + + if(isset($data['f'])) { + foreach($data['f'] as $f) { + $val = array_shift($data['v']); + + + if($val == '') { continue; } + + if($f == 'user') { if(isset($arr['user'])) { $arr['user'] .= '*' . $val; } else { $arr['user'] = $val; } } + if($f == 'ipaddr') { if(isset($arr['ipaddr'])) { $arr['ipaddr'] .= '*' . $val; } else { $arr['ipaddr'] = $val; } } + if($f == 'ref') { if(isset($arr['ref'])) { $arr['ref'] .= '*' . $val; } else { $arr['ref'] = $val; } } + } + } + + if(isset($data['action'])) { $arr['action'] = $data['action']; } + + if(isset($data['date1'])) { $arr['date1'] = $data['date1']; } + if(isset($data['date2'])) { $arr['date2'] = $data['date2']; } + + if(isset($data['sort'])) { $arr['sort'] = $data['sort']; } + if(isset($data['order'])) { $arr['order'] = $data['order']; } + + $arr['page'] = $this->data['page']; + $arr['page_len'] = $this->data['page_len']; + + return $arr; + } + + +} + +?> diff --git a/webui/controller/common/error.php b/webui/controller/common/error.php new file mode 100644 index 00000000..f4562106 --- /dev/null +++ b/webui/controller/common/error.php @@ -0,0 +1,33 @@ +id = "content"; + $this->template = "common/error.tpl"; + $this->layout = "common/layout"; + + $this->document->title = $this->data['text_error']; + + $this->data['errortitle'] = $this->data['text_error']; + + if(isset($_SESSION['error'])){ + $this->data['errorstring'] = $_SESSION['error']; + unset($_SESSION['error']); + } + else { + $this->data['errorstring'] = "this is the errorstring"; + } + + + $this->render(); + + } + + +} + + +?> diff --git a/webui/controller/common/footer.php b/webui/controller/common/footer.php new file mode 100644 index 00000000..5ed1c764 --- /dev/null +++ b/webui/controller/common/footer.php @@ -0,0 +1,18 @@ +id = "footer"; + $this->template = "common/footer.tpl"; + + + $this->render(); + } + + +} + +?> diff --git a/webui/controller/common/layout-empty.php b/webui/controller/common/layout-empty.php new file mode 100644 index 00000000..33ed797c --- /dev/null +++ b/webui/controller/common/layout-empty.php @@ -0,0 +1,16 @@ +template = "common/layout-empty.tpl"; + + $this->render(); + } + + +} + + +?> diff --git a/webui/controller/common/layout-health.php b/webui/controller/common/layout-health.php new file mode 100644 index 00000000..30918b6a --- /dev/null +++ b/webui/controller/common/layout-health.php @@ -0,0 +1,26 @@ +data['title'] = $this->document->title; + + $this->template = "common/layout-health.tpl"; + + + $this->children = array( + "common/menu", + "common/footer" + ); + + $this->render(); + + } + + +} + + +?> diff --git a/webui/controller/common/layout-search.php b/webui/controller/common/layout-search.php new file mode 100644 index 00000000..ef95fdcb --- /dev/null +++ b/webui/controller/common/layout-search.php @@ -0,0 +1,37 @@ +data['title'] = $this->document->title; + + $this->template = "common/layout-search.tpl"; + + $this->data['search_args'] = ''; + + $this->data['open_saved_search_box'] = 0; + + + if(isset($_SERVER['REQUEST_URI'])) { + $this->data['search_args'] = preg_replace("/\/([\w]+)\.php\?{0,1}/", "", $_SERVER['REQUEST_URI']); + + if(preg_match("/\&a\=1/", $this->data['search_args'])) { $this->data['open_saved_search_box'] = 1; } + } + + + $this->children = array( + "common/menu", + "common/footer" + ); + + $this->render(); + + } + + +} + + +?> diff --git a/webui/controller/common/layout.php b/webui/controller/common/layout.php new file mode 100644 index 00000000..aeff2919 --- /dev/null +++ b/webui/controller/common/layout.php @@ -0,0 +1,26 @@ +data['title'] = $this->document->title; + + $this->template = "common/layout.tpl"; + + + $this->children = array( + "common/menu", + "common/footer" + ); + + $this->render(); + + } + + +} + + +?> diff --git a/webui/controller/common/menu.php b/webui/controller/common/menu.php new file mode 100644 index 00000000..9adaa463 --- /dev/null +++ b/webui/controller/common/menu.php @@ -0,0 +1,30 @@ +id = "menu"; + $this->template = "common/menu.tpl"; + + + $db = Registry::get('db'); + + $this->data['admin_user'] = Registry::get('admin_user'); + $this->data['auditor_user'] = Registry::get('auditor_user'); + $this->data['readonly_admin'] = Registry::get('readonly_admin'); + + if($this->data['admin_user'] == 1) { $this->template = "common/menu-admin.tpl"; } + + $this->render(); + + + } + + +} + + + +?> diff --git a/webui/controller/common/not_found.php b/webui/controller/common/not_found.php new file mode 100644 index 00000000..c3daad8f --- /dev/null +++ b/webui/controller/common/not_found.php @@ -0,0 +1,23 @@ +id = "content"; + $this->template = "common/not_found.tpl"; + $this->layout = "common/layout"; + + $this->document->title = $this->data['title_not_found']; + + + $this->render(); + + } + + +} + + +?> diff --git a/webui/controller/domain/domain.php b/webui/controller/domain/domain.php new file mode 100644 index 00000000..9080b05b --- /dev/null +++ b/webui/controller/domain/domain.php @@ -0,0 +1,122 @@ +id = "content"; + $this->template = "domain/list.tpl"; + $this->layout = "common/layout"; + + + $request = Registry::get('request'); + $db = Registry::get('db'); + + $this->load->model('domain/domain'); + + $this->document->title = $this->data['text_domain']; + + + $this->data['username'] = Registry::get('username'); + + + $this->data['page'] = 0; + $this->data['page_len'] = get_page_length(); + + $this->data['total'] = 0; + + $this->data['domains'] = array(); + + /* get search term if there's any */ + + if($this->request->server['REQUEST_METHOD'] == 'POST'){ + $this->data['search'] = @$this->request->post['search']; + } + else { + $this->data['search'] = @$this->request->get['search']; + } + + + /* get page */ + + if(isset($this->request->get['page']) && is_numeric($this->request->get['page']) && $this->request->get['page'] > 0) { + $this->data['page'] = $this->request->get['page']; + } + + + + /* check if we are admin */ + + if(Registry::get('admin_user') == 1) { + + if($this->request->server['REQUEST_METHOD'] == 'POST') { + if($this->validate() == true) { + + if($this->model_domain_domain->addDomain($this->request->post['domain'], $this->request->post['mapped']) == 1) { + $this->data['x'] = $this->data['text_successfully_added']; + } else { + $this->template = "common/error.tpl"; + $this->data['errorstring'] = $this->data['text_failed_to_add']; + } + } + else { + $this->template = "common/error.tpl"; + $this->data['errorstring'] = array_pop($this->error); + } + } + + /* get list of current policies */ + + $this->data['domains'] = $this->model_domain_domain->getDomains(); + + } + else { + $this->template = "common/error.tpl"; + $this->data['errorstring'] = $this->data['text_you_are_not_admin']; + } + + + $this->data['prev_page'] = $this->data['page'] - 1; + $this->data['next_page'] = $this->data['page'] + 1; + + $this->data['total'] = floor(count($this->data['domains']) / $this->data['page_len']); + + + $this->render(); + } + + + private function validate() { + + if(!isset($this->request->post['domain']) || strlen($this->request->post['domain']) < 3) { + $this->error['email'] = $this->data['text_invalid_data']; + } + else { + $domains = explode("\n", $this->request->post['domain']); + foreach ($domains as $domain) { + $domain = rtrim($domain); + if(!preg_match('/^[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,5})$/', $domain) ) { + $this->error['email'] = $this->data['text_invalid_data'] . ": $domain"; + } + } + } + + if(!isset($this->request->post['mapped']) || strlen($this->request->post['mapped']) < 3 || !preg_match('/^[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,5})$/', $this->request->post['mapped']) ) { + $this->error['domain'] = $this->data['text_invalid_data'] . ": " . $this->request->post['mapped']; + } + + if (!$this->error) { + return true; + } else { + return false; + } + + } + + + +} + +?> diff --git a/webui/controller/domain/remove.php b/webui/controller/domain/remove.php new file mode 100644 index 00000000..222f0d3b --- /dev/null +++ b/webui/controller/domain/remove.php @@ -0,0 +1,75 @@ +id = "content"; + $this->template = "domain/remove.tpl"; + $this->layout = "common/layout"; + + + $request = Registry::get('request'); + $db = Registry::get('db'); + + $this->load->model('domain/domain'); + + $this->document->title = $this->data['text_domain']; + + + $this->data['username'] = Registry::get('username'); + + $this->data['domain'] = @$this->request->get['domain']; + $this->data['confirmed'] = (int)@$this->request->get['confirmed']; + + + if($this->validate() == true) { + + if($this->data['confirmed'] == 1) { + $ret = $this->model_domain_domain->deleteDomain($this->data['domain']); + if($ret == 1){ + $this->data['x'] = $this->data['text_successfully_removed']; + } + else { + $this->data['x'] = $this->data['text_failed_to_remove']; + } + } + } + else { + $this->template = "common/error.tpl"; + $this->data['errorstring'] = array_pop($this->error); + } + + + + $this->render(); + } + + + private function validate() { + + if(Registry::get('admin_user') == 0) { + $this->error['admin'] = $this->data['text_you_are_not_admin']; + } + + if(!isset($this->request->get['domain']) || strlen($this->request->get['domain']) < 3 || ($this->request->get['domain'] != "local" && !preg_match('/^[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,5})$/', $this->request->get['domain'])) ) { + $this->error['domain'] = $this->data['text_invalid_data']; + } + + + if (!$this->error) { + return true; + } else { + return false; + } + + } + + +} + +?> diff --git a/webui/controller/health/health.php b/webui/controller/health/health.php new file mode 100644 index 00000000..5a219636 --- /dev/null +++ b/webui/controller/health/health.php @@ -0,0 +1,32 @@ +id = "content"; + $this->template = "health/health.tpl"; + $this->layout = "common/layout-health"; + + + $request = Registry::get('request'); + $language = Registry::get('language'); + + $this->document->title = $language->get('text_health_monitor'); + + + /* check if we are admin */ + + if(Registry::get('admin_user') != 1 && Registry::get('readonly_admin') != 1 && Registry::get('auditor_admin') != 1) { + $this->template = "common/error.tpl"; + $this->data['errorstring'] = $this->data['text_you_are_not_admin']; + } + + + $this->render(); + } + +} + +?> diff --git a/webui/controller/health/worker.php b/webui/controller/health/worker.php new file mode 100644 index 00000000..1fb846e1 --- /dev/null +++ b/webui/controller/health/worker.php @@ -0,0 +1,101 @@ +id = "content"; + $this->template = "health/worker.tpl"; + $this->layout = "common/layout-empty"; + + $db_history = Registry::get('db_history'); + + $this->load->model('health/health'); + $this->load->model('stat/counter'); + + $request = Registry::get('request'); + + $lang = Registry::get('language'); + + + $this->data['health'] = array(); + + if(Registry::get('admin_user') != 1 && Registry::get('readonly_admin') != 1) { + die("go away"); + } + + foreach (Registry::get('health_smtp_servers') as $smtp) { + $this->data['health'][] = $this->model_health_health->checksmtp($smtp, $lang->data['text_error']); + } + + + /*$this->data['queues'][] = format_qshape($lang->data['text_active_incoming_queue'], QSHAPE_ACTIVE_INCOMING); + $this->data['queues'][] = format_qshape($lang->data['text_deferred_queue'], QSHAPE_DEFERRED);*/ + + /*if(file_exists(QSHAPE_ACTIVE_INCOMING_OUT)) { + $this->data['queues_out'][] = format_qshape($lang->data['text_active_incoming_queue'], QSHAPE_ACTIVE_INCOMING_OUT); + $this->data['queues_out'][] = format_qshape($lang->data['text_deferred_queue'], QSHAPE_DEFERRED_OUT); + }*/ + + $this->data['processed_emails'] = $this->model_health_health->count_processed_emails(); + + list ($this->data['uptime'], $this->data['cpuload']) = $this->model_health_health->uptime(); + + $this->data['cpuinfo'] = 100 - (int)file_get_contents(CPUSTAT); + $this->data['archive_size'] = (int)file_get_contents(ARCHIVE_SIZE); + + $this->data['quarantinereportinfo'] = @file_get_contents(DAILY_QUARANTINE_REPORT_STAT); + + list($this->data['totalmem'], $this->data['meminfo'], $this->data['totalswap'], $this->data['swapinfo']) = $this->model_health_health->meminfo(); + $this->data['shortdiskinfo'] = $this->model_health_health->diskinfo(); + + /*if(file_exists(MAILLOG_PID_FILE)) { + $this->data['maillog_status'] = $lang->data['text_running']; + } else { + $this->data['maillog_status'] = $lang->data['text_not_running']; + }*/ + + + if(ENABLE_LDAP_IMPORT_FEATURE == 1) { + $this->data['adsyncinfo'] = @file_get_contents(AD_SYNC_STAT); + + $this->data['total_emails_in_database'] = 0; + + $a = preg_split("/ /", $this->data['adsyncinfo']); + list ($this->data['totalusers'], $this->data['totalnewusers'], $this->data['totaldeletedusers'], $this->data['total_emails_in_database']) = preg_split("/\//", $a[count($a)-1]); + $this->data['adsyncinfo'] = $a[0] . " " . $a[1] . " " . $this->data['total_emails_in_database']; + } + + + /* counter related stuff */ + + $db = Registry::get('db'); + $db->select_db($db->database); + + if($this->request->server['REQUEST_METHOD'] == 'POST' && isset($this->request->post['resetcounters']) && $this->request->post['resetcounters'] == 1) { + if(isset($this->request->post['confirmed']) && $this->request->post['confirmed'] == 1 && Registry::get('admin_user') == 1) { + $this->model_stat_counter->resetCounters(); + header("Location: index.php?route=health/health"); + exit; + } + else { + $this->template = "health/counter-reset-confirm.tpl"; + } + } + + + $this->data['counters'] = $this->model_stat_counter->getCounters(); + $this->data['prefix'] = ''; + if(isset($this->data['counters']['_c:rcvd'])) { $this->data['prefix'] = '_c:'; } + + $this->data['sysinfo'] = $this->model_health_health->sysinfo(); + + $this->render(); + } + + +} + +?> diff --git a/webui/controller/login/login.php b/webui/controller/login/login.php new file mode 100644 index 00000000..43a2b6cc --- /dev/null +++ b/webui/controller/login/login.php @@ -0,0 +1,70 @@ +id = "content"; + $this->template = "login/login.tpl"; + $this->layout = "common/layout"; + + + $request = Registry::get('request'); + + $db = Registry::get('db'); + + $this->load->model('user/auth'); + $this->load->model('user/user'); + $this->load->model('user/prefs'); + + $this->document->title = $this->data['text_login']; + + if($this->request->server['REQUEST_METHOD'] == 'POST' && $this->validate() == true) { + + if($this->model_user_auth->checkLogin($this->request->post['username'], $_POST['password']) == 1) { + + $this->model_user_prefs->get_user_preferences($_SESSION['username']); + + LOGGER('logged in'); + + /*if(isset($_POST['relocation']) && $_POST['relocation']) { + header("Location: " . SITE_URL . "index.php?" . $_POST['relocation']); + } else { + header("Location: " . SITE_URL . "search.php"); + }*/ + + header("Location: " . SITE_URL . "search.php"); + + exit; + } + + $this->data['x'] = $this->data['text_invalid_email_or_password']; + + } + + + $this->render(); + } + + + private function validate() { + + if(strlen($this->request->post['username']) < 2){ + $this->error['username'] = $this->data['text_invalid_username']; + } + + + if (!$this->error) { + return true; + } else { + return false; + } + + } + + +} + +?> diff --git a/webui/controller/login/logout.php b/webui/controller/login/logout.php new file mode 100644 index 00000000..f23c117b --- /dev/null +++ b/webui/controller/login/logout.php @@ -0,0 +1,29 @@ +id = "content"; + $this->template = "login/logout.tpl"; + $this->layout = "common/layout"; + + $request = Registry::get('request'); + + $db = Registry::get('db'); + + $this->load->model('user/auth'); + + $this->document->title = $this->data['text_logout']; + + logout(); + + $this->render(); + } + + +} + +?> diff --git a/webui/controller/message/download.php b/webui/controller/message/download.php new file mode 100644 index 00000000..18ce30be --- /dev/null +++ b/webui/controller/message/download.php @@ -0,0 +1,50 @@ +id = "content"; + $this->template = "message/headers.tpl"; + $this->layout = "common/layout-empty"; + + $request = Registry::get('request'); + $db = Registry::get('db'); + + $this->load->model('search/search'); + $this->load->model('search/message'); + + $this->document->title = $this->data['text_message']; + + $this->data['id'] = @$this->request->get['id']; + + if(!verify_piler_id($this->data['id'])) { + AUDIT(ACTION_UNKNOWN, '', '', $this->data['id'], 'unknown piler id: ' . $this->data['id']); + die("invalid id: " . $this->data['id']); + } + + if(!$this->model_search_search->check_your_permission_by_piler_id($this->data['id'])) { + AUDIT(ACTION_UNAUTHORIZED_VIEW_MESSAGE, '', '', $this->data['id'], ''); + die("no permission for " . $this->data['id']); + } + + + AUDIT(ACTION_DOWNLOAD_MESSAGE, '', '', $this->data['id'], ''); + + header("Cache-Control: public, must-revalidate"); + header("Pragma: no-cache"); + header("Content-Type: application/octet-stream"); + header("Content-Disposition: attachment; filename=" . $this->data['id'] . ".eml"); + header("Content-Transfer-Encoding: binary\n"); + + print $this->model_search_message->get_raw_message($this->data['id']); + exit; + + $this->render(); + } + + +} + +?> diff --git a/webui/controller/message/headers.php b/webui/controller/message/headers.php new file mode 100644 index 00000000..31a109b6 --- /dev/null +++ b/webui/controller/message/headers.php @@ -0,0 +1,44 @@ +id = "content"; + $this->template = "message/headers.tpl"; + $this->layout = "common/layout-empty"; + + $request = Registry::get('request'); + $db = Registry::get('db'); + + $this->load->model('search/search'); + $this->load->model('search/message'); + + $this->load->model('user/user'); + + $this->document->title = $this->data['text_message']; + + $this->data['id'] = @$this->request->get['id']; + + if(!verify_piler_id($this->data['id'])) { + AUDIT(ACTION_UNKNOWN, '', '', $this->data['id'], 'unknown piler id: ' . $this->data['id']); + die("invalid id: " . $this->data['id']); + } + + if(!$this->model_search_search->check_your_permission_by_piler_id($this->data['id'])) { + AUDIT(ACTION_UNAUTHORIZED_VIEW_MESSAGE, '', '', $this->data['id'], ''); + die("no permission for " . $this->data['id']); + } + + AUDIT(ACTION_VIEW_HEADER, '', '', $this->data['id'], ''); + + $this->data['data'] = $this->model_search_message->get_message_headers($this->data['id']); + + $this->render(); + } + + +} + +?> diff --git a/webui/controller/message/remove.php b/webui/controller/message/remove.php new file mode 100644 index 00000000..1686869d --- /dev/null +++ b/webui/controller/message/remove.php @@ -0,0 +1,57 @@ +id = "content"; + $this->template = "message/remove.tpl"; + $this->layout = "common/layout-empty"; + + $request = Registry::get('request'); + $db = Registry::get('db'); + + $this->load->model('search/search'); + $this->load->model('search/message'); + + $this->load->model('user/user'); + + $this->document->title = $this->data['text_message']; + + $this->data['id'] = @$this->request->get['id']; + + if(HOLD_EMAIL == 1) { + AUDIT(ACTION_UNAUTHORIZED_REMOVE_MESSAGE, '', '', $this->data['id'], ''); + die("not authorized to remove id: " . $this->data['id']); + } + + + if(!verify_piler_id($this->data['id'])) { + AUDIT(ACTION_UNKNOWN, '', '', $this->data['id'], 'unknown piler id: ' . $this->data['id']); + die("invalid id: " . $this->data['id']); + } + + if(Registry::get('admin_user') == 0) { + AUDIT(ACTION_UNAUTHORIZED_REMOVE_MESSAGE, '', '', $this->data['id'], ''); + die("no permission for " . $this->data['id']); + } + + + AUDIT(ACTION_REMOVE_MESSAGE, '', '', $this->data['id'], ''); + + + if($this->model_search_search->remove_message($this->data['id']) == 1) { + $this->data['data'] = $this->data['text_marked_for_removal']; + } else { + $this->data['data'] = $this->data['text_failed_to_mark_for_removal']; + AUDIT(ACTION_REMOVE_MESSAGE, '', '', $this->data['id'], 'failed'); + } + + $this->render(); + } + + +} + +?> diff --git a/webui/controller/message/restore.php b/webui/controller/message/restore.php new file mode 100644 index 00000000..a21c6b05 --- /dev/null +++ b/webui/controller/message/restore.php @@ -0,0 +1,65 @@ +id = "content"; + $this->template = "message/restore.tpl"; + $this->layout = "common/layout-empty"; + + $request = Registry::get('request'); + $db = Registry::get('db'); + + $this->load->model('search/search'); + $this->load->model('search/message'); + + $this->load->model('user/user'); + $this->load->model('mail/mail'); + + $this->document->title = $this->data['text_message']; + + $this->data['id'] = @$this->request->get['id']; + + if(!verify_piler_id($this->data['id'])) { + AUDIT(ACTION_UNKNOWN, '', '', $this->data['id'], 'unknown piler id: ' . $this->data['id']); + die("invalid id: " . $this->data['id']); + } + + if(!$this->model_search_search->check_your_permission_by_piler_id($this->data['id'])) { + AUDIT(ACTION_UNAUTHORIZED_VIEW_MESSAGE, '', '', $this->data['id'], ''); + die("no permission for " . $this->data['id']); + } + + AUDIT(ACTION_RESTORE_MESSAGE, '', '', $this->data['id'], ''); + + + $this->data['username'] = Registry::get('username'); + + $rcpt = array(); + + + /* send the email to all the recipients of the original email if we are admin or auditor users */ + + if(Registry::get('admin_user') == 1 || Registry::get('auditor_user') == 1) { + $rcpt = $this->model_search_search->get_message_recipients($this->data['id']); + } + else { + array_push($rcpt, $_SESSION['email']); + } + + + $x = $this->model_mail_mail->send_smtp_email(SMARTHOST, SMARTHOST_PORT, SMTP_DOMAIN, SMTP_FROMADDR, $rcpt, + "Received: by piler" . EOL . PILER_HEADER_FIELD . $this->data['id'] . EOL . $this->model_search_message->get_raw_message($this->data['id']) ); + + if($x == 1) { $this->data['data'] = $this->data['text_restored']; } + else { $this->data['data'] = $this->data['text_failed_to_restore']; } + + $this->render(); + } + + +} + +?> diff --git a/webui/controller/message/view.php b/webui/controller/message/view.php new file mode 100644 index 00000000..08b35c60 --- /dev/null +++ b/webui/controller/message/view.php @@ -0,0 +1,70 @@ +id = "content"; + $this->template = "message/view.tpl"; + $this->layout = "common/layout-empty"; + + $request = Registry::get('request'); + $db = Registry::get('db'); + + $this->load->model('search/search'); + $this->load->model('search/message'); + $this->load->model('audit/audit'); + + $this->load->model('user/user'); + + $this->document->title = $this->data['text_message']; + + $this->data['id'] = ''; + + if(isset($_SERVER['REQUEST_URI'])) { $this->data['id'] = preg_replace("/\/message.php\//", "", $_SERVER['REQUEST_URI']); } + + if($this->request->server['REQUEST_METHOD'] == 'POST') { + $this->data['id'] = $this->request->post['id']; + } + + + if(!verify_piler_id($this->data['id'])) { + AUDIT(ACTION_UNKNOWN, '', '', $this->data['id'], 'unknown piler id: ' . $this->data['id']); + die("invalid id: " . $this->data['id']); + } + + if(!$this->model_search_search->check_your_permission_by_piler_id($this->data['id'])) { + AUDIT(ACTION_UNAUTHORIZED_VIEW_MESSAGE, '', '', $this->data['id'], ''); + die("no permission for " . $this->data['id']); + } + + + AUDIT(ACTION_VIEW_MESSAGE, '', '', $this->data['id'], ''); + + $this->data['username'] = Registry::get('username'); + + /* fix username if we are admin */ + + if(isset($this->request->get['user']) && strlen($this->request->get['user']) > 1 && (Registry::get('admin_user') == 1 || $this->model_user_user->isUserInMyDomain($this->request->get['user']) == 1) ) { + $this->data['username'] = $this->request->get['user']; + } + + + if($this->request->server['REQUEST_METHOD'] == 'POST') { + $this->model_search_message->add_message_tag($this->data['id'], $_SESSION['uid'], $this->request->post['tag']); + header("Location: " . $_SERVER['HTTP_REFERER']); + exit; + } + + + $this->data['message'] = $this->model_search_message->extract_message($this->data['id']); + $this->data['message']['tag'] = $this->model_search_message->get_message_tag($this->data['id'], $_SESSION['uid']); + + $this->render(); + } + + +} + +?> diff --git a/webui/controller/policy/archiving.php b/webui/controller/policy/archiving.php new file mode 100644 index 00000000..c6853329 --- /dev/null +++ b/webui/controller/policy/archiving.php @@ -0,0 +1,41 @@ +id = "content"; + $this->template = "policy/archiving.tpl"; + $this->layout = "common/layout"; + + + $request = Registry::get('request'); + + $db = Registry::get('db'); + + $this->load->model('policy/archiving'); + + $this->document->title = $this->data['text_archiving_rules']; + + $this->data['rules'] = array(); + + + if($_SERVER['REQUEST_METHOD'] == 'POST') { + $rc = $this->model_policy_archiving->add_new_rule($this->request->post); + + } + + $this->data['rules'] = $this->model_policy_archiving->get_rules(); + +//print_r($this->data['rules']); + + + $this->render(); + } + + +} + +?> diff --git a/webui/controller/policy/removearchiving.php b/webui/controller/policy/removearchiving.php new file mode 100644 index 00000000..c8aaf71e --- /dev/null +++ b/webui/controller/policy/removearchiving.php @@ -0,0 +1,76 @@ +id = "content"; + $this->template = "policy/removearchiving.tpl"; + $this->layout = "common/layout"; + + + $request = Registry::get('request'); + $db = Registry::get('db'); + + $this->load->model('policy/archiving'); + + $this->document->title = $this->data['text_archiving_rules']; + + + $this->data['username'] = Registry::get('username'); + + $this->data['id'] = @$this->request->get['id']; + $this->data['confirmed'] = (int)@$this->request->get['confirmed']; + + + $this->data['rule'] = $this->model_policy_archiving->get_rule($this->data['id']); + + if($this->validate() == true) { + + if($this->data['confirmed'] == 1) { + $ret = $this->model_policy_archiving->remove_rule($this->data['id']); + if($ret == 1){ + $this->data['x'] = $this->data['text_successfully_removed']; + } + else { + $this->data['x'] = $this->data['text_failed_to_remove']; + } + } + } + else { + $this->template = "common/error.tpl"; + $this->data['errorstring'] = array_pop($this->error); + } + + + + $this->render(); + } + + + private function validate() { + + if(Registry::get('admin_user') == 0) { + $this->error['admin'] = $this->data['text_you_are_not_admin']; + } + + if(!isset($this->request->get['id']) || $this->request->get['id'] < 1 ) { + $this->error['rule'] = $this->data['text_invalid_data']; + } + + + if (!$this->error) { + return true; + } else { + return false; + } + + } + + +} + +?> diff --git a/webui/controller/search/helper.php b/webui/controller/search/helper.php new file mode 100644 index 00000000..9af88a2d --- /dev/null +++ b/webui/controller/search/helper.php @@ -0,0 +1,202 @@ + '', + 'f_from' => '', + 'o_to' => '', + 'f_to' => '', + 'from' => '', + 'to' => '', + 'from_domain' => '', + 'to_domain' => '', + 'subject' => '', + 'body' => '', + 'date1' => '', + 'date2' => '', + 'direction' => '', + 'size' => '', + 'attachment_type' => '', + 'tag' => '' + ); + + + public function index(){ + + $this->id = "content"; + $this->template = "search/helper.tpl"; + $this->layout = "common/layout-empty"; + + + $request = Registry::get('request'); + $db = Registry::get('db'); + + $sphx = Registry::get('sphx'); + + $this->load->model('search/search'); + $this->load->model('search/message'); + $this->load->model('user/user'); + + + $this->data['page'] = 0; + if(isset($this->request->post['page'])) { $this->data['page'] = $this->request->post['page']; } + + $this->data['page_len'] = get_page_length(); + + $this->data['n'] = -1; + + if($this->request->post['searchtype'] == 'advanced') { + $this->preprocess_post_advanced_request($this->request->post); + $this->fixup_post_request(); + list ($this->data['n'], $this->data['messages']) = $this->model_search_search->search_messages($this->a, ADVANCED_SEARCH, $this->data['page']); + } else if($this->request->post['searchtype'] == 'expert'){ + $this->preprocess_post_expert_request($this->request->post); + $this->fixup_post_request(); + list ($this->data['n'], $this->data['messages']) = $this->model_search_search->search_messages($this->a, ADVANCED_SEARCH, $this->data['page']); + } else { + $this->fixup_post_simple_request(); + list ($this->data['n'], $this->data['messages']) = $this->model_search_search->search_messages($this->request->post, SIMPLE_SEARCH, $this->data['page']); + } + + + /* paging info */ + + $this->data['prev_page'] = $this->data['page'] - 1; + $this->data['next_page'] = $this->data['page'] + 1; + + $this->data['total_pages'] = ceil($this->data['n'] / $this->data['page_len'])-1; + + $this->data['hits_from'] = $this->data['page'] * $this->data['page_len'] + 1; + $this->data['hits_to'] = ($this->data['page']+1) * $this->data['page_len']; + + if($this->data['hits_to'] > $this->data['n']) { $this->data['hits_to'] = $this->data['n']; } + + + $this->render(); + } + + + private function fixup_post_simple_request() { + if(!isset($this->request->post['date1'])) { $this->request->post['date1'] = ''; } + if(!isset($this->request->post['date2'])) { $this->request->post['date2'] = ''; } + } + + + private function fixup_post_request() { + while(list($k, $v) = each($this->a)) { + if($this->a[$k]) { $this->a[$k] = substr($this->a[$k], 1, strlen($this->a[$k])); } + } + + $this->a['sort'] = $this->request->post['sort']; + $this->a['order'] = $this->request->post['order']; + } + + + private function preprocess_post_expert_request($data = array()) { + $token = ''; + +//print_r($data); + + $s = preg_replace("/:/", ": ", $data['search']); + $s = preg_replace("/,/", " ", $s); + $s = preg_replace("/\s{1,}/", " ", $s); + $b = explode(" ", $s); + + while(list($k, $v) = each($b)) { + if($v == 'from:') { $token = 'from'; continue; } + else if($v == 'to:') { $token = 'to'; continue; } + else if($v == 'subject:') { $token = 'subject'; continue; } + else if($v == 'body:') { $token = 'body'; continue; } + else if($v == 'direction:' || $v == 'd:') { $token = 'direction'; continue; } + else if($v == 'size:') { $token = 'size'; continue; } + else if($v == 'date1:') { $token = 'date1'; continue; } + else if($v == 'date2:') { $token = 'date2'; continue; } + else if($v == 'attachment:' || $v == 'a:') { $token = 'attachment_type'; continue; } + else if($v == 'size') { $token = 'size'; continue; } + else if($v == 'tag:') { $token = 'tag'; continue; } + + if($token == 'from') { + $v = fix_email_address($v); + + if(!strstr($v, '@')) { $this->a['from_domain'] .= "|$v"; } + else { + $this->a['from'] .= "|$v"; + if(in_array($v, $_SESSION['emails'])) { $this->a['o_from'] .= "|$v"; } else { $this->a['f_from'] .= "|$v"; } + } + } + else if($token == 'to') { + $v = fix_email_address($v); + + if(!strstr($v, '@')) { $this->a['to_domain'] .= "|$v"; } + else { + $this->a['to'] .= "|$v"; + if(in_array($v, $_SESSION['emails'])) { $this->a['o_to'] .= "|$v"; } else { $this->a['f_to'] .= "|$v"; } + } + } + else if($token == 'subject') { $this->a['subject'] .= ' ' . $v; } + else if($token == 'body') { $this->a['body'] .= ' ' . $v; } + else if($token == 'date1') { $this->a['date1'] = $v; } + else if($token == 'date2') { $this->a['date2'] = $v; } + else if($token == 'direction') { $this->a['direction'] = $v; } + else if($token == 'size') { $this->a['size'] .= ' ' . $v; } + else if($token == 'attachment_type') { $this->a['attachment_type'] .= ' ' . $v; } + else if($token == 'tag') { $this->a['tag'] .= ' ' . $v; } + } + + } + + + private function preprocess_post_advanced_request($data = array()) { + + if(isset($data['f'])) { + foreach($data['f'] as $f) { + $v = array_shift($data['v']); + + if($v == '') { continue; } + + if($f == 'from') { + $v = fix_email_address($v); + + if(!strstr($v, '@')) { $this->a['from_domain'] .= "|$v"; } + else { + $this->a['from'] .= "|$v"; + if(in_array($v, $_SESSION['emails'])) { $this->a['o_from'] .= "|$v"; } else { $this->a['f_from'] .= "|$v"; } + } + } + + if($f == 'to') { + $v = fix_email_address($v); + + if(!strstr($v, '@')) { $this->a['to_domain'] .= "|$v"; } + else { + $this->a['to'] .= "|$v"; + if(in_array($v, $_SESSION['emails'])) { $this->a['o_to'] .= "|$v"; } else { $this->a['f_to'] .= "|$v"; } + } + } + + + if($f == 'subject') { + $this->a['subject'] .= "|$v"; + } + + + if($f == 'body') { + $this->a['body'] .= "|$v"; + } + + if($f == 'tag') { + $this->a['tag'] .= "|$v"; + } + + + } + } + + } + + +} + +?> diff --git a/webui/controller/search/save.php b/webui/controller/search/save.php new file mode 100644 index 00000000..6a2c22c5 --- /dev/null +++ b/webui/controller/search/save.php @@ -0,0 +1,41 @@ +id = "content"; + $this->template = "search/save.tpl"; + $this->layout = "common/layout-empty"; + + + $request = Registry::get('request'); + $db = Registry::get('db'); + + $this->load->model('search/search'); + +//print_r($this->request->post); exit; + + if(isset($this->request->post['save'])) { + $a = preg_replace("/\&save=1$/", "", http_build_query($this->request->post)); + + $this->model_search_search->add_search_term($a); + } + + + $this->data['searchterms'] = $this->model_search_search->get_search_terms(); +//print_r($this->data['searchterms']); exit; + + $this->data['n'] = count($this->data['searchterms']); + + $this->data['select_size'] = $this->data['n'] + 1; + if($this->data['select_size'] > 7) { $this->data['select_size'] = 7; } + + $this->render(); + } + +} + +?> diff --git a/webui/controller/search/search.php b/webui/controller/search/search.php new file mode 100644 index 00000000..b147c3de --- /dev/null +++ b/webui/controller/search/search.php @@ -0,0 +1,95 @@ +id = "content"; + $this->template = "search/search.tpl"; + $this->layout = "common/layout-search"; + + $request = Registry::get('request'); + $db = Registry::get('db'); + + $this->load->model('search/search'); + + $this->data['searchtype'] = 'simple'; + + if(isset($this->request->get['type'])) { + if($this->request->get['type'] == 'advanced') { + $this->template = "search/advanced.tpl"; + $this->data['searchtype'] = 'advanced'; + } + + if($this->request->get['type'] == 'expert') { + $this->template = "search/expert.tpl"; + $this->data['searchtype'] = 'expert'; + } + + } + + if(isset($this->request->post['searchterm'])) { + $this->fixup_post_request(); + + $a = preg_replace("/\&loaded=1$/", "", $this->request->post['searchterm']); + $this->model_search_search->update_search_term($a); + } + + $this->render(); + } + + + private function fixup_post_request() { + $i = 0; + $a = array(); + + $this->data['blocks'] = array(); + + $this->data['searchterm'] = $this->request->post['searchterm']; + + parse_str($this->request->post['searchterm'], $a); + + if(isset($a['from'])) { $this->data['from'] = $a['from']; } + if(isset($a['to'])) { $this->data['to'] = $a['to']; } + if(isset($a['subject'])) { $this->data['subject'] = $a['subject']; } + + if(isset($a['search'])) { $this->data['_search'] = $a['search']; } + + if(isset($a['sort'])) { $this->data['sort'] = $a['sort']; } + if(isset($a['order'])) { $this->data['order'] = $a['order']; } + + if(isset($a['f'])) { + foreach($a['f'] as $f) { + $val = array_shift($a['v']); + + if($val == '') { continue; } + + if($i == 0) { + $this->data['key0'] = 0; + + if($f == 'from') { $this->data['key0'] = 0; } + else if($f == 'to') { $this->data['key0'] = 1; } + else if($f == 'subject') { $this->data['key0'] = 2; } + else if($f == 'body') { $this->data['key0'] = 3; } + + $this->data['val0'] = $val; + } + else { + array_push($this->data['blocks'], array('key' => $f, 'val' => $val)); + } + + $i++; + } + } + + if(isset($a['date1'])) { $this->data['date1'] = $a['date1']; } + if(isset($a['date2'])) { $this->data['date2'] = $a['date2']; } + + if(isset($a['direction'])) { $this->data['direction'] = $a['direction']; } + } + + +} + +?> diff --git a/webui/controller/stat/chart.php b/webui/controller/stat/chart.php new file mode 100644 index 00000000..e8d029f5 --- /dev/null +++ b/webui/controller/stat/chart.php @@ -0,0 +1,45 @@ +load->model('user/user'); + + $this->load->model('stat/chart'); + + $this->load->helper('libchart/classes/libchart'); + + $this->data['username'] = Registry::get('username'); + + $timespan = @$this->request->get['timespan']; + + $db->select_db($db->database); + + $emails = ""; + + /* let the admin users see the whole statistics */ + + if(Registry::get('admin_user') == 0 && Registry::get('readonly_admin') == 0) { + $uid = $this->model_user_user->getUidByName($this->data['username']); + $emails = "AND rcpt IN ('" . preg_replace("/\n/", "','", $this->model_user_user->getEmailsByUid((int)$uid)) . "')"; + } + else if(isset($this->request->get['uid']) && is_numeric($this->request->get['uid']) && $this->request->get['uid'] > 0){ + $emails = "AND rcpt IN ('" . preg_replace("/\n/", "','", $this->model_user_user->getEmailsByUid((int)$this->request->get['uid'])) . "')"; + } + + $aa = new ModelStatChart(); + $aa->pieChartHamSpam($emails, $timespan, $this->data['text_ham_and_spam_messages'], ""); + + } + + +} + +?> diff --git a/webui/controller/stat/counter.php b/webui/controller/stat/counter.php new file mode 100644 index 00000000..7474bcd6 --- /dev/null +++ b/webui/controller/stat/counter.php @@ -0,0 +1,51 @@ +id = "content"; + $this->template = "stat/counter.tpl"; + $this->layout = "common/layout"; + + + $request = Registry::get('request'); + + $db = Registry::get('db'); + $db->select_db($db->database); + + $this->load->model('stat/counter'); + + $this->document->title = $this->data['text_counters']; + + + if(Registry::get('admin_user') == 1) { + + if($this->request->server['REQUEST_METHOD'] == 'POST' && @$this->request->post['reset'] == 1) { + $this->model_stat_counter->resetCounters(); + header("Location: index.php?route=stat/counter"); + exit; + } + + $this->data['counters'] = $this->model_stat_counter->getCounters(); + + $this->data['prefix'] = ''; + + if(isset($this->data['counters']['_c:rcvd'])) { $this->data['prefix'] = '_c:'; } + + } + else { + $this->template = "common/error.tpl"; + $this->data['errorstring'] = $this->data['text_you_are_not_admin']; + } + + + $this->render(); + } + + +} + +?> diff --git a/webui/controller/stat/graph.php b/webui/controller/stat/graph.php new file mode 100644 index 00000000..0ed7ad20 --- /dev/null +++ b/webui/controller/stat/graph.php @@ -0,0 +1,47 @@ +load->model('user/user'); + + + $this->load->model('stat/chart'); + + $this->load->helper('libchart/classes/libchart'); + + $this->data['username'] = Registry::get('username'); + + $timespan = @$this->request->get['timespan']; + + $db->select_db($db->database); + + $emails = ""; + + /* let the admin users see the whole statistics */ + + if(Registry::get('admin_user') == 0 && Registry::get('readonly_admin') == 0) { + $uid = $this->model_user_user->getUidByName($this->data['username']); + $emails = "AND rcpt IN ('" . preg_replace("/\n/", "','", $this->model_user_user->getEmailsByUid((int)$uid)) . "')"; + } + else if(isset($this->request->get['uid']) && is_numeric($this->request->get['uid']) && $this->request->get['uid'] > 0){ + $emails = "AND rcpt IN ('" . preg_replace("/\n/", "','", $this->model_user_user->getEmailsByUid((int)$this->request->get['uid'])) . "')"; + } + + + $aa = new ModelStatChart(); + + $aa->lineChartHamSpam($emails, $timespan, $this->data['text_archived_messages'], SIZE_X, SIZE_Y, ""); + + } + +} + +?> diff --git a/webui/controller/stat/stat.php b/webui/controller/stat/stat.php new file mode 100644 index 00000000..e80caf14 --- /dev/null +++ b/webui/controller/stat/stat.php @@ -0,0 +1,33 @@ +id = "content"; + $this->template = "stat/stat.tpl"; + $this->layout = "common/layout"; + + + $request = Registry::get('request'); + $db = Registry::get('db'); + + $this->load->model('user/user'); + + $this->document->title = $this->data['text_statistics']; + + $this->data['timespan'] = @$this->request->get['timespan']; + $this->data['uid'] = @$this->request->get['uid']; + + $this->data['admin_user'] = Registry::get('admin_user'); + $this->data['readonly_admin'] = Registry::get('readonly_admin'); + + $this->render(); + } + + +} + +?> diff --git a/webui/controller/user/add.php b/webui/controller/user/add.php new file mode 100644 index 00000000..bb326c94 --- /dev/null +++ b/webui/controller/user/add.php @@ -0,0 +1,136 @@ +id = "content"; + $this->template = "user/add.tpl"; + $this->layout = "common/layout"; + + + $request = Registry::get('request'); + $db = Registry::get('db'); + + $this->load->model('user/user'); + + $this->document->title = $this->data['text_user_management']; + + $this->data['domains'] = array(); + + /* check if we are admin */ + + if(Registry::get('admin_user') == 1) { + + /* query available domains */ + + $this->data['domains'] = $this->model_user_user->get_domains(); + + $this->domains = $this->model_user_user->get_email_domains(); + + + if($this->request->server['REQUEST_METHOD'] == 'POST') { + $ret = 0; + + if($this->validate() == true){ + $ret = $this->model_user_user->addUser($this->request->post); + + $_SESSION['last_domain'] = $this->request->post['domain']; + + if($ret == 1){ + $this->data['x'] = $this->data['text_successfully_added']; + } else { + $this->data['errorstring'] = $this->data['text_failed_to_add'] . ": " . $ret; + } + } + else { + $this->data['errorstring'] = array_pop($this->error); + } + + if($ret == 0) { + + $this->data['post'] = $this->request->post; + $this->data['next_user_id'] = $this->model_user_user->getNextUid(); + + } + } + else { + $this->data['next_user_id'] = $this->model_user_user->getNextUid(); + } + } + else { + $this->template = "common/error.tpl"; + $this->data['errorstring'] = $this->data['text_you_are_not_admin']; + } + + + + + $this->render(); + } + + + private function validate() { + + if(!isset($this->request->post['password']) || !isset($this->request->post['password2']) ) { + $this->error['password'] = $this->data['text_missing_password']; + } + + if(strlen(@$this->request->post['password']) < MIN_PASSWORD_LENGTH || strlen(@$this->request->post['password2']) < MIN_PASSWORD_LENGTH) { + $this->error['password'] = $this->data['text_too_short_password']; + } + + if($this->request->post['password'] != $this->request->post['password2']) { + $this->error['password'] = $this->data['text_password_mismatch']; + } + + if(!isset($this->request->post['uid']) || !is_numeric($this->request->post['uid']) || $this->request->post['uid'] < 0) { + $this->error['uid'] = $this->data['text_invalid_uid']; + } + + if(!isset($this->request->post['email']) || strlen($this->request->post['email']) < 3) { + $this->error['email'] = $this->data['text_invalid_email']; + } + else { + $emails = explode("\n", $this->request->post['email']); + foreach ($emails as $email) { + $email = rtrim($email); + $ret = checkemail($email, $this->domains); + if($ret == 0) { + $this->error['email'] = $this->data['text_invalid_email'] . ": $email"; + } + else if($ret == -1) { + $this->error['email'] = $this->data['text_email_in_unknown_domain'] . ": $email"; + } + } + } + + if(!isset($this->request->post['username']) || strlen($this->request->post['username']) < 2) { + $this->error['username'] = $this->data['text_invalid_username']; + } + + if(isset($this->request->post['username']) && $this->model_user_user->getUidByName($this->request->post['username']) > 0) { + $this->error['username'] = $this->data['text_existing_user']; + } + + if(!isset($this->request->post['domain'])) { + $this->error['domain'] = $this->data['text_missing_data']; + } + + + if (!$this->error) { + return true; + } else { + return false; + } + + } + + + +} + +?> diff --git a/webui/controller/user/edit.php b/webui/controller/user/edit.php new file mode 100644 index 00000000..11317db2 --- /dev/null +++ b/webui/controller/user/edit.php @@ -0,0 +1,142 @@ +data['uid'] = 0; + $this->data['email'] = ""; + + $this->id = "content"; + $this->template = "user/edit.tpl"; + $this->layout = "common/layout"; + + + $request = Registry::get('request'); + $db = Registry::get('db'); + $language = Registry::get('language'); + + $this->load->model('user/user'); + + + $this->document->title = $language->get('text_user_management'); + + $this->data['domains'] = array(); + + + if(isset($this->request->get['uid']) && is_numeric($this->request->get['uid']) && $this->request->get['uid'] > 0) { + $this->data['uid'] = $this->request->get['uid']; + } + + if(isset($this->request->post['uid']) && is_numeric($this->request->post['uid']) && $this->request->post['uid'] > 0) { + $this->data['uid'] = $this->request->post['uid']; + } + + + $this->domains = $this->model_user_user->get_email_domains(); + + + if(isset($this->request->get['email']) && checkemail($this->request->get['email'], $this->domains) == 1) { + $this->data['email'] = $this->request->get['email']; + } + + + /* check if we are admin */ + + if(Registry::get('admin_user') == 1) { + + $this->data['domains'] = $this->model_user_user->get_domains(); + + if($this->request->server['REQUEST_METHOD'] == 'POST') { + if($this->validate() == true){ + + $ret = $this->model_user_user->updateUser($this->request->post); + + if($ret == 1){ + $this->data['x'] = $this->data['text_successfully_modified']; + } else { + $this->template = "common/error.tpl"; + $this->data['errorstring'] = $this->data['text_failed_to_modify'] . ": " . $ret; + } + + $__username = $this->request->post['username']; + } + else { + $this->template = "common/error.tpl"; + $this->data['errorstring'] = array_pop($this->error); + } + } + else { + $this->data['user'] = $this->model_user_user->getUserByUid($this->data['uid']); + + $this->data['user']['group_membership'] = $this->model_user_user->get_additional_uids($this->data['uid']); + + $this->data['emails'] = $this->model_user_user->getEmails($this->data['user']['username']); + + } + } + else { + $this->template = "common/error.tpl"; + $this->data['errorstring'] = $this->data['text_you_are_not_admin']; + } + + + + + $this->render(); + } + + + private function validate() { + + if(isset($this->request->post['password']) && strlen(@$this->request->post['password']) > 1) { + + if(strlen(@$this->request->post['password']) < MIN_PASSWORD_LENGTH || strlen(@$this->request->post['password2']) < MIN_PASSWORD_LENGTH) { + $this->error['password'] = $this->data['text_invalid_password']; + } + + if($this->request->post['password'] != $this->request->post['password2']) { + $this->error['password'] = $this->data['text_password_mismatch']; + } + } + + if(!isset($this->request->post['uid']) || !is_numeric($this->request->post['uid']) || (int)$this->request->post['uid'] < 0) { + $this->error['uid'] = $this->data['text_invalid_uid']; + } + + if(strlen(@$this->request->post['email']) < 4) { + $this->error['email'] = $this->data['text_invalid_email']; + } else { + $emails = explode("\n", $this->request->post['email']); + foreach ($emails as $email) { + $email = rtrim($email); + $ret = checkemail($email, $this->domains); + if($ret == 0) { + $this->error['email'] = $this->data['text_invalid_email'] . ": $email"; + } + else if($ret == -1) { + $this->error['email'] = $this->data['text_email_in_unknown_domain'] . ": $email"; + } + } + } + + if(!isset($this->request->post['username']) || strlen($this->request->post['username']) < 2 ) { + $this->error['username'] = $this->data['text_invalid_username']; + } + + + if (!$this->error) { + return true; + } else { + return false; + } + + } + + + +} + +?> diff --git a/webui/controller/user/list.php b/webui/controller/user/list.php new file mode 100644 index 00000000..bbf7617c --- /dev/null +++ b/webui/controller/user/list.php @@ -0,0 +1,101 @@ +id = "content"; + $this->template = "user/list.tpl"; + $this->layout = "common/layout"; + + + $request = Registry::get('request'); + $db = Registry::get('db'); + $language = Registry::get('language'); + + $this->load->model('user/user'); + + $this->document->title = $language->get('text_user_management'); + + + $this->data['page'] = 0; + $this->data['page_len'] = get_page_length(); + + $this->data['total_users'] = 0; + + $users = array(); + + + /* get search term if there's any */ + + if($this->request->server['REQUEST_METHOD'] == 'POST'){ + $this->data['search'] = @$this->request->post['search']; + } + else { + $this->data['search'] = @$this->request->get['search']; + } + + /* get page */ + + if(isset($this->request->get['page']) && is_numeric($this->request->get['page']) && $this->request->get['page'] > 0) { + $this->data['page'] = $this->request->get['page']; + } + + + $this->data['sort'] = 'username'; + + $this->data['order'] = (int)@$this->request->get['order']; + + if(@$this->request->get['sort'] == "uid") { $this->data['sort'] = "uid"; } + if(@$this->request->get['sort'] == "realname") { $this->data['sort'] = "realname"; } + if(@$this->request->get['sort'] == "email") { $this->data['sort'] = "email"; } + if(@$this->request->get['sort'] == "domain") { $this->data['sort'] = "domain"; } + if(@$this->request->get['sort'] == "policy") { $this->data['sort'] = "policy_group"; } + + + /* check if we are admin */ + + if(Registry::get('admin_user') == 1) { + + $users = $this->model_user_user->getUsers($this->data['search'], $this->data['page'], $this->data['page_len'], + $this->data['sort'], $this->data['order']); + + $this->data['total_users'] = $this->model_user_user->howManyUsers($this->data['search']); + + foreach ($users as $user) { + $policy_group = DEFAULT_POLICY; + + $this->data['users'][] = array( + 'uid' => $user['uid'], + 'username' => $user['username'], + 'realname' => $user['realname'], + 'email' => $user['email'], + 'shortemail' => short_email($user['email']), + 'domain' => $user['domain'], + 'policy_group' => $policy_group, + 'isadmin' => $user['isadmin'] + ); + } + + } + else { + $this->template = "common/error.tpl"; + $this->data['errorstring'] = $this->data['text_you_are_not_admin']; + } + + + $this->data['prev_page'] = $this->data['page'] - 1; + $this->data['next_page'] = $this->data['page'] + 1; + + $this->data['total_pages'] = floor($this->data['total_users'] / $this->data['page_len']); + + + $this->render(); + } + + +} + +?> diff --git a/webui/controller/user/remove.php b/webui/controller/user/remove.php new file mode 100644 index 00000000..b80fb095 --- /dev/null +++ b/webui/controller/user/remove.php @@ -0,0 +1,76 @@ +id = "content"; + $this->template = "user/remove.tpl"; + $this->layout = "common/layout"; + + + $request = Registry::get('request'); + $db = Registry::get('db'); + + $this->load->model('user/user'); + + $this->document->title = $this->data['text_user_management']; + + + $this->data['username'] = Registry::get('username'); + + $this->data['uid'] = (int)@$this->request->get['uid']; + $this->data['user'] = @$this->request->get['user']; + $this->data['confirmed'] = (int)@$this->request->get['confirmed']; + + + if($this->validate() == true) { + + if($this->data['confirmed'] == 1) { + $ret = $this->model_user_user->deleteUser($this->data['uid']); + if($ret == 1){ + $this->data['x'] = $this->data['text_successfully_removed']; + } + else { + $this->data['x'] = $this->data['text_failed_to_remove']; + } + } + } + else { + $this->template = "common/error.tpl"; + $this->data['errorstring'] = array_pop($this->error); + } + + + + $this->render(); + } + + + private function validate() { + + if(Registry::get('admin_user') == 0) { + $this->error['admin'] = $this->data['text_you_are_not_admin']; + } + + if(!isset($this->request->get['uid']) || !is_numeric($this->request->get['uid']) || $this->request->get['uid'] < 1 ) { + $this->error['username'] = $this->data['text_invalid_uid']; + } + + + if (!$this->error) { + return true; + } else { + return false; + } + + } + + +} + +?> diff --git a/webui/controller/user/settings.php b/webui/controller/user/settings.php new file mode 100644 index 00000000..5235a6d5 --- /dev/null +++ b/webui/controller/user/settings.php @@ -0,0 +1,78 @@ +id = "content"; + $this->template = "user/settings.tpl"; + $this->layout = "common/layout"; + + + $request = Registry::get('request'); + $db = Registry::get('db'); + + $this->load->model('user/auth'); + $this->load->model('user/prefs'); + + + $this->document->title = $this->data['text_home']; + + + if(isset($this->request->post['pagelen']) && isset($this->request->post['lang']) && isset($this->request->post['theme'])) { + $this->model_user_prefs->set_user_preferences(Registry::get('username'), $this->request->post); + + AUDIT(ACTION_CHANGE_USER_SETTINGS, '', '', '', 'lang:' . $this->request->post['lang'] . ', pagelen:' . $this->request->post['pagelen'] . ', theme:' . $this->request->post['theme']); + + Header("Location: settings.php"); + return; + } + + + if($this->request->server['REQUEST_METHOD'] == 'POST' && PASSWORD_CHANGE_ENABLED == 1 && $this->validate() == true) { + + if($this->model_user_auth->changePassword(Registry::get('username'), $this->request->post['password']) == 1) { + $this->data['x'] = $this->data['text_password_changed']; + } + else { + $this->data['x'] = $this->data['text_failed_to_change_password']; + } + } + + + $this->data['page_len'] = get_page_length(); + + $this->render(); + } + + + private function validate() { + + if(!isset($this->request->post['password']) || !isset($this->request->post['password2']) ) { + $this->error['password'] = $this->data['text_missing_password']; + } + + if(strlen(@$this->request->post['password']) < MIN_PASSWORD_LENGTH || strlen(@$this->request->post['password2']) < MIN_PASSWORD_LENGTH) { + $this->error['password'] = $this->data['text_invalid_password']; + } + + if($this->request->post['password'] != $this->request->post['password2']) { + $this->error['password'] = $this->data['text_password_mismatch']; + } + + + if (!$this->error) { + return true; + } else { + return false; + } + + } + + + +} + +?> diff --git a/webui/index.php b/webui/index.php new file mode 100644 index 00000000..129ffac2 --- /dev/null +++ b/webui/index.php @@ -0,0 +1,89 @@ +addServer($m[0], $m[1]); + } + + Registry::set('memcache', $memcache); +} + +Registry::set('counters', $counters); +Registry::set('langs', $langs); +Registry::set('themes', $themes); + +Registry::set('health_smtp_servers', $health_smtp_servers); +Registry::set('partitions_to_monitor', $partitions_to_monitor); + + +if(Registry::get('username')) { + + if(isset($request->get['route'])){ + $action = new Router($request->get['route']); + } + else { + $action = new Router('search/search'); + } +} +else { + $action = new Router('login/login'); +} + + +$controller = new Front(); +$controller->dispatch($action, new Router('common/not_found')); + + +?> diff --git a/webui/language/en/messages.php b/webui/language/en/messages.php new file mode 100644 index 00000000..d819bb33 --- /dev/null +++ b/webui/language/en/messages.php @@ -0,0 +1,308 @@ + diff --git a/webui/language/hu/messages.iso-8859-2.php b/webui/language/hu/messages.iso-8859-2.php new file mode 100644 index 00000000..d61c8d02 --- /dev/null +++ b/webui/language/hu/messages.iso-8859-2.php @@ -0,0 +1,309 @@ + diff --git a/webui/language/hu/messages.php b/webui/language/hu/messages.php new file mode 100644 index 00000000..26c6be7f --- /dev/null +++ b/webui/language/hu/messages.php @@ -0,0 +1,309 @@ + diff --git a/webui/log/.htaccess b/webui/log/.htaccess new file mode 100644 index 00000000..ff2beb84 --- /dev/null +++ b/webui/log/.htaccess @@ -0,0 +1,2 @@ +order deny,allow +deny from all diff --git a/webui/log/lock b/webui/log/lock new file mode 100644 index 00000000..6d4a60df --- /dev/null +++ b/webui/log/lock @@ -0,0 +1 @@ +lock file diff --git a/webui/model/audit/audit.php b/webui/model/audit/audit.php new file mode 100644 index 00000000..39f78b67 --- /dev/null +++ b/webui/model/audit/audit.php @@ -0,0 +1,121 @@ +append_search_criteria($data['ipaddr'], &$arr) . ")"; + } + + if(isset($data['user'])) { + $where .= " AND email IN (" . $this->append_search_criteria($data['user'], &$arr) . ")"; + } + + if(isset($data['ref'])) { + $where .= " AND ref IN (" . $this->append_search_criteria($data['ref'], &$arr) . ")"; + } + + + $date = fixup_date_condition('ts', $data['date1'], $data['date2']); + + + if($date) { $where .= " AND $date "; } + + if($where) { + $where = " WHERE " . substr($where, 5, strlen($where)); + } + + $from = $data['page_len'] * $data['page']; + + + $query = $this->db->query("SELECT COUNT(*) AS count FROM " . TABLE_AUDIT . " $where", $arr); + + $n = $query->row['count']; + + if($n > 0) { + if($n > MAX_AUDIT_HITS) { $n = MAX_AUDIT_HITS; } + + $query = $this->db->query("SELECT * FROM " . TABLE_AUDIT . " $where $sortorder LIMIT $from," . $data['page_len'], $arr); + + + if(isset($query->rows)) { + + foreach($query->rows as $a) { + if($a['meta_id'] > 0) { $q .= "," . $a['meta_id']; } + } + + if($q) { + $q = substr($q, 1, strlen($q)); + $Q = $this->db->query("SELECT id, piler_id FROM " . TABLE_META . " WHERE id IN($q)"); + + foreach($Q->rows as $a) { + $m[$a['id']] = $a['piler_id']; + } + } + + foreach($query->rows as $a) { + $results[] = array( + 'id' => $a['meta_id'], + 'piler_id' => isset($m[$a['meta_id']]) ? $m[$a['meta_id']] : '', + 'action' => $a['action'], + 'email' => $a['email'], + 'date' => date(AUDIT_DATE_FORMAT, $a['ts']), + 'ipaddr' => $a['ipaddr'], + 'description' => $a['description'], + 'shortdescription' => make_short_string($a['description'], MAX_CGI_FROM_SUBJ_LEN) + ); + + } + } + } + + return array($n, $results); + } + + + private function append_search_criteria($s = '', $arr = array()) { + $q = ""; + + $a = explode("*", $s); + + for($i=0; $i diff --git a/webui/model/domain/domain.php b/webui/model/domain/domain.php new file mode 100644 index 00000000..f9f2f33d --- /dev/null +++ b/webui/model/domain/domain.php @@ -0,0 +1,47 @@ +db->query("SELECT domain, mapped FROM " . TABLE_DOMAIN . " ORDER BY domain ASC"); + + return $query->rows; + } + + + public function deleteDomain($domain = '') { + if($domain == "") { return 0; } + + $query = $this->db->query("DELETE FROM " . TABLE_DOMAIN . " WHERE domain=?", array($domain)); + + $rc = $this->db->countAffected(); + + LOGGER("remove domain: $domain (rc=$rc)"); + + return $rc; + } + + + public function addDomain($domain = '', $mapped = '') { + if($domain == "" || $mapped == "") { return 0; } + + $domains = explode("\n", $domain); + + foreach ($domains as $domain) { + $domain = rtrim($domain); + $query = $this->db->query("INSERT INTO " . TABLE_DOMAIN . " (domain, mapped) VALUES (?,?)", array($domain, $mapped)); + + $rc = $this->db->countAffected(); + + LOGGER("add domain: $domain (rc=$rc)"); + + if($rc != 1){ return 0; } + } + + return 1; + } + + +} + +?> diff --git a/webui/model/health/health.php b/webui/model/health/health.php new file mode 100644 index 00000000..66e4b022 --- /dev/null +++ b/webui/model/health/health.php @@ -0,0 +1,114 @@ += 1) { + return sprintf("%.2f", $time) . " sec"; + } + else { + return sprintf("%.2f", 1000*$time) . " ms"; + } + } + + + public function checksmtp($smtp = array(), $error = '') { + + $ret = $error; + $time = 0; + + if($smtp[0] && $smtp[1] && is_numeric($smtp[1]) && $smtp[1] > 0 && $smtp[1] < 65536) { + $time_start = microtime(true); + + $s = @fsockopen($smtp[0], $smtp[1]); + + if($s) { + $ret = trim(fgets($s, 4096)); + fputs($s, "QUIT\r\n"); + fclose($s); + } + } + + $time = microtime(true) - $time_start; + return array($smtp[0] . ":" . $smtp[1], $ret, $this->format_time($time), $smtp[2]); + } + + + public function count_processed_emails() { + $today = $last_7_days = $last_30_days = 0; + $now = time(); + + $ts = $now - 86400; + $query = $this->db->query("select count(*) as count from " . TABLE_META . " where arrived > $ts"); + if(isset($query->row['count'])) { $today = $query->row['count']; } + + $ts = $now - 604800; + $query = $this->db->query("select count(*) as count from " . TABLE_META . " where arrived > $ts"); + if(isset($query->row['count'])) { $last_7_days = $query->row['count']; } + + $ts = $now - 2592000; + $query = $this->db->query("select count(*) as count from " . TABLE_META . " where arrived > $ts"); + if(isset($query->row['count'])) { $last_30_days = $query->row['count']; } + + return array($today, $last_7_days, $last_30_days); + } + + + public function uptime() { + $s = exec("uptime"); + list ($uptime, $loadavg) = preg_split("/ load average\: /", $s); + + return array(preg_replace("/\,\ {0,}$/", "", $uptime), $loadavg); + } + + + public function meminfo() { + $m = explode("\n", file_get_contents("/proc/meminfo")); + + while(list($k, $v) = each($m)) { + $a = preg_split("/\ {1,}/", $v); + if(isset($a[0]) && $a[0]) { $_m[$a[0]] = $a[1]; } + } + + $mem_percentage = sprintf("%.2f", 100*($_m['MemTotal:'] - $_m['MemFree:'] - $_m['Cached:']) / $_m['MemTotal:']); + $swap_percentage = sprintf("%.2f", 100*($_m['SwapTotal:'] - $_m['SwapFree:']) / $_m['SwapTotal:']); + + return array(sprintf("%.0f", $_m['MemTotal:'] / 1000), $mem_percentage, sprintf("%.0f", $_m['SwapTotal:'] / 1000), $swap_percentage); + } + + + public function diskinfo() { + $shortinfo = array(); + + $s = exec("df -h", $output); + + $partitions = Registry::get('partitions_to_monitor'); + + while(list($k, $v) = each($output)) { + if($k > 0) { + $p = preg_split("/\ {1,}/", $v); + if(isset($p[5]) && in_array($p[5], $partitions)) { + $shortinfo[] = array( + 'partition' => $p[5], + 'utilization' => preg_replace("/\%/", "", $p[4]) + ); + } + } + } + + return $shortinfo; + } + + + public function sysinfo() { + $hostname = exec("hostname -f"); + $s = exec("uname -a"); + + return array($hostname, $s); + } + + +} + + +?> diff --git a/webui/model/mail/mail.php b/webui/model/mail/mail.php new file mode 100644 index 00000000..6c8fcf7a --- /dev/null +++ b/webui/model/mail/mail.php @@ -0,0 +1,51 @@ +\r\n"); + $l = fgets($r, 4096); + + while(list($k, $v) = each($to)) { + fputs($r, "RCPT TO: <$v>\r\n"); + $l = fgets($r, 4096); + } + + fputs($r, "DATA\r\n"); + $l = fgets($r, 4096); + if(!preg_match("/^354/", $l)){ $l = fgets($r, 4096); } + + fputs($r, $msg); + + if(!preg_match("/\r\n.\r\n$/", $msg)){ + fputs($r, "\r\n.\r\n"); + } + + $l = fgets($r, 4096); + + if(preg_match("/^250/", $l)){ $ok = 1; } + + fputs($r, "QUIT\r\n"); + $l = fgets($r, 4096); + + fclose($r); + + return $ok; + } + +} + +?> diff --git a/webui/model/policy/archiving.php b/webui/model/policy/archiving.php new file mode 100644 index 00000000..3d40b2f2 --- /dev/null +++ b/webui/model/policy/archiving.php @@ -0,0 +1,39 @@ +db->query("SELECT * FROM " . TABLE_ARCHIVING_RULE . " ORDER BY id"); + + if(isset($query->rows)) { return $query->rows; } + + return array(); + } + + + public function get_rule($id = 0) { + $query = $this->db->query("SELECT * FROM " . TABLE_ARCHIVING_RULE . " WHERE id=?", array($id)); + + if(isset($query->row)) { return $query->row; } + + return array(); + } + + + public function add_new_rule($data = array()) { + $query = $this->db->query("INSERT INTO " . TABLE_ARCHIVING_RULE . " (`from`,`to`,`subject`,`_size`,`size`,`attachment_type`,`_attachment_size`,`attachment_size`) VALUES(?,?,?,?,?,?,?,?)", array($data['from'], $data['to'], $data['subject'], $data['_size'], $data['size'], $data['attachment_type'], $data['_attachment_size'], $data['attachment_size'])); + + return $this->db->countAffected(); + } + + + public function remove_rule($id = 0) { + $query = $this->db->query("DELETE FROM " . TABLE_ARCHIVING_RULE . " WHERE id=?", array($id)); + return $this->db->countAffected(); + } + + +} + +?> diff --git a/webui/model/search/message.php b/webui/model/search/message.php new file mode 100644 index 00000000..7dc47038 --- /dev/null +++ b/webui/model/search/message.php @@ -0,0 +1,420 @@ +db->query("SELECT `size`, `hlen`, `digest`, `bodydigest`,`attachments` FROM " . TABLE_META . " WHERE piler_id=?", array($id)); + + $digest = $q->row['digest']; + $bodydigest = $q->row['bodydigest']; + $size = $q->row['size']; + $hlen = $q->row['hlen']; + $attachments = $q->row['attachments']; + + $data = $this->get_raw_message($id); + + $_digest = openssl_digest($data, "SHA256"); + $_bodydigest = openssl_digest(substr($data, $hlen), "SHA256"); + + $data = ''; + + if($_digest == $digest && $_bodydigest == $bodydigest) { return 1; } + + return 0; + } + + + public function get_raw_message($id = '') { + $data = ''; + + if($id == '' || !preg_match("/^([0-9a-f]+)$/", $id)) { return $data; } + + $handle = popen(DECRYPT_BINARY . " $id", "r"); + + while(($buf = fread($handle, DECRYPT_BUFFER_LENGTH))){ + $data .= $buf; + } + + pclose($handle); + + return $data; + } + + + public function get_message_headers($id = '') { + $data = ''; + + //$f = $this->get_store_path($id); + //$msg = $this->decrypt_and_uncompress_file($f.".m"); + $msg = $this->get_raw_message($id); + + $pos = strpos($msg, "\n\r\n"); + if($pos == false) { + $pos = strpos($msg, "\n\n"); + } + + if($pos == false) { return $msg; } + + $data = substr($msg, 0, $pos); + $msg = ''; + + $data = preg_replace("/\/", ">", $data); + + return $data; + } + + + public function extract_message($id = '') { + $header = ""; + $body_chunk = ""; + $is_header = 1; + $state = "UNDEF"; + $b = array(); + $boundary = array(); + $text_plain = 1; + $text_html = 0; + $charset = ""; + $qp = $base64 = 0; + $has_text_plain = 0; + + $from = $to = $subject = $date = $message = ""; + + $msg = $this->get_raw_message($id); + +//print "a: $msg\n"; + + $a = explode("\n", $msg); $msg = ""; + + while(list($k, $l) = each($a)){ + $l .= "\n"; + + if(($l[0] == "\r" && $l[1] == "\n" && $is_header == 1) || ($l[0] == "\n" && $is_header == 1) ){ + $is_header = 0; + } + + if(preg_match("/^Content-Type:/i", $l)) $state = "CONTENT_TYPE"; + if(preg_match("/^Content-Transfer-Encoding:/i", $l)) $state = "CONTENT_TRANSFER_ENCODING"; + + if($state == "CONTENT_TYPE"){ + $x = strstr($l, "boundary"); + if($x){ + $x = preg_replace("/boundary =/", "boundary=", $x); + $x = preg_replace("/boundary= /", "boundary=", $x); + + $x = preg_replace("/\"/", "", $x); + $x = preg_replace("/\'/", "", $x); + + $b = explode("boundary=", $x); + + array_push($boundary, rtrim($b[count($b)-1])); + } + + if(preg_match("/charset/i", $l)){ + $types = explode(";", $l); + foreach ($types as $type){ + if(preg_match("/charset/i", $type)){ + $type = preg_replace("/[\"\'\ ]/", "", $type); + + $x = explode("=", $type); + $charset = $x[1]; + } + } + } + + if(strstr($l, "text/plain")){ $text_plain = 1; $has_text_plain = 1; } + if(strstr($l, "text/html")){ $text_html = 1; $text_plain = 0; } + } + + if($state == "CONTENT_TRANSFER_ENCODING"){ + if(strstr($l, "quoted-printable")){ $qp = 1; } + if(strstr($l, "base64")){ $base64 = 1; } + } + + + if($is_header == 1){ + if($l[0] != " " && $l[0] != "\t"){ $state = "UNDEF"; } + if(preg_match("/^From:/i", $l)){ $state = "FROM"; } + if(preg_match("/^To:/i", $l) || preg_match("/^Cc:/i", $l)){ $state = "TO"; } + if(preg_match("/^Date:/i", $l)){ $state = "DATE"; } + if(preg_match("/^Subject:/i", $l)){ $state = "SUBJECT"; } + if(preg_match("/^Content-Type:/", $l)){ $state = "CONTENT_TYPE"; } + + $l = preg_replace("//", ">", $l); + + if($state == "FROM"){ $from .= preg_replace("/\r|\n/", "", $l); } + if($state == "TO"){ $to .= preg_replace("/\r|\n/", "", $l); } + if($state == "SUBJECT"){ $subject .= preg_replace("/\r|\n/", "", $l); } + if($state == "DATE"){ $date .= preg_replace("/\r|\n/", "", $l); } + } + else { + + if($this->check_boundary($boundary, $l) == 1){ + + if($text_plain == 1 || $has_text_plain == 0) { + $message .= $this->flush_body_chunk($body_chunk, $charset, $qp, $base64, $text_plain, $text_html); + } + + $text_plain = $text_html = $qp = $base64 = 0; + + $charset = $body_chunk = ""; + + continue; + } + + else if(($l[0] == "\r" && $l[1] == "\n") || $l[0] == "\n"){ + $state = "BODY"; + $body_chunk .= $l; + } + + else if($state == "BODY"){ + if($text_plain == 1 || $text_html == 1){ $body_chunk .= $l; } + + } + + } + + + } + + if($body_chunk && ($text_plain == 1 || $has_text_plain == 0) ){ + $message .= $this->flush_body_chunk($body_chunk, $charset, $qp, $base64, $text_plain, $text_html); + } + + + return array('from' => $this->decode_my_str($from), + 'to' => $this->decode_my_str($to), + 'subject' => $this->decode_my_str($subject), + 'date' => $this->decode_my_str($date), + 'message' => $message + ); + } + + + private function check_boundary($boundary, $line) { + + for($i=0; $iqp_decode($chunk); + } + + if($base64 == 1){ + $chunk = base64_decode($chunk); + } + + if(!preg_match("/utf-8/i", $charset)){ + $chunk = utf8_encode($chunk); + } + + if($text_plain == 1){ + $chunk = preg_replace("//", ">", $chunk); + + //$chunk = "
\n" . $this->print_nicely($chunk) . "
\n"; + $chunk = preg_replace("/\n/", "
\n", $chunk); + $chunk = "\n" . $this->print_nicely($chunk); + } + + if($text_html == 1){ + $chunk = preg_replace("/\]+)\>([\w\W]+)\<\/style\>/i", "", $chunk); + + if(ENABLE_REMOTE_IMAGES == 0) { + $chunk = preg_replace("/style([\s]{0,}=[\s]{0,})\"([^\"]+)/", "style=\"xxxx", $chunk); + $chunk = preg_replace("/style([\s]{0,}=[\s]{0,})\'([^\']+)/", "style=\'xxxx", $chunk); + } + + $chunk = preg_replace("/\/i", "", $chunk); + + if(ENABLE_REMOTE_IMAGES == 0) { $chunk = preg_replace("/\]+)\>/i", "", $chunk); } + + /* prevent scripts in the HTML part */ + + $chunk = preg_replace("/document\.write/", "document.writeee", $chunk); + $chunk = preg_replace("/<\s{0,}script([\w\W]+)\/script\s{0,}\>/i", "", $chunk); + } + + return $chunk; + } + + + private function print_nicely($chunk) { + $k = 0; + $nice_chunk = ""; + + $x = explode(" ", $chunk); + + for($i=0; $i 70){ $nice_chunk .= "\n"; $k = 0; } + } + + return $nice_chunk; + } + + + public function NiceSize($size) { + if($size < 1000) return "1k"; + if($size < 100000) return round($size/1000) . "k"; + + return sprintf("%.1f", $size/1000000) . "M"; + } + + + private function qp_decode($l) { + $res = ""; + $c = ""; + + if($l == ""){ return ""; } + + /* remove soft breaks at the end of lines */ + + if(preg_match("/\=\r\n/", $l)){ $l = preg_replace("/\=\r\n/", "", $l); } + if(preg_match("/\=\n/", $l)){ $l = preg_replace("/\=\n/", "", $l); } + + for($i=0; $i 0) || ($x == 1 && $k == 1) ){ + $result .= " "; + } + + $result .= $this->fix_encoded_string($v); + } + + return $result; + } + + + private function fix_encoded_string($what = '') { + $s = ""; + + $what = rtrim($what, "\"\r\n"); + $what = ltrim($what, "\""); + + if(preg_match("/^\=\?/", $what) && preg_match("/\?\=$/", $what)){ + $what = preg_replace("/^\=\?/", "", $what); + $what = preg_replace("/\?\=$/", "", $what); + + if(preg_match("/\?Q\?/i", $what)){ + $x = preg_replace("/^([\w\-]+)\?Q\?/i", "", $what); + + $s = quoted_printable_decode($x); + $s = preg_replace("/_/", " ", $s); + } + + if(preg_match("/\?B\?/i", $what)){ + $x = preg_replace("/^([\w\-]+)\?B\?/i", "", $what); + + $s = base64_decode($x); + $s = preg_replace('/\0/', "*", $s); + } + + + if(!preg_match("/utf-8/i", $what)){ + $s = utf8_encode($s); + } + + } + else { + $s = utf8_encode($what); + } + + return $s; + } + + + public function get_message_tag($id = '', $uid = 0) { + if($id == '' || $uid <= 0) { return ''; } + + $query = $this->db->query("SELECT `tag` FROM " . TABLE_TAG . "," . TABLE_META . " WHERE " . TABLE_TAG . ".id=" . TABLE_META . ".id AND uid=? AND piler_id=?", array($uid, $id)); + + if(isset($query->row['tag'])) { return $query->row['tag']; } + + return ''; + } + + + public function add_message_tag($id = '', $uid = 0, $tag = '') { + if($id == '' || $uid <= 0) { return 0; } + + $query = $this->db->query("SELECT `id` FROM " . TABLE_META . " WHERE piler_id=?", array($id)); + + if(isset($query->row['id']) && $query->row['id'] > 0) { + + $id = $query->row['id']; + + if($tag == '') { + $query = $this->db->query("DELETE FROM " . TABLE_TAG . " WHERE uid=? AND id=?", array($uid, $id)); + } else { + $query = $this->db->query("UPDATE " . TABLE_TAG . " SET tag=? WHERE uid=? AND id=?", array($tag, $uid, $id)); + if($this->db->countAffected() == 0) { + $query = $this->db->query("INSERT INTO " . TABLE_TAG . " (id, uid, tag) VALUES(?,?,?)", array($id, $uid, $tag)); + } + } + + return 1; + } + + return 0; + } + + +} + +?> diff --git a/webui/model/search/search.php b/webui/model/search/search.php new file mode 100644 index 00000000..71f47c7c --- /dev/null +++ b/webui/model/search/search.php @@ -0,0 +1,502 @@ +make_cache_file_name($data, $sortorder); + $memcache = Registry::get('memcache'); + $m = $memcache->get($cache_key); + } + + + if(isset($m['ids'])) { + $all_ids = $m['ids']; + } else { + + if($search_type == SIMPLE_SEARCH) { + $conditions = $this->assemble_simple_query_conditions($data); + } + else { + $conditions = $this->assemble_advanced_query_conditions($data); + } + + $all_ids = $this->query_all_possible_IDs($data, $conditions, $sort, $order, $sortorder, $cache_key); + } + + + + $total_hits = count($all_ids); + + $data['page_len'] = get_page_length(); + + if($total_hits > 0) { + $i = 0; + + foreach($all_ids as $id) { + + if($i >= $data['page_len'] * $page && $i < $data['page_len'] * ($page+1) ) { + array_push($one_page_of_ids, $id); + + if($q) { $q .= ",?"; } else { $q = "?"; } + } + + $i++; + } + + } + + return array($total_hits, $this->get_meta_data($one_page_of_ids, $q, $sortorder)); + } + + + private function assemble_advanced_query_conditions($data = array()) { + $f1 = $f2 = $t1 = $t2 = $fd = $td = ''; + $incoming = $outgoing = ''; + $email = $match = ''; + $n_fc = $n_tc = 0; + + + $data['f_from'] = $this->fix_email_address_for_sphinx($data['f_from']); + $data['o_from'] = $this->fix_email_address_for_sphinx($data['o_from']); + $data['f_to'] = $this->fix_email_address_for_sphinx($data['f_to']); + $data['o_to'] = $this->fix_email_address_for_sphinx($data['o_to']); + $data['from_domain'] = $this->fix_email_address_for_sphinx($data['from_domain']); + $data['to_domain'] = $this->fix_email_address_for_sphinx($data['to_domain']); + + $data['body'] = $this->fixup_sphinx_operators($data['body']); + $data['subject'] = $this->fixup_sphinx_operators($data['subject']); + + + if(Registry::get('admin_user') == 1 || Registry::get('auditor_user') == 1) { + if($data['f_from']) { $f1 .= "|" . $data['f_from']; $n_fc++; } + if($data['o_from']) { $f1 .= "|" . $data['o_from']; $n_fc++; } + if($data['from_domain']) { $fd .= "(@fromdomain " . $data['from_domain'] . ")"; $n_fc++; } + + if($data['f_to']) { $t1 .= "|" . $data['f_to']; $n_tc++; } + if($data['o_to']) { $t1 .= "|" . $data['o_to']; $n_tc++; } + if($data['to_domain']) { $td .= "(@todomain " . $data['to_domain'] . ")"; $n_tc++; } + + if($f1) { $f1 = "(@from " . substr($f1, 1, strlen($f1)) . ")"; } + if($t1) { $t1 = "(@to " . substr($t1, 1, strlen($t1)) . ")"; } + + } + else { + $all_your_addresses = $this->get_all_your_address(); + + if($data['f_from']) { $f1 = "(@from " . $data['f_from'] . " @to $all_your_addresses)"; $n_fc++; } + if($data['o_from']) { $f2 = "(@from " . $data['o_from'] . ")"; $n_fc++; } + if($data['from_domain']) { $fd = "(@fromdomain " . $data['from_domain'] . " @to $all_your_addresses)"; $n_fc++; } + + if($data['f_to']) { $t1 = "(@to " . $data['f_to'] . " @from $all_your_addresses)"; $n_tc++; } + if($data['o_to']) { $t2 = "(@to " . $data['o_to'] . ")"; $n_tc++; } + if($data['to_domain']) { $td = "(@todomain " . $data['to_domain'] . " @from $all_your_addresses)"; $n_tc++; } + + if($n_fc == 0 && $n_tc == 0 && $data['from_domain'] == '' && $data['to_domain'] == '') { + if($data['direction'] == 2) { + $f1 = " (@from " . $all_your_addresses . ")"; + } else { + $t1 = " (@to " . $all_your_addresses . ")"; + } + } + } + + if($f1) { $incoming .= "|$f1"; } + if($f2) { $incoming .= "|$f2"; } + if($fd) { $incoming .= "|$fd"; } + + if($t1) { $outgoing .= "|$t1"; } + if($t2) { $outgoing .= "|$t2"; } + if($td) { $outgoing .= "|$td"; } + + if($incoming) { $incoming = substr($incoming, 1, strlen($incoming)); if($n_fc > 1) { $incoming = "($incoming)"; } } + if($outgoing) { $outgoing = substr($outgoing, 1, strlen($outgoing)); if($n_tc > 1) { $outgoing = "($outgoing)"; } } + + + if($incoming) { + $email = $incoming; + if($outgoing) { $email = $incoming . " & " . $outgoing; } + } else if($outgoing) { + $email = $outgoing; + } + + + if($email) { $match = $email; } + + if($data['body']) { if($match) { $match .= " & "; } $match .= "(@body " . $data['body'] . ") "; } + if($data['subject']) { if($match) { $match .= " & "; } $match .= "(@subject " . $data['subject'] . ") "; } + if($data['attachment_type']) { if($match) { $match .= " & "; } $match .= "(@attachment_types " . $data['attachment_type'] . ") "; } + + return $match; + } + + + private function assemble_simple_query_conditions($data = array(), $sort = 'sent', $order = 'DESC', $sortorder = '', $cache_key = '') { + $email = $match = ""; + + if(Registry::get('admin_user') == 0 && Registry::get('auditor_user') == 0) { + + $all_your_addresses = $this->get_all_your_address(); + + if(isset($data['from'])) { $data['from'] = fix_email_address($data['from']); } + if(isset($data['to'])) { $data['to'] = fix_email_address($data['to']); } + + // missing from address + + if(!isset($data['from'])) { + + if(isset($data['to']) && !strstr($data['to'], '@')) { $email = "@from $all_your_addresses @todomain " . $this->fix_email_address_for_sphinx($data['to']); } + else if(!isset($data['to'])) { $email = "@to $all_your_addresses"; } + else if(!in_array($data['to'], $_SESSION['emails'])) { $email = "@from $all_your_addresses @to " . $this->fix_email_address_for_sphinx($data['to']); } + else { $email = "@to " . $this->fix_email_address_for_sphinx($data['to']); } + + } + + // missing to address + + else if(!isset($data['to'])) { + if(isset($data['from']) && !strstr($data['from'], '@')) { $email = "@to $all_your_addresses @fromdomain " . $this->fix_email_address_for_sphinx($data['from']); } + else if(!in_array($data['from'], $_SESSION['emails'])) { $email = "@to $all_your_addresses @from " . $this->fix_email_address_for_sphinx($data['from']); } + else { $email = "@from " . $this->fix_email_address_for_sphinx($data['from']); } + } + + else if(isset($data['from']) && isset($data['to'])) { + + if( + (!in_array($data['from'], $_SESSION['emails']) && in_array($data['to'], $_SESSION['emails'])) || + (!in_array($data['to'], $_SESSION['emails']) && in_array($data['from'], $_SESSION['emails'])) + ) { + $email = "@from " . $this->fix_email_address_for_sphinx($data['from']) . " @to " . $this->fix_email_address_for_sphinx($data['to']); + } + + else { + $email = " @to INVALID "; + } + } + + } + else { + if(isset($data['from'])) { + if(strstr($data['from'], '@')) { $match .= " @from " . $this->fix_email_address_for_sphinx($data['from']); } + else { $match .= " @fromdomain " . $this->fix_email_address_for_sphinx($data['from']); } + } + + if(isset($data['to'])) { + if(strstr($data['to'], '@')) { $match .= " @to " . $this->fix_email_address_for_sphinx($data['to']); } + else { $match .= " @todomain " . $this->fix_email_address_for_sphinx($data['to']); } + } + + } + + + + if(isset($data['subject'])) { + $data['subject'] = $this->fixup_sphinx_operators($data['subject']); + $match .= " @(subject,body) " . $data['subject']; + } + + + if($email) { $match = " $email " . $match; } + + return $match; + } + + + private function query_all_possible_IDs($data = array(), $conditions = '', $sort = 'sent', $order = 'DESC', $sortorder = '', $cache_key = '') { + $ids = array(); + $direction = $size = ''; + $tag_id_list = ''; + + + if($data['sort'] == 'from' || $data['sort'] == 'subj') { $sortorder = ''; } + + $date = fixup_date_condition('sent', $data['date1'], $data['date2']); + + if($date) { $date .= " AND "; } + + if(isset($data['direction']) && $data['direction'] != '') { $direction = "direction = " . $data['direction'] . " AND "; } + + if(isset($data['size']) && $data['size']) { + $data['size'] = preg_replace("/\s/", "", $data['size']); + if(preg_match("/^(\>|\<)\={0,}\d{1,}$/", $data['size'])) { $size = "size " . $data['size'] . " AND "; } + } + + + if($data['tag']) { + $tag_id_list = " AND id IN (0"; + + $data['tag'] = $this->fixup_sphinx_operators($data['tag']); + + $aa = $this->sphx->query("SELECT id FROM " . SPHINX_TAG_INDEX . " WHERE uid=" . $_SESSION['uid'] . " AND MATCH('@tag " . $data['tag'] . " ') "); + + foreach($aa->rows as $a) { + $tag_id_list .= "," . $a['id']; + } + + $tag_id_list .= ") "; + } + + + + $query = $this->sphx->query("SELECT id FROM " . SPHINX_MAIN_INDEX . " WHERE $date $direction $size MATCH('$conditions') $tag_id_list $sortorder LIMIT 0," . MAX_SEARCH_HITS); + +//print $query->query; print "

" . $query->exec_time . "

\n"; + + + /* + * build an id list + */ + + $q = ""; + + foreach($query->rows as $a) { + array_push($ids, $a['id']); + + if($q) { $q .= ",?"; } + else { $q = "?"; } + } + + + /* + * if the query was requested to be sorted by sender or subject, then sphinx cannot do + * that, so we assemble the list of all sphinx IDs matching the query + */ + + if($data['sort'] == 'from' || $data['sort'] == 'subj') { + + $query = $this->db->query("SELECT id FROM " . TABLE_META . " WHERE id IN ($q) ORDER BY `$sort` $order", $ids); + //print $query->query . ", exec: " . $query->exec_time . "

\n"; + + $ids = array(); + + foreach($query->rows as $q) { + array_push($ids, $q['id']); + } + + } + + + if(MEMCACHED_ENABLED && $cache_key) { + $memcache = Registry::get('memcache'); + $memcache->add($cache_key, array('ts' => time(), 'total_hits' => count($ids), 'ids' => $ids), 0, MEMCACHED_TTL); + } + + + return $ids; + } + + + private function get_meta_data($ids = array(), $q = '', $sortorder = '') { + $messages = array(); + $tag = array(); + + + if(count($ids) == 0) return $messages; + + $query = $this->db->query("SELECT `id`, `from`, `subject`, `piler_id`, `reference`, `size`, `spam`, `sent`, `arrived`, `attachments` FROM `" . TABLE_META . "` WHERE `id` IN ($q) $sortorder", $ids); + + + if(isset($query->rows)) { + + $tags = $this->db->query("SELECT `id`, `tag` FROM `" . TABLE_TAG . "` WHERE `id` IN ($q)", $ids); + foreach ($tags->rows as $t) { + $tag[$t['id']] = $t['tag']; + } + + + $lang = Registry::get('language'); + + foreach($query->rows as $m) { + $m['shortfrom'] = make_short_string($m['from'], MAX_CGI_FROM_SUBJ_LEN); + + if($m['subject'] == "") { $m['subject'] = "<" . $lang->data['text_no_subject'] . ">"; } + + $m['subject'] = escape_gt_lt_quote_symbols($m['subject']); + $m['shortsubject'] = make_short_string($m['subject'], MAX_CGI_FROM_SUBJ_LEN); + + $m['date'] = date(SEARCH_HIT_DATE_FORMAT, $m['sent']); + $m['size'] = nice_size($m['size']); + + + /* + * verifying 20 messages takes some time, still it's useful + */ + + if(ENABLE_ON_THE_FLY_VERIFICATION == 1) { + $m['verification'] = $this->model_search_message->verify_message($m['piler_id']); + } + + if(isset($tag[$m['id']])) { $m['tag'] = $tag[$m['id']]; } else { $m['tag'] = ''; } + + array_push($messages, $m); + } + } + + return $messages; + } + + + public function get_message_recipients($id = '') { + $rcpt = array(); + + if(Registry::get('admin_user') == 0 && Registry::get('auditor_user') == 0) { return $rcpt; } + + $query = $this->db->query("SELECT `to` FROM " . VIEW_MESSAGES . " WHERE piler_id=?", array($id)); + + foreach($query->rows as $q) { + array_push($rcpt, $q['to']); + } + + return $rcpt; + } + + + private function get_all_your_address() { + $s = ''; + + while(list($k, $v) = each($_SESSION['emails'])) { + if($s) { $s .= '| ' . $this->fix_email_address_for_sphinx($v); } + else { $s = $this->fix_email_address_for_sphinx($v); } + } + + return $s; + } + + + public function check_your_permission_by_piler_id($id = '') { + $q = ''; + $arr = $a = array(); + + if($id == '') { return 0; } + + if(Registry::get('admin_user') == 1 || Registry::get('auditor_user') == 1) { return 1; } + + array_push($arr, $id); + + while(list($k, $v) = each($_SESSION['emails'])) { + if(validemail($v) == 1) { + $q .= ",?"; + array_push($a, $v); + } + } + + $q = preg_replace("/^\,/", "", $q); + + $arr = array_merge($arr, $a, $a); + + $query = $this->db->query("SELECT * FROM " . VIEW_MESSAGES . " WHERE piler_id=? AND ( `from` IN ($q) OR `to` IN ($q) )", $arr); + + if(isset($query->row['id'])) { return 1; } + + return 0; + } + + + public function remove_message($id = '') { + if($id == '') { return 0; } + + if(Registry::get('admin_user') == 0) { return 0; } + + $query = $this->db->query("UPDATE " . TABLE_META . " SET deleted=1 WHERE piler_id=?", array($id)); + + return $this->db->countAffected(); + } + + + private function fix_email_address_for_sphinx($email = '') { + return preg_replace("/[\@\.\+\-]/", "X", $email); + } + + + public function get_search_terms() { + + $query = $this->db->query("SELECT term FROM " . TABLE_SEARCH . " where email=? ORDER BY ts DESC", array($_SESSION['email'])); + if(isset($query->rows)) { return $query->rows; } + + return array(); + } + + + public function add_search_term($term = '') { + if($term == '') { return 0; } + + if($this->update_search_term($term) == 0) { + AUDIT(ACTION_SAVE_SEARCH, '', '', '', $term); + $query = $this->db->query("INSERT INTO " . TABLE_SEARCH . " (email, ts, term) VALUES(?,?,?)", array($_SESSION['email'], time(), $term)); + } + + return 1; + } + + + public function update_search_term($term = '') { + if($term == '') { return 0; } + + AUDIT(ACTION_SEARCH, '', '', '', $term); + + $query = $this->db->query("UPDATE " . TABLE_SEARCH . " SET ts=? WHERE term=? AND email=?", array(time(), $term, $_SESSION['email'])); + + return $this->db->countAffected(); + } + + + private function fixup_sphinx_operators($s = '') { + if($s == '') { return $s; } + + $s = preg_replace("/ OR /", "|", $s); + $a = explode(" ", $s); + $s = ''; + + while(list($k, $v) = each($a)) { + + if(substr($v, 0, 4) == 'http') { + $v = preg_replace("/http(s){0,1}\:\/\//", "__URL__", $v); + $b = explode("/", $v); + $s .= ' ' . $this->fix_email_address_for_sphinx($b[0]); + } + else { + $s .= ' ' . $v; + } + } + + return $s; + } + + + private function make_cache_file_name($data = array(), $sortorder = '') { + return sha1($_SESSION['email'] . "/" . join("*", $data) . "-" . (NOW - NOW % 3600) . "-" . $sortorder); + } + +} + + +?> diff --git a/webui/model/stat/chart.php b/webui/model/stat/chart.php new file mode 100644 index 00000000..a34e315d --- /dev/null +++ b/webui/model/stat/chart.php @@ -0,0 +1,139 @@ +getPlot()->getPalette()->setLineColor(array( + //new Color(26, 192, 144), + new Color(208, 48, 128), + )); + + $line1 = new XYDataSet(); + + $limit = $this->getDataPoints($timespan); + + $range = $this->getRangeInSeconds($timespan); + + if($timespan == "daily"){ $grouping = "GROUP BY FROM_UNIXTIME(ts, '%Y.%m.%d. %H')"; } + else { $grouping = "GROUP BY FROM_UNIXTIME(ts, '%Y.%m.%d.')"; } + + + if($timespan == "daily"){ + $query = $this->db->query("select arrived-(arrived%3600) as ts, count(*) as num from " . TABLE_META . " where arrived > $range $emails $grouping ORDER BY ts DESC limit $limit"); + $date_format = "H:i"; + } else { + $query = $this->db->query("select arrived-(arrived%86400) as ts, count(*) as num from " . TABLE_META . " where arrived > $range $emails $grouping ORDER BY ts DESC limit $limit"); + $date_format = "m.d."; + } + + foreach ($query->rows as $q) { + array_push($ydata, $q['num']); + array_push($dates, date($date_format, $q['ts'])); + } + + if($query->num_rows >= 15) { + $i = 0; + while(list($k, $v) = each($dates)) { + $i++; + if($i % 3) { $dates[$k] = ""; } + } + reset($dates); + } + + + + $ydata = array_reverse($ydata); + $dates = array_reverse($dates); + + for($i=0; $iaddPoint(new Point("$ts", $ydata[$i])); + } + + + $dataSet = new XYSeriesDataSet(); + $dataSet->addSerie("RCVD", $line1); + + $chart->setDataSet($dataSet); + + $chart->setTitle($title); + $chart->getPlot()->setGraphCaptionRatio(0.80); + + $this->sendOutput($chart, $output); + } + + + public function pieChartHamSpam($emails = '', $timespan, $title, $output) { + $ham = $spam = 0; + + $range = $this->getRangeInSeconds($timespan); + + $chart = new PieChart(SIZE_X, SIZE_Y); + + $query = $this->db->query("SELECT COUNT(*) AS SPAM FROM " . TABLE_META . " WHERE $emails AND arrived > $range"); + if($query->num_rows > 0) { $spam = $query->row['SPAM']; } + + $query = $this->db->query("SELECT COUNT(*) AS HAM FROM " . TABLE_META . " WHERE $emails AND arrived > $range"); + if($query->num_rows > 0) { $ham = $query->row['HAM']; } + + if($ham > $spam) { + $chart->getPlot()->getPalette()->setPieColor(array(new Color(26, 192, 144), new Color(208, 48, 128) )); + } else { + $chart->getPlot()->getPalette()->setPieColor(array(new Color(208, 48, 128), new Color(26, 192, 144) )); + } + + + $dataSet = new XYDataSet(); + + $dataSet->addPoint(new Point("HAM ($ham)", $ham)); + $dataSet->addPoint(new Point("SPAM ($spam)", $spam)); + + $chart->setDataSet($dataSet); + $chart->setTitle($title); + + $this->sendOutput($chart, $output); + } + + + private function getRangeInSeconds($timespan) { + $range = 0; + + if($timespan == "daily") { return time() - 86400; } + if($timespan == "weekly") { return time() - 604800; } + + return time() - 2592000; + } + + + private function getDataPoints($timespan) { + + if($timespan == "daily") { return 24; } + if($timespan == "weekly") { return 7; } + + return 30; + } + + + private function sendOutput($chart, $output = '') { + if($output == "") { + header("Content-type: image/png"); + header("Expires: now"); + } + + if($output) { + $chart->render($output); + } + else { + $chart->render(); + } + } + +} + +?> diff --git a/webui/model/stat/counter.php b/webui/model/stat/counter.php new file mode 100644 index 00000000..41241f38 --- /dev/null +++ b/webui/model/stat/counter.php @@ -0,0 +1,43 @@ +get(Registry::get('counters')); + + if(isset($counter['_c:counters_last_update'])) { return $counter; } + } + + $query = $this->db->query("SELECT * FROM " . TABLE_COUNTER); + + if($query->num_rows == 1) { + $counter = $query->row; + } + + return $counter; + } + + + public function resetCounters(){ + + if(MEMCACHED_ENABLED) { + $memcache = Registry::get('memcache'); + + foreach (Registry::get('counters') as $counter) { + $memcache->set($counter, 0); + } + } + + $query = $this->db->query("UPDATE " . TABLE_COUNTER . " set rcvd=0, virus=0, duplicate=0, ignore=0"); + + return 0; + } + +} + +?> diff --git a/webui/model/user/auth.php b/webui/model/user/auth.php new file mode 100644 index 00000000..72d467c6 --- /dev/null +++ b/webui/model/user/auth.php @@ -0,0 +1,78 @@ +db->query("SELECT " . TABLE_USER . ".username, " . TABLE_USER . ".uid, " . TABLE_USER . ".realname, " . TABLE_USER . ".dn, " . TABLE_USER . ".password, " . TABLE_USER . ".isadmin, " . TABLE_USER . ".domain FROM " . TABLE_USER . ", " . TABLE_EMAIL . " WHERE " . TABLE_EMAIL . ".email=? AND " . TABLE_EMAIL . ".uid=" . TABLE_USER . ".uid", array($username)); + + if(!isset($query->row['password'])) { return 0; } + + $pass = crypt($password, $query->row['password']); + + if($pass == $query->row['password']){ + + $_SESSION['username'] = $query->row['username']; + $_SESSION['uid'] = $query->row['uid']; + $_SESSION['admin_user'] = $query->row['isadmin']; + $_SESSION['email'] = $username; + $_SESSION['domain'] = $query->row['domain']; + $_SESSION['realname'] = $query->row['realname']; + + $_SESSION['emails'] = $this->model_user_user->get_users_all_email_addresses($query->row['uid']); + + AUDIT(ACTION_LOGIN, $username, '', '', 'successful auth against user table'); + + return 1; + } + else { + AUDIT(ACTION_LOGIN_FAILED, $username, '', '', 'failed auth against user table'); + } + + if(strlen($query->row['dn']) > 3) { return $this->checkLoginAgainstLDAP($query->row, $password); } + + return 0; + } + + + private function checkLoginAgainstLDAP($user = array(), $password = '') { + if($password == '' || !isset($user['username']) || !isset($user['domain']) || !isset($user['dn']) || strlen($user['domain']) < 2){ return 0; } + + $query = $this->db->query("SELECT remotehost, basedn FROM " . TABLE_REMOTE . " WHERE remotedomain=?", array($user['domain'])); + + if($query->num_rows != 1) { return 0; } + + $ldap = new LDAP($query->row['remotehost'], $user['dn'], $password); + + if($ldap->is_bind_ok()) { + $_SESSION['username'] = $user['username']; + $_SESSION['admin_user'] = 0; + $_SESSION['email'] = $user['username']; + + $this->changePassword($user['username'], $password); + + AUDIT(ACTION_LOGIN, $user['username'], '', '', 'changed password in local table'); + + return 1; + } + else { + AUDIT(ACTION_LOGIN_FAILED, $user['username'], '', '', 'failed bind to ' . $query->row['remotehost'], $user['dn']); + } + + return 0; + } + + + public function changePassword($username = '', $password = '') { + if($username == "" || $password == ""){ return 0; } + + $query = $this->db->query("UPDATE " . TABLE_USER . " SET password=? WHERE username=?", array(crypt($password), $username)); + + $rc = $this->db->countAffected(); + + return $rc; + } + +} + +?> diff --git a/webui/model/user/import.php b/webui/model/user/import.php new file mode 100644 index 00000000..6e579bb8 --- /dev/null +++ b/webui/model/user/import.php @@ -0,0 +1,344 @@ +model_user_user->getDomains(); + $query = $this->db->query("SELECT remotehost, basedn, binddn FROM " . TABLE_REMOTE . " WHERE remotedomain=?", array($my_domain[0])); + + return $query->row; + } + + + public function queryRemoteUsers($host) { + $data = array(); + + LOGGER("running queryRemoteUsers() ..."); + + $attrs = array("cn", "mail", "mailAlternateAddress", "memberdn", "memberaddr"); + $mailAttr = 'mail'; + $mailAttrs = array("mail", "mailalternateaddress"); + + $memberAttrs = array("memberdn"); + + $ldap = new LDAP($host['ldap_host'], $host['ldap_binddn'], $host['ldap_bindpw']); + if($ldap->is_bind_ok() == 0) { + LOGGER($host['ldap_binddn'] . ": failed bind to " . $host['ldap_host']); + return array(); + } + + LOGGER($host['ldap_binddn'] . ": successful bind to " . $host['ldap_host']); + LOGGER("LDAP type: " . $host['type']); + + if($host['type'] == "AD") { + $attrs = array("cn", "proxyaddresses", "member"); + + $mailAttr = "proxyaddresses"; + $mailAttrs = array("proxyaddresses"); + + $memberAttrs = array("member"); + } + + + $query = $ldap->query($host['ldap_basedn'], "$mailAttr=*", $attrs ); + LOGGER("LDAP query: $mailAttr=* for basedn:" . $host['ldap_basedn']); + + foreach ($query->rows as $result) { + $emails = ""; + + if(!isset($result['cn']) || !isset($result['dn']) ) { continue; } + + foreach($mailAttrs as $__mail_attr) { + + if(isset($result[$__mail_attr]) ) { + + if(is_array($result[$__mail_attr]) ) { + + for($i = 0; $i < $result[$__mail_attr]['count']; $i++) { + LOGGER("found email entry: " . $result['dn'] . " => $__mail_attr:" . $result[$__mail_attr][$i]); + if(preg_match("/^smtp\:/i", $result[$__mail_attr][$i])) { + $emails .= strtolower(preg_replace("/^smtp\:/i", "", $result[$__mail_attr][$i])) . "\n"; + } + } + } + else { + LOGGER("found email entry: " . $result['dn'] . " => $__mail_attr:" . $result[$__mail_attr]); + $emails .= strtolower(preg_replace("/smtp\:/i", "", $result[$__mail_attr])) . "\n"; + } + + } + + } + + $__emails = explode("\n", $emails); + + + $members = ""; + + foreach($memberAttrs as $__member_attr) { + + if(isset($result[$__member_attr]) ) { + if(is_array($result[$__member_attr]) ) { + for($i = 0; $i < $result[$__member_attr]['count']; $i++) { + LOGGER("found member entry: " . $result['dn'] . " => $__member_attr:" . $result[$__member_attr][$i]); + $members .= $result[$__member_attr][$i] . "\n"; + } + } + else { + LOGGER("found member entry: " . $result['dn'] . " => $__member_attr:" . $result[$__member_attr]); + $members .= $result[$__member_attr] . "\n"; + } + } + + } + + $data[] = array( + 'username' => preg_replace("/\n{1,}$/", "", $__emails[0]), + 'realname' => $result['cn'], + 'dn' => $result['dn'], + 'emails' => preg_replace("/\n{1,}$/", "", $emails), + 'members' => preg_replace("/\n{1,}$/", "", $members) + ); + + } + + LOGGER("found " . count($data) . " users"); + + return $data; + } + + + + public function fillRemoteTable($host = array(), $domain = '') { + if($domain == '') { return 0; } + + /* + * if the 't_remote' table has no entry for your domain and we read some users + * let's put the connection info to the 't_remote' table needed for proxying + * the authentication requests + */ + + $query = $this->db->query("SELECT COUNT(*) AS num FROM " . TABLE_REMOTE . " WHERE remotedomain=?", array($domain)); + + if(isset($query->row['num'])) { + + if($query->row['num'] == 0) { + $query = $this->db->query("INSERT INTO " . TABLE_REMOTE . " (remotedomain, remotehost, basedn, binddn) VALUES(?,?,?,?)", array($domain, $host['ldap_host'], $host['ldap_basedn'], $host['ldap_binddn'])); + } + else { + $query = $this->db->query("UPDATE " . TABLE_REMOTE . " SET remotehost=?, basedn=?, binddn=? WHERE remotedomain=?", array($host['ldap_host'], $host['ldap_basedn'], $host['ldap_binddn'], $domain)); + + } + + LOGGER("SQL exec:" . $query->query); + + } + + return 1; + } + + + + public function processUsers($users = array(), $globals = array()) { + $late_add = array(); + $uids = array(); + $exclude = array(); + $newuser = 0; + $deleteduser = 0; + $n = 0; + + LOGGER("running processUsers() ..."); + + /* build a list of DNs to exclude from the import */ + + while (list($k, $v) = each($globals)) { + if(preg_match("/^reject_/", $k)) { + $exclude[$v] = $v; + } + } + + + foreach ($users as $_user) { + if(strlen($_user['dn']) > DN_MAX_LEN) { LOGGER("ERR: too long entry: " . $_user['dn']); } + + if(in_array($_user['dn'], $exclude) ) { + LOGGER("excluding from import:" . $_user['dn']); + continue; + } + + /* Does this DN exist in the user table ? */ + + $__user = $this->model_user_user->getUserByDN($_user['dn']); + + if(isset($__user['uid'])) { + + array_push($uids, $__user['uid']); + + + /* if so, then verify the email addresses */ + + $changed = 0; + $emails = $this->model_user_user->getEmailsByUid($__user['uid']); + + /* first let's add the new email addresses */ + + $ldap_emails = explode("\n", $_user['emails']); + $sql_emails = explode("\n", $emails); + + foreach ($ldap_emails as $email) { + if(!in_array($email, $sql_emails)) { + $rc = $this->model_user_user->addEmail($__user['uid'], $email); + $changed++; + + /* in case of an error add it to the $late_add array() */ + + if($rc == 0) { + $late_add[] = array( + 'uid' => $__user['uid'], + 'email' => $email + ); + } + } + } + + + /* delete emails not present in the user's LDAP entry */ + + foreach ($sql_emails as $email) { + if(!in_array($email, $ldap_emails)) { + $rc = $this->model_user_user->removeEmail($__user['uid'], $email); + $changed++; + } + } + + LOGGER($_user['dn'] . ": exists, changed=$changed"); + + if($changed > 0) { $n++; } + } + else { + + /* or add the new user */ + + $user = $this->createNewUserArray($_user['dn'], $_user['username'], $_user['realname'], $_user['emails'], $globals); + array_push($uids, $user['uid']); + + $rc = $this->model_user_user->addUser($user); + if($rc == 1) { $newuser++; } + } + } + + + /* add the rest to the email table */ + + foreach ($late_add as $new) { + $rc = $this->model_user_user->addEmail($new['uid'], $new['email']); + if($rc == 1) { $newuser++; } + } + + + /* delete accounts not present in the LDAP directory */ + + if(count($uids) > 0) { + $uidlist = implode("','", $uids); + $query = $this->db->query("SELECT uid, username FROM " . TABLE_USER . " WHERE domain=? AND dn != '*' AND dn LIKE '%" . $globals['ldap_basedn'] . "' AND dn is NOT NULL AND uid NOT IN ('$uidlist')", array($globals['domain']) ); + + foreach ($query->rows as $deleted) { + $deleteduser++; + $this->model_user_user->deleteUser($deleted['uid']); + } + } + + + /* try to add new membership entries */ + + reset($users); + + foreach ($users as $user) { + if($user['members']) { + + $group = $this->model_user_user->getUserByDN($user['dn']); + + $members = explode("\n", $user['members']); + if(count($members) > 0) { + + if(isset($group['uid'])) { + $query = $this->db->query("DELETE FROM " . TABLE_EMAIL_LIST . " WHERE gid=?", array($group['uid']) ); + } + + foreach ($members as $member) { + if(validemail($member)) { + $__user = $this->model_user_user->getUserByEmail($member); + } else { + $__user = $this->model_user_user->getUserByDN($member); + } + + if(isset($group['uid']) && isset($__user['uid'])) { + $query = $this->db->query("INSERT INTO " . TABLE_EMAIL_LIST . " (uid, gid) VALUES(?,?)", array((int)$__user['uid'], $group['uid'])); + } + + } + } + + } + } + + return array($newuser, $deleteduser); + } + + + private function createNewUserArray($dn = '', $username = '', $realname = '', $emails = '', $globals = array()) { + $user = array(); + + $user['uid'] = $this->model_user_user->getNextUid(); + $user['gid'] = $globals['gid']; + + $user['email'] = $emails; + + if(USE_EMAIL_AS_USERNAME == 1) { + $email = explode("\n", $emails); + $user['username'] = $email[0]; + } + else { + $user['username'] = $username . $user['uid']; + } + + + $user['password'] = '*'; + + $user['realname'] = $realname; + + if($realname == '') { $user['realname'] = $username; } + + $user['domain'] = $globals['domain']; + $user['dn'] = $dn; + $user['policy_group'] = $globals['policy_group']; + $user['isadmin'] = 0; + $user['whitelist'] = ''; + $user['blacklist'] = ''; + + return $user; + } + + + public function trashPassword($users = array()) { + foreach ($users as $user) { + $query = $this->db->query("UPDATE " . TABLE_USER . " SET password='*' WHERE dn=?", array($user['dn'])); + $rc = $this->db->countAffected(); + LOGGER("setting default password for " . $user['dn'] . " (rc=$rc)"); + } + } + + + public function count_email_addresses() { + $query = $this->db->query("SELECT COUNT(*) AS num FROM " . TABLE_EMAIL); + + if(isset($query->row['num'])) { return $query->row['num']; } + + return 0; + } + +} + +?> diff --git a/webui/model/user/prefs.php b/webui/model/user/prefs.php new file mode 100644 index 00000000..b617fe43 --- /dev/null +++ b/webui/model/user/prefs.php @@ -0,0 +1,45 @@ +db->query("SELECT * FROM " . TABLE_USER_SETTINGS . " WHERE username=?", array($username)); + + if(isset($query->row['pagelen'])) { $_SESSION['pagelen'] = $query->row['pagelen']; } else { $_SESSION['pagelen'] = PAGE_LEN; } + if(isset($query->row['lang'])) { $_SESSION['lang'] = $query->row['lang']; } else { $_SESSION['lang'] = LANG; } + if(isset($query->row['theme'])) { $_SESSION['theme'] = $query->row['theme']; } else { $_SESSION['theme'] = THEME; } + + return 1; + } + + + public function set_user_preferences($username = '', $prefs = array() ) { + + if(!isset($prefs['pagelen']) || !is_numeric($prefs['pagelen']) || $prefs['pagelen'] < 10 || $prefs['pagelen'] > 100 + || !isset($prefs['lang']) || strlen($prefs['lang']) != 2 || !file_exists(DIR_LANGUAGE . $prefs['lang']) + || !isset($prefs['theme']) || !preg_match("/^([a-zA-Z0-9\-\_]+)$/", $prefs['theme']) || !file_exists(DIR_THEME . $prefs['theme']) ) { return 1; } + + $query = $this->db->query("SELECT COUNT(*) AS num FROM " . TABLE_USER_SETTINGS . " WHERE username=?", array($username)); + + if((int)@$query->row['num'] == 1) { + $query = $this->db->query("UPDATE " . TABLE_USER_SETTINGS . " SET lang=?, pagelen=?, theme=? WHERE username=?", array($prefs['lang'], (int)@$prefs['pagelen'], $prefs['theme'], $username)); + } + else { + $query = $this->db->query("INSERT INTO " . TABLE_USER_SETTINGS . " (username, pagelen, lang, theme) VALUES(?,?,?,?)", array($username, (int)@$prefs['pagelen'], $prefs['lang'], $prefs['theme'])); + } + + + $_SESSION['pagelen'] = $prefs['pagelen']; + $_SESSION['lang'] = $prefs['lang']; + $_SESSION['theme'] = $prefs['theme']; + + LOGGER("set user preference", $username); + + return 1; + } + +} + +?> diff --git a/webui/model/user/user.php b/webui/model/user/user.php new file mode 100644 index 00000000..de66856e --- /dev/null +++ b/webui/model/user/user.php @@ -0,0 +1,421 @@ +db->query("SELECT uid FROM " . TABLE_USER . " WHERE username=?", array($username)); + + if(isset($query->row['uid'])){ + return $query->row['uid']; + } + + return -1; + } + + + public function getUsernameByUid($uid = 0) { + + $query = $this->db->query("SELECT username FROM " . TABLE_USER . " WHERE uid=?", array((int)$uid)); + + if(isset($query->row['username'])){ + return $query->row['username']; + } + + return ""; + } + + + public function get_uid_by_email($email = '') { + $query = $this->db->query("SELECT uid FROM " . TABLE_EMAIL . " WHERE email=?", array($email)); + + if(isset($query->row['uid'])){ return $query->row['uid']; } + + return -1; + } + + + public function get_username_by_email($email = '') { + $query = $this->db->query("SELECT username FROM " . TABLE_USER . ", " . TABLE_EMAIL . " WHERE " . TABLE_USER . ".uid=" . TABLE_EMAIL . ".uid AND email=?", array($email)); + + if(isset($query->row['username'])){ return $query->row['username']; } + + return ""; + } + + + public function get_users_all_email_addresses($uid = 0) { + $data = array(); + $uids = $uid; + + if($uid > 0) { + $query = $this->db->query("SELECT gid FROM " . TABLE_EMAIL_LIST . " WHERE uid=?", array((int)$uid)); + + if(isset($query->rows)) { + foreach ($query->rows as $q) { + if(is_numeric($q['gid']) && $q['gid'] > 0) { + $uids .= "," . $q['gid']; + } + } + } + + $query = $this->db->query("SELECT email FROM " . TABLE_EMAIL . " WHERE uid IN ($uids)"); + foreach ($query->rows as $q) { + array_push($data, $q['email']); + } + + } + + return $data; + } + + + public function get_additional_uids($uid = 0) { + $data = array(); + + if($uid > 0) { + $query = $this->db->query("SELECT gid FROM " . TABLE_EMAIL_LIST . " WHERE uid=?", array((int)$uid)); + + if(isset($query->rows)) { + foreach ($query->rows as $q) { + array_push($data, $q['gid']); + } + } + } + + return $data; + } + + + public function getEmailAddress($username = '') { + + $query = $this->db->query("SELECT " . TABLE_EMAIL . ".email AS email FROM " . TABLE_EMAIL . "," . TABLE_USER . " WHERE " . TABLE_EMAIL . ".uid=" . TABLE_USER . ".uid AND " . TABLE_USER . ".username=? LIMIT 1", array($username)); + + if(isset($query->row['email'])){ + return $query->row['email']; + } + + return ""; + } + + + public function getEmails($username = '') { + $emails = ""; + + $query = $this->db->query("SELECT " . TABLE_EMAIL . ".email AS email FROM " . TABLE_EMAIL . "," . TABLE_USER . " WHERE " . TABLE_EMAIL . ".uid=" . TABLE_USER . ".uid AND " . TABLE_USER . ".username=?", array($username)); + + foreach ($query->rows as $q) { + $emails .= $q['email'] . "\n"; + } + + return preg_replace("/\n$/", "", $emails); + } + + + public function getEmailsByUid($uid = 0) { + $emails = ""; + + $query = $this->db->query("SELECT email FROM " . TABLE_EMAIL . " WHERE uid=?", array((int)$uid)); + foreach ($query->rows as $q) { + $emails .= $q['email'] . "\n"; + } + + return preg_replace("/\n$/", "", $emails); + } + + + public function getUserByDN($dn = '') { + if($dn == '') { return array(); } + + $query = $this->db->query("SELECT * FROM " . TABLE_USER . " WHERE dn=?", array($dn)); + + if($query->num_rows == 1) { + return $query->row; + } + + return array(); + } + + + public function getUserByUid($uid = 0) { + if(!is_numeric($uid) || (int)$uid < 0){ + return array(); + } + + $query = $this->db->query("SELECT * FROM " . TABLE_USER . " WHERE uid=?", array((int)$uid)); + + return $query->row; + } + + + public function getUserByEmail($email = '') { + if($email == '') { + return array(); + } + + $query = $this->db->query("SELECT * FROM " . TABLE_USER . "," . TABLE_EMAIL . " WHERE " . TABLE_USER . ".uid=" . TABLE_EMAIL . ".uid AND email=?", array($email)); + + return $query->row; + } + + + public function getUsernameByEmail($email = '') { + $username = ""; + + if($email == '') { return $username; } + + $query = $this->db->query("SELECT username FROM " . TABLE_USER . " WHERE uid IN (SELECT uid FROM " . TABLE_EMAIL . " WHERE email=?)", array($email)); + + if(isset($query->row['username'])) { $username = $query->row['username']; } + + return $username; + } + + + public function getUsers($search = '', $page = 0, $page_len = 0, $sort = 'username', $order = 0) { + $where_cond = " WHERE " . TABLE_USER . ".uid=" . TABLE_EMAIL . ".uid "; + $_order = ""; + $users = array(); + $my_domain = array(); + $limit = ""; + + $from = (int)$page * (int)$page_len; + + $search = preg_replace("/\s{1,}/", "", $search); + + if($search){ + $where_cond .= " AND email like '%" . $this->db->escape($search) . "%' "; + } + + /* sort order */ + + if($order == 0) { $order = "ASC"; } + else { $order = "DESC"; } + + $_order = "ORDER BY $sort $order"; + + if($page_len > 0) { $limit = " LIMIT " . (int)$from . ", " . (int)$page_len; } + + $query = $this->db->query("SELECT " . TABLE_USER . ".uid, isadmin, username, realname, domain, email FROM " . TABLE_USER . "," . TABLE_EMAIL . " $where_cond group by " . TABLE_USER . ".uid $_order $limit"); + + foreach ($query->rows as $q) { + + if(Registry::get('admin_user') == 1 || (isset($q['domain']) && $q['domain'] == $my_domain[0]) ) { + $users[] = array( + 'uid' => $q['uid'], + 'username' => $q['username'], + 'realname' => $q['realname'], + 'domain' => isset($q['domain']) ? $q['domain'] : "", + 'email' => $q['email'], + 'isadmin' => $q['isadmin'] + ); + } + + } + + return $users; + } + + + public function howManyUsers($search = '') { + $where_cond = ""; + + if($search){ + $where_cond .= " WHERE email like '%" . $this->db->escape($search) . "%' "; + } + + $query = $this->db->query("SELECT COUNT(*) AS num, uid FROM " . TABLE_EMAIL . " $where_cond group by uid"); + + return $query->num_rows; + } + + + public function get_domains() { + $data = array(); + + $query = $this->db->query("SELECT DISTINCT mapped AS domain FROM " . TABLE_DOMAIN); + + foreach ($query->rows as $q) { + array_push($data, $q['domain']); + } + + return $data; + } + + + public function get_email_domains() { + $data = array(); + + $query = $this->db->query("SELECT domain FROM " . TABLE_DOMAIN); + + foreach ($query->rows as $q) { + array_push($data, $q['domain']); + } + + return $data; + } + + + public function getNextUid() { + + $query = $this->db->query("SELECT MAX(uid) AS last_id FROM " . TABLE_USER); + + if(isset($query->row['last_id']) && $query->row['last_id'] > 0) { + return (int)$query->row['last_id'] + 1; + } + + return 1; + } + + + public function addUser($user) { + LOGGER("add user: " . $user['username'] . ", uid=" . (int)$user['uid']); + + if(!isset($user['domain']) || $user['domain'] == "") { return -1; } + if(!isset($user['username']) || $user['username'] == "" || $this->getUidByName($user['username']) > 0) { return -1; } + + $emails = explode("\n", $user['email']); + foreach ($emails as $email) { + $email = rtrim($email); + + $query = $this->db->query("SELECT COUNT(*) AS count FROM " . TABLE_EMAIL . " WHERE email=?", array($email)); + + /* remove from memcached */ + + if(MEMCACHED_ENABLED) { + $memcache = Registry::get('memcache'); + $memcache->delete("_c:" . $email); + } + + if($query->row['count'] > 0) { + return $email; + } + } + + + $query = $this->db->query("SELECT COUNT(*) AS count FROM " . TABLE_USER . " WHERE username=?", array($user['username'])); + if($query->row['count'] > 0) { + return $user['username']; + } + + $encrypted_password = crypt($user['password']); + + $query = $this->db->query("INSERT INTO " . TABLE_USER . " (uid, username, realname, password, domain, dn, isadmin) VALUES(?,?,?,?,?,?,?)", array((int)$user['uid'], $user['username'], $user['realname'], $encrypted_password, $user['domain'], @$user['dn'], (int)$user['isadmin'])); + + if($query->error == 1 || $this->db->countAffected() == 0){ return $user['username']; } + + foreach ($emails as $email) { + $email = rtrim($email); + + $ret = $this->addEmail((int)$user['uid'], $email); + if($ret == 0) { return -2; } + } + + + return 1; + } + + + public function addEmail($uid = 0, $email = '') { + if($uid < 1 || $email == ""){ return 0; } + + $query = $this->db->query("INSERT INTO " . TABLE_EMAIL . " (uid, email) VALUES(?,?)", array((int)$uid, $email)); + + $rc = $this->db->countAffected(); + + LOGGER("add email: $email, uid=$uid (rc=$rc)"); + + return $rc; + } + + + public function removeEmail($uid = 0, $email = '') { + if((int)$uid < 1 || $email == ""){ return 0; } + + $query = $this->db->query("DELETE FROM " . TABLE_EMAIL . " WHERE uid=? AND email=?", array((int)$uid, $email)); + + $rc = $this->db->countAffected(); + + LOGGER("remove email: $email, uid=$uid (rc=$rc)"); + + return $rc; + } + + + public function updateUser($user) { + LOGGER("update user: " . $user['username'] . ", uid=" . (int)$user['uid']); + + $emails = explode("\n", $user['email']); + foreach ($emails as $email) { + $email = rtrim($email); + + $query = $this->db->query("SELECT COUNT(*) AS count FROM " . TABLE_EMAIL . " WHERE uid!=? AND email=?", array((int)$user['uid'], $email)); + + if($query->row['count'] > 0) { + return $email; + } + } + + + /* update password field if we have to */ + + if(strlen($user['password']) >= MIN_PASSWORD_LENGTH) { + $query = $this->db->query("UPDATE " . TABLE_USER . " SET password=? WHERE uid=?", array(crypt($user['password']), (int)$user['uid'])); + if($this->db->countAffected() != 1) { return 0; } + } + + $query = $this->db->query("UPDATE " . TABLE_USER . " SET username=?, realname=?, domain=?, dn=?, isadmin=? WHERE uid=?", array($user['username'], $user['realname'], $user['domain'], @$user['dn'], $user['isadmin'], (int)$user['uid'])); + + + /* first, remove all his email addresses */ + + $query = $this->db->query("DELETE FROM " . TABLE_EMAIL . " WHERE uid=?", array((int)$user['uid'])); + + /* then add all the emails we have from the CGI post input */ + + foreach ($emails as $email) { + $email = rtrim($email); + $query = $this->db->query("INSERT INTO " . TABLE_EMAIL . " (uid, email) VALUES(?,?)", array((int)$user['uid'], $email)); + + /* remove from memcached */ + + if(MEMCACHED_ENABLED) { + $memcache = Registry::get('memcache'); + $memcache->delete("_c:" . $email); + } + + } + + return 1; + } + + + public function deleteUser($uid) { + if(!$this->checkUID($uid)){ return 0; } + + $query = $this->db->query("DELETE FROM " . TABLE_EMAIL . " WHERE uid=?", array((int)$uid)); + $query = $this->db->query("DELETE FROM " . TABLE_USER . " WHERE uid=?", array((int)$uid)); + + LOGGER("remove user: uid=$uid"); + + return 1; + } + + + +} + +?> diff --git a/webui/sign.php b/webui/sign.php new file mode 100644 index 00000000..8ab42ad8 --- /dev/null +++ b/webui/sign.php @@ -0,0 +1,36 @@ +query("select vcode FROM " . TABLE_META . " WHERE sent >= ? AND sent < ? ORDER BY id ASC", array($ts1, $ts2)); + + +print $query->query . " $ts1, $ts2\n\n"; + + + +foreach ($query->rows as $q) { + $data .= $q['vcode']; +} + +print $data . "\n"; + +$digest = openssl_digest($data, "SHA256"); + +print "$digest\n"; + + +print fetch_url("http://ecrive.net/api/plain?mode=sign&data=$digest"); + +//print fetch_url("http://ecrive.net/api/plain?mode=check&data=$digest&signature=$s"); diff --git a/webui/system/controller.php b/webui/system/controller.php new file mode 100644 index 00000000..6bb88a15 --- /dev/null +++ b/webui/system/controller.php @@ -0,0 +1,119 @@ +data = array_merge($this->data, $language->data); + } + + + public function __get($key) { + return Registry::get($key); + } + + + public function __set($key, $value) { + Registry::set($key, $value); + } + + + public function args($args = array()){ + while(list($key, $value) = each($args)) $this->data[$key] = $value; + } + + + protected function render(){ + + foreach ($this->children as $child) { + $file = DIR_APPLICATION . $child . ".php"; + $class = 'Controller' . preg_replace('/[^a-zA-Z0-9]/', '', $child); + + if(file_exists($file)){ + require_once($file); + + $controller = new $class(); + + $controller->index(); + + $this->data[$controller->id] = $controller->output; + } + else { + exit("Error: Could not load controller ($file)" . $child . '!'); + } + + } + + + + + $this->output = $this->fetch($this->template); + + + if($this->layout){ + + $file = DIR_APPLICATION . $this->layout . '.php'; + $class = 'Controller' . preg_replace('/[^a-zA-Z0-9]/', '', $this->layout); + + if(file_exists($file)){ + require_once($file); + + $controller = new $class(); + + $controller->data[$this->id] = $this->output; + + $controller->index(); + + $this->output = $controller->output; + + } + else { + exit("Error: Could not load layout ($file) " . $this->layout . '!'); + } + + print $this->output; + } + + } + + + protected function fetch(){ + + if(isset($_SESSION['theme']) && preg_match("/^([a-zA-Z0-9\-\_]+)$/", $_SESSION['theme']) && file_exists(DIR_THEME . $_SESSION['theme']) ) { + $file = DIR_THEME . $_SESSION['theme'] . '/templates/' . $this->template; + } else { + $file = DIR_THEME . THEME . '/templates/' . $this->template; + } + + + if(file_exists($file)){ + + extract($this->data); + + ob_start(); + + include($file); + + $content = ob_get_contents(); + + ob_end_clean(); + + return $content; + } + else { + exit('Error: Could not load template ' . $file . '!'); + } + } + + +} + +?> diff --git a/webui/system/database/ldap.php b/webui/system/database/ldap.php new file mode 100644 index 00000000..eeb76fa0 --- /dev/null +++ b/webui/system/database/ldap.php @@ -0,0 +1,101 @@ +link = ldap_connect($ldaphost) or exit('Error: ldap_connect()'); + ldap_set_option($this->link, LDAP_OPT_PROTOCOL_VERSION, 3); + + if(@ldap_bind($this->link, $binddn, $bindpw)) { + $this->bind = 1; + } + else { + $this->bind = 0; + } + + return $this->link; + } + + + public function is_bind_ok() { + return $this->bind; + } + + + public function query($basedn, $filter, $justthese) { + $i = 0; + $data = array(); + + $sr = ldap_search($this->link, $basedn, $filter, $justthese); + + $results = ldap_get_entries($this->link, $sr); + + for($i=0; $i < $results['count']; $i++) { + for($k=0; $k < $results[$i]['count']; $k++) { + $attr = $results[$i][$k]; + + if($results[$i][$attr]['count'] == 1) { + $data[$i][$attr] = isset($results[$i][$attr][0]) ? $results[$i][$attr][0] : ""; + } + else { + $data[$i][$attr] = isset($results[$i][$attr]) ? $results[$i][$attr] : ""; + } + + } + + $data[$i]['dn'] = $results[$i]['dn']; + } + + + $query = new stdClass(); + + $query->row = isset($data[0]) ? $data[0] : array(); + $query->dn = isset($results[0]['dn']) ? $results[0]['dn'] : ""; + $query->rows = $data; + $query->num_rows = $results['count']; + + unset($data); + + return $query; + } + + + public function add($dn, $entry) { + return ldap_add($this->link, $dn, $entry); + } + + + public function modify($dn, $entry) { + return ldap_modify($this->link, $dn, $entry); + } + + + public function rename($dn, $newrdn, $newparent) { + return ldap_rename($this->link, $dn, $newrdn, $newparent, TRUE); + } + + + public function replace($dn, $entry) { + return ldap_mod_replace($this->link, $dn, $entry); + } + + + public function delete($dn) { + return ldap_delete($this->link, $dn); + } + + + public function __destruct() { + ldap_unbind($this->link); + } + + +} + + +?> diff --git a/webui/system/database/mysql.php b/webui/system/database/mysql.php new file mode 100644 index 00000000..7f02cf9f --- /dev/null +++ b/webui/system/database/mysql.php @@ -0,0 +1,88 @@ +link = new PDO("mysql:host=$hostname;dbname=$database", $username, $password, + array( + PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8", + PDO::MYSQL_ATTR_INIT_COMMAND => "SET CHARACTER SET utf8" + ) + ); + + } + catch(PDOException $exception) { + exit('Error: ' . $exception->getMessage() . " on database: $database
"); + } + + $this->affected = 0; + } + + + public function select_db($database) { } + + + public function query($sql, $arr = array()) { + $query = new stdClass(); + + $query->error = 1; + $query->errmsg = "Error"; + $query->query = $sql; + + $time_start = microtime(true); + + $i = 0; + $data = array(); + + $s = $this->link->prepare($sql); + if(!$s) { return $query; } + + $s->execute($arr); + + $this->affected = $s->rowCount(); + + $R = $s->fetchAll(); + + while(list ($k, $v) = each($R)){ + $data[$i] = $v; + $i++; + } + + $query->row = isset($data[0]) ? $data[0] : array(); + $query->rows = $data; + $query->num_rows = $i; + + $query->error = 0; + $query->errmsg = ""; + + unset($data); + + $time_end = microtime(true); + + $query->exec_time = $time_end - $time_start; + + return $query; + } + + + public function countAffected() { + return $this->affected; + } + + + public function getLastId() { + return $this->link->lastInsertId(); + } + + + public function __destruct() { } + +} + + +?> diff --git a/webui/system/database/sphinx.php b/webui/system/database/sphinx.php new file mode 100644 index 00000000..944e7d2f --- /dev/null +++ b/webui/system/database/sphinx.php @@ -0,0 +1,92 @@ +link = mysql_connect($hostname, $username, $password)) { + exit('Error: Could not make a database connection using ' . $username . '@' . $hostname); + } + + $this->prefix = $prefix; + + mysql_query("SET NAMES 'utf8'", $this->link); + mysql_query("SET CHARACTER SET utf8", $this->link); + } + + + public function query($sql) { + $query = new stdClass(); + + $query->query = $sql; + $query->error = 0; + $query->errmsg = ""; + + $time_start = microtime(true); + + $resource = mysql_query(str_replace('#__', $this->prefix, $sql), $this->link); + + if($resource){ + if(is_resource($resource)){ + $i = 0; + + $data = array(); + + while ($result = mysql_fetch_assoc($resource)) { + $data[$i] = $result; + + $i++; + } + + mysql_free_result($resource); + + $query->row = isset($data[0]) ? $data[0] : array(); + $query->rows = $data; + $query->num_rows = $i; + + unset($data); + + $time_end = microtime(true); + + $query->exec_time = $time_end - $time_start; + + return $query; + } + else { + return $query; + } + } + else { + $_SESSION['error'] = 'Error: ' . mysql_error() . '
Error No: ' . mysql_errno() . '
' . $sql; + + $query->errmsg = 'Error: ' . mysql_error() . '
Error No: ' . mysql_errno() . '
' . $sql; + $query->error = 1; + + return $query; + } + + } + + + public function countAffected() { + return mysql_affected_rows($this->link); + } + + + public function getLastId() { + return mysql_insert_id($this->link); + } + + + public function __destruct() { + mysql_close($this->link); + } + + +} + + +?> diff --git a/webui/system/database/sqlite.php b/webui/system/database/sqlite.php new file mode 100644 index 00000000..793b1d84 --- /dev/null +++ b/webui/system/database/sqlite.php @@ -0,0 +1,93 @@ +link = new PDO("sqlite:$database", 'OPEN_CREATE'); + } + catch(PDOException $exception) { + exit('Error: ' . $exception->getMessage() . " on $database
"); + } + + if($fixperm == 1) { chmod($database, 0660); } + + $this->affected = 0; + } + + + public function select_db($database) { } + + + public function query($sql) { + $query = new stdClass(); + + $query->error = 1; + $query->errmsg = "Error"; + $query->query = $sql; + + $time_start = microtime(true); + + $i = 0; + $data = array(); + + $s = $this->link->prepare($sql); + if(!$s) { return $query; } + + $s->execute(); + + $this->affected = $s->rowCount(); + + $R = $s->fetchAll(); + + while(list ($k, $v) = each($R)){ + $data[$i] = $v; + $i++; + } + + $query->row = isset($data[0]) ? $data[0] : array(); + $query->rows = $data; + $query->num_rows = $i; + + $query->error = 0; + $query->errmsg = ""; + + unset($data); + + $time_end = microtime(true); + + $query->exec_time = $time_end - $time_start; + + return $query; + } + + + public function escape($value) { + //return $this->link->quote($value); + return $value; + } + + + public function countAffected() { + return $this->affected; + } + + + public function getLastId() { + return $this->link->lastInsertId(); + } + + + public function __destruct() { } + +} + + +?> diff --git a/webui/system/db.php b/webui/system/db.php new file mode 100644 index 00000000..7e39b62f --- /dev/null +++ b/webui/system/db.php @@ -0,0 +1,38 @@ +driver = new $driver($hostname, $username, $password, $database, $prefix); + $this->database = $database; + } + + + public function select_db($db) { + $this->driver->select_db($db); + } + + + public function query($sql, $arr = array()) { + return $this->driver->query($sql, $arr); + } + + + public function countAffected() { + return $this->driver->countAffected(); + } + + + public function getLastId() { + return $this->driver->getLastId(); + } + +} + +?> diff --git a/webui/system/document.php b/webui/system/document.php new file mode 100644 index 00000000..589f0932 --- /dev/null +++ b/webui/system/document.php @@ -0,0 +1,12 @@ + diff --git a/webui/system/front.php b/webui/system/front.php new file mode 100644 index 00000000..1808873b --- /dev/null +++ b/webui/system/front.php @@ -0,0 +1,59 @@ +error = $error; + + $action = $this->execute($action); + + if($action) $this->execute($error); + } + + + private function execute($action) { + $file = DIR_APPLICATION . $this->sanitize_path($action->getClass()) . ".php"; + $class = 'Controller' . preg_replace("/[^a-zA-Z0-9]/", "", $action->getClass()); + + $method = $action->getMethod(); + $args = $action->getArgs(); + + + $action = NULL; + + if(file_exists($file)){ + require_once($file); + + $controller = new $class(); + + if(is_callable(array($controller, $method))){ + $action = call_user_func_array(array($controller, $method), $args); + } + else { + $action = $this->error; + + $this->error = NULL; + } + } + else { + + + $action = $this->error; + + $this->error = NULL; + } + + + return $action; + } + + +} + +?> diff --git a/webui/system/helper/fpdf16/font/courier.php b/webui/system/helper/fpdf16/font/courier.php new file mode 100755 index 00000000..913f9a45 --- /dev/null +++ b/webui/system/helper/fpdf16/font/courier.php @@ -0,0 +1,7 @@ + diff --git a/webui/system/helper/fpdf16/font/desktop.ini b/webui/system/helper/fpdf16/font/desktop.ini new file mode 100755 index 00000000..8a96fbb7 --- /dev/null +++ b/webui/system/helper/fpdf16/font/desktop.ini @@ -0,0 +1,4 @@ +[ViewState] +Mode= +Vid= +FolderType=NotSpecified diff --git a/webui/system/helper/fpdf16/font/helvetica.php b/webui/system/helper/fpdf16/font/helvetica.php new file mode 100755 index 00000000..ca94cdf2 --- /dev/null +++ b/webui/system/helper/fpdf16/font/helvetica.php @@ -0,0 +1,15 @@ +278,chr(1)=>278,chr(2)=>278,chr(3)=>278,chr(4)=>278,chr(5)=>278,chr(6)=>278,chr(7)=>278,chr(8)=>278,chr(9)=>278,chr(10)=>278,chr(11)=>278,chr(12)=>278,chr(13)=>278,chr(14)=>278,chr(15)=>278,chr(16)=>278,chr(17)=>278,chr(18)=>278,chr(19)=>278,chr(20)=>278,chr(21)=>278, + chr(22)=>278,chr(23)=>278,chr(24)=>278,chr(25)=>278,chr(26)=>278,chr(27)=>278,chr(28)=>278,chr(29)=>278,chr(30)=>278,chr(31)=>278,' '=>278,'!'=>278,'"'=>355,'#'=>556,'$'=>556,'%'=>889,'&'=>667,'\''=>191,'('=>333,')'=>333,'*'=>389,'+'=>584, + ','=>278,'-'=>333,'.'=>278,'/'=>278,'0'=>556,'1'=>556,'2'=>556,'3'=>556,'4'=>556,'5'=>556,'6'=>556,'7'=>556,'8'=>556,'9'=>556,':'=>278,';'=>278,'<'=>584,'='=>584,'>'=>584,'?'=>556,'@'=>1015,'A'=>667, + 'B'=>667,'C'=>722,'D'=>722,'E'=>667,'F'=>611,'G'=>778,'H'=>722,'I'=>278,'J'=>500,'K'=>667,'L'=>556,'M'=>833,'N'=>722,'O'=>778,'P'=>667,'Q'=>778,'R'=>722,'S'=>667,'T'=>611,'U'=>722,'V'=>667,'W'=>944, + 'X'=>667,'Y'=>667,'Z'=>611,'['=>278,'\\'=>278,']'=>278,'^'=>469,'_'=>556,'`'=>333,'a'=>556,'b'=>556,'c'=>500,'d'=>556,'e'=>556,'f'=>278,'g'=>556,'h'=>556,'i'=>222,'j'=>222,'k'=>500,'l'=>222,'m'=>833, + 'n'=>556,'o'=>556,'p'=>556,'q'=>556,'r'=>333,'s'=>500,'t'=>278,'u'=>556,'v'=>500,'w'=>722,'x'=>500,'y'=>500,'z'=>500,'{'=>334,'|'=>260,'}'=>334,'~'=>584,chr(127)=>350,chr(128)=>556,chr(129)=>350,chr(130)=>222,chr(131)=>556, + chr(132)=>333,chr(133)=>1000,chr(134)=>556,chr(135)=>556,chr(136)=>333,chr(137)=>1000,chr(138)=>667,chr(139)=>333,chr(140)=>1000,chr(141)=>350,chr(142)=>611,chr(143)=>350,chr(144)=>350,chr(145)=>222,chr(146)=>222,chr(147)=>333,chr(148)=>333,chr(149)=>350,chr(150)=>556,chr(151)=>1000,chr(152)=>333,chr(153)=>1000, + chr(154)=>500,chr(155)=>333,chr(156)=>944,chr(157)=>350,chr(158)=>500,chr(159)=>667,chr(160)=>278,chr(161)=>333,chr(162)=>556,chr(163)=>556,chr(164)=>556,chr(165)=>556,chr(166)=>260,chr(167)=>556,chr(168)=>333,chr(169)=>737,chr(170)=>370,chr(171)=>556,chr(172)=>584,chr(173)=>333,chr(174)=>737,chr(175)=>333, + chr(176)=>400,chr(177)=>584,chr(178)=>333,chr(179)=>333,chr(180)=>333,chr(181)=>556,chr(182)=>537,chr(183)=>278,chr(184)=>333,chr(185)=>333,chr(186)=>365,chr(187)=>556,chr(188)=>834,chr(189)=>834,chr(190)=>834,chr(191)=>611,chr(192)=>667,chr(193)=>667,chr(194)=>667,chr(195)=>667,chr(196)=>667,chr(197)=>667, + chr(198)=>1000,chr(199)=>722,chr(200)=>667,chr(201)=>667,chr(202)=>667,chr(203)=>667,chr(204)=>278,chr(205)=>278,chr(206)=>278,chr(207)=>278,chr(208)=>722,chr(209)=>722,chr(210)=>778,chr(211)=>778,chr(212)=>778,chr(213)=>778,chr(214)=>778,chr(215)=>584,chr(216)=>778,chr(217)=>722,chr(218)=>722,chr(219)=>722, + chr(220)=>722,chr(221)=>667,chr(222)=>667,chr(223)=>611,chr(224)=>556,chr(225)=>556,chr(226)=>556,chr(227)=>556,chr(228)=>556,chr(229)=>556,chr(230)=>889,chr(231)=>500,chr(232)=>556,chr(233)=>556,chr(234)=>556,chr(235)=>556,chr(236)=>278,chr(237)=>278,chr(238)=>278,chr(239)=>278,chr(240)=>556,chr(241)=>556, + chr(242)=>556,chr(243)=>556,chr(244)=>556,chr(245)=>556,chr(246)=>556,chr(247)=>584,chr(248)=>611,chr(249)=>556,chr(250)=>556,chr(251)=>556,chr(252)=>556,chr(253)=>500,chr(254)=>556,chr(255)=>500); +?> diff --git a/webui/system/helper/fpdf16/font/helveticab.php b/webui/system/helper/fpdf16/font/helveticab.php new file mode 100755 index 00000000..276cfa8c --- /dev/null +++ b/webui/system/helper/fpdf16/font/helveticab.php @@ -0,0 +1,15 @@ +278,chr(1)=>278,chr(2)=>278,chr(3)=>278,chr(4)=>278,chr(5)=>278,chr(6)=>278,chr(7)=>278,chr(8)=>278,chr(9)=>278,chr(10)=>278,chr(11)=>278,chr(12)=>278,chr(13)=>278,chr(14)=>278,chr(15)=>278,chr(16)=>278,chr(17)=>278,chr(18)=>278,chr(19)=>278,chr(20)=>278,chr(21)=>278, + chr(22)=>278,chr(23)=>278,chr(24)=>278,chr(25)=>278,chr(26)=>278,chr(27)=>278,chr(28)=>278,chr(29)=>278,chr(30)=>278,chr(31)=>278,' '=>278,'!'=>333,'"'=>474,'#'=>556,'$'=>556,'%'=>889,'&'=>722,'\''=>238,'('=>333,')'=>333,'*'=>389,'+'=>584, + ','=>278,'-'=>333,'.'=>278,'/'=>278,'0'=>556,'1'=>556,'2'=>556,'3'=>556,'4'=>556,'5'=>556,'6'=>556,'7'=>556,'8'=>556,'9'=>556,':'=>333,';'=>333,'<'=>584,'='=>584,'>'=>584,'?'=>611,'@'=>975,'A'=>722, + 'B'=>722,'C'=>722,'D'=>722,'E'=>667,'F'=>611,'G'=>778,'H'=>722,'I'=>278,'J'=>556,'K'=>722,'L'=>611,'M'=>833,'N'=>722,'O'=>778,'P'=>667,'Q'=>778,'R'=>722,'S'=>667,'T'=>611,'U'=>722,'V'=>667,'W'=>944, + 'X'=>667,'Y'=>667,'Z'=>611,'['=>333,'\\'=>278,']'=>333,'^'=>584,'_'=>556,'`'=>333,'a'=>556,'b'=>611,'c'=>556,'d'=>611,'e'=>556,'f'=>333,'g'=>611,'h'=>611,'i'=>278,'j'=>278,'k'=>556,'l'=>278,'m'=>889, + 'n'=>611,'o'=>611,'p'=>611,'q'=>611,'r'=>389,'s'=>556,'t'=>333,'u'=>611,'v'=>556,'w'=>778,'x'=>556,'y'=>556,'z'=>500,'{'=>389,'|'=>280,'}'=>389,'~'=>584,chr(127)=>350,chr(128)=>556,chr(129)=>350,chr(130)=>278,chr(131)=>556, + chr(132)=>500,chr(133)=>1000,chr(134)=>556,chr(135)=>556,chr(136)=>333,chr(137)=>1000,chr(138)=>667,chr(139)=>333,chr(140)=>1000,chr(141)=>350,chr(142)=>611,chr(143)=>350,chr(144)=>350,chr(145)=>278,chr(146)=>278,chr(147)=>500,chr(148)=>500,chr(149)=>350,chr(150)=>556,chr(151)=>1000,chr(152)=>333,chr(153)=>1000, + chr(154)=>556,chr(155)=>333,chr(156)=>944,chr(157)=>350,chr(158)=>500,chr(159)=>667,chr(160)=>278,chr(161)=>333,chr(162)=>556,chr(163)=>556,chr(164)=>556,chr(165)=>556,chr(166)=>280,chr(167)=>556,chr(168)=>333,chr(169)=>737,chr(170)=>370,chr(171)=>556,chr(172)=>584,chr(173)=>333,chr(174)=>737,chr(175)=>333, + chr(176)=>400,chr(177)=>584,chr(178)=>333,chr(179)=>333,chr(180)=>333,chr(181)=>611,chr(182)=>556,chr(183)=>278,chr(184)=>333,chr(185)=>333,chr(186)=>365,chr(187)=>556,chr(188)=>834,chr(189)=>834,chr(190)=>834,chr(191)=>611,chr(192)=>722,chr(193)=>722,chr(194)=>722,chr(195)=>722,chr(196)=>722,chr(197)=>722, + chr(198)=>1000,chr(199)=>722,chr(200)=>667,chr(201)=>667,chr(202)=>667,chr(203)=>667,chr(204)=>278,chr(205)=>278,chr(206)=>278,chr(207)=>278,chr(208)=>722,chr(209)=>722,chr(210)=>778,chr(211)=>778,chr(212)=>778,chr(213)=>778,chr(214)=>778,chr(215)=>584,chr(216)=>778,chr(217)=>722,chr(218)=>722,chr(219)=>722, + chr(220)=>722,chr(221)=>667,chr(222)=>667,chr(223)=>611,chr(224)=>556,chr(225)=>556,chr(226)=>556,chr(227)=>556,chr(228)=>556,chr(229)=>556,chr(230)=>889,chr(231)=>556,chr(232)=>556,chr(233)=>556,chr(234)=>556,chr(235)=>556,chr(236)=>278,chr(237)=>278,chr(238)=>278,chr(239)=>278,chr(240)=>611,chr(241)=>611, + chr(242)=>611,chr(243)=>611,chr(244)=>611,chr(245)=>611,chr(246)=>611,chr(247)=>584,chr(248)=>611,chr(249)=>611,chr(250)=>611,chr(251)=>611,chr(252)=>611,chr(253)=>556,chr(254)=>611,chr(255)=>556); +?> diff --git a/webui/system/helper/fpdf16/font/helveticabi.php b/webui/system/helper/fpdf16/font/helveticabi.php new file mode 100755 index 00000000..8d217743 --- /dev/null +++ b/webui/system/helper/fpdf16/font/helveticabi.php @@ -0,0 +1,15 @@ +278,chr(1)=>278,chr(2)=>278,chr(3)=>278,chr(4)=>278,chr(5)=>278,chr(6)=>278,chr(7)=>278,chr(8)=>278,chr(9)=>278,chr(10)=>278,chr(11)=>278,chr(12)=>278,chr(13)=>278,chr(14)=>278,chr(15)=>278,chr(16)=>278,chr(17)=>278,chr(18)=>278,chr(19)=>278,chr(20)=>278,chr(21)=>278, + chr(22)=>278,chr(23)=>278,chr(24)=>278,chr(25)=>278,chr(26)=>278,chr(27)=>278,chr(28)=>278,chr(29)=>278,chr(30)=>278,chr(31)=>278,' '=>278,'!'=>333,'"'=>474,'#'=>556,'$'=>556,'%'=>889,'&'=>722,'\''=>238,'('=>333,')'=>333,'*'=>389,'+'=>584, + ','=>278,'-'=>333,'.'=>278,'/'=>278,'0'=>556,'1'=>556,'2'=>556,'3'=>556,'4'=>556,'5'=>556,'6'=>556,'7'=>556,'8'=>556,'9'=>556,':'=>333,';'=>333,'<'=>584,'='=>584,'>'=>584,'?'=>611,'@'=>975,'A'=>722, + 'B'=>722,'C'=>722,'D'=>722,'E'=>667,'F'=>611,'G'=>778,'H'=>722,'I'=>278,'J'=>556,'K'=>722,'L'=>611,'M'=>833,'N'=>722,'O'=>778,'P'=>667,'Q'=>778,'R'=>722,'S'=>667,'T'=>611,'U'=>722,'V'=>667,'W'=>944, + 'X'=>667,'Y'=>667,'Z'=>611,'['=>333,'\\'=>278,']'=>333,'^'=>584,'_'=>556,'`'=>333,'a'=>556,'b'=>611,'c'=>556,'d'=>611,'e'=>556,'f'=>333,'g'=>611,'h'=>611,'i'=>278,'j'=>278,'k'=>556,'l'=>278,'m'=>889, + 'n'=>611,'o'=>611,'p'=>611,'q'=>611,'r'=>389,'s'=>556,'t'=>333,'u'=>611,'v'=>556,'w'=>778,'x'=>556,'y'=>556,'z'=>500,'{'=>389,'|'=>280,'}'=>389,'~'=>584,chr(127)=>350,chr(128)=>556,chr(129)=>350,chr(130)=>278,chr(131)=>556, + chr(132)=>500,chr(133)=>1000,chr(134)=>556,chr(135)=>556,chr(136)=>333,chr(137)=>1000,chr(138)=>667,chr(139)=>333,chr(140)=>1000,chr(141)=>350,chr(142)=>611,chr(143)=>350,chr(144)=>350,chr(145)=>278,chr(146)=>278,chr(147)=>500,chr(148)=>500,chr(149)=>350,chr(150)=>556,chr(151)=>1000,chr(152)=>333,chr(153)=>1000, + chr(154)=>556,chr(155)=>333,chr(156)=>944,chr(157)=>350,chr(158)=>500,chr(159)=>667,chr(160)=>278,chr(161)=>333,chr(162)=>556,chr(163)=>556,chr(164)=>556,chr(165)=>556,chr(166)=>280,chr(167)=>556,chr(168)=>333,chr(169)=>737,chr(170)=>370,chr(171)=>556,chr(172)=>584,chr(173)=>333,chr(174)=>737,chr(175)=>333, + chr(176)=>400,chr(177)=>584,chr(178)=>333,chr(179)=>333,chr(180)=>333,chr(181)=>611,chr(182)=>556,chr(183)=>278,chr(184)=>333,chr(185)=>333,chr(186)=>365,chr(187)=>556,chr(188)=>834,chr(189)=>834,chr(190)=>834,chr(191)=>611,chr(192)=>722,chr(193)=>722,chr(194)=>722,chr(195)=>722,chr(196)=>722,chr(197)=>722, + chr(198)=>1000,chr(199)=>722,chr(200)=>667,chr(201)=>667,chr(202)=>667,chr(203)=>667,chr(204)=>278,chr(205)=>278,chr(206)=>278,chr(207)=>278,chr(208)=>722,chr(209)=>722,chr(210)=>778,chr(211)=>778,chr(212)=>778,chr(213)=>778,chr(214)=>778,chr(215)=>584,chr(216)=>778,chr(217)=>722,chr(218)=>722,chr(219)=>722, + chr(220)=>722,chr(221)=>667,chr(222)=>667,chr(223)=>611,chr(224)=>556,chr(225)=>556,chr(226)=>556,chr(227)=>556,chr(228)=>556,chr(229)=>556,chr(230)=>889,chr(231)=>556,chr(232)=>556,chr(233)=>556,chr(234)=>556,chr(235)=>556,chr(236)=>278,chr(237)=>278,chr(238)=>278,chr(239)=>278,chr(240)=>611,chr(241)=>611, + chr(242)=>611,chr(243)=>611,chr(244)=>611,chr(245)=>611,chr(246)=>611,chr(247)=>584,chr(248)=>611,chr(249)=>611,chr(250)=>611,chr(251)=>611,chr(252)=>611,chr(253)=>556,chr(254)=>611,chr(255)=>556); +?> diff --git a/webui/system/helper/fpdf16/font/helveticai.php b/webui/system/helper/fpdf16/font/helveticai.php new file mode 100755 index 00000000..88bf4371 --- /dev/null +++ b/webui/system/helper/fpdf16/font/helveticai.php @@ -0,0 +1,15 @@ +278,chr(1)=>278,chr(2)=>278,chr(3)=>278,chr(4)=>278,chr(5)=>278,chr(6)=>278,chr(7)=>278,chr(8)=>278,chr(9)=>278,chr(10)=>278,chr(11)=>278,chr(12)=>278,chr(13)=>278,chr(14)=>278,chr(15)=>278,chr(16)=>278,chr(17)=>278,chr(18)=>278,chr(19)=>278,chr(20)=>278,chr(21)=>278, + chr(22)=>278,chr(23)=>278,chr(24)=>278,chr(25)=>278,chr(26)=>278,chr(27)=>278,chr(28)=>278,chr(29)=>278,chr(30)=>278,chr(31)=>278,' '=>278,'!'=>278,'"'=>355,'#'=>556,'$'=>556,'%'=>889,'&'=>667,'\''=>191,'('=>333,')'=>333,'*'=>389,'+'=>584, + ','=>278,'-'=>333,'.'=>278,'/'=>278,'0'=>556,'1'=>556,'2'=>556,'3'=>556,'4'=>556,'5'=>556,'6'=>556,'7'=>556,'8'=>556,'9'=>556,':'=>278,';'=>278,'<'=>584,'='=>584,'>'=>584,'?'=>556,'@'=>1015,'A'=>667, + 'B'=>667,'C'=>722,'D'=>722,'E'=>667,'F'=>611,'G'=>778,'H'=>722,'I'=>278,'J'=>500,'K'=>667,'L'=>556,'M'=>833,'N'=>722,'O'=>778,'P'=>667,'Q'=>778,'R'=>722,'S'=>667,'T'=>611,'U'=>722,'V'=>667,'W'=>944, + 'X'=>667,'Y'=>667,'Z'=>611,'['=>278,'\\'=>278,']'=>278,'^'=>469,'_'=>556,'`'=>333,'a'=>556,'b'=>556,'c'=>500,'d'=>556,'e'=>556,'f'=>278,'g'=>556,'h'=>556,'i'=>222,'j'=>222,'k'=>500,'l'=>222,'m'=>833, + 'n'=>556,'o'=>556,'p'=>556,'q'=>556,'r'=>333,'s'=>500,'t'=>278,'u'=>556,'v'=>500,'w'=>722,'x'=>500,'y'=>500,'z'=>500,'{'=>334,'|'=>260,'}'=>334,'~'=>584,chr(127)=>350,chr(128)=>556,chr(129)=>350,chr(130)=>222,chr(131)=>556, + chr(132)=>333,chr(133)=>1000,chr(134)=>556,chr(135)=>556,chr(136)=>333,chr(137)=>1000,chr(138)=>667,chr(139)=>333,chr(140)=>1000,chr(141)=>350,chr(142)=>611,chr(143)=>350,chr(144)=>350,chr(145)=>222,chr(146)=>222,chr(147)=>333,chr(148)=>333,chr(149)=>350,chr(150)=>556,chr(151)=>1000,chr(152)=>333,chr(153)=>1000, + chr(154)=>500,chr(155)=>333,chr(156)=>944,chr(157)=>350,chr(158)=>500,chr(159)=>667,chr(160)=>278,chr(161)=>333,chr(162)=>556,chr(163)=>556,chr(164)=>556,chr(165)=>556,chr(166)=>260,chr(167)=>556,chr(168)=>333,chr(169)=>737,chr(170)=>370,chr(171)=>556,chr(172)=>584,chr(173)=>333,chr(174)=>737,chr(175)=>333, + chr(176)=>400,chr(177)=>584,chr(178)=>333,chr(179)=>333,chr(180)=>333,chr(181)=>556,chr(182)=>537,chr(183)=>278,chr(184)=>333,chr(185)=>333,chr(186)=>365,chr(187)=>556,chr(188)=>834,chr(189)=>834,chr(190)=>834,chr(191)=>611,chr(192)=>667,chr(193)=>667,chr(194)=>667,chr(195)=>667,chr(196)=>667,chr(197)=>667, + chr(198)=>1000,chr(199)=>722,chr(200)=>667,chr(201)=>667,chr(202)=>667,chr(203)=>667,chr(204)=>278,chr(205)=>278,chr(206)=>278,chr(207)=>278,chr(208)=>722,chr(209)=>722,chr(210)=>778,chr(211)=>778,chr(212)=>778,chr(213)=>778,chr(214)=>778,chr(215)=>584,chr(216)=>778,chr(217)=>722,chr(218)=>722,chr(219)=>722, + chr(220)=>722,chr(221)=>667,chr(222)=>667,chr(223)=>611,chr(224)=>556,chr(225)=>556,chr(226)=>556,chr(227)=>556,chr(228)=>556,chr(229)=>556,chr(230)=>889,chr(231)=>500,chr(232)=>556,chr(233)=>556,chr(234)=>556,chr(235)=>556,chr(236)=>278,chr(237)=>278,chr(238)=>278,chr(239)=>278,chr(240)=>556,chr(241)=>556, + chr(242)=>556,chr(243)=>556,chr(244)=>556,chr(245)=>556,chr(246)=>556,chr(247)=>584,chr(248)=>611,chr(249)=>556,chr(250)=>556,chr(251)=>556,chr(252)=>556,chr(253)=>500,chr(254)=>556,chr(255)=>500); +?> diff --git a/webui/system/helper/fpdf16/font/makefont/cp1250.map b/webui/system/helper/fpdf16/font/makefont/cp1250.map new file mode 100755 index 00000000..ec110af0 --- /dev/null +++ b/webui/system/helper/fpdf16/font/makefont/cp1250.map @@ -0,0 +1,251 @@ +!00 U+0000 .notdef +!01 U+0001 .notdef +!02 U+0002 .notdef +!03 U+0003 .notdef +!04 U+0004 .notdef +!05 U+0005 .notdef +!06 U+0006 .notdef +!07 U+0007 .notdef +!08 U+0008 .notdef +!09 U+0009 .notdef +!0A U+000A .notdef +!0B U+000B .notdef +!0C U+000C .notdef +!0D U+000D .notdef +!0E U+000E .notdef +!0F U+000F .notdef +!10 U+0010 .notdef +!11 U+0011 .notdef +!12 U+0012 .notdef +!13 U+0013 .notdef +!14 U+0014 .notdef +!15 U+0015 .notdef +!16 U+0016 .notdef +!17 U+0017 .notdef +!18 U+0018 .notdef +!19 U+0019 .notdef +!1A U+001A .notdef +!1B U+001B .notdef +!1C U+001C .notdef +!1D U+001D .notdef +!1E U+001E .notdef +!1F U+001F .notdef +!20 U+0020 space +!21 U+0021 exclam +!22 U+0022 quotedbl +!23 U+0023 numbersign +!24 U+0024 dollar +!25 U+0025 percent +!26 U+0026 ampersand +!27 U+0027 quotesingle +!28 U+0028 parenleft +!29 U+0029 parenright +!2A U+002A asterisk +!2B U+002B plus +!2C U+002C comma +!2D U+002D hyphen +!2E U+002E period +!2F U+002F slash +!30 U+0030 zero +!31 U+0031 one +!32 U+0032 two +!33 U+0033 three +!34 U+0034 four +!35 U+0035 five +!36 U+0036 six +!37 U+0037 seven +!38 U+0038 eight +!39 U+0039 nine +!3A U+003A colon +!3B U+003B semicolon +!3C U+003C less +!3D U+003D equal +!3E U+003E greater +!3F U+003F question +!40 U+0040 at +!41 U+0041 A +!42 U+0042 B +!43 U+0043 C +!44 U+0044 D +!45 U+0045 E +!46 U+0046 F +!47 U+0047 G +!48 U+0048 H +!49 U+0049 I +!4A U+004A J +!4B U+004B K +!4C U+004C L +!4D U+004D M +!4E U+004E N +!4F U+004F O +!50 U+0050 P +!51 U+0051 Q +!52 U+0052 R +!53 U+0053 S +!54 U+0054 T +!55 U+0055 U +!56 U+0056 V +!57 U+0057 W +!58 U+0058 X +!59 U+0059 Y +!5A U+005A Z +!5B U+005B bracketleft +!5C U+005C backslash +!5D U+005D bracketright +!5E U+005E asciicircum +!5F U+005F underscore +!60 U+0060 grave +!61 U+0061 a +!62 U+0062 b +!63 U+0063 c +!64 U+0064 d +!65 U+0065 e +!66 U+0066 f +!67 U+0067 g +!68 U+0068 h +!69 U+0069 i +!6A U+006A j +!6B U+006B k +!6C U+006C l +!6D U+006D m +!6E U+006E n +!6F U+006F o +!70 U+0070 p +!71 U+0071 q +!72 U+0072 r +!73 U+0073 s +!74 U+0074 t +!75 U+0075 u +!76 U+0076 v +!77 U+0077 w +!78 U+0078 x +!79 U+0079 y +!7A U+007A z +!7B U+007B braceleft +!7C U+007C bar +!7D U+007D braceright +!7E U+007E asciitilde +!7F U+007F .notdef +!80 U+20AC Euro +!82 U+201A quotesinglbase +!84 U+201E quotedblbase +!85 U+2026 ellipsis +!86 U+2020 dagger +!87 U+2021 daggerdbl +!89 U+2030 perthousand +!8A U+0160 Scaron +!8B U+2039 guilsinglleft +!8C U+015A Sacute +!8D U+0164 Tcaron +!8E U+017D Zcaron +!8F U+0179 Zacute +!91 U+2018 quoteleft +!92 U+2019 quoteright +!93 U+201C quotedblleft +!94 U+201D quotedblright +!95 U+2022 bullet +!96 U+2013 endash +!97 U+2014 emdash +!99 U+2122 trademark +!9A U+0161 scaron +!9B U+203A guilsinglright +!9C U+015B sacute +!9D U+0165 tcaron +!9E U+017E zcaron +!9F U+017A zacute +!A0 U+00A0 space +!A1 U+02C7 caron +!A2 U+02D8 breve +!A3 U+0141 Lslash +!A4 U+00A4 currency +!A5 U+0104 Aogonek +!A6 U+00A6 brokenbar +!A7 U+00A7 section +!A8 U+00A8 dieresis +!A9 U+00A9 copyright +!AA U+015E Scedilla +!AB U+00AB guillemotleft +!AC U+00AC logicalnot +!AD U+00AD hyphen +!AE U+00AE registered +!AF U+017B Zdotaccent +!B0 U+00B0 degree +!B1 U+00B1 plusminus +!B2 U+02DB ogonek +!B3 U+0142 lslash +!B4 U+00B4 acute +!B5 U+00B5 mu +!B6 U+00B6 paragraph +!B7 U+00B7 periodcentered +!B8 U+00B8 cedilla +!B9 U+0105 aogonek +!BA U+015F scedilla +!BB U+00BB guillemotright +!BC U+013D Lcaron +!BD U+02DD hungarumlaut +!BE U+013E lcaron +!BF U+017C zdotaccent +!C0 U+0154 Racute +!C1 U+00C1 Aacute +!C2 U+00C2 Acircumflex +!C3 U+0102 Abreve +!C4 U+00C4 Adieresis +!C5 U+0139 Lacute +!C6 U+0106 Cacute +!C7 U+00C7 Ccedilla +!C8 U+010C Ccaron +!C9 U+00C9 Eacute +!CA U+0118 Eogonek +!CB U+00CB Edieresis +!CC U+011A Ecaron +!CD U+00CD Iacute +!CE U+00CE Icircumflex +!CF U+010E Dcaron +!D0 U+0110 Dcroat +!D1 U+0143 Nacute +!D2 U+0147 Ncaron +!D3 U+00D3 Oacute +!D4 U+00D4 Ocircumflex +!D5 U+0150 Ohungarumlaut +!D6 U+00D6 Odieresis +!D7 U+00D7 multiply +!D8 U+0158 Rcaron +!D9 U+016E Uring +!DA U+00DA Uacute +!DB U+0170 Uhungarumlaut +!DC U+00DC Udieresis +!DD U+00DD Yacute +!DE U+0162 Tcommaaccent +!DF U+00DF germandbls +!E0 U+0155 racute +!E1 U+00E1 aacute +!E2 U+00E2 acircumflex +!E3 U+0103 abreve +!E4 U+00E4 adieresis +!E5 U+013A lacute +!E6 U+0107 cacute +!E7 U+00E7 ccedilla +!E8 U+010D ccaron +!E9 U+00E9 eacute +!EA U+0119 eogonek +!EB U+00EB edieresis +!EC U+011B ecaron +!ED U+00ED iacute +!EE U+00EE icircumflex +!EF U+010F dcaron +!F0 U+0111 dcroat +!F1 U+0144 nacute +!F2 U+0148 ncaron +!F3 U+00F3 oacute +!F4 U+00F4 ocircumflex +!F5 U+0151 ohungarumlaut +!F6 U+00F6 odieresis +!F7 U+00F7 divide +!F8 U+0159 rcaron +!F9 U+016F uring +!FA U+00FA uacute +!FB U+0171 uhungarumlaut +!FC U+00FC udieresis +!FD U+00FD yacute +!FE U+0163 tcommaaccent +!FF U+02D9 dotaccent diff --git a/webui/system/helper/fpdf16/font/makefont/cp1251.map b/webui/system/helper/fpdf16/font/makefont/cp1251.map new file mode 100755 index 00000000..de6a198d --- /dev/null +++ b/webui/system/helper/fpdf16/font/makefont/cp1251.map @@ -0,0 +1,255 @@ +!00 U+0000 .notdef +!01 U+0001 .notdef +!02 U+0002 .notdef +!03 U+0003 .notdef +!04 U+0004 .notdef +!05 U+0005 .notdef +!06 U+0006 .notdef +!07 U+0007 .notdef +!08 U+0008 .notdef +!09 U+0009 .notdef +!0A U+000A .notdef +!0B U+000B .notdef +!0C U+000C .notdef +!0D U+000D .notdef +!0E U+000E .notdef +!0F U+000F .notdef +!10 U+0010 .notdef +!11 U+0011 .notdef +!12 U+0012 .notdef +!13 U+0013 .notdef +!14 U+0014 .notdef +!15 U+0015 .notdef +!16 U+0016 .notdef +!17 U+0017 .notdef +!18 U+0018 .notdef +!19 U+0019 .notdef +!1A U+001A .notdef +!1B U+001B .notdef +!1C U+001C .notdef +!1D U+001D .notdef +!1E U+001E .notdef +!1F U+001F .notdef +!20 U+0020 space +!21 U+0021 exclam +!22 U+0022 quotedbl +!23 U+0023 numbersign +!24 U+0024 dollar +!25 U+0025 percent +!26 U+0026 ampersand +!27 U+0027 quotesingle +!28 U+0028 parenleft +!29 U+0029 parenright +!2A U+002A asterisk +!2B U+002B plus +!2C U+002C comma +!2D U+002D hyphen +!2E U+002E period +!2F U+002F slash +!30 U+0030 zero +!31 U+0031 one +!32 U+0032 two +!33 U+0033 three +!34 U+0034 four +!35 U+0035 five +!36 U+0036 six +!37 U+0037 seven +!38 U+0038 eight +!39 U+0039 nine +!3A U+003A colon +!3B U+003B semicolon +!3C U+003C less +!3D U+003D equal +!3E U+003E greater +!3F U+003F question +!40 U+0040 at +!41 U+0041 A +!42 U+0042 B +!43 U+0043 C +!44 U+0044 D +!45 U+0045 E +!46 U+0046 F +!47 U+0047 G +!48 U+0048 H +!49 U+0049 I +!4A U+004A J +!4B U+004B K +!4C U+004C L +!4D U+004D M +!4E U+004E N +!4F U+004F O +!50 U+0050 P +!51 U+0051 Q +!52 U+0052 R +!53 U+0053 S +!54 U+0054 T +!55 U+0055 U +!56 U+0056 V +!57 U+0057 W +!58 U+0058 X +!59 U+0059 Y +!5A U+005A Z +!5B U+005B bracketleft +!5C U+005C backslash +!5D U+005D bracketright +!5E U+005E asciicircum +!5F U+005F underscore +!60 U+0060 grave +!61 U+0061 a +!62 U+0062 b +!63 U+0063 c +!64 U+0064 d +!65 U+0065 e +!66 U+0066 f +!67 U+0067 g +!68 U+0068 h +!69 U+0069 i +!6A U+006A j +!6B U+006B k +!6C U+006C l +!6D U+006D m +!6E U+006E n +!6F U+006F o +!70 U+0070 p +!71 U+0071 q +!72 U+0072 r +!73 U+0073 s +!74 U+0074 t +!75 U+0075 u +!76 U+0076 v +!77 U+0077 w +!78 U+0078 x +!79 U+0079 y +!7A U+007A z +!7B U+007B braceleft +!7C U+007C bar +!7D U+007D braceright +!7E U+007E asciitilde +!7F U+007F .notdef +!80 U+0402 afii10051 +!81 U+0403 afii10052 +!82 U+201A quotesinglbase +!83 U+0453 afii10100 +!84 U+201E quotedblbase +!85 U+2026 ellipsis +!86 U+2020 dagger +!87 U+2021 daggerdbl +!88 U+20AC Euro +!89 U+2030 perthousand +!8A U+0409 afii10058 +!8B U+2039 guilsinglleft +!8C U+040A afii10059 +!8D U+040C afii10061 +!8E U+040B afii10060 +!8F U+040F afii10145 +!90 U+0452 afii10099 +!91 U+2018 quoteleft +!92 U+2019 quoteright +!93 U+201C quotedblleft +!94 U+201D quotedblright +!95 U+2022 bullet +!96 U+2013 endash +!97 U+2014 emdash +!99 U+2122 trademark +!9A U+0459 afii10106 +!9B U+203A guilsinglright +!9C U+045A afii10107 +!9D U+045C afii10109 +!9E U+045B afii10108 +!9F U+045F afii10193 +!A0 U+00A0 space +!A1 U+040E afii10062 +!A2 U+045E afii10110 +!A3 U+0408 afii10057 +!A4 U+00A4 currency +!A5 U+0490 afii10050 +!A6 U+00A6 brokenbar +!A7 U+00A7 section +!A8 U+0401 afii10023 +!A9 U+00A9 copyright +!AA U+0404 afii10053 +!AB U+00AB guillemotleft +!AC U+00AC logicalnot +!AD U+00AD hyphen +!AE U+00AE registered +!AF U+0407 afii10056 +!B0 U+00B0 degree +!B1 U+00B1 plusminus +!B2 U+0406 afii10055 +!B3 U+0456 afii10103 +!B4 U+0491 afii10098 +!B5 U+00B5 mu +!B6 U+00B6 paragraph +!B7 U+00B7 periodcentered +!B8 U+0451 afii10071 +!B9 U+2116 afii61352 +!BA U+0454 afii10101 +!BB U+00BB guillemotright +!BC U+0458 afii10105 +!BD U+0405 afii10054 +!BE U+0455 afii10102 +!BF U+0457 afii10104 +!C0 U+0410 afii10017 +!C1 U+0411 afii10018 +!C2 U+0412 afii10019 +!C3 U+0413 afii10020 +!C4 U+0414 afii10021 +!C5 U+0415 afii10022 +!C6 U+0416 afii10024 +!C7 U+0417 afii10025 +!C8 U+0418 afii10026 +!C9 U+0419 afii10027 +!CA U+041A afii10028 +!CB U+041B afii10029 +!CC U+041C afii10030 +!CD U+041D afii10031 +!CE U+041E afii10032 +!CF U+041F afii10033 +!D0 U+0420 afii10034 +!D1 U+0421 afii10035 +!D2 U+0422 afii10036 +!D3 U+0423 afii10037 +!D4 U+0424 afii10038 +!D5 U+0425 afii10039 +!D6 U+0426 afii10040 +!D7 U+0427 afii10041 +!D8 U+0428 afii10042 +!D9 U+0429 afii10043 +!DA U+042A afii10044 +!DB U+042B afii10045 +!DC U+042C afii10046 +!DD U+042D afii10047 +!DE U+042E afii10048 +!DF U+042F afii10049 +!E0 U+0430 afii10065 +!E1 U+0431 afii10066 +!E2 U+0432 afii10067 +!E3 U+0433 afii10068 +!E4 U+0434 afii10069 +!E5 U+0435 afii10070 +!E6 U+0436 afii10072 +!E7 U+0437 afii10073 +!E8 U+0438 afii10074 +!E9 U+0439 afii10075 +!EA U+043A afii10076 +!EB U+043B afii10077 +!EC U+043C afii10078 +!ED U+043D afii10079 +!EE U+043E afii10080 +!EF U+043F afii10081 +!F0 U+0440 afii10082 +!F1 U+0441 afii10083 +!F2 U+0442 afii10084 +!F3 U+0443 afii10085 +!F4 U+0444 afii10086 +!F5 U+0445 afii10087 +!F6 U+0446 afii10088 +!F7 U+0447 afii10089 +!F8 U+0448 afii10090 +!F9 U+0449 afii10091 +!FA U+044A afii10092 +!FB U+044B afii10093 +!FC U+044C afii10094 +!FD U+044D afii10095 +!FE U+044E afii10096 +!FF U+044F afii10097 diff --git a/webui/system/helper/fpdf16/font/makefont/cp1252.map b/webui/system/helper/fpdf16/font/makefont/cp1252.map new file mode 100755 index 00000000..dd490e59 --- /dev/null +++ b/webui/system/helper/fpdf16/font/makefont/cp1252.map @@ -0,0 +1,251 @@ +!00 U+0000 .notdef +!01 U+0001 .notdef +!02 U+0002 .notdef +!03 U+0003 .notdef +!04 U+0004 .notdef +!05 U+0005 .notdef +!06 U+0006 .notdef +!07 U+0007 .notdef +!08 U+0008 .notdef +!09 U+0009 .notdef +!0A U+000A .notdef +!0B U+000B .notdef +!0C U+000C .notdef +!0D U+000D .notdef +!0E U+000E .notdef +!0F U+000F .notdef +!10 U+0010 .notdef +!11 U+0011 .notdef +!12 U+0012 .notdef +!13 U+0013 .notdef +!14 U+0014 .notdef +!15 U+0015 .notdef +!16 U+0016 .notdef +!17 U+0017 .notdef +!18 U+0018 .notdef +!19 U+0019 .notdef +!1A U+001A .notdef +!1B U+001B .notdef +!1C U+001C .notdef +!1D U+001D .notdef +!1E U+001E .notdef +!1F U+001F .notdef +!20 U+0020 space +!21 U+0021 exclam +!22 U+0022 quotedbl +!23 U+0023 numbersign +!24 U+0024 dollar +!25 U+0025 percent +!26 U+0026 ampersand +!27 U+0027 quotesingle +!28 U+0028 parenleft +!29 U+0029 parenright +!2A U+002A asterisk +!2B U+002B plus +!2C U+002C comma +!2D U+002D hyphen +!2E U+002E period +!2F U+002F slash +!30 U+0030 zero +!31 U+0031 one +!32 U+0032 two +!33 U+0033 three +!34 U+0034 four +!35 U+0035 five +!36 U+0036 six +!37 U+0037 seven +!38 U+0038 eight +!39 U+0039 nine +!3A U+003A colon +!3B U+003B semicolon +!3C U+003C less +!3D U+003D equal +!3E U+003E greater +!3F U+003F question +!40 U+0040 at +!41 U+0041 A +!42 U+0042 B +!43 U+0043 C +!44 U+0044 D +!45 U+0045 E +!46 U+0046 F +!47 U+0047 G +!48 U+0048 H +!49 U+0049 I +!4A U+004A J +!4B U+004B K +!4C U+004C L +!4D U+004D M +!4E U+004E N +!4F U+004F O +!50 U+0050 P +!51 U+0051 Q +!52 U+0052 R +!53 U+0053 S +!54 U+0054 T +!55 U+0055 U +!56 U+0056 V +!57 U+0057 W +!58 U+0058 X +!59 U+0059 Y +!5A U+005A Z +!5B U+005B bracketleft +!5C U+005C backslash +!5D U+005D bracketright +!5E U+005E asciicircum +!5F U+005F underscore +!60 U+0060 grave +!61 U+0061 a +!62 U+0062 b +!63 U+0063 c +!64 U+0064 d +!65 U+0065 e +!66 U+0066 f +!67 U+0067 g +!68 U+0068 h +!69 U+0069 i +!6A U+006A j +!6B U+006B k +!6C U+006C l +!6D U+006D m +!6E U+006E n +!6F U+006F o +!70 U+0070 p +!71 U+0071 q +!72 U+0072 r +!73 U+0073 s +!74 U+0074 t +!75 U+0075 u +!76 U+0076 v +!77 U+0077 w +!78 U+0078 x +!79 U+0079 y +!7A U+007A z +!7B U+007B braceleft +!7C U+007C bar +!7D U+007D braceright +!7E U+007E asciitilde +!7F U+007F .notdef +!80 U+20AC Euro +!82 U+201A quotesinglbase +!83 U+0192 florin +!84 U+201E quotedblbase +!85 U+2026 ellipsis +!86 U+2020 dagger +!87 U+2021 daggerdbl +!88 U+02C6 circumflex +!89 U+2030 perthousand +!8A U+0160 Scaron +!8B U+2039 guilsinglleft +!8C U+0152 OE +!8E U+017D Zcaron +!91 U+2018 quoteleft +!92 U+2019 quoteright +!93 U+201C quotedblleft +!94 U+201D quotedblright +!95 U+2022 bullet +!96 U+2013 endash +!97 U+2014 emdash +!98 U+02DC tilde +!99 U+2122 trademark +!9A U+0161 scaron +!9B U+203A guilsinglright +!9C U+0153 oe +!9E U+017E zcaron +!9F U+0178 Ydieresis +!A0 U+00A0 space +!A1 U+00A1 exclamdown +!A2 U+00A2 cent +!A3 U+00A3 sterling +!A4 U+00A4 currency +!A5 U+00A5 yen +!A6 U+00A6 brokenbar +!A7 U+00A7 section +!A8 U+00A8 dieresis +!A9 U+00A9 copyright +!AA U+00AA ordfeminine +!AB U+00AB guillemotleft +!AC U+00AC logicalnot +!AD U+00AD hyphen +!AE U+00AE registered +!AF U+00AF macron +!B0 U+00B0 degree +!B1 U+00B1 plusminus +!B2 U+00B2 twosuperior +!B3 U+00B3 threesuperior +!B4 U+00B4 acute +!B5 U+00B5 mu +!B6 U+00B6 paragraph +!B7 U+00B7 periodcentered +!B8 U+00B8 cedilla +!B9 U+00B9 onesuperior +!BA U+00BA ordmasculine +!BB U+00BB guillemotright +!BC U+00BC onequarter +!BD U+00BD onehalf +!BE U+00BE threequarters +!BF U+00BF questiondown +!C0 U+00C0 Agrave +!C1 U+00C1 Aacute +!C2 U+00C2 Acircumflex +!C3 U+00C3 Atilde +!C4 U+00C4 Adieresis +!C5 U+00C5 Aring +!C6 U+00C6 AE +!C7 U+00C7 Ccedilla +!C8 U+00C8 Egrave +!C9 U+00C9 Eacute +!CA U+00CA Ecircumflex +!CB U+00CB Edieresis +!CC U+00CC Igrave +!CD U+00CD Iacute +!CE U+00CE Icircumflex +!CF U+00CF Idieresis +!D0 U+00D0 Eth +!D1 U+00D1 Ntilde +!D2 U+00D2 Ograve +!D3 U+00D3 Oacute +!D4 U+00D4 Ocircumflex +!D5 U+00D5 Otilde +!D6 U+00D6 Odieresis +!D7 U+00D7 multiply +!D8 U+00D8 Oslash +!D9 U+00D9 Ugrave +!DA U+00DA Uacute +!DB U+00DB Ucircumflex +!DC U+00DC Udieresis +!DD U+00DD Yacute +!DE U+00DE Thorn +!DF U+00DF germandbls +!E0 U+00E0 agrave +!E1 U+00E1 aacute +!E2 U+00E2 acircumflex +!E3 U+00E3 atilde +!E4 U+00E4 adieresis +!E5 U+00E5 aring +!E6 U+00E6 ae +!E7 U+00E7 ccedilla +!E8 U+00E8 egrave +!E9 U+00E9 eacute +!EA U+00EA ecircumflex +!EB U+00EB edieresis +!EC U+00EC igrave +!ED U+00ED iacute +!EE U+00EE icircumflex +!EF U+00EF idieresis +!F0 U+00F0 eth +!F1 U+00F1 ntilde +!F2 U+00F2 ograve +!F3 U+00F3 oacute +!F4 U+00F4 ocircumflex +!F5 U+00F5 otilde +!F6 U+00F6 odieresis +!F7 U+00F7 divide +!F8 U+00F8 oslash +!F9 U+00F9 ugrave +!FA U+00FA uacute +!FB U+00FB ucircumflex +!FC U+00FC udieresis +!FD U+00FD yacute +!FE U+00FE thorn +!FF U+00FF ydieresis diff --git a/webui/system/helper/fpdf16/font/makefont/cp1253.map b/webui/system/helper/fpdf16/font/makefont/cp1253.map new file mode 100755 index 00000000..4bd826fb --- /dev/null +++ b/webui/system/helper/fpdf16/font/makefont/cp1253.map @@ -0,0 +1,239 @@ +!00 U+0000 .notdef +!01 U+0001 .notdef +!02 U+0002 .notdef +!03 U+0003 .notdef +!04 U+0004 .notdef +!05 U+0005 .notdef +!06 U+0006 .notdef +!07 U+0007 .notdef +!08 U+0008 .notdef +!09 U+0009 .notdef +!0A U+000A .notdef +!0B U+000B .notdef +!0C U+000C .notdef +!0D U+000D .notdef +!0E U+000E .notdef +!0F U+000F .notdef +!10 U+0010 .notdef +!11 U+0011 .notdef +!12 U+0012 .notdef +!13 U+0013 .notdef +!14 U+0014 .notdef +!15 U+0015 .notdef +!16 U+0016 .notdef +!17 U+0017 .notdef +!18 U+0018 .notdef +!19 U+0019 .notdef +!1A U+001A .notdef +!1B U+001B .notdef +!1C U+001C .notdef +!1D U+001D .notdef +!1E U+001E .notdef +!1F U+001F .notdef +!20 U+0020 space +!21 U+0021 exclam +!22 U+0022 quotedbl +!23 U+0023 numbersign +!24 U+0024 dollar +!25 U+0025 percent +!26 U+0026 ampersand +!27 U+0027 quotesingle +!28 U+0028 parenleft +!29 U+0029 parenright +!2A U+002A asterisk +!2B U+002B plus +!2C U+002C comma +!2D U+002D hyphen +!2E U+002E period +!2F U+002F slash +!30 U+0030 zero +!31 U+0031 one +!32 U+0032 two +!33 U+0033 three +!34 U+0034 four +!35 U+0035 five +!36 U+0036 six +!37 U+0037 seven +!38 U+0038 eight +!39 U+0039 nine +!3A U+003A colon +!3B U+003B semicolon +!3C U+003C less +!3D U+003D equal +!3E U+003E greater +!3F U+003F question +!40 U+0040 at +!41 U+0041 A +!42 U+0042 B +!43 U+0043 C +!44 U+0044 D +!45 U+0045 E +!46 U+0046 F +!47 U+0047 G +!48 U+0048 H +!49 U+0049 I +!4A U+004A J +!4B U+004B K +!4C U+004C L +!4D U+004D M +!4E U+004E N +!4F U+004F O +!50 U+0050 P +!51 U+0051 Q +!52 U+0052 R +!53 U+0053 S +!54 U+0054 T +!55 U+0055 U +!56 U+0056 V +!57 U+0057 W +!58 U+0058 X +!59 U+0059 Y +!5A U+005A Z +!5B U+005B bracketleft +!5C U+005C backslash +!5D U+005D bracketright +!5E U+005E asciicircum +!5F U+005F underscore +!60 U+0060 grave +!61 U+0061 a +!62 U+0062 b +!63 U+0063 c +!64 U+0064 d +!65 U+0065 e +!66 U+0066 f +!67 U+0067 g +!68 U+0068 h +!69 U+0069 i +!6A U+006A j +!6B U+006B k +!6C U+006C l +!6D U+006D m +!6E U+006E n +!6F U+006F o +!70 U+0070 p +!71 U+0071 q +!72 U+0072 r +!73 U+0073 s +!74 U+0074 t +!75 U+0075 u +!76 U+0076 v +!77 U+0077 w +!78 U+0078 x +!79 U+0079 y +!7A U+007A z +!7B U+007B braceleft +!7C U+007C bar +!7D U+007D braceright +!7E U+007E asciitilde +!7F U+007F .notdef +!80 U+20AC Euro +!82 U+201A quotesinglbase +!83 U+0192 florin +!84 U+201E quotedblbase +!85 U+2026 ellipsis +!86 U+2020 dagger +!87 U+2021 daggerdbl +!89 U+2030 perthousand +!8B U+2039 guilsinglleft +!91 U+2018 quoteleft +!92 U+2019 quoteright +!93 U+201C quotedblleft +!94 U+201D quotedblright +!95 U+2022 bullet +!96 U+2013 endash +!97 U+2014 emdash +!99 U+2122 trademark +!9B U+203A guilsinglright +!A0 U+00A0 space +!A1 U+0385 dieresistonos +!A2 U+0386 Alphatonos +!A3 U+00A3 sterling +!A4 U+00A4 currency +!A5 U+00A5 yen +!A6 U+00A6 brokenbar +!A7 U+00A7 section +!A8 U+00A8 dieresis +!A9 U+00A9 copyright +!AB U+00AB guillemotleft +!AC U+00AC logicalnot +!AD U+00AD hyphen +!AE U+00AE registered +!AF U+2015 afii00208 +!B0 U+00B0 degree +!B1 U+00B1 plusminus +!B2 U+00B2 twosuperior +!B3 U+00B3 threesuperior +!B4 U+0384 tonos +!B5 U+00B5 mu +!B6 U+00B6 paragraph +!B7 U+00B7 periodcentered +!B8 U+0388 Epsilontonos +!B9 U+0389 Etatonos +!BA U+038A Iotatonos +!BB U+00BB guillemotright +!BC U+038C Omicrontonos +!BD U+00BD onehalf +!BE U+038E Upsilontonos +!BF U+038F Omegatonos +!C0 U+0390 iotadieresistonos +!C1 U+0391 Alpha +!C2 U+0392 Beta +!C3 U+0393 Gamma +!C4 U+0394 Delta +!C5 U+0395 Epsilon +!C6 U+0396 Zeta +!C7 U+0397 Eta +!C8 U+0398 Theta +!C9 U+0399 Iota +!CA U+039A Kappa +!CB U+039B Lambda +!CC U+039C Mu +!CD U+039D Nu +!CE U+039E Xi +!CF U+039F Omicron +!D0 U+03A0 Pi +!D1 U+03A1 Rho +!D3 U+03A3 Sigma +!D4 U+03A4 Tau +!D5 U+03A5 Upsilon +!D6 U+03A6 Phi +!D7 U+03A7 Chi +!D8 U+03A8 Psi +!D9 U+03A9 Omega +!DA U+03AA Iotadieresis +!DB U+03AB Upsilondieresis +!DC U+03AC alphatonos +!DD U+03AD epsilontonos +!DE U+03AE etatonos +!DF U+03AF iotatonos +!E0 U+03B0 upsilondieresistonos +!E1 U+03B1 alpha +!E2 U+03B2 beta +!E3 U+03B3 gamma +!E4 U+03B4 delta +!E5 U+03B5 epsilon +!E6 U+03B6 zeta +!E7 U+03B7 eta +!E8 U+03B8 theta +!E9 U+03B9 iota +!EA U+03BA kappa +!EB U+03BB lambda +!EC U+03BC mu +!ED U+03BD nu +!EE U+03BE xi +!EF U+03BF omicron +!F0 U+03C0 pi +!F1 U+03C1 rho +!F2 U+03C2 sigma1 +!F3 U+03C3 sigma +!F4 U+03C4 tau +!F5 U+03C5 upsilon +!F6 U+03C6 phi +!F7 U+03C7 chi +!F8 U+03C8 psi +!F9 U+03C9 omega +!FA U+03CA iotadieresis +!FB U+03CB upsilondieresis +!FC U+03CC omicrontonos +!FD U+03CD upsilontonos +!FE U+03CE omegatonos diff --git a/webui/system/helper/fpdf16/font/makefont/cp1254.map b/webui/system/helper/fpdf16/font/makefont/cp1254.map new file mode 100755 index 00000000..829473b2 --- /dev/null +++ b/webui/system/helper/fpdf16/font/makefont/cp1254.map @@ -0,0 +1,249 @@ +!00 U+0000 .notdef +!01 U+0001 .notdef +!02 U+0002 .notdef +!03 U+0003 .notdef +!04 U+0004 .notdef +!05 U+0005 .notdef +!06 U+0006 .notdef +!07 U+0007 .notdef +!08 U+0008 .notdef +!09 U+0009 .notdef +!0A U+000A .notdef +!0B U+000B .notdef +!0C U+000C .notdef +!0D U+000D .notdef +!0E U+000E .notdef +!0F U+000F .notdef +!10 U+0010 .notdef +!11 U+0011 .notdef +!12 U+0012 .notdef +!13 U+0013 .notdef +!14 U+0014 .notdef +!15 U+0015 .notdef +!16 U+0016 .notdef +!17 U+0017 .notdef +!18 U+0018 .notdef +!19 U+0019 .notdef +!1A U+001A .notdef +!1B U+001B .notdef +!1C U+001C .notdef +!1D U+001D .notdef +!1E U+001E .notdef +!1F U+001F .notdef +!20 U+0020 space +!21 U+0021 exclam +!22 U+0022 quotedbl +!23 U+0023 numbersign +!24 U+0024 dollar +!25 U+0025 percent +!26 U+0026 ampersand +!27 U+0027 quotesingle +!28 U+0028 parenleft +!29 U+0029 parenright +!2A U+002A asterisk +!2B U+002B plus +!2C U+002C comma +!2D U+002D hyphen +!2E U+002E period +!2F U+002F slash +!30 U+0030 zero +!31 U+0031 one +!32 U+0032 two +!33 U+0033 three +!34 U+0034 four +!35 U+0035 five +!36 U+0036 six +!37 U+0037 seven +!38 U+0038 eight +!39 U+0039 nine +!3A U+003A colon +!3B U+003B semicolon +!3C U+003C less +!3D U+003D equal +!3E U+003E greater +!3F U+003F question +!40 U+0040 at +!41 U+0041 A +!42 U+0042 B +!43 U+0043 C +!44 U+0044 D +!45 U+0045 E +!46 U+0046 F +!47 U+0047 G +!48 U+0048 H +!49 U+0049 I +!4A U+004A J +!4B U+004B K +!4C U+004C L +!4D U+004D M +!4E U+004E N +!4F U+004F O +!50 U+0050 P +!51 U+0051 Q +!52 U+0052 R +!53 U+0053 S +!54 U+0054 T +!55 U+0055 U +!56 U+0056 V +!57 U+0057 W +!58 U+0058 X +!59 U+0059 Y +!5A U+005A Z +!5B U+005B bracketleft +!5C U+005C backslash +!5D U+005D bracketright +!5E U+005E asciicircum +!5F U+005F underscore +!60 U+0060 grave +!61 U+0061 a +!62 U+0062 b +!63 U+0063 c +!64 U+0064 d +!65 U+0065 e +!66 U+0066 f +!67 U+0067 g +!68 U+0068 h +!69 U+0069 i +!6A U+006A j +!6B U+006B k +!6C U+006C l +!6D U+006D m +!6E U+006E n +!6F U+006F o +!70 U+0070 p +!71 U+0071 q +!72 U+0072 r +!73 U+0073 s +!74 U+0074 t +!75 U+0075 u +!76 U+0076 v +!77 U+0077 w +!78 U+0078 x +!79 U+0079 y +!7A U+007A z +!7B U+007B braceleft +!7C U+007C bar +!7D U+007D braceright +!7E U+007E asciitilde +!7F U+007F .notdef +!80 U+20AC Euro +!82 U+201A quotesinglbase +!83 U+0192 florin +!84 U+201E quotedblbase +!85 U+2026 ellipsis +!86 U+2020 dagger +!87 U+2021 daggerdbl +!88 U+02C6 circumflex +!89 U+2030 perthousand +!8A U+0160 Scaron +!8B U+2039 guilsinglleft +!8C U+0152 OE +!91 U+2018 quoteleft +!92 U+2019 quoteright +!93 U+201C quotedblleft +!94 U+201D quotedblright +!95 U+2022 bullet +!96 U+2013 endash +!97 U+2014 emdash +!98 U+02DC tilde +!99 U+2122 trademark +!9A U+0161 scaron +!9B U+203A guilsinglright +!9C U+0153 oe +!9F U+0178 Ydieresis +!A0 U+00A0 space +!A1 U+00A1 exclamdown +!A2 U+00A2 cent +!A3 U+00A3 sterling +!A4 U+00A4 currency +!A5 U+00A5 yen +!A6 U+00A6 brokenbar +!A7 U+00A7 section +!A8 U+00A8 dieresis +!A9 U+00A9 copyright +!AA U+00AA ordfeminine +!AB U+00AB guillemotleft +!AC U+00AC logicalnot +!AD U+00AD hyphen +!AE U+00AE registered +!AF U+00AF macron +!B0 U+00B0 degree +!B1 U+00B1 plusminus +!B2 U+00B2 twosuperior +!B3 U+00B3 threesuperior +!B4 U+00B4 acute +!B5 U+00B5 mu +!B6 U+00B6 paragraph +!B7 U+00B7 periodcentered +!B8 U+00B8 cedilla +!B9 U+00B9 onesuperior +!BA U+00BA ordmasculine +!BB U+00BB guillemotright +!BC U+00BC onequarter +!BD U+00BD onehalf +!BE U+00BE threequarters +!BF U+00BF questiondown +!C0 U+00C0 Agrave +!C1 U+00C1 Aacute +!C2 U+00C2 Acircumflex +!C3 U+00C3 Atilde +!C4 U+00C4 Adieresis +!C5 U+00C5 Aring +!C6 U+00C6 AE +!C7 U+00C7 Ccedilla +!C8 U+00C8 Egrave +!C9 U+00C9 Eacute +!CA U+00CA Ecircumflex +!CB U+00CB Edieresis +!CC U+00CC Igrave +!CD U+00CD Iacute +!CE U+00CE Icircumflex +!CF U+00CF Idieresis +!D0 U+011E Gbreve +!D1 U+00D1 Ntilde +!D2 U+00D2 Ograve +!D3 U+00D3 Oacute +!D4 U+00D4 Ocircumflex +!D5 U+00D5 Otilde +!D6 U+00D6 Odieresis +!D7 U+00D7 multiply +!D8 U+00D8 Oslash +!D9 U+00D9 Ugrave +!DA U+00DA Uacute +!DB U+00DB Ucircumflex +!DC U+00DC Udieresis +!DD U+0130 Idotaccent +!DE U+015E Scedilla +!DF U+00DF germandbls +!E0 U+00E0 agrave +!E1 U+00E1 aacute +!E2 U+00E2 acircumflex +!E3 U+00E3 atilde +!E4 U+00E4 adieresis +!E5 U+00E5 aring +!E6 U+00E6 ae +!E7 U+00E7 ccedilla +!E8 U+00E8 egrave +!E9 U+00E9 eacute +!EA U+00EA ecircumflex +!EB U+00EB edieresis +!EC U+00EC igrave +!ED U+00ED iacute +!EE U+00EE icircumflex +!EF U+00EF idieresis +!F0 U+011F gbreve +!F1 U+00F1 ntilde +!F2 U+00F2 ograve +!F3 U+00F3 oacute +!F4 U+00F4 ocircumflex +!F5 U+00F5 otilde +!F6 U+00F6 odieresis +!F7 U+00F7 divide +!F8 U+00F8 oslash +!F9 U+00F9 ugrave +!FA U+00FA uacute +!FB U+00FB ucircumflex +!FC U+00FC udieresis +!FD U+0131 dotlessi +!FE U+015F scedilla +!FF U+00FF ydieresis diff --git a/webui/system/helper/fpdf16/font/makefont/cp1255.map b/webui/system/helper/fpdf16/font/makefont/cp1255.map new file mode 100755 index 00000000..079e10c6 --- /dev/null +++ b/webui/system/helper/fpdf16/font/makefont/cp1255.map @@ -0,0 +1,233 @@ +!00 U+0000 .notdef +!01 U+0001 .notdef +!02 U+0002 .notdef +!03 U+0003 .notdef +!04 U+0004 .notdef +!05 U+0005 .notdef +!06 U+0006 .notdef +!07 U+0007 .notdef +!08 U+0008 .notdef +!09 U+0009 .notdef +!0A U+000A .notdef +!0B U+000B .notdef +!0C U+000C .notdef +!0D U+000D .notdef +!0E U+000E .notdef +!0F U+000F .notdef +!10 U+0010 .notdef +!11 U+0011 .notdef +!12 U+0012 .notdef +!13 U+0013 .notdef +!14 U+0014 .notdef +!15 U+0015 .notdef +!16 U+0016 .notdef +!17 U+0017 .notdef +!18 U+0018 .notdef +!19 U+0019 .notdef +!1A U+001A .notdef +!1B U+001B .notdef +!1C U+001C .notdef +!1D U+001D .notdef +!1E U+001E .notdef +!1F U+001F .notdef +!20 U+0020 space +!21 U+0021 exclam +!22 U+0022 quotedbl +!23 U+0023 numbersign +!24 U+0024 dollar +!25 U+0025 percent +!26 U+0026 ampersand +!27 U+0027 quotesingle +!28 U+0028 parenleft +!29 U+0029 parenright +!2A U+002A asterisk +!2B U+002B plus +!2C U+002C comma +!2D U+002D hyphen +!2E U+002E period +!2F U+002F slash +!30 U+0030 zero +!31 U+0031 one +!32 U+0032 two +!33 U+0033 three +!34 U+0034 four +!35 U+0035 five +!36 U+0036 six +!37 U+0037 seven +!38 U+0038 eight +!39 U+0039 nine +!3A U+003A colon +!3B U+003B semicolon +!3C U+003C less +!3D U+003D equal +!3E U+003E greater +!3F U+003F question +!40 U+0040 at +!41 U+0041 A +!42 U+0042 B +!43 U+0043 C +!44 U+0044 D +!45 U+0045 E +!46 U+0046 F +!47 U+0047 G +!48 U+0048 H +!49 U+0049 I +!4A U+004A J +!4B U+004B K +!4C U+004C L +!4D U+004D M +!4E U+004E N +!4F U+004F O +!50 U+0050 P +!51 U+0051 Q +!52 U+0052 R +!53 U+0053 S +!54 U+0054 T +!55 U+0055 U +!56 U+0056 V +!57 U+0057 W +!58 U+0058 X +!59 U+0059 Y +!5A U+005A Z +!5B U+005B bracketleft +!5C U+005C backslash +!5D U+005D bracketright +!5E U+005E asciicircum +!5F U+005F underscore +!60 U+0060 grave +!61 U+0061 a +!62 U+0062 b +!63 U+0063 c +!64 U+0064 d +!65 U+0065 e +!66 U+0066 f +!67 U+0067 g +!68 U+0068 h +!69 U+0069 i +!6A U+006A j +!6B U+006B k +!6C U+006C l +!6D U+006D m +!6E U+006E n +!6F U+006F o +!70 U+0070 p +!71 U+0071 q +!72 U+0072 r +!73 U+0073 s +!74 U+0074 t +!75 U+0075 u +!76 U+0076 v +!77 U+0077 w +!78 U+0078 x +!79 U+0079 y +!7A U+007A z +!7B U+007B braceleft +!7C U+007C bar +!7D U+007D braceright +!7E U+007E asciitilde +!7F U+007F .notdef +!80 U+20AC Euro +!82 U+201A quotesinglbase +!83 U+0192 florin +!84 U+201E quotedblbase +!85 U+2026 ellipsis +!86 U+2020 dagger +!87 U+2021 daggerdbl +!88 U+02C6 circumflex +!89 U+2030 perthousand +!8B U+2039 guilsinglleft +!91 U+2018 quoteleft +!92 U+2019 quoteright +!93 U+201C quotedblleft +!94 U+201D quotedblright +!95 U+2022 bullet +!96 U+2013 endash +!97 U+2014 emdash +!98 U+02DC tilde +!99 U+2122 trademark +!9B U+203A guilsinglright +!A0 U+00A0 space +!A1 U+00A1 exclamdown +!A2 U+00A2 cent +!A3 U+00A3 sterling +!A4 U+20AA afii57636 +!A5 U+00A5 yen +!A6 U+00A6 brokenbar +!A7 U+00A7 section +!A8 U+00A8 dieresis +!A9 U+00A9 copyright +!AA U+00D7 multiply +!AB U+00AB guillemotleft +!AC U+00AC logicalnot +!AD U+00AD sfthyphen +!AE U+00AE registered +!AF U+00AF macron +!B0 U+00B0 degree +!B1 U+00B1 plusminus +!B2 U+00B2 twosuperior +!B3 U+00B3 threesuperior +!B4 U+00B4 acute +!B5 U+00B5 mu +!B6 U+00B6 paragraph +!B7 U+00B7 middot +!B8 U+00B8 cedilla +!B9 U+00B9 onesuperior +!BA U+00F7 divide +!BB U+00BB guillemotright +!BC U+00BC onequarter +!BD U+00BD onehalf +!BE U+00BE threequarters +!BF U+00BF questiondown +!C0 U+05B0 afii57799 +!C1 U+05B1 afii57801 +!C2 U+05B2 afii57800 +!C3 U+05B3 afii57802 +!C4 U+05B4 afii57793 +!C5 U+05B5 afii57794 +!C6 U+05B6 afii57795 +!C7 U+05B7 afii57798 +!C8 U+05B8 afii57797 +!C9 U+05B9 afii57806 +!CB U+05BB afii57796 +!CC U+05BC afii57807 +!CD U+05BD afii57839 +!CE U+05BE afii57645 +!CF U+05BF afii57841 +!D0 U+05C0 afii57842 +!D1 U+05C1 afii57804 +!D2 U+05C2 afii57803 +!D3 U+05C3 afii57658 +!D4 U+05F0 afii57716 +!D5 U+05F1 afii57717 +!D6 U+05F2 afii57718 +!D7 U+05F3 gereshhebrew +!D8 U+05F4 gershayimhebrew +!E0 U+05D0 afii57664 +!E1 U+05D1 afii57665 +!E2 U+05D2 afii57666 +!E3 U+05D3 afii57667 +!E4 U+05D4 afii57668 +!E5 U+05D5 afii57669 +!E6 U+05D6 afii57670 +!E7 U+05D7 afii57671 +!E8 U+05D8 afii57672 +!E9 U+05D9 afii57673 +!EA U+05DA afii57674 +!EB U+05DB afii57675 +!EC U+05DC afii57676 +!ED U+05DD afii57677 +!EE U+05DE afii57678 +!EF U+05DF afii57679 +!F0 U+05E0 afii57680 +!F1 U+05E1 afii57681 +!F2 U+05E2 afii57682 +!F3 U+05E3 afii57683 +!F4 U+05E4 afii57684 +!F5 U+05E5 afii57685 +!F6 U+05E6 afii57686 +!F7 U+05E7 afii57687 +!F8 U+05E8 afii57688 +!F9 U+05E9 afii57689 +!FA U+05EA afii57690 +!FD U+200E afii299 +!FE U+200F afii300 diff --git a/webui/system/helper/fpdf16/font/makefont/cp1257.map b/webui/system/helper/fpdf16/font/makefont/cp1257.map new file mode 100755 index 00000000..2f2ecfa2 --- /dev/null +++ b/webui/system/helper/fpdf16/font/makefont/cp1257.map @@ -0,0 +1,244 @@ +!00 U+0000 .notdef +!01 U+0001 .notdef +!02 U+0002 .notdef +!03 U+0003 .notdef +!04 U+0004 .notdef +!05 U+0005 .notdef +!06 U+0006 .notdef +!07 U+0007 .notdef +!08 U+0008 .notdef +!09 U+0009 .notdef +!0A U+000A .notdef +!0B U+000B .notdef +!0C U+000C .notdef +!0D U+000D .notdef +!0E U+000E .notdef +!0F U+000F .notdef +!10 U+0010 .notdef +!11 U+0011 .notdef +!12 U+0012 .notdef +!13 U+0013 .notdef +!14 U+0014 .notdef +!15 U+0015 .notdef +!16 U+0016 .notdef +!17 U+0017 .notdef +!18 U+0018 .notdef +!19 U+0019 .notdef +!1A U+001A .notdef +!1B U+001B .notdef +!1C U+001C .notdef +!1D U+001D .notdef +!1E U+001E .notdef +!1F U+001F .notdef +!20 U+0020 space +!21 U+0021 exclam +!22 U+0022 quotedbl +!23 U+0023 numbersign +!24 U+0024 dollar +!25 U+0025 percent +!26 U+0026 ampersand +!27 U+0027 quotesingle +!28 U+0028 parenleft +!29 U+0029 parenright +!2A U+002A asterisk +!2B U+002B plus +!2C U+002C comma +!2D U+002D hyphen +!2E U+002E period +!2F U+002F slash +!30 U+0030 zero +!31 U+0031 one +!32 U+0032 two +!33 U+0033 three +!34 U+0034 four +!35 U+0035 five +!36 U+0036 six +!37 U+0037 seven +!38 U+0038 eight +!39 U+0039 nine +!3A U+003A colon +!3B U+003B semicolon +!3C U+003C less +!3D U+003D equal +!3E U+003E greater +!3F U+003F question +!40 U+0040 at +!41 U+0041 A +!42 U+0042 B +!43 U+0043 C +!44 U+0044 D +!45 U+0045 E +!46 U+0046 F +!47 U+0047 G +!48 U+0048 H +!49 U+0049 I +!4A U+004A J +!4B U+004B K +!4C U+004C L +!4D U+004D M +!4E U+004E N +!4F U+004F O +!50 U+0050 P +!51 U+0051 Q +!52 U+0052 R +!53 U+0053 S +!54 U+0054 T +!55 U+0055 U +!56 U+0056 V +!57 U+0057 W +!58 U+0058 X +!59 U+0059 Y +!5A U+005A Z +!5B U+005B bracketleft +!5C U+005C backslash +!5D U+005D bracketright +!5E U+005E asciicircum +!5F U+005F underscore +!60 U+0060 grave +!61 U+0061 a +!62 U+0062 b +!63 U+0063 c +!64 U+0064 d +!65 U+0065 e +!66 U+0066 f +!67 U+0067 g +!68 U+0068 h +!69 U+0069 i +!6A U+006A j +!6B U+006B k +!6C U+006C l +!6D U+006D m +!6E U+006E n +!6F U+006F o +!70 U+0070 p +!71 U+0071 q +!72 U+0072 r +!73 U+0073 s +!74 U+0074 t +!75 U+0075 u +!76 U+0076 v +!77 U+0077 w +!78 U+0078 x +!79 U+0079 y +!7A U+007A z +!7B U+007B braceleft +!7C U+007C bar +!7D U+007D braceright +!7E U+007E asciitilde +!7F U+007F .notdef +!80 U+20AC Euro +!82 U+201A quotesinglbase +!84 U+201E quotedblbase +!85 U+2026 ellipsis +!86 U+2020 dagger +!87 U+2021 daggerdbl +!89 U+2030 perthousand +!8B U+2039 guilsinglleft +!8D U+00A8 dieresis +!8E U+02C7 caron +!8F U+00B8 cedilla +!91 U+2018 quoteleft +!92 U+2019 quoteright +!93 U+201C quotedblleft +!94 U+201D quotedblright +!95 U+2022 bullet +!96 U+2013 endash +!97 U+2014 emdash +!99 U+2122 trademark +!9B U+203A guilsinglright +!9D U+00AF macron +!9E U+02DB ogonek +!A0 U+00A0 space +!A2 U+00A2 cent +!A3 U+00A3 sterling +!A4 U+00A4 currency +!A6 U+00A6 brokenbar +!A7 U+00A7 section +!A8 U+00D8 Oslash +!A9 U+00A9 copyright +!AA U+0156 Rcommaaccent +!AB U+00AB guillemotleft +!AC U+00AC logicalnot +!AD U+00AD hyphen +!AE U+00AE registered +!AF U+00C6 AE +!B0 U+00B0 degree +!B1 U+00B1 plusminus +!B2 U+00B2 twosuperior +!B3 U+00B3 threesuperior +!B4 U+00B4 acute +!B5 U+00B5 mu +!B6 U+00B6 paragraph +!B7 U+00B7 periodcentered +!B8 U+00F8 oslash +!B9 U+00B9 onesuperior +!BA U+0157 rcommaaccent +!BB U+00BB guillemotright +!BC U+00BC onequarter +!BD U+00BD onehalf +!BE U+00BE threequarters +!BF U+00E6 ae +!C0 U+0104 Aogonek +!C1 U+012E Iogonek +!C2 U+0100 Amacron +!C3 U+0106 Cacute +!C4 U+00C4 Adieresis +!C5 U+00C5 Aring +!C6 U+0118 Eogonek +!C7 U+0112 Emacron +!C8 U+010C Ccaron +!C9 U+00C9 Eacute +!CA U+0179 Zacute +!CB U+0116 Edotaccent +!CC U+0122 Gcommaaccent +!CD U+0136 Kcommaaccent +!CE U+012A Imacron +!CF U+013B Lcommaaccent +!D0 U+0160 Scaron +!D1 U+0143 Nacute +!D2 U+0145 Ncommaaccent +!D3 U+00D3 Oacute +!D4 U+014C Omacron +!D5 U+00D5 Otilde +!D6 U+00D6 Odieresis +!D7 U+00D7 multiply +!D8 U+0172 Uogonek +!D9 U+0141 Lslash +!DA U+015A Sacute +!DB U+016A Umacron +!DC U+00DC Udieresis +!DD U+017B Zdotaccent +!DE U+017D Zcaron +!DF U+00DF germandbls +!E0 U+0105 aogonek +!E1 U+012F iogonek +!E2 U+0101 amacron +!E3 U+0107 cacute +!E4 U+00E4 adieresis +!E5 U+00E5 aring +!E6 U+0119 eogonek +!E7 U+0113 emacron +!E8 U+010D ccaron +!E9 U+00E9 eacute +!EA U+017A zacute +!EB U+0117 edotaccent +!EC U+0123 gcommaaccent +!ED U+0137 kcommaaccent +!EE U+012B imacron +!EF U+013C lcommaaccent +!F0 U+0161 scaron +!F1 U+0144 nacute +!F2 U+0146 ncommaaccent +!F3 U+00F3 oacute +!F4 U+014D omacron +!F5 U+00F5 otilde +!F6 U+00F6 odieresis +!F7 U+00F7 divide +!F8 U+0173 uogonek +!F9 U+0142 lslash +!FA U+015B sacute +!FB U+016B umacron +!FC U+00FC udieresis +!FD U+017C zdotaccent +!FE U+017E zcaron +!FF U+02D9 dotaccent diff --git a/webui/system/helper/fpdf16/font/makefont/cp1258.map b/webui/system/helper/fpdf16/font/makefont/cp1258.map new file mode 100755 index 00000000..fed915f7 --- /dev/null +++ b/webui/system/helper/fpdf16/font/makefont/cp1258.map @@ -0,0 +1,247 @@ +!00 U+0000 .notdef +!01 U+0001 .notdef +!02 U+0002 .notdef +!03 U+0003 .notdef +!04 U+0004 .notdef +!05 U+0005 .notdef +!06 U+0006 .notdef +!07 U+0007 .notdef +!08 U+0008 .notdef +!09 U+0009 .notdef +!0A U+000A .notdef +!0B U+000B .notdef +!0C U+000C .notdef +!0D U+000D .notdef +!0E U+000E .notdef +!0F U+000F .notdef +!10 U+0010 .notdef +!11 U+0011 .notdef +!12 U+0012 .notdef +!13 U+0013 .notdef +!14 U+0014 .notdef +!15 U+0015 .notdef +!16 U+0016 .notdef +!17 U+0017 .notdef +!18 U+0018 .notdef +!19 U+0019 .notdef +!1A U+001A .notdef +!1B U+001B .notdef +!1C U+001C .notdef +!1D U+001D .notdef +!1E U+001E .notdef +!1F U+001F .notdef +!20 U+0020 space +!21 U+0021 exclam +!22 U+0022 quotedbl +!23 U+0023 numbersign +!24 U+0024 dollar +!25 U+0025 percent +!26 U+0026 ampersand +!27 U+0027 quotesingle +!28 U+0028 parenleft +!29 U+0029 parenright +!2A U+002A asterisk +!2B U+002B plus +!2C U+002C comma +!2D U+002D hyphen +!2E U+002E period +!2F U+002F slash +!30 U+0030 zero +!31 U+0031 one +!32 U+0032 two +!33 U+0033 three +!34 U+0034 four +!35 U+0035 five +!36 U+0036 six +!37 U+0037 seven +!38 U+0038 eight +!39 U+0039 nine +!3A U+003A colon +!3B U+003B semicolon +!3C U+003C less +!3D U+003D equal +!3E U+003E greater +!3F U+003F question +!40 U+0040 at +!41 U+0041 A +!42 U+0042 B +!43 U+0043 C +!44 U+0044 D +!45 U+0045 E +!46 U+0046 F +!47 U+0047 G +!48 U+0048 H +!49 U+0049 I +!4A U+004A J +!4B U+004B K +!4C U+004C L +!4D U+004D M +!4E U+004E N +!4F U+004F O +!50 U+0050 P +!51 U+0051 Q +!52 U+0052 R +!53 U+0053 S +!54 U+0054 T +!55 U+0055 U +!56 U+0056 V +!57 U+0057 W +!58 U+0058 X +!59 U+0059 Y +!5A U+005A Z +!5B U+005B bracketleft +!5C U+005C backslash +!5D U+005D bracketright +!5E U+005E asciicircum +!5F U+005F underscore +!60 U+0060 grave +!61 U+0061 a +!62 U+0062 b +!63 U+0063 c +!64 U+0064 d +!65 U+0065 e +!66 U+0066 f +!67 U+0067 g +!68 U+0068 h +!69 U+0069 i +!6A U+006A j +!6B U+006B k +!6C U+006C l +!6D U+006D m +!6E U+006E n +!6F U+006F o +!70 U+0070 p +!71 U+0071 q +!72 U+0072 r +!73 U+0073 s +!74 U+0074 t +!75 U+0075 u +!76 U+0076 v +!77 U+0077 w +!78 U+0078 x +!79 U+0079 y +!7A U+007A z +!7B U+007B braceleft +!7C U+007C bar +!7D U+007D braceright +!7E U+007E asciitilde +!7F U+007F .notdef +!80 U+20AC Euro +!82 U+201A quotesinglbase +!83 U+0192 florin +!84 U+201E quotedblbase +!85 U+2026 ellipsis +!86 U+2020 dagger +!87 U+2021 daggerdbl +!88 U+02C6 circumflex +!89 U+2030 perthousand +!8B U+2039 guilsinglleft +!8C U+0152 OE +!91 U+2018 quoteleft +!92 U+2019 quoteright +!93 U+201C quotedblleft +!94 U+201D quotedblright +!95 U+2022 bullet +!96 U+2013 endash +!97 U+2014 emdash +!98 U+02DC tilde +!99 U+2122 trademark +!9B U+203A guilsinglright +!9C U+0153 oe +!9F U+0178 Ydieresis +!A0 U+00A0 space +!A1 U+00A1 exclamdown +!A2 U+00A2 cent +!A3 U+00A3 sterling +!A4 U+00A4 currency +!A5 U+00A5 yen +!A6 U+00A6 brokenbar +!A7 U+00A7 section +!A8 U+00A8 dieresis +!A9 U+00A9 copyright +!AA U+00AA ordfeminine +!AB U+00AB guillemotleft +!AC U+00AC logicalnot +!AD U+00AD hyphen +!AE U+00AE registered +!AF U+00AF macron +!B0 U+00B0 degree +!B1 U+00B1 plusminus +!B2 U+00B2 twosuperior +!B3 U+00B3 threesuperior +!B4 U+00B4 acute +!B5 U+00B5 mu +!B6 U+00B6 paragraph +!B7 U+00B7 periodcentered +!B8 U+00B8 cedilla +!B9 U+00B9 onesuperior +!BA U+00BA ordmasculine +!BB U+00BB guillemotright +!BC U+00BC onequarter +!BD U+00BD onehalf +!BE U+00BE threequarters +!BF U+00BF questiondown +!C0 U+00C0 Agrave +!C1 U+00C1 Aacute +!C2 U+00C2 Acircumflex +!C3 U+0102 Abreve +!C4 U+00C4 Adieresis +!C5 U+00C5 Aring +!C6 U+00C6 AE +!C7 U+00C7 Ccedilla +!C8 U+00C8 Egrave +!C9 U+00C9 Eacute +!CA U+00CA Ecircumflex +!CB U+00CB Edieresis +!CC U+0300 gravecomb +!CD U+00CD Iacute +!CE U+00CE Icircumflex +!CF U+00CF Idieresis +!D0 U+0110 Dcroat +!D1 U+00D1 Ntilde +!D2 U+0309 hookabovecomb +!D3 U+00D3 Oacute +!D4 U+00D4 Ocircumflex +!D5 U+01A0 Ohorn +!D6 U+00D6 Odieresis +!D7 U+00D7 multiply +!D8 U+00D8 Oslash +!D9 U+00D9 Ugrave +!DA U+00DA Uacute +!DB U+00DB Ucircumflex +!DC U+00DC Udieresis +!DD U+01AF Uhorn +!DE U+0303 tildecomb +!DF U+00DF germandbls +!E0 U+00E0 agrave +!E1 U+00E1 aacute +!E2 U+00E2 acircumflex +!E3 U+0103 abreve +!E4 U+00E4 adieresis +!E5 U+00E5 aring +!E6 U+00E6 ae +!E7 U+00E7 ccedilla +!E8 U+00E8 egrave +!E9 U+00E9 eacute +!EA U+00EA ecircumflex +!EB U+00EB edieresis +!EC U+0301 acutecomb +!ED U+00ED iacute +!EE U+00EE icircumflex +!EF U+00EF idieresis +!F0 U+0111 dcroat +!F1 U+00F1 ntilde +!F2 U+0323 dotbelowcomb +!F3 U+00F3 oacute +!F4 U+00F4 ocircumflex +!F5 U+01A1 ohorn +!F6 U+00F6 odieresis +!F7 U+00F7 divide +!F8 U+00F8 oslash +!F9 U+00F9 ugrave +!FA U+00FA uacute +!FB U+00FB ucircumflex +!FC U+00FC udieresis +!FD U+01B0 uhorn +!FE U+20AB dong +!FF U+00FF ydieresis diff --git a/webui/system/helper/fpdf16/font/makefont/cp874.map b/webui/system/helper/fpdf16/font/makefont/cp874.map new file mode 100755 index 00000000..1006e6b1 --- /dev/null +++ b/webui/system/helper/fpdf16/font/makefont/cp874.map @@ -0,0 +1,225 @@ +!00 U+0000 .notdef +!01 U+0001 .notdef +!02 U+0002 .notdef +!03 U+0003 .notdef +!04 U+0004 .notdef +!05 U+0005 .notdef +!06 U+0006 .notdef +!07 U+0007 .notdef +!08 U+0008 .notdef +!09 U+0009 .notdef +!0A U+000A .notdef +!0B U+000B .notdef +!0C U+000C .notdef +!0D U+000D .notdef +!0E U+000E .notdef +!0F U+000F .notdef +!10 U+0010 .notdef +!11 U+0011 .notdef +!12 U+0012 .notdef +!13 U+0013 .notdef +!14 U+0014 .notdef +!15 U+0015 .notdef +!16 U+0016 .notdef +!17 U+0017 .notdef +!18 U+0018 .notdef +!19 U+0019 .notdef +!1A U+001A .notdef +!1B U+001B .notdef +!1C U+001C .notdef +!1D U+001D .notdef +!1E U+001E .notdef +!1F U+001F .notdef +!20 U+0020 space +!21 U+0021 exclam +!22 U+0022 quotedbl +!23 U+0023 numbersign +!24 U+0024 dollar +!25 U+0025 percent +!26 U+0026 ampersand +!27 U+0027 quotesingle +!28 U+0028 parenleft +!29 U+0029 parenright +!2A U+002A asterisk +!2B U+002B plus +!2C U+002C comma +!2D U+002D hyphen +!2E U+002E period +!2F U+002F slash +!30 U+0030 zero +!31 U+0031 one +!32 U+0032 two +!33 U+0033 three +!34 U+0034 four +!35 U+0035 five +!36 U+0036 six +!37 U+0037 seven +!38 U+0038 eight +!39 U+0039 nine +!3A U+003A colon +!3B U+003B semicolon +!3C U+003C less +!3D U+003D equal +!3E U+003E greater +!3F U+003F question +!40 U+0040 at +!41 U+0041 A +!42 U+0042 B +!43 U+0043 C +!44 U+0044 D +!45 U+0045 E +!46 U+0046 F +!47 U+0047 G +!48 U+0048 H +!49 U+0049 I +!4A U+004A J +!4B U+004B K +!4C U+004C L +!4D U+004D M +!4E U+004E N +!4F U+004F O +!50 U+0050 P +!51 U+0051 Q +!52 U+0052 R +!53 U+0053 S +!54 U+0054 T +!55 U+0055 U +!56 U+0056 V +!57 U+0057 W +!58 U+0058 X +!59 U+0059 Y +!5A U+005A Z +!5B U+005B bracketleft +!5C U+005C backslash +!5D U+005D bracketright +!5E U+005E asciicircum +!5F U+005F underscore +!60 U+0060 grave +!61 U+0061 a +!62 U+0062 b +!63 U+0063 c +!64 U+0064 d +!65 U+0065 e +!66 U+0066 f +!67 U+0067 g +!68 U+0068 h +!69 U+0069 i +!6A U+006A j +!6B U+006B k +!6C U+006C l +!6D U+006D m +!6E U+006E n +!6F U+006F o +!70 U+0070 p +!71 U+0071 q +!72 U+0072 r +!73 U+0073 s +!74 U+0074 t +!75 U+0075 u +!76 U+0076 v +!77 U+0077 w +!78 U+0078 x +!79 U+0079 y +!7A U+007A z +!7B U+007B braceleft +!7C U+007C bar +!7D U+007D braceright +!7E U+007E asciitilde +!7F U+007F .notdef +!80 U+20AC Euro +!85 U+2026 ellipsis +!91 U+2018 quoteleft +!92 U+2019 quoteright +!93 U+201C quotedblleft +!94 U+201D quotedblright +!95 U+2022 bullet +!96 U+2013 endash +!97 U+2014 emdash +!A0 U+00A0 space +!A1 U+0E01 kokaithai +!A2 U+0E02 khokhaithai +!A3 U+0E03 khokhuatthai +!A4 U+0E04 khokhwaithai +!A5 U+0E05 khokhonthai +!A6 U+0E06 khorakhangthai +!A7 U+0E07 ngonguthai +!A8 U+0E08 chochanthai +!A9 U+0E09 chochingthai +!AA U+0E0A chochangthai +!AB U+0E0B sosothai +!AC U+0E0C chochoethai +!AD U+0E0D yoyingthai +!AE U+0E0E dochadathai +!AF U+0E0F topatakthai +!B0 U+0E10 thothanthai +!B1 U+0E11 thonangmonthothai +!B2 U+0E12 thophuthaothai +!B3 U+0E13 nonenthai +!B4 U+0E14 dodekthai +!B5 U+0E15 totaothai +!B6 U+0E16 thothungthai +!B7 U+0E17 thothahanthai +!B8 U+0E18 thothongthai +!B9 U+0E19 nonuthai +!BA U+0E1A bobaimaithai +!BB U+0E1B poplathai +!BC U+0E1C phophungthai +!BD U+0E1D fofathai +!BE U+0E1E phophanthai +!BF U+0E1F fofanthai +!C0 U+0E20 phosamphaothai +!C1 U+0E21 momathai +!C2 U+0E22 yoyakthai +!C3 U+0E23 roruathai +!C4 U+0E24 ruthai +!C5 U+0E25 lolingthai +!C6 U+0E26 luthai +!C7 U+0E27 wowaenthai +!C8 U+0E28 sosalathai +!C9 U+0E29 sorusithai +!CA U+0E2A sosuathai +!CB U+0E2B hohipthai +!CC U+0E2C lochulathai +!CD U+0E2D oangthai +!CE U+0E2E honokhukthai +!CF U+0E2F paiyannoithai +!D0 U+0E30 saraathai +!D1 U+0E31 maihanakatthai +!D2 U+0E32 saraaathai +!D3 U+0E33 saraamthai +!D4 U+0E34 saraithai +!D5 U+0E35 saraiithai +!D6 U+0E36 sarauethai +!D7 U+0E37 saraueethai +!D8 U+0E38 sarauthai +!D9 U+0E39 sarauuthai +!DA U+0E3A phinthuthai +!DF U+0E3F bahtthai +!E0 U+0E40 saraethai +!E1 U+0E41 saraaethai +!E2 U+0E42 saraothai +!E3 U+0E43 saraaimaimuanthai +!E4 U+0E44 saraaimaimalaithai +!E5 U+0E45 lakkhangyaothai +!E6 U+0E46 maiyamokthai +!E7 U+0E47 maitaikhuthai +!E8 U+0E48 maiekthai +!E9 U+0E49 maithothai +!EA U+0E4A maitrithai +!EB U+0E4B maichattawathai +!EC U+0E4C thanthakhatthai +!ED U+0E4D nikhahitthai +!EE U+0E4E yamakkanthai +!EF U+0E4F fongmanthai +!F0 U+0E50 zerothai +!F1 U+0E51 onethai +!F2 U+0E52 twothai +!F3 U+0E53 threethai +!F4 U+0E54 fourthai +!F5 U+0E55 fivethai +!F6 U+0E56 sixthai +!F7 U+0E57 seventhai +!F8 U+0E58 eightthai +!F9 U+0E59 ninethai +!FA U+0E5A angkhankhuthai +!FB U+0E5B khomutthai diff --git a/webui/system/helper/fpdf16/font/makefont/iso-8859-1.map b/webui/system/helper/fpdf16/font/makefont/iso-8859-1.map new file mode 100755 index 00000000..61740a38 --- /dev/null +++ b/webui/system/helper/fpdf16/font/makefont/iso-8859-1.map @@ -0,0 +1,256 @@ +!00 U+0000 .notdef +!01 U+0001 .notdef +!02 U+0002 .notdef +!03 U+0003 .notdef +!04 U+0004 .notdef +!05 U+0005 .notdef +!06 U+0006 .notdef +!07 U+0007 .notdef +!08 U+0008 .notdef +!09 U+0009 .notdef +!0A U+000A .notdef +!0B U+000B .notdef +!0C U+000C .notdef +!0D U+000D .notdef +!0E U+000E .notdef +!0F U+000F .notdef +!10 U+0010 .notdef +!11 U+0011 .notdef +!12 U+0012 .notdef +!13 U+0013 .notdef +!14 U+0014 .notdef +!15 U+0015 .notdef +!16 U+0016 .notdef +!17 U+0017 .notdef +!18 U+0018 .notdef +!19 U+0019 .notdef +!1A U+001A .notdef +!1B U+001B .notdef +!1C U+001C .notdef +!1D U+001D .notdef +!1E U+001E .notdef +!1F U+001F .notdef +!20 U+0020 space +!21 U+0021 exclam +!22 U+0022 quotedbl +!23 U+0023 numbersign +!24 U+0024 dollar +!25 U+0025 percent +!26 U+0026 ampersand +!27 U+0027 quotesingle +!28 U+0028 parenleft +!29 U+0029 parenright +!2A U+002A asterisk +!2B U+002B plus +!2C U+002C comma +!2D U+002D hyphen +!2E U+002E period +!2F U+002F slash +!30 U+0030 zero +!31 U+0031 one +!32 U+0032 two +!33 U+0033 three +!34 U+0034 four +!35 U+0035 five +!36 U+0036 six +!37 U+0037 seven +!38 U+0038 eight +!39 U+0039 nine +!3A U+003A colon +!3B U+003B semicolon +!3C U+003C less +!3D U+003D equal +!3E U+003E greater +!3F U+003F question +!40 U+0040 at +!41 U+0041 A +!42 U+0042 B +!43 U+0043 C +!44 U+0044 D +!45 U+0045 E +!46 U+0046 F +!47 U+0047 G +!48 U+0048 H +!49 U+0049 I +!4A U+004A J +!4B U+004B K +!4C U+004C L +!4D U+004D M +!4E U+004E N +!4F U+004F O +!50 U+0050 P +!51 U+0051 Q +!52 U+0052 R +!53 U+0053 S +!54 U+0054 T +!55 U+0055 U +!56 U+0056 V +!57 U+0057 W +!58 U+0058 X +!59 U+0059 Y +!5A U+005A Z +!5B U+005B bracketleft +!5C U+005C backslash +!5D U+005D bracketright +!5E U+005E asciicircum +!5F U+005F underscore +!60 U+0060 grave +!61 U+0061 a +!62 U+0062 b +!63 U+0063 c +!64 U+0064 d +!65 U+0065 e +!66 U+0066 f +!67 U+0067 g +!68 U+0068 h +!69 U+0069 i +!6A U+006A j +!6B U+006B k +!6C U+006C l +!6D U+006D m +!6E U+006E n +!6F U+006F o +!70 U+0070 p +!71 U+0071 q +!72 U+0072 r +!73 U+0073 s +!74 U+0074 t +!75 U+0075 u +!76 U+0076 v +!77 U+0077 w +!78 U+0078 x +!79 U+0079 y +!7A U+007A z +!7B U+007B braceleft +!7C U+007C bar +!7D U+007D braceright +!7E U+007E asciitilde +!7F U+007F .notdef +!80 U+0080 .notdef +!81 U+0081 .notdef +!82 U+0082 .notdef +!83 U+0083 .notdef +!84 U+0084 .notdef +!85 U+0085 .notdef +!86 U+0086 .notdef +!87 U+0087 .notdef +!88 U+0088 .notdef +!89 U+0089 .notdef +!8A U+008A .notdef +!8B U+008B .notdef +!8C U+008C .notdef +!8D U+008D .notdef +!8E U+008E .notdef +!8F U+008F .notdef +!90 U+0090 .notdef +!91 U+0091 .notdef +!92 U+0092 .notdef +!93 U+0093 .notdef +!94 U+0094 .notdef +!95 U+0095 .notdef +!96 U+0096 .notdef +!97 U+0097 .notdef +!98 U+0098 .notdef +!99 U+0099 .notdef +!9A U+009A .notdef +!9B U+009B .notdef +!9C U+009C .notdef +!9D U+009D .notdef +!9E U+009E .notdef +!9F U+009F .notdef +!A0 U+00A0 space +!A1 U+00A1 exclamdown +!A2 U+00A2 cent +!A3 U+00A3 sterling +!A4 U+00A4 currency +!A5 U+00A5 yen +!A6 U+00A6 brokenbar +!A7 U+00A7 section +!A8 U+00A8 dieresis +!A9 U+00A9 copyright +!AA U+00AA ordfeminine +!AB U+00AB guillemotleft +!AC U+00AC logicalnot +!AD U+00AD hyphen +!AE U+00AE registered +!AF U+00AF macron +!B0 U+00B0 degree +!B1 U+00B1 plusminus +!B2 U+00B2 twosuperior +!B3 U+00B3 threesuperior +!B4 U+00B4 acute +!B5 U+00B5 mu +!B6 U+00B6 paragraph +!B7 U+00B7 periodcentered +!B8 U+00B8 cedilla +!B9 U+00B9 onesuperior +!BA U+00BA ordmasculine +!BB U+00BB guillemotright +!BC U+00BC onequarter +!BD U+00BD onehalf +!BE U+00BE threequarters +!BF U+00BF questiondown +!C0 U+00C0 Agrave +!C1 U+00C1 Aacute +!C2 U+00C2 Acircumflex +!C3 U+00C3 Atilde +!C4 U+00C4 Adieresis +!C5 U+00C5 Aring +!C6 U+00C6 AE +!C7 U+00C7 Ccedilla +!C8 U+00C8 Egrave +!C9 U+00C9 Eacute +!CA U+00CA Ecircumflex +!CB U+00CB Edieresis +!CC U+00CC Igrave +!CD U+00CD Iacute +!CE U+00CE Icircumflex +!CF U+00CF Idieresis +!D0 U+00D0 Eth +!D1 U+00D1 Ntilde +!D2 U+00D2 Ograve +!D3 U+00D3 Oacute +!D4 U+00D4 Ocircumflex +!D5 U+00D5 Otilde +!D6 U+00D6 Odieresis +!D7 U+00D7 multiply +!D8 U+00D8 Oslash +!D9 U+00D9 Ugrave +!DA U+00DA Uacute +!DB U+00DB Ucircumflex +!DC U+00DC Udieresis +!DD U+00DD Yacute +!DE U+00DE Thorn +!DF U+00DF germandbls +!E0 U+00E0 agrave +!E1 U+00E1 aacute +!E2 U+00E2 acircumflex +!E3 U+00E3 atilde +!E4 U+00E4 adieresis +!E5 U+00E5 aring +!E6 U+00E6 ae +!E7 U+00E7 ccedilla +!E8 U+00E8 egrave +!E9 U+00E9 eacute +!EA U+00EA ecircumflex +!EB U+00EB edieresis +!EC U+00EC igrave +!ED U+00ED iacute +!EE U+00EE icircumflex +!EF U+00EF idieresis +!F0 U+00F0 eth +!F1 U+00F1 ntilde +!F2 U+00F2 ograve +!F3 U+00F3 oacute +!F4 U+00F4 ocircumflex +!F5 U+00F5 otilde +!F6 U+00F6 odieresis +!F7 U+00F7 divide +!F8 U+00F8 oslash +!F9 U+00F9 ugrave +!FA U+00FA uacute +!FB U+00FB ucircumflex +!FC U+00FC udieresis +!FD U+00FD yacute +!FE U+00FE thorn +!FF U+00FF ydieresis diff --git a/webui/system/helper/fpdf16/font/makefont/iso-8859-11.map b/webui/system/helper/fpdf16/font/makefont/iso-8859-11.map new file mode 100755 index 00000000..91688120 --- /dev/null +++ b/webui/system/helper/fpdf16/font/makefont/iso-8859-11.map @@ -0,0 +1,248 @@ +!00 U+0000 .notdef +!01 U+0001 .notdef +!02 U+0002 .notdef +!03 U+0003 .notdef +!04 U+0004 .notdef +!05 U+0005 .notdef +!06 U+0006 .notdef +!07 U+0007 .notdef +!08 U+0008 .notdef +!09 U+0009 .notdef +!0A U+000A .notdef +!0B U+000B .notdef +!0C U+000C .notdef +!0D U+000D .notdef +!0E U+000E .notdef +!0F U+000F .notdef +!10 U+0010 .notdef +!11 U+0011 .notdef +!12 U+0012 .notdef +!13 U+0013 .notdef +!14 U+0014 .notdef +!15 U+0015 .notdef +!16 U+0016 .notdef +!17 U+0017 .notdef +!18 U+0018 .notdef +!19 U+0019 .notdef +!1A U+001A .notdef +!1B U+001B .notdef +!1C U+001C .notdef +!1D U+001D .notdef +!1E U+001E .notdef +!1F U+001F .notdef +!20 U+0020 space +!21 U+0021 exclam +!22 U+0022 quotedbl +!23 U+0023 numbersign +!24 U+0024 dollar +!25 U+0025 percent +!26 U+0026 ampersand +!27 U+0027 quotesingle +!28 U+0028 parenleft +!29 U+0029 parenright +!2A U+002A asterisk +!2B U+002B plus +!2C U+002C comma +!2D U+002D hyphen +!2E U+002E period +!2F U+002F slash +!30 U+0030 zero +!31 U+0031 one +!32 U+0032 two +!33 U+0033 three +!34 U+0034 four +!35 U+0035 five +!36 U+0036 six +!37 U+0037 seven +!38 U+0038 eight +!39 U+0039 nine +!3A U+003A colon +!3B U+003B semicolon +!3C U+003C less +!3D U+003D equal +!3E U+003E greater +!3F U+003F question +!40 U+0040 at +!41 U+0041 A +!42 U+0042 B +!43 U+0043 C +!44 U+0044 D +!45 U+0045 E +!46 U+0046 F +!47 U+0047 G +!48 U+0048 H +!49 U+0049 I +!4A U+004A J +!4B U+004B K +!4C U+004C L +!4D U+004D M +!4E U+004E N +!4F U+004F O +!50 U+0050 P +!51 U+0051 Q +!52 U+0052 R +!53 U+0053 S +!54 U+0054 T +!55 U+0055 U +!56 U+0056 V +!57 U+0057 W +!58 U+0058 X +!59 U+0059 Y +!5A U+005A Z +!5B U+005B bracketleft +!5C U+005C backslash +!5D U+005D bracketright +!5E U+005E asciicircum +!5F U+005F underscore +!60 U+0060 grave +!61 U+0061 a +!62 U+0062 b +!63 U+0063 c +!64 U+0064 d +!65 U+0065 e +!66 U+0066 f +!67 U+0067 g +!68 U+0068 h +!69 U+0069 i +!6A U+006A j +!6B U+006B k +!6C U+006C l +!6D U+006D m +!6E U+006E n +!6F U+006F o +!70 U+0070 p +!71 U+0071 q +!72 U+0072 r +!73 U+0073 s +!74 U+0074 t +!75 U+0075 u +!76 U+0076 v +!77 U+0077 w +!78 U+0078 x +!79 U+0079 y +!7A U+007A z +!7B U+007B braceleft +!7C U+007C bar +!7D U+007D braceright +!7E U+007E asciitilde +!7F U+007F .notdef +!80 U+0080 .notdef +!81 U+0081 .notdef +!82 U+0082 .notdef +!83 U+0083 .notdef +!84 U+0084 .notdef +!85 U+0085 .notdef +!86 U+0086 .notdef +!87 U+0087 .notdef +!88 U+0088 .notdef +!89 U+0089 .notdef +!8A U+008A .notdef +!8B U+008B .notdef +!8C U+008C .notdef +!8D U+008D .notdef +!8E U+008E .notdef +!8F U+008F .notdef +!90 U+0090 .notdef +!91 U+0091 .notdef +!92 U+0092 .notdef +!93 U+0093 .notdef +!94 U+0094 .notdef +!95 U+0095 .notdef +!96 U+0096 .notdef +!97 U+0097 .notdef +!98 U+0098 .notdef +!99 U+0099 .notdef +!9A U+009A .notdef +!9B U+009B .notdef +!9C U+009C .notdef +!9D U+009D .notdef +!9E U+009E .notdef +!9F U+009F .notdef +!A0 U+00A0 space +!A1 U+0E01 kokaithai +!A2 U+0E02 khokhaithai +!A3 U+0E03 khokhuatthai +!A4 U+0E04 khokhwaithai +!A5 U+0E05 khokhonthai +!A6 U+0E06 khorakhangthai +!A7 U+0E07 ngonguthai +!A8 U+0E08 chochanthai +!A9 U+0E09 chochingthai +!AA U+0E0A chochangthai +!AB U+0E0B sosothai +!AC U+0E0C chochoethai +!AD U+0E0D yoyingthai +!AE U+0E0E dochadathai +!AF U+0E0F topatakthai +!B0 U+0E10 thothanthai +!B1 U+0E11 thonangmonthothai +!B2 U+0E12 thophuthaothai +!B3 U+0E13 nonenthai +!B4 U+0E14 dodekthai +!B5 U+0E15 totaothai +!B6 U+0E16 thothungthai +!B7 U+0E17 thothahanthai +!B8 U+0E18 thothongthai +!B9 U+0E19 nonuthai +!BA U+0E1A bobaimaithai +!BB U+0E1B poplathai +!BC U+0E1C phophungthai +!BD U+0E1D fofathai +!BE U+0E1E phophanthai +!BF U+0E1F fofanthai +!C0 U+0E20 phosamphaothai +!C1 U+0E21 momathai +!C2 U+0E22 yoyakthai +!C3 U+0E23 roruathai +!C4 U+0E24 ruthai +!C5 U+0E25 lolingthai +!C6 U+0E26 luthai +!C7 U+0E27 wowaenthai +!C8 U+0E28 sosalathai +!C9 U+0E29 sorusithai +!CA U+0E2A sosuathai +!CB U+0E2B hohipthai +!CC U+0E2C lochulathai +!CD U+0E2D oangthai +!CE U+0E2E honokhukthai +!CF U+0E2F paiyannoithai +!D0 U+0E30 saraathai +!D1 U+0E31 maihanakatthai +!D2 U+0E32 saraaathai +!D3 U+0E33 saraamthai +!D4 U+0E34 saraithai +!D5 U+0E35 saraiithai +!D6 U+0E36 sarauethai +!D7 U+0E37 saraueethai +!D8 U+0E38 sarauthai +!D9 U+0E39 sarauuthai +!DA U+0E3A phinthuthai +!DF U+0E3F bahtthai +!E0 U+0E40 saraethai +!E1 U+0E41 saraaethai +!E2 U+0E42 saraothai +!E3 U+0E43 saraaimaimuanthai +!E4 U+0E44 saraaimaimalaithai +!E5 U+0E45 lakkhangyaothai +!E6 U+0E46 maiyamokthai +!E7 U+0E47 maitaikhuthai +!E8 U+0E48 maiekthai +!E9 U+0E49 maithothai +!EA U+0E4A maitrithai +!EB U+0E4B maichattawathai +!EC U+0E4C thanthakhatthai +!ED U+0E4D nikhahitthai +!EE U+0E4E yamakkanthai +!EF U+0E4F fongmanthai +!F0 U+0E50 zerothai +!F1 U+0E51 onethai +!F2 U+0E52 twothai +!F3 U+0E53 threethai +!F4 U+0E54 fourthai +!F5 U+0E55 fivethai +!F6 U+0E56 sixthai +!F7 U+0E57 seventhai +!F8 U+0E58 eightthai +!F9 U+0E59 ninethai +!FA U+0E5A angkhankhuthai +!FB U+0E5B khomutthai diff --git a/webui/system/helper/fpdf16/font/makefont/iso-8859-15.map b/webui/system/helper/fpdf16/font/makefont/iso-8859-15.map new file mode 100755 index 00000000..6c2b5712 --- /dev/null +++ b/webui/system/helper/fpdf16/font/makefont/iso-8859-15.map @@ -0,0 +1,256 @@ +!00 U+0000 .notdef +!01 U+0001 .notdef +!02 U+0002 .notdef +!03 U+0003 .notdef +!04 U+0004 .notdef +!05 U+0005 .notdef +!06 U+0006 .notdef +!07 U+0007 .notdef +!08 U+0008 .notdef +!09 U+0009 .notdef +!0A U+000A .notdef +!0B U+000B .notdef +!0C U+000C .notdef +!0D U+000D .notdef +!0E U+000E .notdef +!0F U+000F .notdef +!10 U+0010 .notdef +!11 U+0011 .notdef +!12 U+0012 .notdef +!13 U+0013 .notdef +!14 U+0014 .notdef +!15 U+0015 .notdef +!16 U+0016 .notdef +!17 U+0017 .notdef +!18 U+0018 .notdef +!19 U+0019 .notdef +!1A U+001A .notdef +!1B U+001B .notdef +!1C U+001C .notdef +!1D U+001D .notdef +!1E U+001E .notdef +!1F U+001F .notdef +!20 U+0020 space +!21 U+0021 exclam +!22 U+0022 quotedbl +!23 U+0023 numbersign +!24 U+0024 dollar +!25 U+0025 percent +!26 U+0026 ampersand +!27 U+0027 quotesingle +!28 U+0028 parenleft +!29 U+0029 parenright +!2A U+002A asterisk +!2B U+002B plus +!2C U+002C comma +!2D U+002D hyphen +!2E U+002E period +!2F U+002F slash +!30 U+0030 zero +!31 U+0031 one +!32 U+0032 two +!33 U+0033 three +!34 U+0034 four +!35 U+0035 five +!36 U+0036 six +!37 U+0037 seven +!38 U+0038 eight +!39 U+0039 nine +!3A U+003A colon +!3B U+003B semicolon +!3C U+003C less +!3D U+003D equal +!3E U+003E greater +!3F U+003F question +!40 U+0040 at +!41 U+0041 A +!42 U+0042 B +!43 U+0043 C +!44 U+0044 D +!45 U+0045 E +!46 U+0046 F +!47 U+0047 G +!48 U+0048 H +!49 U+0049 I +!4A U+004A J +!4B U+004B K +!4C U+004C L +!4D U+004D M +!4E U+004E N +!4F U+004F O +!50 U+0050 P +!51 U+0051 Q +!52 U+0052 R +!53 U+0053 S +!54 U+0054 T +!55 U+0055 U +!56 U+0056 V +!57 U+0057 W +!58 U+0058 X +!59 U+0059 Y +!5A U+005A Z +!5B U+005B bracketleft +!5C U+005C backslash +!5D U+005D bracketright +!5E U+005E asciicircum +!5F U+005F underscore +!60 U+0060 grave +!61 U+0061 a +!62 U+0062 b +!63 U+0063 c +!64 U+0064 d +!65 U+0065 e +!66 U+0066 f +!67 U+0067 g +!68 U+0068 h +!69 U+0069 i +!6A U+006A j +!6B U+006B k +!6C U+006C l +!6D U+006D m +!6E U+006E n +!6F U+006F o +!70 U+0070 p +!71 U+0071 q +!72 U+0072 r +!73 U+0073 s +!74 U+0074 t +!75 U+0075 u +!76 U+0076 v +!77 U+0077 w +!78 U+0078 x +!79 U+0079 y +!7A U+007A z +!7B U+007B braceleft +!7C U+007C bar +!7D U+007D braceright +!7E U+007E asciitilde +!7F U+007F .notdef +!80 U+0080 .notdef +!81 U+0081 .notdef +!82 U+0082 .notdef +!83 U+0083 .notdef +!84 U+0084 .notdef +!85 U+0085 .notdef +!86 U+0086 .notdef +!87 U+0087 .notdef +!88 U+0088 .notdef +!89 U+0089 .notdef +!8A U+008A .notdef +!8B U+008B .notdef +!8C U+008C .notdef +!8D U+008D .notdef +!8E U+008E .notdef +!8F U+008F .notdef +!90 U+0090 .notdef +!91 U+0091 .notdef +!92 U+0092 .notdef +!93 U+0093 .notdef +!94 U+0094 .notdef +!95 U+0095 .notdef +!96 U+0096 .notdef +!97 U+0097 .notdef +!98 U+0098 .notdef +!99 U+0099 .notdef +!9A U+009A .notdef +!9B U+009B .notdef +!9C U+009C .notdef +!9D U+009D .notdef +!9E U+009E .notdef +!9F U+009F .notdef +!A0 U+00A0 space +!A1 U+00A1 exclamdown +!A2 U+00A2 cent +!A3 U+00A3 sterling +!A4 U+20AC Euro +!A5 U+00A5 yen +!A6 U+0160 Scaron +!A7 U+00A7 section +!A8 U+0161 scaron +!A9 U+00A9 copyright +!AA U+00AA ordfeminine +!AB U+00AB guillemotleft +!AC U+00AC logicalnot +!AD U+00AD hyphen +!AE U+00AE registered +!AF U+00AF macron +!B0 U+00B0 degree +!B1 U+00B1 plusminus +!B2 U+00B2 twosuperior +!B3 U+00B3 threesuperior +!B4 U+017D Zcaron +!B5 U+00B5 mu +!B6 U+00B6 paragraph +!B7 U+00B7 periodcentered +!B8 U+017E zcaron +!B9 U+00B9 onesuperior +!BA U+00BA ordmasculine +!BB U+00BB guillemotright +!BC U+0152 OE +!BD U+0153 oe +!BE U+0178 Ydieresis +!BF U+00BF questiondown +!C0 U+00C0 Agrave +!C1 U+00C1 Aacute +!C2 U+00C2 Acircumflex +!C3 U+00C3 Atilde +!C4 U+00C4 Adieresis +!C5 U+00C5 Aring +!C6 U+00C6 AE +!C7 U+00C7 Ccedilla +!C8 U+00C8 Egrave +!C9 U+00C9 Eacute +!CA U+00CA Ecircumflex +!CB U+00CB Edieresis +!CC U+00CC Igrave +!CD U+00CD Iacute +!CE U+00CE Icircumflex +!CF U+00CF Idieresis +!D0 U+00D0 Eth +!D1 U+00D1 Ntilde +!D2 U+00D2 Ograve +!D3 U+00D3 Oacute +!D4 U+00D4 Ocircumflex +!D5 U+00D5 Otilde +!D6 U+00D6 Odieresis +!D7 U+00D7 multiply +!D8 U+00D8 Oslash +!D9 U+00D9 Ugrave +!DA U+00DA Uacute +!DB U+00DB Ucircumflex +!DC U+00DC Udieresis +!DD U+00DD Yacute +!DE U+00DE Thorn +!DF U+00DF germandbls +!E0 U+00E0 agrave +!E1 U+00E1 aacute +!E2 U+00E2 acircumflex +!E3 U+00E3 atilde +!E4 U+00E4 adieresis +!E5 U+00E5 aring +!E6 U+00E6 ae +!E7 U+00E7 ccedilla +!E8 U+00E8 egrave +!E9 U+00E9 eacute +!EA U+00EA ecircumflex +!EB U+00EB edieresis +!EC U+00EC igrave +!ED U+00ED iacute +!EE U+00EE icircumflex +!EF U+00EF idieresis +!F0 U+00F0 eth +!F1 U+00F1 ntilde +!F2 U+00F2 ograve +!F3 U+00F3 oacute +!F4 U+00F4 ocircumflex +!F5 U+00F5 otilde +!F6 U+00F6 odieresis +!F7 U+00F7 divide +!F8 U+00F8 oslash +!F9 U+00F9 ugrave +!FA U+00FA uacute +!FB U+00FB ucircumflex +!FC U+00FC udieresis +!FD U+00FD yacute +!FE U+00FE thorn +!FF U+00FF ydieresis diff --git a/webui/system/helper/fpdf16/font/makefont/iso-8859-16.map b/webui/system/helper/fpdf16/font/makefont/iso-8859-16.map new file mode 100755 index 00000000..202c8fe5 --- /dev/null +++ b/webui/system/helper/fpdf16/font/makefont/iso-8859-16.map @@ -0,0 +1,256 @@ +!00 U+0000 .notdef +!01 U+0001 .notdef +!02 U+0002 .notdef +!03 U+0003 .notdef +!04 U+0004 .notdef +!05 U+0005 .notdef +!06 U+0006 .notdef +!07 U+0007 .notdef +!08 U+0008 .notdef +!09 U+0009 .notdef +!0A U+000A .notdef +!0B U+000B .notdef +!0C U+000C .notdef +!0D U+000D .notdef +!0E U+000E .notdef +!0F U+000F .notdef +!10 U+0010 .notdef +!11 U+0011 .notdef +!12 U+0012 .notdef +!13 U+0013 .notdef +!14 U+0014 .notdef +!15 U+0015 .notdef +!16 U+0016 .notdef +!17 U+0017 .notdef +!18 U+0018 .notdef +!19 U+0019 .notdef +!1A U+001A .notdef +!1B U+001B .notdef +!1C U+001C .notdef +!1D U+001D .notdef +!1E U+001E .notdef +!1F U+001F .notdef +!20 U+0020 space +!21 U+0021 exclam +!22 U+0022 quotedbl +!23 U+0023 numbersign +!24 U+0024 dollar +!25 U+0025 percent +!26 U+0026 ampersand +!27 U+0027 quotesingle +!28 U+0028 parenleft +!29 U+0029 parenright +!2A U+002A asterisk +!2B U+002B plus +!2C U+002C comma +!2D U+002D hyphen +!2E U+002E period +!2F U+002F slash +!30 U+0030 zero +!31 U+0031 one +!32 U+0032 two +!33 U+0033 three +!34 U+0034 four +!35 U+0035 five +!36 U+0036 six +!37 U+0037 seven +!38 U+0038 eight +!39 U+0039 nine +!3A U+003A colon +!3B U+003B semicolon +!3C U+003C less +!3D U+003D equal +!3E U+003E greater +!3F U+003F question +!40 U+0040 at +!41 U+0041 A +!42 U+0042 B +!43 U+0043 C +!44 U+0044 D +!45 U+0045 E +!46 U+0046 F +!47 U+0047 G +!48 U+0048 H +!49 U+0049 I +!4A U+004A J +!4B U+004B K +!4C U+004C L +!4D U+004D M +!4E U+004E N +!4F U+004F O +!50 U+0050 P +!51 U+0051 Q +!52 U+0052 R +!53 U+0053 S +!54 U+0054 T +!55 U+0055 U +!56 U+0056 V +!57 U+0057 W +!58 U+0058 X +!59 U+0059 Y +!5A U+005A Z +!5B U+005B bracketleft +!5C U+005C backslash +!5D U+005D bracketright +!5E U+005E asciicircum +!5F U+005F underscore +!60 U+0060 grave +!61 U+0061 a +!62 U+0062 b +!63 U+0063 c +!64 U+0064 d +!65 U+0065 e +!66 U+0066 f +!67 U+0067 g +!68 U+0068 h +!69 U+0069 i +!6A U+006A j +!6B U+006B k +!6C U+006C l +!6D U+006D m +!6E U+006E n +!6F U+006F o +!70 U+0070 p +!71 U+0071 q +!72 U+0072 r +!73 U+0073 s +!74 U+0074 t +!75 U+0075 u +!76 U+0076 v +!77 U+0077 w +!78 U+0078 x +!79 U+0079 y +!7A U+007A z +!7B U+007B braceleft +!7C U+007C bar +!7D U+007D braceright +!7E U+007E asciitilde +!7F U+007F .notdef +!80 U+0080 .notdef +!81 U+0081 .notdef +!82 U+0082 .notdef +!83 U+0083 .notdef +!84 U+0084 .notdef +!85 U+0085 .notdef +!86 U+0086 .notdef +!87 U+0087 .notdef +!88 U+0088 .notdef +!89 U+0089 .notdef +!8A U+008A .notdef +!8B U+008B .notdef +!8C U+008C .notdef +!8D U+008D .notdef +!8E U+008E .notdef +!8F U+008F .notdef +!90 U+0090 .notdef +!91 U+0091 .notdef +!92 U+0092 .notdef +!93 U+0093 .notdef +!94 U+0094 .notdef +!95 U+0095 .notdef +!96 U+0096 .notdef +!97 U+0097 .notdef +!98 U+0098 .notdef +!99 U+0099 .notdef +!9A U+009A .notdef +!9B U+009B .notdef +!9C U+009C .notdef +!9D U+009D .notdef +!9E U+009E .notdef +!9F U+009F .notdef +!A0 U+00A0 space +!A1 U+0104 Aogonek +!A2 U+0105 aogonek +!A3 U+0141 Lslash +!A4 U+20AC Euro +!A5 U+201E quotedblbase +!A6 U+0160 Scaron +!A7 U+00A7 section +!A8 U+0161 scaron +!A9 U+00A9 copyright +!AA U+0218 Scommaaccent +!AB U+00AB guillemotleft +!AC U+0179 Zacute +!AD U+00AD hyphen +!AE U+017A zacute +!AF U+017B Zdotaccent +!B0 U+00B0 degree +!B1 U+00B1 plusminus +!B2 U+010C Ccaron +!B3 U+0142 lslash +!B4 U+017D Zcaron +!B5 U+201D quotedblright +!B6 U+00B6 paragraph +!B7 U+00B7 periodcentered +!B8 U+017E zcaron +!B9 U+010D ccaron +!BA U+0219 scommaaccent +!BB U+00BB guillemotright +!BC U+0152 OE +!BD U+0153 oe +!BE U+0178 Ydieresis +!BF U+017C zdotaccent +!C0 U+00C0 Agrave +!C1 U+00C1 Aacute +!C2 U+00C2 Acircumflex +!C3 U+0102 Abreve +!C4 U+00C4 Adieresis +!C5 U+0106 Cacute +!C6 U+00C6 AE +!C7 U+00C7 Ccedilla +!C8 U+00C8 Egrave +!C9 U+00C9 Eacute +!CA U+00CA Ecircumflex +!CB U+00CB Edieresis +!CC U+00CC Igrave +!CD U+00CD Iacute +!CE U+00CE Icircumflex +!CF U+00CF Idieresis +!D0 U+0110 Dcroat +!D1 U+0143 Nacute +!D2 U+00D2 Ograve +!D3 U+00D3 Oacute +!D4 U+00D4 Ocircumflex +!D5 U+0150 Ohungarumlaut +!D6 U+00D6 Odieresis +!D7 U+015A Sacute +!D8 U+0170 Uhungarumlaut +!D9 U+00D9 Ugrave +!DA U+00DA Uacute +!DB U+00DB Ucircumflex +!DC U+00DC Udieresis +!DD U+0118 Eogonek +!DE U+021A Tcommaaccent +!DF U+00DF germandbls +!E0 U+00E0 agrave +!E1 U+00E1 aacute +!E2 U+00E2 acircumflex +!E3 U+0103 abreve +!E4 U+00E4 adieresis +!E5 U+0107 cacute +!E6 U+00E6 ae +!E7 U+00E7 ccedilla +!E8 U+00E8 egrave +!E9 U+00E9 eacute +!EA U+00EA ecircumflex +!EB U+00EB edieresis +!EC U+00EC igrave +!ED U+00ED iacute +!EE U+00EE icircumflex +!EF U+00EF idieresis +!F0 U+0111 dcroat +!F1 U+0144 nacute +!F2 U+00F2 ograve +!F3 U+00F3 oacute +!F4 U+00F4 ocircumflex +!F5 U+0151 ohungarumlaut +!F6 U+00F6 odieresis +!F7 U+015B sacute +!F8 U+0171 uhungarumlaut +!F9 U+00F9 ugrave +!FA U+00FA uacute +!FB U+00FB ucircumflex +!FC U+00FC udieresis +!FD U+0119 eogonek +!FE U+021B tcommaaccent +!FF U+00FF ydieresis diff --git a/webui/system/helper/fpdf16/font/makefont/iso-8859-2.map b/webui/system/helper/fpdf16/font/makefont/iso-8859-2.map new file mode 100755 index 00000000..65ae09f9 --- /dev/null +++ b/webui/system/helper/fpdf16/font/makefont/iso-8859-2.map @@ -0,0 +1,256 @@ +!00 U+0000 .notdef +!01 U+0001 .notdef +!02 U+0002 .notdef +!03 U+0003 .notdef +!04 U+0004 .notdef +!05 U+0005 .notdef +!06 U+0006 .notdef +!07 U+0007 .notdef +!08 U+0008 .notdef +!09 U+0009 .notdef +!0A U+000A .notdef +!0B U+000B .notdef +!0C U+000C .notdef +!0D U+000D .notdef +!0E U+000E .notdef +!0F U+000F .notdef +!10 U+0010 .notdef +!11 U+0011 .notdef +!12 U+0012 .notdef +!13 U+0013 .notdef +!14 U+0014 .notdef +!15 U+0015 .notdef +!16 U+0016 .notdef +!17 U+0017 .notdef +!18 U+0018 .notdef +!19 U+0019 .notdef +!1A U+001A .notdef +!1B U+001B .notdef +!1C U+001C .notdef +!1D U+001D .notdef +!1E U+001E .notdef +!1F U+001F .notdef +!20 U+0020 space +!21 U+0021 exclam +!22 U+0022 quotedbl +!23 U+0023 numbersign +!24 U+0024 dollar +!25 U+0025 percent +!26 U+0026 ampersand +!27 U+0027 quotesingle +!28 U+0028 parenleft +!29 U+0029 parenright +!2A U+002A asterisk +!2B U+002B plus +!2C U+002C comma +!2D U+002D hyphen +!2E U+002E period +!2F U+002F slash +!30 U+0030 zero +!31 U+0031 one +!32 U+0032 two +!33 U+0033 three +!34 U+0034 four +!35 U+0035 five +!36 U+0036 six +!37 U+0037 seven +!38 U+0038 eight +!39 U+0039 nine +!3A U+003A colon +!3B U+003B semicolon +!3C U+003C less +!3D U+003D equal +!3E U+003E greater +!3F U+003F question +!40 U+0040 at +!41 U+0041 A +!42 U+0042 B +!43 U+0043 C +!44 U+0044 D +!45 U+0045 E +!46 U+0046 F +!47 U+0047 G +!48 U+0048 H +!49 U+0049 I +!4A U+004A J +!4B U+004B K +!4C U+004C L +!4D U+004D M +!4E U+004E N +!4F U+004F O +!50 U+0050 P +!51 U+0051 Q +!52 U+0052 R +!53 U+0053 S +!54 U+0054 T +!55 U+0055 U +!56 U+0056 V +!57 U+0057 W +!58 U+0058 X +!59 U+0059 Y +!5A U+005A Z +!5B U+005B bracketleft +!5C U+005C backslash +!5D U+005D bracketright +!5E U+005E asciicircum +!5F U+005F underscore +!60 U+0060 grave +!61 U+0061 a +!62 U+0062 b +!63 U+0063 c +!64 U+0064 d +!65 U+0065 e +!66 U+0066 f +!67 U+0067 g +!68 U+0068 h +!69 U+0069 i +!6A U+006A j +!6B U+006B k +!6C U+006C l +!6D U+006D m +!6E U+006E n +!6F U+006F o +!70 U+0070 p +!71 U+0071 q +!72 U+0072 r +!73 U+0073 s +!74 U+0074 t +!75 U+0075 u +!76 U+0076 v +!77 U+0077 w +!78 U+0078 x +!79 U+0079 y +!7A U+007A z +!7B U+007B braceleft +!7C U+007C bar +!7D U+007D braceright +!7E U+007E asciitilde +!7F U+007F .notdef +!80 U+0080 .notdef +!81 U+0081 .notdef +!82 U+0082 .notdef +!83 U+0083 .notdef +!84 U+0084 .notdef +!85 U+0085 .notdef +!86 U+0086 .notdef +!87 U+0087 .notdef +!88 U+0088 .notdef +!89 U+0089 .notdef +!8A U+008A .notdef +!8B U+008B .notdef +!8C U+008C .notdef +!8D U+008D .notdef +!8E U+008E .notdef +!8F U+008F .notdef +!90 U+0090 .notdef +!91 U+0091 .notdef +!92 U+0092 .notdef +!93 U+0093 .notdef +!94 U+0094 .notdef +!95 U+0095 .notdef +!96 U+0096 .notdef +!97 U+0097 .notdef +!98 U+0098 .notdef +!99 U+0099 .notdef +!9A U+009A .notdef +!9B U+009B .notdef +!9C U+009C .notdef +!9D U+009D .notdef +!9E U+009E .notdef +!9F U+009F .notdef +!A0 U+00A0 space +!A1 U+0104 Aogonek +!A2 U+02D8 breve +!A3 U+0141 Lslash +!A4 U+00A4 currency +!A5 U+013D Lcaron +!A6 U+015A Sacute +!A7 U+00A7 section +!A8 U+00A8 dieresis +!A9 U+0160 Scaron +!AA U+015E Scedilla +!AB U+0164 Tcaron +!AC U+0179 Zacute +!AD U+00AD hyphen +!AE U+017D Zcaron +!AF U+017B Zdotaccent +!B0 U+00B0 degree +!B1 U+0105 aogonek +!B2 U+02DB ogonek +!B3 U+0142 lslash +!B4 U+00B4 acute +!B5 U+013E lcaron +!B6 U+015B sacute +!B7 U+02C7 caron +!B8 U+00B8 cedilla +!B9 U+0161 scaron +!BA U+015F scedilla +!BB U+0165 tcaron +!BC U+017A zacute +!BD U+02DD hungarumlaut +!BE U+017E zcaron +!BF U+017C zdotaccent +!C0 U+0154 Racute +!C1 U+00C1 Aacute +!C2 U+00C2 Acircumflex +!C3 U+0102 Abreve +!C4 U+00C4 Adieresis +!C5 U+0139 Lacute +!C6 U+0106 Cacute +!C7 U+00C7 Ccedilla +!C8 U+010C Ccaron +!C9 U+00C9 Eacute +!CA U+0118 Eogonek +!CB U+00CB Edieresis +!CC U+011A Ecaron +!CD U+00CD Iacute +!CE U+00CE Icircumflex +!CF U+010E Dcaron +!D0 U+0110 Dcroat +!D1 U+0143 Nacute +!D2 U+0147 Ncaron +!D3 U+00D3 Oacute +!D4 U+00D4 Ocircumflex +!D5 U+0150 Ohungarumlaut +!D6 U+00D6 Odieresis +!D7 U+00D7 multiply +!D8 U+0158 Rcaron +!D9 U+016E Uring +!DA U+00DA Uacute +!DB U+0170 Uhungarumlaut +!DC U+00DC Udieresis +!DD U+00DD Yacute +!DE U+0162 Tcommaaccent +!DF U+00DF germandbls +!E0 U+0155 racute +!E1 U+00E1 aacute +!E2 U+00E2 acircumflex +!E3 U+0103 abreve +!E4 U+00E4 adieresis +!E5 U+013A lacute +!E6 U+0107 cacute +!E7 U+00E7 ccedilla +!E8 U+010D ccaron +!E9 U+00E9 eacute +!EA U+0119 eogonek +!EB U+00EB edieresis +!EC U+011B ecaron +!ED U+00ED iacute +!EE U+00EE icircumflex +!EF U+010F dcaron +!F0 U+0111 dcroat +!F1 U+0144 nacute +!F2 U+0148 ncaron +!F3 U+00F3 oacute +!F4 U+00F4 ocircumflex +!F5 U+0151 ohungarumlaut +!F6 U+00F6 odieresis +!F7 U+00F7 divide +!F8 U+0159 rcaron +!F9 U+016F uring +!FA U+00FA uacute +!FB U+0171 uhungarumlaut +!FC U+00FC udieresis +!FD U+00FD yacute +!FE U+0163 tcommaaccent +!FF U+02D9 dotaccent diff --git a/webui/system/helper/fpdf16/font/makefont/iso-8859-4.map b/webui/system/helper/fpdf16/font/makefont/iso-8859-4.map new file mode 100755 index 00000000..a7d87bf3 --- /dev/null +++ b/webui/system/helper/fpdf16/font/makefont/iso-8859-4.map @@ -0,0 +1,256 @@ +!00 U+0000 .notdef +!01 U+0001 .notdef +!02 U+0002 .notdef +!03 U+0003 .notdef +!04 U+0004 .notdef +!05 U+0005 .notdef +!06 U+0006 .notdef +!07 U+0007 .notdef +!08 U+0008 .notdef +!09 U+0009 .notdef +!0A U+000A .notdef +!0B U+000B .notdef +!0C U+000C .notdef +!0D U+000D .notdef +!0E U+000E .notdef +!0F U+000F .notdef +!10 U+0010 .notdef +!11 U+0011 .notdef +!12 U+0012 .notdef +!13 U+0013 .notdef +!14 U+0014 .notdef +!15 U+0015 .notdef +!16 U+0016 .notdef +!17 U+0017 .notdef +!18 U+0018 .notdef +!19 U+0019 .notdef +!1A U+001A .notdef +!1B U+001B .notdef +!1C U+001C .notdef +!1D U+001D .notdef +!1E U+001E .notdef +!1F U+001F .notdef +!20 U+0020 space +!21 U+0021 exclam +!22 U+0022 quotedbl +!23 U+0023 numbersign +!24 U+0024 dollar +!25 U+0025 percent +!26 U+0026 ampersand +!27 U+0027 quotesingle +!28 U+0028 parenleft +!29 U+0029 parenright +!2A U+002A asterisk +!2B U+002B plus +!2C U+002C comma +!2D U+002D hyphen +!2E U+002E period +!2F U+002F slash +!30 U+0030 zero +!31 U+0031 one +!32 U+0032 two +!33 U+0033 three +!34 U+0034 four +!35 U+0035 five +!36 U+0036 six +!37 U+0037 seven +!38 U+0038 eight +!39 U+0039 nine +!3A U+003A colon +!3B U+003B semicolon +!3C U+003C less +!3D U+003D equal +!3E U+003E greater +!3F U+003F question +!40 U+0040 at +!41 U+0041 A +!42 U+0042 B +!43 U+0043 C +!44 U+0044 D +!45 U+0045 E +!46 U+0046 F +!47 U+0047 G +!48 U+0048 H +!49 U+0049 I +!4A U+004A J +!4B U+004B K +!4C U+004C L +!4D U+004D M +!4E U+004E N +!4F U+004F O +!50 U+0050 P +!51 U+0051 Q +!52 U+0052 R +!53 U+0053 S +!54 U+0054 T +!55 U+0055 U +!56 U+0056 V +!57 U+0057 W +!58 U+0058 X +!59 U+0059 Y +!5A U+005A Z +!5B U+005B bracketleft +!5C U+005C backslash +!5D U+005D bracketright +!5E U+005E asciicircum +!5F U+005F underscore +!60 U+0060 grave +!61 U+0061 a +!62 U+0062 b +!63 U+0063 c +!64 U+0064 d +!65 U+0065 e +!66 U+0066 f +!67 U+0067 g +!68 U+0068 h +!69 U+0069 i +!6A U+006A j +!6B U+006B k +!6C U+006C l +!6D U+006D m +!6E U+006E n +!6F U+006F o +!70 U+0070 p +!71 U+0071 q +!72 U+0072 r +!73 U+0073 s +!74 U+0074 t +!75 U+0075 u +!76 U+0076 v +!77 U+0077 w +!78 U+0078 x +!79 U+0079 y +!7A U+007A z +!7B U+007B braceleft +!7C U+007C bar +!7D U+007D braceright +!7E U+007E asciitilde +!7F U+007F .notdef +!80 U+0080 .notdef +!81 U+0081 .notdef +!82 U+0082 .notdef +!83 U+0083 .notdef +!84 U+0084 .notdef +!85 U+0085 .notdef +!86 U+0086 .notdef +!87 U+0087 .notdef +!88 U+0088 .notdef +!89 U+0089 .notdef +!8A U+008A .notdef +!8B U+008B .notdef +!8C U+008C .notdef +!8D U+008D .notdef +!8E U+008E .notdef +!8F U+008F .notdef +!90 U+0090 .notdef +!91 U+0091 .notdef +!92 U+0092 .notdef +!93 U+0093 .notdef +!94 U+0094 .notdef +!95 U+0095 .notdef +!96 U+0096 .notdef +!97 U+0097 .notdef +!98 U+0098 .notdef +!99 U+0099 .notdef +!9A U+009A .notdef +!9B U+009B .notdef +!9C U+009C .notdef +!9D U+009D .notdef +!9E U+009E .notdef +!9F U+009F .notdef +!A0 U+00A0 space +!A1 U+0104 Aogonek +!A2 U+0138 kgreenlandic +!A3 U+0156 Rcommaaccent +!A4 U+00A4 currency +!A5 U+0128 Itilde +!A6 U+013B Lcommaaccent +!A7 U+00A7 section +!A8 U+00A8 dieresis +!A9 U+0160 Scaron +!AA U+0112 Emacron +!AB U+0122 Gcommaaccent +!AC U+0166 Tbar +!AD U+00AD hyphen +!AE U+017D Zcaron +!AF U+00AF macron +!B0 U+00B0 degree +!B1 U+0105 aogonek +!B2 U+02DB ogonek +!B3 U+0157 rcommaaccent +!B4 U+00B4 acute +!B5 U+0129 itilde +!B6 U+013C lcommaaccent +!B7 U+02C7 caron +!B8 U+00B8 cedilla +!B9 U+0161 scaron +!BA U+0113 emacron +!BB U+0123 gcommaaccent +!BC U+0167 tbar +!BD U+014A Eng +!BE U+017E zcaron +!BF U+014B eng +!C0 U+0100 Amacron +!C1 U+00C1 Aacute +!C2 U+00C2 Acircumflex +!C3 U+00C3 Atilde +!C4 U+00C4 Adieresis +!C5 U+00C5 Aring +!C6 U+00C6 AE +!C7 U+012E Iogonek +!C8 U+010C Ccaron +!C9 U+00C9 Eacute +!CA U+0118 Eogonek +!CB U+00CB Edieresis +!CC U+0116 Edotaccent +!CD U+00CD Iacute +!CE U+00CE Icircumflex +!CF U+012A Imacron +!D0 U+0110 Dcroat +!D1 U+0145 Ncommaaccent +!D2 U+014C Omacron +!D3 U+0136 Kcommaaccent +!D4 U+00D4 Ocircumflex +!D5 U+00D5 Otilde +!D6 U+00D6 Odieresis +!D7 U+00D7 multiply +!D8 U+00D8 Oslash +!D9 U+0172 Uogonek +!DA U+00DA Uacute +!DB U+00DB Ucircumflex +!DC U+00DC Udieresis +!DD U+0168 Utilde +!DE U+016A Umacron +!DF U+00DF germandbls +!E0 U+0101 amacron +!E1 U+00E1 aacute +!E2 U+00E2 acircumflex +!E3 U+00E3 atilde +!E4 U+00E4 adieresis +!E5 U+00E5 aring +!E6 U+00E6 ae +!E7 U+012F iogonek +!E8 U+010D ccaron +!E9 U+00E9 eacute +!EA U+0119 eogonek +!EB U+00EB edieresis +!EC U+0117 edotaccent +!ED U+00ED iacute +!EE U+00EE icircumflex +!EF U+012B imacron +!F0 U+0111 dcroat +!F1 U+0146 ncommaaccent +!F2 U+014D omacron +!F3 U+0137 kcommaaccent +!F4 U+00F4 ocircumflex +!F5 U+00F5 otilde +!F6 U+00F6 odieresis +!F7 U+00F7 divide +!F8 U+00F8 oslash +!F9 U+0173 uogonek +!FA U+00FA uacute +!FB U+00FB ucircumflex +!FC U+00FC udieresis +!FD U+0169 utilde +!FE U+016B umacron +!FF U+02D9 dotaccent diff --git a/webui/system/helper/fpdf16/font/makefont/iso-8859-5.map b/webui/system/helper/fpdf16/font/makefont/iso-8859-5.map new file mode 100755 index 00000000..f9cd4edc --- /dev/null +++ b/webui/system/helper/fpdf16/font/makefont/iso-8859-5.map @@ -0,0 +1,256 @@ +!00 U+0000 .notdef +!01 U+0001 .notdef +!02 U+0002 .notdef +!03 U+0003 .notdef +!04 U+0004 .notdef +!05 U+0005 .notdef +!06 U+0006 .notdef +!07 U+0007 .notdef +!08 U+0008 .notdef +!09 U+0009 .notdef +!0A U+000A .notdef +!0B U+000B .notdef +!0C U+000C .notdef +!0D U+000D .notdef +!0E U+000E .notdef +!0F U+000F .notdef +!10 U+0010 .notdef +!11 U+0011 .notdef +!12 U+0012 .notdef +!13 U+0013 .notdef +!14 U+0014 .notdef +!15 U+0015 .notdef +!16 U+0016 .notdef +!17 U+0017 .notdef +!18 U+0018 .notdef +!19 U+0019 .notdef +!1A U+001A .notdef +!1B U+001B .notdef +!1C U+001C .notdef +!1D U+001D .notdef +!1E U+001E .notdef +!1F U+001F .notdef +!20 U+0020 space +!21 U+0021 exclam +!22 U+0022 quotedbl +!23 U+0023 numbersign +!24 U+0024 dollar +!25 U+0025 percent +!26 U+0026 ampersand +!27 U+0027 quotesingle +!28 U+0028 parenleft +!29 U+0029 parenright +!2A U+002A asterisk +!2B U+002B plus +!2C U+002C comma +!2D U+002D hyphen +!2E U+002E period +!2F U+002F slash +!30 U+0030 zero +!31 U+0031 one +!32 U+0032 two +!33 U+0033 three +!34 U+0034 four +!35 U+0035 five +!36 U+0036 six +!37 U+0037 seven +!38 U+0038 eight +!39 U+0039 nine +!3A U+003A colon +!3B U+003B semicolon +!3C U+003C less +!3D U+003D equal +!3E U+003E greater +!3F U+003F question +!40 U+0040 at +!41 U+0041 A +!42 U+0042 B +!43 U+0043 C +!44 U+0044 D +!45 U+0045 E +!46 U+0046 F +!47 U+0047 G +!48 U+0048 H +!49 U+0049 I +!4A U+004A J +!4B U+004B K +!4C U+004C L +!4D U+004D M +!4E U+004E N +!4F U+004F O +!50 U+0050 P +!51 U+0051 Q +!52 U+0052 R +!53 U+0053 S +!54 U+0054 T +!55 U+0055 U +!56 U+0056 V +!57 U+0057 W +!58 U+0058 X +!59 U+0059 Y +!5A U+005A Z +!5B U+005B bracketleft +!5C U+005C backslash +!5D U+005D bracketright +!5E U+005E asciicircum +!5F U+005F underscore +!60 U+0060 grave +!61 U+0061 a +!62 U+0062 b +!63 U+0063 c +!64 U+0064 d +!65 U+0065 e +!66 U+0066 f +!67 U+0067 g +!68 U+0068 h +!69 U+0069 i +!6A U+006A j +!6B U+006B k +!6C U+006C l +!6D U+006D m +!6E U+006E n +!6F U+006F o +!70 U+0070 p +!71 U+0071 q +!72 U+0072 r +!73 U+0073 s +!74 U+0074 t +!75 U+0075 u +!76 U+0076 v +!77 U+0077 w +!78 U+0078 x +!79 U+0079 y +!7A U+007A z +!7B U+007B braceleft +!7C U+007C bar +!7D U+007D braceright +!7E U+007E asciitilde +!7F U+007F .notdef +!80 U+0080 .notdef +!81 U+0081 .notdef +!82 U+0082 .notdef +!83 U+0083 .notdef +!84 U+0084 .notdef +!85 U+0085 .notdef +!86 U+0086 .notdef +!87 U+0087 .notdef +!88 U+0088 .notdef +!89 U+0089 .notdef +!8A U+008A .notdef +!8B U+008B .notdef +!8C U+008C .notdef +!8D U+008D .notdef +!8E U+008E .notdef +!8F U+008F .notdef +!90 U+0090 .notdef +!91 U+0091 .notdef +!92 U+0092 .notdef +!93 U+0093 .notdef +!94 U+0094 .notdef +!95 U+0095 .notdef +!96 U+0096 .notdef +!97 U+0097 .notdef +!98 U+0098 .notdef +!99 U+0099 .notdef +!9A U+009A .notdef +!9B U+009B .notdef +!9C U+009C .notdef +!9D U+009D .notdef +!9E U+009E .notdef +!9F U+009F .notdef +!A0 U+00A0 space +!A1 U+0401 afii10023 +!A2 U+0402 afii10051 +!A3 U+0403 afii10052 +!A4 U+0404 afii10053 +!A5 U+0405 afii10054 +!A6 U+0406 afii10055 +!A7 U+0407 afii10056 +!A8 U+0408 afii10057 +!A9 U+0409 afii10058 +!AA U+040A afii10059 +!AB U+040B afii10060 +!AC U+040C afii10061 +!AD U+00AD hyphen +!AE U+040E afii10062 +!AF U+040F afii10145 +!B0 U+0410 afii10017 +!B1 U+0411 afii10018 +!B2 U+0412 afii10019 +!B3 U+0413 afii10020 +!B4 U+0414 afii10021 +!B5 U+0415 afii10022 +!B6 U+0416 afii10024 +!B7 U+0417 afii10025 +!B8 U+0418 afii10026 +!B9 U+0419 afii10027 +!BA U+041A afii10028 +!BB U+041B afii10029 +!BC U+041C afii10030 +!BD U+041D afii10031 +!BE U+041E afii10032 +!BF U+041F afii10033 +!C0 U+0420 afii10034 +!C1 U+0421 afii10035 +!C2 U+0422 afii10036 +!C3 U+0423 afii10037 +!C4 U+0424 afii10038 +!C5 U+0425 afii10039 +!C6 U+0426 afii10040 +!C7 U+0427 afii10041 +!C8 U+0428 afii10042 +!C9 U+0429 afii10043 +!CA U+042A afii10044 +!CB U+042B afii10045 +!CC U+042C afii10046 +!CD U+042D afii10047 +!CE U+042E afii10048 +!CF U+042F afii10049 +!D0 U+0430 afii10065 +!D1 U+0431 afii10066 +!D2 U+0432 afii10067 +!D3 U+0433 afii10068 +!D4 U+0434 afii10069 +!D5 U+0435 afii10070 +!D6 U+0436 afii10072 +!D7 U+0437 afii10073 +!D8 U+0438 afii10074 +!D9 U+0439 afii10075 +!DA U+043A afii10076 +!DB U+043B afii10077 +!DC U+043C afii10078 +!DD U+043D afii10079 +!DE U+043E afii10080 +!DF U+043F afii10081 +!E0 U+0440 afii10082 +!E1 U+0441 afii10083 +!E2 U+0442 afii10084 +!E3 U+0443 afii10085 +!E4 U+0444 afii10086 +!E5 U+0445 afii10087 +!E6 U+0446 afii10088 +!E7 U+0447 afii10089 +!E8 U+0448 afii10090 +!E9 U+0449 afii10091 +!EA U+044A afii10092 +!EB U+044B afii10093 +!EC U+044C afii10094 +!ED U+044D afii10095 +!EE U+044E afii10096 +!EF U+044F afii10097 +!F0 U+2116 afii61352 +!F1 U+0451 afii10071 +!F2 U+0452 afii10099 +!F3 U+0453 afii10100 +!F4 U+0454 afii10101 +!F5 U+0455 afii10102 +!F6 U+0456 afii10103 +!F7 U+0457 afii10104 +!F8 U+0458 afii10105 +!F9 U+0459 afii10106 +!FA U+045A afii10107 +!FB U+045B afii10108 +!FC U+045C afii10109 +!FD U+00A7 section +!FE U+045E afii10110 +!FF U+045F afii10193 diff --git a/webui/system/helper/fpdf16/font/makefont/iso-8859-7.map b/webui/system/helper/fpdf16/font/makefont/iso-8859-7.map new file mode 100755 index 00000000..e163796b --- /dev/null +++ b/webui/system/helper/fpdf16/font/makefont/iso-8859-7.map @@ -0,0 +1,250 @@ +!00 U+0000 .notdef +!01 U+0001 .notdef +!02 U+0002 .notdef +!03 U+0003 .notdef +!04 U+0004 .notdef +!05 U+0005 .notdef +!06 U+0006 .notdef +!07 U+0007 .notdef +!08 U+0008 .notdef +!09 U+0009 .notdef +!0A U+000A .notdef +!0B U+000B .notdef +!0C U+000C .notdef +!0D U+000D .notdef +!0E U+000E .notdef +!0F U+000F .notdef +!10 U+0010 .notdef +!11 U+0011 .notdef +!12 U+0012 .notdef +!13 U+0013 .notdef +!14 U+0014 .notdef +!15 U+0015 .notdef +!16 U+0016 .notdef +!17 U+0017 .notdef +!18 U+0018 .notdef +!19 U+0019 .notdef +!1A U+001A .notdef +!1B U+001B .notdef +!1C U+001C .notdef +!1D U+001D .notdef +!1E U+001E .notdef +!1F U+001F .notdef +!20 U+0020 space +!21 U+0021 exclam +!22 U+0022 quotedbl +!23 U+0023 numbersign +!24 U+0024 dollar +!25 U+0025 percent +!26 U+0026 ampersand +!27 U+0027 quotesingle +!28 U+0028 parenleft +!29 U+0029 parenright +!2A U+002A asterisk +!2B U+002B plus +!2C U+002C comma +!2D U+002D hyphen +!2E U+002E period +!2F U+002F slash +!30 U+0030 zero +!31 U+0031 one +!32 U+0032 two +!33 U+0033 three +!34 U+0034 four +!35 U+0035 five +!36 U+0036 six +!37 U+0037 seven +!38 U+0038 eight +!39 U+0039 nine +!3A U+003A colon +!3B U+003B semicolon +!3C U+003C less +!3D U+003D equal +!3E U+003E greater +!3F U+003F question +!40 U+0040 at +!41 U+0041 A +!42 U+0042 B +!43 U+0043 C +!44 U+0044 D +!45 U+0045 E +!46 U+0046 F +!47 U+0047 G +!48 U+0048 H +!49 U+0049 I +!4A U+004A J +!4B U+004B K +!4C U+004C L +!4D U+004D M +!4E U+004E N +!4F U+004F O +!50 U+0050 P +!51 U+0051 Q +!52 U+0052 R +!53 U+0053 S +!54 U+0054 T +!55 U+0055 U +!56 U+0056 V +!57 U+0057 W +!58 U+0058 X +!59 U+0059 Y +!5A U+005A Z +!5B U+005B bracketleft +!5C U+005C backslash +!5D U+005D bracketright +!5E U+005E asciicircum +!5F U+005F underscore +!60 U+0060 grave +!61 U+0061 a +!62 U+0062 b +!63 U+0063 c +!64 U+0064 d +!65 U+0065 e +!66 U+0066 f +!67 U+0067 g +!68 U+0068 h +!69 U+0069 i +!6A U+006A j +!6B U+006B k +!6C U+006C l +!6D U+006D m +!6E U+006E n +!6F U+006F o +!70 U+0070 p +!71 U+0071 q +!72 U+0072 r +!73 U+0073 s +!74 U+0074 t +!75 U+0075 u +!76 U+0076 v +!77 U+0077 w +!78 U+0078 x +!79 U+0079 y +!7A U+007A z +!7B U+007B braceleft +!7C U+007C bar +!7D U+007D braceright +!7E U+007E asciitilde +!7F U+007F .notdef +!80 U+0080 .notdef +!81 U+0081 .notdef +!82 U+0082 .notdef +!83 U+0083 .notdef +!84 U+0084 .notdef +!85 U+0085 .notdef +!86 U+0086 .notdef +!87 U+0087 .notdef +!88 U+0088 .notdef +!89 U+0089 .notdef +!8A U+008A .notdef +!8B U+008B .notdef +!8C U+008C .notdef +!8D U+008D .notdef +!8E U+008E .notdef +!8F U+008F .notdef +!90 U+0090 .notdef +!91 U+0091 .notdef +!92 U+0092 .notdef +!93 U+0093 .notdef +!94 U+0094 .notdef +!95 U+0095 .notdef +!96 U+0096 .notdef +!97 U+0097 .notdef +!98 U+0098 .notdef +!99 U+0099 .notdef +!9A U+009A .notdef +!9B U+009B .notdef +!9C U+009C .notdef +!9D U+009D .notdef +!9E U+009E .notdef +!9F U+009F .notdef +!A0 U+00A0 space +!A1 U+2018 quoteleft +!A2 U+2019 quoteright +!A3 U+00A3 sterling +!A6 U+00A6 brokenbar +!A7 U+00A7 section +!A8 U+00A8 dieresis +!A9 U+00A9 copyright +!AB U+00AB guillemotleft +!AC U+00AC logicalnot +!AD U+00AD hyphen +!AF U+2015 afii00208 +!B0 U+00B0 degree +!B1 U+00B1 plusminus +!B2 U+00B2 twosuperior +!B3 U+00B3 threesuperior +!B4 U+0384 tonos +!B5 U+0385 dieresistonos +!B6 U+0386 Alphatonos +!B7 U+00B7 periodcentered +!B8 U+0388 Epsilontonos +!B9 U+0389 Etatonos +!BA U+038A Iotatonos +!BB U+00BB guillemotright +!BC U+038C Omicrontonos +!BD U+00BD onehalf +!BE U+038E Upsilontonos +!BF U+038F Omegatonos +!C0 U+0390 iotadieresistonos +!C1 U+0391 Alpha +!C2 U+0392 Beta +!C3 U+0393 Gamma +!C4 U+0394 Delta +!C5 U+0395 Epsilon +!C6 U+0396 Zeta +!C7 U+0397 Eta +!C8 U+0398 Theta +!C9 U+0399 Iota +!CA U+039A Kappa +!CB U+039B Lambda +!CC U+039C Mu +!CD U+039D Nu +!CE U+039E Xi +!CF U+039F Omicron +!D0 U+03A0 Pi +!D1 U+03A1 Rho +!D3 U+03A3 Sigma +!D4 U+03A4 Tau +!D5 U+03A5 Upsilon +!D6 U+03A6 Phi +!D7 U+03A7 Chi +!D8 U+03A8 Psi +!D9 U+03A9 Omega +!DA U+03AA Iotadieresis +!DB U+03AB Upsilondieresis +!DC U+03AC alphatonos +!DD U+03AD epsilontonos +!DE U+03AE etatonos +!DF U+03AF iotatonos +!E0 U+03B0 upsilondieresistonos +!E1 U+03B1 alpha +!E2 U+03B2 beta +!E3 U+03B3 gamma +!E4 U+03B4 delta +!E5 U+03B5 epsilon +!E6 U+03B6 zeta +!E7 U+03B7 eta +!E8 U+03B8 theta +!E9 U+03B9 iota +!EA U+03BA kappa +!EB U+03BB lambda +!EC U+03BC mu +!ED U+03BD nu +!EE U+03BE xi +!EF U+03BF omicron +!F0 U+03C0 pi +!F1 U+03C1 rho +!F2 U+03C2 sigma1 +!F3 U+03C3 sigma +!F4 U+03C4 tau +!F5 U+03C5 upsilon +!F6 U+03C6 phi +!F7 U+03C7 chi +!F8 U+03C8 psi +!F9 U+03C9 omega +!FA U+03CA iotadieresis +!FB U+03CB upsilondieresis +!FC U+03CC omicrontonos +!FD U+03CD upsilontonos +!FE U+03CE omegatonos diff --git a/webui/system/helper/fpdf16/font/makefont/iso-8859-9.map b/webui/system/helper/fpdf16/font/makefont/iso-8859-9.map new file mode 100755 index 00000000..48c123ae --- /dev/null +++ b/webui/system/helper/fpdf16/font/makefont/iso-8859-9.map @@ -0,0 +1,256 @@ +!00 U+0000 .notdef +!01 U+0001 .notdef +!02 U+0002 .notdef +!03 U+0003 .notdef +!04 U+0004 .notdef +!05 U+0005 .notdef +!06 U+0006 .notdef +!07 U+0007 .notdef +!08 U+0008 .notdef +!09 U+0009 .notdef +!0A U+000A .notdef +!0B U+000B .notdef +!0C U+000C .notdef +!0D U+000D .notdef +!0E U+000E .notdef +!0F U+000F .notdef +!10 U+0010 .notdef +!11 U+0011 .notdef +!12 U+0012 .notdef +!13 U+0013 .notdef +!14 U+0014 .notdef +!15 U+0015 .notdef +!16 U+0016 .notdef +!17 U+0017 .notdef +!18 U+0018 .notdef +!19 U+0019 .notdef +!1A U+001A .notdef +!1B U+001B .notdef +!1C U+001C .notdef +!1D U+001D .notdef +!1E U+001E .notdef +!1F U+001F .notdef +!20 U+0020 space +!21 U+0021 exclam +!22 U+0022 quotedbl +!23 U+0023 numbersign +!24 U+0024 dollar +!25 U+0025 percent +!26 U+0026 ampersand +!27 U+0027 quotesingle +!28 U+0028 parenleft +!29 U+0029 parenright +!2A U+002A asterisk +!2B U+002B plus +!2C U+002C comma +!2D U+002D hyphen +!2E U+002E period +!2F U+002F slash +!30 U+0030 zero +!31 U+0031 one +!32 U+0032 two +!33 U+0033 three +!34 U+0034 four +!35 U+0035 five +!36 U+0036 six +!37 U+0037 seven +!38 U+0038 eight +!39 U+0039 nine +!3A U+003A colon +!3B U+003B semicolon +!3C U+003C less +!3D U+003D equal +!3E U+003E greater +!3F U+003F question +!40 U+0040 at +!41 U+0041 A +!42 U+0042 B +!43 U+0043 C +!44 U+0044 D +!45 U+0045 E +!46 U+0046 F +!47 U+0047 G +!48 U+0048 H +!49 U+0049 I +!4A U+004A J +!4B U+004B K +!4C U+004C L +!4D U+004D M +!4E U+004E N +!4F U+004F O +!50 U+0050 P +!51 U+0051 Q +!52 U+0052 R +!53 U+0053 S +!54 U+0054 T +!55 U+0055 U +!56 U+0056 V +!57 U+0057 W +!58 U+0058 X +!59 U+0059 Y +!5A U+005A Z +!5B U+005B bracketleft +!5C U+005C backslash +!5D U+005D bracketright +!5E U+005E asciicircum +!5F U+005F underscore +!60 U+0060 grave +!61 U+0061 a +!62 U+0062 b +!63 U+0063 c +!64 U+0064 d +!65 U+0065 e +!66 U+0066 f +!67 U+0067 g +!68 U+0068 h +!69 U+0069 i +!6A U+006A j +!6B U+006B k +!6C U+006C l +!6D U+006D m +!6E U+006E n +!6F U+006F o +!70 U+0070 p +!71 U+0071 q +!72 U+0072 r +!73 U+0073 s +!74 U+0074 t +!75 U+0075 u +!76 U+0076 v +!77 U+0077 w +!78 U+0078 x +!79 U+0079 y +!7A U+007A z +!7B U+007B braceleft +!7C U+007C bar +!7D U+007D braceright +!7E U+007E asciitilde +!7F U+007F .notdef +!80 U+0080 .notdef +!81 U+0081 .notdef +!82 U+0082 .notdef +!83 U+0083 .notdef +!84 U+0084 .notdef +!85 U+0085 .notdef +!86 U+0086 .notdef +!87 U+0087 .notdef +!88 U+0088 .notdef +!89 U+0089 .notdef +!8A U+008A .notdef +!8B U+008B .notdef +!8C U+008C .notdef +!8D U+008D .notdef +!8E U+008E .notdef +!8F U+008F .notdef +!90 U+0090 .notdef +!91 U+0091 .notdef +!92 U+0092 .notdef +!93 U+0093 .notdef +!94 U+0094 .notdef +!95 U+0095 .notdef +!96 U+0096 .notdef +!97 U+0097 .notdef +!98 U+0098 .notdef +!99 U+0099 .notdef +!9A U+009A .notdef +!9B U+009B .notdef +!9C U+009C .notdef +!9D U+009D .notdef +!9E U+009E .notdef +!9F U+009F .notdef +!A0 U+00A0 space +!A1 U+00A1 exclamdown +!A2 U+00A2 cent +!A3 U+00A3 sterling +!A4 U+00A4 currency +!A5 U+00A5 yen +!A6 U+00A6 brokenbar +!A7 U+00A7 section +!A8 U+00A8 dieresis +!A9 U+00A9 copyright +!AA U+00AA ordfeminine +!AB U+00AB guillemotleft +!AC U+00AC logicalnot +!AD U+00AD hyphen +!AE U+00AE registered +!AF U+00AF macron +!B0 U+00B0 degree +!B1 U+00B1 plusminus +!B2 U+00B2 twosuperior +!B3 U+00B3 threesuperior +!B4 U+00B4 acute +!B5 U+00B5 mu +!B6 U+00B6 paragraph +!B7 U+00B7 periodcentered +!B8 U+00B8 cedilla +!B9 U+00B9 onesuperior +!BA U+00BA ordmasculine +!BB U+00BB guillemotright +!BC U+00BC onequarter +!BD U+00BD onehalf +!BE U+00BE threequarters +!BF U+00BF questiondown +!C0 U+00C0 Agrave +!C1 U+00C1 Aacute +!C2 U+00C2 Acircumflex +!C3 U+00C3 Atilde +!C4 U+00C4 Adieresis +!C5 U+00C5 Aring +!C6 U+00C6 AE +!C7 U+00C7 Ccedilla +!C8 U+00C8 Egrave +!C9 U+00C9 Eacute +!CA U+00CA Ecircumflex +!CB U+00CB Edieresis +!CC U+00CC Igrave +!CD U+00CD Iacute +!CE U+00CE Icircumflex +!CF U+00CF Idieresis +!D0 U+011E Gbreve +!D1 U+00D1 Ntilde +!D2 U+00D2 Ograve +!D3 U+00D3 Oacute +!D4 U+00D4 Ocircumflex +!D5 U+00D5 Otilde +!D6 U+00D6 Odieresis +!D7 U+00D7 multiply +!D8 U+00D8 Oslash +!D9 U+00D9 Ugrave +!DA U+00DA Uacute +!DB U+00DB Ucircumflex +!DC U+00DC Udieresis +!DD U+0130 Idotaccent +!DE U+015E Scedilla +!DF U+00DF germandbls +!E0 U+00E0 agrave +!E1 U+00E1 aacute +!E2 U+00E2 acircumflex +!E3 U+00E3 atilde +!E4 U+00E4 adieresis +!E5 U+00E5 aring +!E6 U+00E6 ae +!E7 U+00E7 ccedilla +!E8 U+00E8 egrave +!E9 U+00E9 eacute +!EA U+00EA ecircumflex +!EB U+00EB edieresis +!EC U+00EC igrave +!ED U+00ED iacute +!EE U+00EE icircumflex +!EF U+00EF idieresis +!F0 U+011F gbreve +!F1 U+00F1 ntilde +!F2 U+00F2 ograve +!F3 U+00F3 oacute +!F4 U+00F4 ocircumflex +!F5 U+00F5 otilde +!F6 U+00F6 odieresis +!F7 U+00F7 divide +!F8 U+00F8 oslash +!F9 U+00F9 ugrave +!FA U+00FA uacute +!FB U+00FB ucircumflex +!FC U+00FC udieresis +!FD U+0131 dotlessi +!FE U+015F scedilla +!FF U+00FF ydieresis diff --git a/webui/system/helper/fpdf16/font/makefont/koi8-r.map b/webui/system/helper/fpdf16/font/makefont/koi8-r.map new file mode 100755 index 00000000..6ad5d05d --- /dev/null +++ b/webui/system/helper/fpdf16/font/makefont/koi8-r.map @@ -0,0 +1,256 @@ +!00 U+0000 .notdef +!01 U+0001 .notdef +!02 U+0002 .notdef +!03 U+0003 .notdef +!04 U+0004 .notdef +!05 U+0005 .notdef +!06 U+0006 .notdef +!07 U+0007 .notdef +!08 U+0008 .notdef +!09 U+0009 .notdef +!0A U+000A .notdef +!0B U+000B .notdef +!0C U+000C .notdef +!0D U+000D .notdef +!0E U+000E .notdef +!0F U+000F .notdef +!10 U+0010 .notdef +!11 U+0011 .notdef +!12 U+0012 .notdef +!13 U+0013 .notdef +!14 U+0014 .notdef +!15 U+0015 .notdef +!16 U+0016 .notdef +!17 U+0017 .notdef +!18 U+0018 .notdef +!19 U+0019 .notdef +!1A U+001A .notdef +!1B U+001B .notdef +!1C U+001C .notdef +!1D U+001D .notdef +!1E U+001E .notdef +!1F U+001F .notdef +!20 U+0020 space +!21 U+0021 exclam +!22 U+0022 quotedbl +!23 U+0023 numbersign +!24 U+0024 dollar +!25 U+0025 percent +!26 U+0026 ampersand +!27 U+0027 quotesingle +!28 U+0028 parenleft +!29 U+0029 parenright +!2A U+002A asterisk +!2B U+002B plus +!2C U+002C comma +!2D U+002D hyphen +!2E U+002E period +!2F U+002F slash +!30 U+0030 zero +!31 U+0031 one +!32 U+0032 two +!33 U+0033 three +!34 U+0034 four +!35 U+0035 five +!36 U+0036 six +!37 U+0037 seven +!38 U+0038 eight +!39 U+0039 nine +!3A U+003A colon +!3B U+003B semicolon +!3C U+003C less +!3D U+003D equal +!3E U+003E greater +!3F U+003F question +!40 U+0040 at +!41 U+0041 A +!42 U+0042 B +!43 U+0043 C +!44 U+0044 D +!45 U+0045 E +!46 U+0046 F +!47 U+0047 G +!48 U+0048 H +!49 U+0049 I +!4A U+004A J +!4B U+004B K +!4C U+004C L +!4D U+004D M +!4E U+004E N +!4F U+004F O +!50 U+0050 P +!51 U+0051 Q +!52 U+0052 R +!53 U+0053 S +!54 U+0054 T +!55 U+0055 U +!56 U+0056 V +!57 U+0057 W +!58 U+0058 X +!59 U+0059 Y +!5A U+005A Z +!5B U+005B bracketleft +!5C U+005C backslash +!5D U+005D bracketright +!5E U+005E asciicircum +!5F U+005F underscore +!60 U+0060 grave +!61 U+0061 a +!62 U+0062 b +!63 U+0063 c +!64 U+0064 d +!65 U+0065 e +!66 U+0066 f +!67 U+0067 g +!68 U+0068 h +!69 U+0069 i +!6A U+006A j +!6B U+006B k +!6C U+006C l +!6D U+006D m +!6E U+006E n +!6F U+006F o +!70 U+0070 p +!71 U+0071 q +!72 U+0072 r +!73 U+0073 s +!74 U+0074 t +!75 U+0075 u +!76 U+0076 v +!77 U+0077 w +!78 U+0078 x +!79 U+0079 y +!7A U+007A z +!7B U+007B braceleft +!7C U+007C bar +!7D U+007D braceright +!7E U+007E asciitilde +!7F U+007F .notdef +!80 U+2500 SF100000 +!81 U+2502 SF110000 +!82 U+250C SF010000 +!83 U+2510 SF030000 +!84 U+2514 SF020000 +!85 U+2518 SF040000 +!86 U+251C SF080000 +!87 U+2524 SF090000 +!88 U+252C SF060000 +!89 U+2534 SF070000 +!8A U+253C SF050000 +!8B U+2580 upblock +!8C U+2584 dnblock +!8D U+2588 block +!8E U+258C lfblock +!8F U+2590 rtblock +!90 U+2591 ltshade +!91 U+2592 shade +!92 U+2593 dkshade +!93 U+2320 integraltp +!94 U+25A0 filledbox +!95 U+2219 periodcentered +!96 U+221A radical +!97 U+2248 approxequal +!98 U+2264 lessequal +!99 U+2265 greaterequal +!9A U+00A0 space +!9B U+2321 integralbt +!9C U+00B0 degree +!9D U+00B2 twosuperior +!9E U+00B7 periodcentered +!9F U+00F7 divide +!A0 U+2550 SF430000 +!A1 U+2551 SF240000 +!A2 U+2552 SF510000 +!A3 U+0451 afii10071 +!A4 U+2553 SF520000 +!A5 U+2554 SF390000 +!A6 U+2555 SF220000 +!A7 U+2556 SF210000 +!A8 U+2557 SF250000 +!A9 U+2558 SF500000 +!AA U+2559 SF490000 +!AB U+255A SF380000 +!AC U+255B SF280000 +!AD U+255C SF270000 +!AE U+255D SF260000 +!AF U+255E SF360000 +!B0 U+255F SF370000 +!B1 U+2560 SF420000 +!B2 U+2561 SF190000 +!B3 U+0401 afii10023 +!B4 U+2562 SF200000 +!B5 U+2563 SF230000 +!B6 U+2564 SF470000 +!B7 U+2565 SF480000 +!B8 U+2566 SF410000 +!B9 U+2567 SF450000 +!BA U+2568 SF460000 +!BB U+2569 SF400000 +!BC U+256A SF540000 +!BD U+256B SF530000 +!BE U+256C SF440000 +!BF U+00A9 copyright +!C0 U+044E afii10096 +!C1 U+0430 afii10065 +!C2 U+0431 afii10066 +!C3 U+0446 afii10088 +!C4 U+0434 afii10069 +!C5 U+0435 afii10070 +!C6 U+0444 afii10086 +!C7 U+0433 afii10068 +!C8 U+0445 afii10087 +!C9 U+0438 afii10074 +!CA U+0439 afii10075 +!CB U+043A afii10076 +!CC U+043B afii10077 +!CD U+043C afii10078 +!CE U+043D afii10079 +!CF U+043E afii10080 +!D0 U+043F afii10081 +!D1 U+044F afii10097 +!D2 U+0440 afii10082 +!D3 U+0441 afii10083 +!D4 U+0442 afii10084 +!D5 U+0443 afii10085 +!D6 U+0436 afii10072 +!D7 U+0432 afii10067 +!D8 U+044C afii10094 +!D9 U+044B afii10093 +!DA U+0437 afii10073 +!DB U+0448 afii10090 +!DC U+044D afii10095 +!DD U+0449 afii10091 +!DE U+0447 afii10089 +!DF U+044A afii10092 +!E0 U+042E afii10048 +!E1 U+0410 afii10017 +!E2 U+0411 afii10018 +!E3 U+0426 afii10040 +!E4 U+0414 afii10021 +!E5 U+0415 afii10022 +!E6 U+0424 afii10038 +!E7 U+0413 afii10020 +!E8 U+0425 afii10039 +!E9 U+0418 afii10026 +!EA U+0419 afii10027 +!EB U+041A afii10028 +!EC U+041B afii10029 +!ED U+041C afii10030 +!EE U+041D afii10031 +!EF U+041E afii10032 +!F0 U+041F afii10033 +!F1 U+042F afii10049 +!F2 U+0420 afii10034 +!F3 U+0421 afii10035 +!F4 U+0422 afii10036 +!F5 U+0423 afii10037 +!F6 U+0416 afii10024 +!F7 U+0412 afii10019 +!F8 U+042C afii10046 +!F9 U+042B afii10045 +!FA U+0417 afii10025 +!FB U+0428 afii10042 +!FC U+042D afii10047 +!FD U+0429 afii10043 +!FE U+0427 afii10041 +!FF U+042A afii10044 diff --git a/webui/system/helper/fpdf16/font/makefont/koi8-u.map b/webui/system/helper/fpdf16/font/makefont/koi8-u.map new file mode 100755 index 00000000..40a7e4fd --- /dev/null +++ b/webui/system/helper/fpdf16/font/makefont/koi8-u.map @@ -0,0 +1,256 @@ +!00 U+0000 .notdef +!01 U+0001 .notdef +!02 U+0002 .notdef +!03 U+0003 .notdef +!04 U+0004 .notdef +!05 U+0005 .notdef +!06 U+0006 .notdef +!07 U+0007 .notdef +!08 U+0008 .notdef +!09 U+0009 .notdef +!0A U+000A .notdef +!0B U+000B .notdef +!0C U+000C .notdef +!0D U+000D .notdef +!0E U+000E .notdef +!0F U+000F .notdef +!10 U+0010 .notdef +!11 U+0011 .notdef +!12 U+0012 .notdef +!13 U+0013 .notdef +!14 U+0014 .notdef +!15 U+0015 .notdef +!16 U+0016 .notdef +!17 U+0017 .notdef +!18 U+0018 .notdef +!19 U+0019 .notdef +!1A U+001A .notdef +!1B U+001B .notdef +!1C U+001C .notdef +!1D U+001D .notdef +!1E U+001E .notdef +!1F U+001F .notdef +!20 U+0020 space +!21 U+0021 exclam +!22 U+0022 quotedbl +!23 U+0023 numbersign +!24 U+0024 dollar +!25 U+0025 percent +!26 U+0026 ampersand +!27 U+0027 quotesingle +!28 U+0028 parenleft +!29 U+0029 parenright +!2A U+002A asterisk +!2B U+002B plus +!2C U+002C comma +!2D U+002D hyphen +!2E U+002E period +!2F U+002F slash +!30 U+0030 zero +!31 U+0031 one +!32 U+0032 two +!33 U+0033 three +!34 U+0034 four +!35 U+0035 five +!36 U+0036 six +!37 U+0037 seven +!38 U+0038 eight +!39 U+0039 nine +!3A U+003A colon +!3B U+003B semicolon +!3C U+003C less +!3D U+003D equal +!3E U+003E greater +!3F U+003F question +!40 U+0040 at +!41 U+0041 A +!42 U+0042 B +!43 U+0043 C +!44 U+0044 D +!45 U+0045 E +!46 U+0046 F +!47 U+0047 G +!48 U+0048 H +!49 U+0049 I +!4A U+004A J +!4B U+004B K +!4C U+004C L +!4D U+004D M +!4E U+004E N +!4F U+004F O +!50 U+0050 P +!51 U+0051 Q +!52 U+0052 R +!53 U+0053 S +!54 U+0054 T +!55 U+0055 U +!56 U+0056 V +!57 U+0057 W +!58 U+0058 X +!59 U+0059 Y +!5A U+005A Z +!5B U+005B bracketleft +!5C U+005C backslash +!5D U+005D bracketright +!5E U+005E asciicircum +!5F U+005F underscore +!60 U+0060 grave +!61 U+0061 a +!62 U+0062 b +!63 U+0063 c +!64 U+0064 d +!65 U+0065 e +!66 U+0066 f +!67 U+0067 g +!68 U+0068 h +!69 U+0069 i +!6A U+006A j +!6B U+006B k +!6C U+006C l +!6D U+006D m +!6E U+006E n +!6F U+006F o +!70 U+0070 p +!71 U+0071 q +!72 U+0072 r +!73 U+0073 s +!74 U+0074 t +!75 U+0075 u +!76 U+0076 v +!77 U+0077 w +!78 U+0078 x +!79 U+0079 y +!7A U+007A z +!7B U+007B braceleft +!7C U+007C bar +!7D U+007D braceright +!7E U+007E asciitilde +!7F U+007F .notdef +!80 U+2500 SF100000 +!81 U+2502 SF110000 +!82 U+250C SF010000 +!83 U+2510 SF030000 +!84 U+2514 SF020000 +!85 U+2518 SF040000 +!86 U+251C SF080000 +!87 U+2524 SF090000 +!88 U+252C SF060000 +!89 U+2534 SF070000 +!8A U+253C SF050000 +!8B U+2580 upblock +!8C U+2584 dnblock +!8D U+2588 block +!8E U+258C lfblock +!8F U+2590 rtblock +!90 U+2591 ltshade +!91 U+2592 shade +!92 U+2593 dkshade +!93 U+2320 integraltp +!94 U+25A0 filledbox +!95 U+2022 bullet +!96 U+221A radical +!97 U+2248 approxequal +!98 U+2264 lessequal +!99 U+2265 greaterequal +!9A U+00A0 space +!9B U+2321 integralbt +!9C U+00B0 degree +!9D U+00B2 twosuperior +!9E U+00B7 periodcentered +!9F U+00F7 divide +!A0 U+2550 SF430000 +!A1 U+2551 SF240000 +!A2 U+2552 SF510000 +!A3 U+0451 afii10071 +!A4 U+0454 afii10101 +!A5 U+2554 SF390000 +!A6 U+0456 afii10103 +!A7 U+0457 afii10104 +!A8 U+2557 SF250000 +!A9 U+2558 SF500000 +!AA U+2559 SF490000 +!AB U+255A SF380000 +!AC U+255B SF280000 +!AD U+0491 afii10098 +!AE U+255D SF260000 +!AF U+255E SF360000 +!B0 U+255F SF370000 +!B1 U+2560 SF420000 +!B2 U+2561 SF190000 +!B3 U+0401 afii10023 +!B4 U+0404 afii10053 +!B5 U+2563 SF230000 +!B6 U+0406 afii10055 +!B7 U+0407 afii10056 +!B8 U+2566 SF410000 +!B9 U+2567 SF450000 +!BA U+2568 SF460000 +!BB U+2569 SF400000 +!BC U+256A SF540000 +!BD U+0490 afii10050 +!BE U+256C SF440000 +!BF U+00A9 copyright +!C0 U+044E afii10096 +!C1 U+0430 afii10065 +!C2 U+0431 afii10066 +!C3 U+0446 afii10088 +!C4 U+0434 afii10069 +!C5 U+0435 afii10070 +!C6 U+0444 afii10086 +!C7 U+0433 afii10068 +!C8 U+0445 afii10087 +!C9 U+0438 afii10074 +!CA U+0439 afii10075 +!CB U+043A afii10076 +!CC U+043B afii10077 +!CD U+043C afii10078 +!CE U+043D afii10079 +!CF U+043E afii10080 +!D0 U+043F afii10081 +!D1 U+044F afii10097 +!D2 U+0440 afii10082 +!D3 U+0441 afii10083 +!D4 U+0442 afii10084 +!D5 U+0443 afii10085 +!D6 U+0436 afii10072 +!D7 U+0432 afii10067 +!D8 U+044C afii10094 +!D9 U+044B afii10093 +!DA U+0437 afii10073 +!DB U+0448 afii10090 +!DC U+044D afii10095 +!DD U+0449 afii10091 +!DE U+0447 afii10089 +!DF U+044A afii10092 +!E0 U+042E afii10048 +!E1 U+0410 afii10017 +!E2 U+0411 afii10018 +!E3 U+0426 afii10040 +!E4 U+0414 afii10021 +!E5 U+0415 afii10022 +!E6 U+0424 afii10038 +!E7 U+0413 afii10020 +!E8 U+0425 afii10039 +!E9 U+0418 afii10026 +!EA U+0419 afii10027 +!EB U+041A afii10028 +!EC U+041B afii10029 +!ED U+041C afii10030 +!EE U+041D afii10031 +!EF U+041E afii10032 +!F0 U+041F afii10033 +!F1 U+042F afii10049 +!F2 U+0420 afii10034 +!F3 U+0421 afii10035 +!F4 U+0422 afii10036 +!F5 U+0423 afii10037 +!F6 U+0416 afii10024 +!F7 U+0412 afii10019 +!F8 U+042C afii10046 +!F9 U+042B afii10045 +!FA U+0417 afii10025 +!FB U+0428 afii10042 +!FC U+042D afii10047 +!FD U+0429 afii10043 +!FE U+0427 afii10041 +!FF U+042A afii10044 diff --git a/webui/system/helper/fpdf16/font/makefont/makefont.php b/webui/system/helper/fpdf16/font/makefont/makefont.php new file mode 100755 index 00000000..7e7ed564 --- /dev/null +++ b/webui/system/helper/fpdf16/font/makefont/makefont.php @@ -0,0 +1,419 @@ +Error: encoding not found: '.$enc); + $cc2gn=array(); + foreach($a as $l) + { + if($l[0]=='!') + { + $e=preg_split('/[ \\t]+/',rtrim($l)); + $cc=hexdec(substr($e[0],1)); + $gn=$e[2]; + $cc2gn[$cc]=$gn; + } + } + for($i=0;$i<=255;$i++) + { + if(!isset($cc2gn[$i])) + $cc2gn[$i]='.notdef'; + } + return $cc2gn; +} + +function ReadAFM($file, &$map) +{ + //Read a font metric file + $a=file($file); + if(empty($a)) + die('File not found'); + $widths=array(); + $fm=array(); + $fix=array('Edot'=>'Edotaccent','edot'=>'edotaccent','Idot'=>'Idotaccent','Zdot'=>'Zdotaccent','zdot'=>'zdotaccent', + 'Odblacute'=>'Ohungarumlaut','odblacute'=>'ohungarumlaut','Udblacute'=>'Uhungarumlaut','udblacute'=>'uhungarumlaut', + 'Gcedilla'=>'Gcommaaccent','gcedilla'=>'gcommaaccent','Kcedilla'=>'Kcommaaccent','kcedilla'=>'kcommaaccent', + 'Lcedilla'=>'Lcommaaccent','lcedilla'=>'lcommaaccent','Ncedilla'=>'Ncommaaccent','ncedilla'=>'ncommaaccent', + 'Rcedilla'=>'Rcommaaccent','rcedilla'=>'rcommaaccent','Scedilla'=>'Scommaaccent','scedilla'=>'scommaaccent', + 'Tcedilla'=>'Tcommaaccent','tcedilla'=>'tcommaaccent','Dslash'=>'Dcroat','dslash'=>'dcroat','Dmacron'=>'Dcroat','dmacron'=>'dcroat', + 'combininggraveaccent'=>'gravecomb','combininghookabove'=>'hookabovecomb','combiningtildeaccent'=>'tildecomb', + 'combiningacuteaccent'=>'acutecomb','combiningdotbelow'=>'dotbelowcomb','dongsign'=>'dong'); + foreach($a as $l) + { + $e=explode(' ',rtrim($l)); + if(count($e)<2) + continue; + $code=$e[0]; + $param=$e[1]; + if($code=='C') + { + //Character metrics + $cc=(int)$e[1]; + $w=$e[4]; + $gn=$e[7]; + if(substr($gn,-4)=='20AC') + $gn='Euro'; + if(isset($fix[$gn])) + { + //Fix incorrect glyph name + foreach($map as $c=>$n) + { + if($n==$fix[$gn]) + $map[$c]=$gn; + } + } + if(empty($map)) + { + //Symbolic font: use built-in encoding + $widths[$cc]=$w; + } + else + { + $widths[$gn]=$w; + if($gn=='X') + $fm['CapXHeight']=$e[13]; + } + if($gn=='.notdef') + $fm['MissingWidth']=$w; + } + elseif($code=='FontName') + $fm['FontName']=$param; + elseif($code=='Weight') + $fm['Weight']=$param; + elseif($code=='ItalicAngle') + $fm['ItalicAngle']=(double)$param; + elseif($code=='Ascender') + $fm['Ascender']=(int)$param; + elseif($code=='Descender') + $fm['Descender']=(int)$param; + elseif($code=='UnderlineThickness') + $fm['UnderlineThickness']=(int)$param; + elseif($code=='UnderlinePosition') + $fm['UnderlinePosition']=(int)$param; + elseif($code=='IsFixedPitch') + $fm['IsFixedPitch']=($param=='true'); + elseif($code=='FontBBox') + $fm['FontBBox']=array($e[1],$e[2],$e[3],$e[4]); + elseif($code=='CapHeight') + $fm['CapHeight']=(int)$param; + elseif($code=='StdVW') + $fm['StdVW']=(int)$param; + } + if(!isset($fm['FontName'])) + die('FontName not found'); + if(!empty($map)) + { + if(!isset($widths['.notdef'])) + $widths['.notdef']=600; + if(!isset($widths['Delta']) && isset($widths['increment'])) + $widths['Delta']=$widths['increment']; + //Order widths according to map + for($i=0;$i<=255;$i++) + { + if(!isset($widths[$map[$i]])) + { + echo 'Warning: character '.$map[$i].' is missing
'; + $widths[$i]=$widths['.notdef']; + } + else + $widths[$i]=$widths[$map[$i]]; + } + } + $fm['Widths']=$widths; + return $fm; +} + +function MakeFontDescriptor($fm, $symbolic) +{ + //Ascent + $asc=(isset($fm['Ascender']) ? $fm['Ascender'] : 1000); + $fd="array('Ascent'=>".$asc; + //Descent + $desc=(isset($fm['Descender']) ? $fm['Descender'] : -200); + $fd.=",'Descent'=>".$desc; + //CapHeight + if(isset($fm['CapHeight'])) + $ch=$fm['CapHeight']; + elseif(isset($fm['CapXHeight'])) + $ch=$fm['CapXHeight']; + else + $ch=$asc; + $fd.=",'CapHeight'=>".$ch; + //Flags + $flags=0; + if(isset($fm['IsFixedPitch']) && $fm['IsFixedPitch']) + $flags+=1<<0; + if($symbolic) + $flags+=1<<2; + if(!$symbolic) + $flags+=1<<5; + if(isset($fm['ItalicAngle']) && $fm['ItalicAngle']!=0) + $flags+=1<<6; + $fd.=",'Flags'=>".$flags; + //FontBBox + if(isset($fm['FontBBox'])) + $fbb=$fm['FontBBox']; + else + $fbb=array(0,$desc-100,1000,$asc+100); + $fd.=",'FontBBox'=>'[".$fbb[0].' '.$fbb[1].' '.$fbb[2].' '.$fbb[3]."]'"; + //ItalicAngle + $ia=(isset($fm['ItalicAngle']) ? $fm['ItalicAngle'] : 0); + $fd.=",'ItalicAngle'=>".$ia; + //StemV + if(isset($fm['StdVW'])) + $stemv=$fm['StdVW']; + elseif(isset($fm['Weight']) && preg_match('/bold|black/i',$fm['Weight'])) + $stemv=120; + else + $stemv=70; + $fd.=",'StemV'=>".$stemv; + //MissingWidth + if(isset($fm['MissingWidth'])) + $fd.=",'MissingWidth'=>".$fm['MissingWidth']; + $fd.=')'; + return $fd; +} + +function MakeWidthArray($fm) +{ + //Make character width array + $s="array(\n\t"; + $cw=$fm['Widths']; + for($i=0;$i<=255;$i++) + { + if(chr($i)=="'") + $s.="'\\''"; + elseif(chr($i)=="\\") + $s.="'\\\\'"; + elseif($i>=32 && $i<=126) + $s.="'".chr($i)."'"; + else + $s.="chr($i)"; + $s.='=>'.$fm['Widths'][$i]; + if($i<255) + $s.=','; + if(($i+1)%22==0) + $s.="\n\t"; + } + $s.=')'; + return $s; +} + +function MakeFontEncoding($map) +{ + //Build differences from reference encoding + $ref=ReadMap('cp1252'); + $s=''; + $last=0; + for($i=32;$i<=255;$i++) + { + if($map[$i]!=$ref[$i]) + { + if($i!=$last+1) + $s.=$i.' '; + $last=$i; + $s.='/'.$map[$i].' '; + } + } + return rtrim($s); +} + +function SaveToFile($file, $s, $mode) +{ + $f=fopen($file,'w'.$mode); + if(!$f) + die('Can\'t write to file '.$file); + fwrite($f,$s,strlen($s)); + fclose($f); +} + +function ReadShort($f) +{ + $a=unpack('n1n',fread($f,2)); + return $a['n']; +} + +function ReadLong($f) +{ + $a=unpack('N1N',fread($f,4)); + return $a['N']; +} + +function CheckTTF($file) +{ + //Check if font license allows embedding + $f=fopen($file,'rb'); + if(!$f) + die('Error: Can\'t open '.$file); + //Extract number of tables + fseek($f,4,SEEK_CUR); + $nb=ReadShort($f); + fseek($f,6,SEEK_CUR); + //Seek OS/2 table + $found=false; + for($i=0;$i<$nb;$i++) + { + if(fread($f,4)=='OS/2') + { + $found=true; + break; + } + fseek($f,12,SEEK_CUR); + } + if(!$found) + { + fclose($f); + return; + } + fseek($f,4,SEEK_CUR); + $offset=ReadLong($f); + fseek($f,$offset,SEEK_SET); + //Extract fsType flags + fseek($f,8,SEEK_CUR); + $fsType=ReadShort($f); + $rl=($fsType & 0x02)!=0; + $pp=($fsType & 0x04)!=0; + $e=($fsType & 0x08)!=0; + fclose($f); + if($rl && !$pp && !$e) + echo 'Warning: font license does not allow embedding'; +} + +/******************************************************************************* +* fontfile: path to TTF file (or empty string if not to be embedded) * +* afmfile: path to AFM file * +* enc: font encoding (or empty string for symbolic fonts) * +* patch: optional patch for encoding * +* type: font type if fontfile is empty * +*******************************************************************************/ +function MakeFont($fontfile, $afmfile, $enc='cp1252', $patch=array(), $type='TrueType') +{ + //Generate a font definition file + if(get_magic_quotes_runtime()) + @set_magic_quotes_runtime(0); + ini_set('auto_detect_line_endings','1'); + if($enc) + { + $map=ReadMap($enc); + foreach($patch as $cc=>$gn) + $map[$cc]=$gn; + } + else + $map=array(); + if(!file_exists($afmfile)) + die('Error: AFM file not found: '.$afmfile); + $fm=ReadAFM($afmfile,$map); + if($enc) + $diff=MakeFontEncoding($map); + else + $diff=''; + $fd=MakeFontDescriptor($fm,empty($map)); + //Find font type + if($fontfile) + { + $ext=strtolower(substr($fontfile,-3)); + if($ext=='ttf') + $type='TrueType'; + elseif($ext=='pfb') + $type='Type1'; + else + die('Error: unrecognized font file extension: '.$ext); + } + else + { + if($type!='TrueType' && $type!='Type1') + die('Error: incorrect font type: '.$type); + } + //Start generation + $s='Error: font file not found: '.$fontfile); + if($type=='TrueType') + CheckTTF($fontfile); + $f=fopen($fontfile,'rb'); + if(!$f) + die('Error: Can\'t open '.$fontfile); + $file=fread($f,filesize($fontfile)); + fclose($f); + if($type=='Type1') + { + //Find first two sections and discard third one + $header=(ord($file[0])==128); + if($header) + { + //Strip first binary header + $file=substr($file,6); + } + $pos=strpos($file,'eexec'); + if(!$pos) + die('Error: font file does not seem to be valid Type1'); + $size1=$pos+6; + if($header && ord($file[$size1])==128) + { + //Strip second binary header + $file=substr($file,0,$size1).substr($file,$size1+6); + } + $pos=strpos($file,'00000000'); + if(!$pos) + die('Error: font file does not seem to be valid Type1'); + $size2=$pos-$size1; + $file=substr($file,0,$size1+$size2); + } + if(function_exists('gzcompress')) + { + $cmp=$basename.'.z'; + SaveToFile($cmp,gzcompress($file),'b'); + $s.='$file=\''.$cmp."';\n"; + echo 'Font file compressed ('.$cmp.')
'; + } + else + { + $s.='$file=\''.basename($fontfile)."';\n"; + echo 'Notice: font file could not be compressed (zlib extension not available)
'; + } + if($type=='Type1') + { + $s.='$size1='.$size1.";\n"; + $s.='$size2='.$size2.";\n"; + } + else + $s.='$originalsize='.filesize($fontfile).";\n"; + } + else + { + //Not embedded font + $s.='$file='."'';\n"; + } + $s.="?>\n"; + SaveToFile($basename.'.php',$s,'t'); + echo 'Font definition file generated ('.$basename.'.php'.')
'; +} +?> diff --git a/webui/system/helper/fpdf16/font/symbol.php b/webui/system/helper/fpdf16/font/symbol.php new file mode 100755 index 00000000..43b50e45 --- /dev/null +++ b/webui/system/helper/fpdf16/font/symbol.php @@ -0,0 +1,15 @@ +250,chr(1)=>250,chr(2)=>250,chr(3)=>250,chr(4)=>250,chr(5)=>250,chr(6)=>250,chr(7)=>250,chr(8)=>250,chr(9)=>250,chr(10)=>250,chr(11)=>250,chr(12)=>250,chr(13)=>250,chr(14)=>250,chr(15)=>250,chr(16)=>250,chr(17)=>250,chr(18)=>250,chr(19)=>250,chr(20)=>250,chr(21)=>250, + chr(22)=>250,chr(23)=>250,chr(24)=>250,chr(25)=>250,chr(26)=>250,chr(27)=>250,chr(28)=>250,chr(29)=>250,chr(30)=>250,chr(31)=>250,' '=>250,'!'=>333,'"'=>713,'#'=>500,'$'=>549,'%'=>833,'&'=>778,'\''=>439,'('=>333,')'=>333,'*'=>500,'+'=>549, + ','=>250,'-'=>549,'.'=>250,'/'=>278,'0'=>500,'1'=>500,'2'=>500,'3'=>500,'4'=>500,'5'=>500,'6'=>500,'7'=>500,'8'=>500,'9'=>500,':'=>278,';'=>278,'<'=>549,'='=>549,'>'=>549,'?'=>444,'@'=>549,'A'=>722, + 'B'=>667,'C'=>722,'D'=>612,'E'=>611,'F'=>763,'G'=>603,'H'=>722,'I'=>333,'J'=>631,'K'=>722,'L'=>686,'M'=>889,'N'=>722,'O'=>722,'P'=>768,'Q'=>741,'R'=>556,'S'=>592,'T'=>611,'U'=>690,'V'=>439,'W'=>768, + 'X'=>645,'Y'=>795,'Z'=>611,'['=>333,'\\'=>863,']'=>333,'^'=>658,'_'=>500,'`'=>500,'a'=>631,'b'=>549,'c'=>549,'d'=>494,'e'=>439,'f'=>521,'g'=>411,'h'=>603,'i'=>329,'j'=>603,'k'=>549,'l'=>549,'m'=>576, + 'n'=>521,'o'=>549,'p'=>549,'q'=>521,'r'=>549,'s'=>603,'t'=>439,'u'=>576,'v'=>713,'w'=>686,'x'=>493,'y'=>686,'z'=>494,'{'=>480,'|'=>200,'}'=>480,'~'=>549,chr(127)=>0,chr(128)=>0,chr(129)=>0,chr(130)=>0,chr(131)=>0, + chr(132)=>0,chr(133)=>0,chr(134)=>0,chr(135)=>0,chr(136)=>0,chr(137)=>0,chr(138)=>0,chr(139)=>0,chr(140)=>0,chr(141)=>0,chr(142)=>0,chr(143)=>0,chr(144)=>0,chr(145)=>0,chr(146)=>0,chr(147)=>0,chr(148)=>0,chr(149)=>0,chr(150)=>0,chr(151)=>0,chr(152)=>0,chr(153)=>0, + chr(154)=>0,chr(155)=>0,chr(156)=>0,chr(157)=>0,chr(158)=>0,chr(159)=>0,chr(160)=>750,chr(161)=>620,chr(162)=>247,chr(163)=>549,chr(164)=>167,chr(165)=>713,chr(166)=>500,chr(167)=>753,chr(168)=>753,chr(169)=>753,chr(170)=>753,chr(171)=>1042,chr(172)=>987,chr(173)=>603,chr(174)=>987,chr(175)=>603, + chr(176)=>400,chr(177)=>549,chr(178)=>411,chr(179)=>549,chr(180)=>549,chr(181)=>713,chr(182)=>494,chr(183)=>460,chr(184)=>549,chr(185)=>549,chr(186)=>549,chr(187)=>549,chr(188)=>1000,chr(189)=>603,chr(190)=>1000,chr(191)=>658,chr(192)=>823,chr(193)=>686,chr(194)=>795,chr(195)=>987,chr(196)=>768,chr(197)=>768, + chr(198)=>823,chr(199)=>768,chr(200)=>768,chr(201)=>713,chr(202)=>713,chr(203)=>713,chr(204)=>713,chr(205)=>713,chr(206)=>713,chr(207)=>713,chr(208)=>768,chr(209)=>713,chr(210)=>790,chr(211)=>790,chr(212)=>890,chr(213)=>823,chr(214)=>549,chr(215)=>250,chr(216)=>713,chr(217)=>603,chr(218)=>603,chr(219)=>1042, + chr(220)=>987,chr(221)=>603,chr(222)=>987,chr(223)=>603,chr(224)=>494,chr(225)=>329,chr(226)=>790,chr(227)=>790,chr(228)=>786,chr(229)=>713,chr(230)=>384,chr(231)=>384,chr(232)=>384,chr(233)=>384,chr(234)=>384,chr(235)=>384,chr(236)=>494,chr(237)=>494,chr(238)=>494,chr(239)=>494,chr(240)=>0,chr(241)=>329, + chr(242)=>274,chr(243)=>686,chr(244)=>686,chr(245)=>686,chr(246)=>384,chr(247)=>384,chr(248)=>384,chr(249)=>384,chr(250)=>384,chr(251)=>384,chr(252)=>494,chr(253)=>494,chr(254)=>494,chr(255)=>0); +?> diff --git a/webui/system/helper/fpdf16/font/times.php b/webui/system/helper/fpdf16/font/times.php new file mode 100755 index 00000000..837c706e --- /dev/null +++ b/webui/system/helper/fpdf16/font/times.php @@ -0,0 +1,15 @@ +250,chr(1)=>250,chr(2)=>250,chr(3)=>250,chr(4)=>250,chr(5)=>250,chr(6)=>250,chr(7)=>250,chr(8)=>250,chr(9)=>250,chr(10)=>250,chr(11)=>250,chr(12)=>250,chr(13)=>250,chr(14)=>250,chr(15)=>250,chr(16)=>250,chr(17)=>250,chr(18)=>250,chr(19)=>250,chr(20)=>250,chr(21)=>250, + chr(22)=>250,chr(23)=>250,chr(24)=>250,chr(25)=>250,chr(26)=>250,chr(27)=>250,chr(28)=>250,chr(29)=>250,chr(30)=>250,chr(31)=>250,' '=>250,'!'=>333,'"'=>408,'#'=>500,'$'=>500,'%'=>833,'&'=>778,'\''=>180,'('=>333,')'=>333,'*'=>500,'+'=>564, + ','=>250,'-'=>333,'.'=>250,'/'=>278,'0'=>500,'1'=>500,'2'=>500,'3'=>500,'4'=>500,'5'=>500,'6'=>500,'7'=>500,'8'=>500,'9'=>500,':'=>278,';'=>278,'<'=>564,'='=>564,'>'=>564,'?'=>444,'@'=>921,'A'=>722, + 'B'=>667,'C'=>667,'D'=>722,'E'=>611,'F'=>556,'G'=>722,'H'=>722,'I'=>333,'J'=>389,'K'=>722,'L'=>611,'M'=>889,'N'=>722,'O'=>722,'P'=>556,'Q'=>722,'R'=>667,'S'=>556,'T'=>611,'U'=>722,'V'=>722,'W'=>944, + 'X'=>722,'Y'=>722,'Z'=>611,'['=>333,'\\'=>278,']'=>333,'^'=>469,'_'=>500,'`'=>333,'a'=>444,'b'=>500,'c'=>444,'d'=>500,'e'=>444,'f'=>333,'g'=>500,'h'=>500,'i'=>278,'j'=>278,'k'=>500,'l'=>278,'m'=>778, + 'n'=>500,'o'=>500,'p'=>500,'q'=>500,'r'=>333,'s'=>389,'t'=>278,'u'=>500,'v'=>500,'w'=>722,'x'=>500,'y'=>500,'z'=>444,'{'=>480,'|'=>200,'}'=>480,'~'=>541,chr(127)=>350,chr(128)=>500,chr(129)=>350,chr(130)=>333,chr(131)=>500, + chr(132)=>444,chr(133)=>1000,chr(134)=>500,chr(135)=>500,chr(136)=>333,chr(137)=>1000,chr(138)=>556,chr(139)=>333,chr(140)=>889,chr(141)=>350,chr(142)=>611,chr(143)=>350,chr(144)=>350,chr(145)=>333,chr(146)=>333,chr(147)=>444,chr(148)=>444,chr(149)=>350,chr(150)=>500,chr(151)=>1000,chr(152)=>333,chr(153)=>980, + chr(154)=>389,chr(155)=>333,chr(156)=>722,chr(157)=>350,chr(158)=>444,chr(159)=>722,chr(160)=>250,chr(161)=>333,chr(162)=>500,chr(163)=>500,chr(164)=>500,chr(165)=>500,chr(166)=>200,chr(167)=>500,chr(168)=>333,chr(169)=>760,chr(170)=>276,chr(171)=>500,chr(172)=>564,chr(173)=>333,chr(174)=>760,chr(175)=>333, + chr(176)=>400,chr(177)=>564,chr(178)=>300,chr(179)=>300,chr(180)=>333,chr(181)=>500,chr(182)=>453,chr(183)=>250,chr(184)=>333,chr(185)=>300,chr(186)=>310,chr(187)=>500,chr(188)=>750,chr(189)=>750,chr(190)=>750,chr(191)=>444,chr(192)=>722,chr(193)=>722,chr(194)=>722,chr(195)=>722,chr(196)=>722,chr(197)=>722, + chr(198)=>889,chr(199)=>667,chr(200)=>611,chr(201)=>611,chr(202)=>611,chr(203)=>611,chr(204)=>333,chr(205)=>333,chr(206)=>333,chr(207)=>333,chr(208)=>722,chr(209)=>722,chr(210)=>722,chr(211)=>722,chr(212)=>722,chr(213)=>722,chr(214)=>722,chr(215)=>564,chr(216)=>722,chr(217)=>722,chr(218)=>722,chr(219)=>722, + chr(220)=>722,chr(221)=>722,chr(222)=>556,chr(223)=>500,chr(224)=>444,chr(225)=>444,chr(226)=>444,chr(227)=>444,chr(228)=>444,chr(229)=>444,chr(230)=>667,chr(231)=>444,chr(232)=>444,chr(233)=>444,chr(234)=>444,chr(235)=>444,chr(236)=>278,chr(237)=>278,chr(238)=>278,chr(239)=>278,chr(240)=>500,chr(241)=>500, + chr(242)=>500,chr(243)=>500,chr(244)=>500,chr(245)=>500,chr(246)=>500,chr(247)=>564,chr(248)=>500,chr(249)=>500,chr(250)=>500,chr(251)=>500,chr(252)=>500,chr(253)=>500,chr(254)=>500,chr(255)=>500); +?> diff --git a/webui/system/helper/fpdf16/font/timesb.php b/webui/system/helper/fpdf16/font/timesb.php new file mode 100755 index 00000000..09cff86a --- /dev/null +++ b/webui/system/helper/fpdf16/font/timesb.php @@ -0,0 +1,15 @@ +250,chr(1)=>250,chr(2)=>250,chr(3)=>250,chr(4)=>250,chr(5)=>250,chr(6)=>250,chr(7)=>250,chr(8)=>250,chr(9)=>250,chr(10)=>250,chr(11)=>250,chr(12)=>250,chr(13)=>250,chr(14)=>250,chr(15)=>250,chr(16)=>250,chr(17)=>250,chr(18)=>250,chr(19)=>250,chr(20)=>250,chr(21)=>250, + chr(22)=>250,chr(23)=>250,chr(24)=>250,chr(25)=>250,chr(26)=>250,chr(27)=>250,chr(28)=>250,chr(29)=>250,chr(30)=>250,chr(31)=>250,' '=>250,'!'=>333,'"'=>555,'#'=>500,'$'=>500,'%'=>1000,'&'=>833,'\''=>278,'('=>333,')'=>333,'*'=>500,'+'=>570, + ','=>250,'-'=>333,'.'=>250,'/'=>278,'0'=>500,'1'=>500,'2'=>500,'3'=>500,'4'=>500,'5'=>500,'6'=>500,'7'=>500,'8'=>500,'9'=>500,':'=>333,';'=>333,'<'=>570,'='=>570,'>'=>570,'?'=>500,'@'=>930,'A'=>722, + 'B'=>667,'C'=>722,'D'=>722,'E'=>667,'F'=>611,'G'=>778,'H'=>778,'I'=>389,'J'=>500,'K'=>778,'L'=>667,'M'=>944,'N'=>722,'O'=>778,'P'=>611,'Q'=>778,'R'=>722,'S'=>556,'T'=>667,'U'=>722,'V'=>722,'W'=>1000, + 'X'=>722,'Y'=>722,'Z'=>667,'['=>333,'\\'=>278,']'=>333,'^'=>581,'_'=>500,'`'=>333,'a'=>500,'b'=>556,'c'=>444,'d'=>556,'e'=>444,'f'=>333,'g'=>500,'h'=>556,'i'=>278,'j'=>333,'k'=>556,'l'=>278,'m'=>833, + 'n'=>556,'o'=>500,'p'=>556,'q'=>556,'r'=>444,'s'=>389,'t'=>333,'u'=>556,'v'=>500,'w'=>722,'x'=>500,'y'=>500,'z'=>444,'{'=>394,'|'=>220,'}'=>394,'~'=>520,chr(127)=>350,chr(128)=>500,chr(129)=>350,chr(130)=>333,chr(131)=>500, + chr(132)=>500,chr(133)=>1000,chr(134)=>500,chr(135)=>500,chr(136)=>333,chr(137)=>1000,chr(138)=>556,chr(139)=>333,chr(140)=>1000,chr(141)=>350,chr(142)=>667,chr(143)=>350,chr(144)=>350,chr(145)=>333,chr(146)=>333,chr(147)=>500,chr(148)=>500,chr(149)=>350,chr(150)=>500,chr(151)=>1000,chr(152)=>333,chr(153)=>1000, + chr(154)=>389,chr(155)=>333,chr(156)=>722,chr(157)=>350,chr(158)=>444,chr(159)=>722,chr(160)=>250,chr(161)=>333,chr(162)=>500,chr(163)=>500,chr(164)=>500,chr(165)=>500,chr(166)=>220,chr(167)=>500,chr(168)=>333,chr(169)=>747,chr(170)=>300,chr(171)=>500,chr(172)=>570,chr(173)=>333,chr(174)=>747,chr(175)=>333, + chr(176)=>400,chr(177)=>570,chr(178)=>300,chr(179)=>300,chr(180)=>333,chr(181)=>556,chr(182)=>540,chr(183)=>250,chr(184)=>333,chr(185)=>300,chr(186)=>330,chr(187)=>500,chr(188)=>750,chr(189)=>750,chr(190)=>750,chr(191)=>500,chr(192)=>722,chr(193)=>722,chr(194)=>722,chr(195)=>722,chr(196)=>722,chr(197)=>722, + chr(198)=>1000,chr(199)=>722,chr(200)=>667,chr(201)=>667,chr(202)=>667,chr(203)=>667,chr(204)=>389,chr(205)=>389,chr(206)=>389,chr(207)=>389,chr(208)=>722,chr(209)=>722,chr(210)=>778,chr(211)=>778,chr(212)=>778,chr(213)=>778,chr(214)=>778,chr(215)=>570,chr(216)=>778,chr(217)=>722,chr(218)=>722,chr(219)=>722, + chr(220)=>722,chr(221)=>722,chr(222)=>611,chr(223)=>556,chr(224)=>500,chr(225)=>500,chr(226)=>500,chr(227)=>500,chr(228)=>500,chr(229)=>500,chr(230)=>722,chr(231)=>444,chr(232)=>444,chr(233)=>444,chr(234)=>444,chr(235)=>444,chr(236)=>278,chr(237)=>278,chr(238)=>278,chr(239)=>278,chr(240)=>500,chr(241)=>556, + chr(242)=>500,chr(243)=>500,chr(244)=>500,chr(245)=>500,chr(246)=>500,chr(247)=>570,chr(248)=>500,chr(249)=>556,chr(250)=>556,chr(251)=>556,chr(252)=>556,chr(253)=>500,chr(254)=>556,chr(255)=>500); +?> diff --git a/webui/system/helper/fpdf16/font/timesbi.php b/webui/system/helper/fpdf16/font/timesbi.php new file mode 100755 index 00000000..b4e38d76 --- /dev/null +++ b/webui/system/helper/fpdf16/font/timesbi.php @@ -0,0 +1,15 @@ +250,chr(1)=>250,chr(2)=>250,chr(3)=>250,chr(4)=>250,chr(5)=>250,chr(6)=>250,chr(7)=>250,chr(8)=>250,chr(9)=>250,chr(10)=>250,chr(11)=>250,chr(12)=>250,chr(13)=>250,chr(14)=>250,chr(15)=>250,chr(16)=>250,chr(17)=>250,chr(18)=>250,chr(19)=>250,chr(20)=>250,chr(21)=>250, + chr(22)=>250,chr(23)=>250,chr(24)=>250,chr(25)=>250,chr(26)=>250,chr(27)=>250,chr(28)=>250,chr(29)=>250,chr(30)=>250,chr(31)=>250,' '=>250,'!'=>389,'"'=>555,'#'=>500,'$'=>500,'%'=>833,'&'=>778,'\''=>278,'('=>333,')'=>333,'*'=>500,'+'=>570, + ','=>250,'-'=>333,'.'=>250,'/'=>278,'0'=>500,'1'=>500,'2'=>500,'3'=>500,'4'=>500,'5'=>500,'6'=>500,'7'=>500,'8'=>500,'9'=>500,':'=>333,';'=>333,'<'=>570,'='=>570,'>'=>570,'?'=>500,'@'=>832,'A'=>667, + 'B'=>667,'C'=>667,'D'=>722,'E'=>667,'F'=>667,'G'=>722,'H'=>778,'I'=>389,'J'=>500,'K'=>667,'L'=>611,'M'=>889,'N'=>722,'O'=>722,'P'=>611,'Q'=>722,'R'=>667,'S'=>556,'T'=>611,'U'=>722,'V'=>667,'W'=>889, + 'X'=>667,'Y'=>611,'Z'=>611,'['=>333,'\\'=>278,']'=>333,'^'=>570,'_'=>500,'`'=>333,'a'=>500,'b'=>500,'c'=>444,'d'=>500,'e'=>444,'f'=>333,'g'=>500,'h'=>556,'i'=>278,'j'=>278,'k'=>500,'l'=>278,'m'=>778, + 'n'=>556,'o'=>500,'p'=>500,'q'=>500,'r'=>389,'s'=>389,'t'=>278,'u'=>556,'v'=>444,'w'=>667,'x'=>500,'y'=>444,'z'=>389,'{'=>348,'|'=>220,'}'=>348,'~'=>570,chr(127)=>350,chr(128)=>500,chr(129)=>350,chr(130)=>333,chr(131)=>500, + chr(132)=>500,chr(133)=>1000,chr(134)=>500,chr(135)=>500,chr(136)=>333,chr(137)=>1000,chr(138)=>556,chr(139)=>333,chr(140)=>944,chr(141)=>350,chr(142)=>611,chr(143)=>350,chr(144)=>350,chr(145)=>333,chr(146)=>333,chr(147)=>500,chr(148)=>500,chr(149)=>350,chr(150)=>500,chr(151)=>1000,chr(152)=>333,chr(153)=>1000, + chr(154)=>389,chr(155)=>333,chr(156)=>722,chr(157)=>350,chr(158)=>389,chr(159)=>611,chr(160)=>250,chr(161)=>389,chr(162)=>500,chr(163)=>500,chr(164)=>500,chr(165)=>500,chr(166)=>220,chr(167)=>500,chr(168)=>333,chr(169)=>747,chr(170)=>266,chr(171)=>500,chr(172)=>606,chr(173)=>333,chr(174)=>747,chr(175)=>333, + chr(176)=>400,chr(177)=>570,chr(178)=>300,chr(179)=>300,chr(180)=>333,chr(181)=>576,chr(182)=>500,chr(183)=>250,chr(184)=>333,chr(185)=>300,chr(186)=>300,chr(187)=>500,chr(188)=>750,chr(189)=>750,chr(190)=>750,chr(191)=>500,chr(192)=>667,chr(193)=>667,chr(194)=>667,chr(195)=>667,chr(196)=>667,chr(197)=>667, + chr(198)=>944,chr(199)=>667,chr(200)=>667,chr(201)=>667,chr(202)=>667,chr(203)=>667,chr(204)=>389,chr(205)=>389,chr(206)=>389,chr(207)=>389,chr(208)=>722,chr(209)=>722,chr(210)=>722,chr(211)=>722,chr(212)=>722,chr(213)=>722,chr(214)=>722,chr(215)=>570,chr(216)=>722,chr(217)=>722,chr(218)=>722,chr(219)=>722, + chr(220)=>722,chr(221)=>611,chr(222)=>611,chr(223)=>500,chr(224)=>500,chr(225)=>500,chr(226)=>500,chr(227)=>500,chr(228)=>500,chr(229)=>500,chr(230)=>722,chr(231)=>444,chr(232)=>444,chr(233)=>444,chr(234)=>444,chr(235)=>444,chr(236)=>278,chr(237)=>278,chr(238)=>278,chr(239)=>278,chr(240)=>500,chr(241)=>556, + chr(242)=>500,chr(243)=>500,chr(244)=>500,chr(245)=>500,chr(246)=>500,chr(247)=>570,chr(248)=>500,chr(249)=>556,chr(250)=>556,chr(251)=>556,chr(252)=>556,chr(253)=>444,chr(254)=>500,chr(255)=>444); +?> diff --git a/webui/system/helper/fpdf16/font/timesi.php b/webui/system/helper/fpdf16/font/timesi.php new file mode 100755 index 00000000..0ba2b777 --- /dev/null +++ b/webui/system/helper/fpdf16/font/timesi.php @@ -0,0 +1,15 @@ +250,chr(1)=>250,chr(2)=>250,chr(3)=>250,chr(4)=>250,chr(5)=>250,chr(6)=>250,chr(7)=>250,chr(8)=>250,chr(9)=>250,chr(10)=>250,chr(11)=>250,chr(12)=>250,chr(13)=>250,chr(14)=>250,chr(15)=>250,chr(16)=>250,chr(17)=>250,chr(18)=>250,chr(19)=>250,chr(20)=>250,chr(21)=>250, + chr(22)=>250,chr(23)=>250,chr(24)=>250,chr(25)=>250,chr(26)=>250,chr(27)=>250,chr(28)=>250,chr(29)=>250,chr(30)=>250,chr(31)=>250,' '=>250,'!'=>333,'"'=>420,'#'=>500,'$'=>500,'%'=>833,'&'=>778,'\''=>214,'('=>333,')'=>333,'*'=>500,'+'=>675, + ','=>250,'-'=>333,'.'=>250,'/'=>278,'0'=>500,'1'=>500,'2'=>500,'3'=>500,'4'=>500,'5'=>500,'6'=>500,'7'=>500,'8'=>500,'9'=>500,':'=>333,';'=>333,'<'=>675,'='=>675,'>'=>675,'?'=>500,'@'=>920,'A'=>611, + 'B'=>611,'C'=>667,'D'=>722,'E'=>611,'F'=>611,'G'=>722,'H'=>722,'I'=>333,'J'=>444,'K'=>667,'L'=>556,'M'=>833,'N'=>667,'O'=>722,'P'=>611,'Q'=>722,'R'=>611,'S'=>500,'T'=>556,'U'=>722,'V'=>611,'W'=>833, + 'X'=>611,'Y'=>556,'Z'=>556,'['=>389,'\\'=>278,']'=>389,'^'=>422,'_'=>500,'`'=>333,'a'=>500,'b'=>500,'c'=>444,'d'=>500,'e'=>444,'f'=>278,'g'=>500,'h'=>500,'i'=>278,'j'=>278,'k'=>444,'l'=>278,'m'=>722, + 'n'=>500,'o'=>500,'p'=>500,'q'=>500,'r'=>389,'s'=>389,'t'=>278,'u'=>500,'v'=>444,'w'=>667,'x'=>444,'y'=>444,'z'=>389,'{'=>400,'|'=>275,'}'=>400,'~'=>541,chr(127)=>350,chr(128)=>500,chr(129)=>350,chr(130)=>333,chr(131)=>500, + chr(132)=>556,chr(133)=>889,chr(134)=>500,chr(135)=>500,chr(136)=>333,chr(137)=>1000,chr(138)=>500,chr(139)=>333,chr(140)=>944,chr(141)=>350,chr(142)=>556,chr(143)=>350,chr(144)=>350,chr(145)=>333,chr(146)=>333,chr(147)=>556,chr(148)=>556,chr(149)=>350,chr(150)=>500,chr(151)=>889,chr(152)=>333,chr(153)=>980, + chr(154)=>389,chr(155)=>333,chr(156)=>667,chr(157)=>350,chr(158)=>389,chr(159)=>556,chr(160)=>250,chr(161)=>389,chr(162)=>500,chr(163)=>500,chr(164)=>500,chr(165)=>500,chr(166)=>275,chr(167)=>500,chr(168)=>333,chr(169)=>760,chr(170)=>276,chr(171)=>500,chr(172)=>675,chr(173)=>333,chr(174)=>760,chr(175)=>333, + chr(176)=>400,chr(177)=>675,chr(178)=>300,chr(179)=>300,chr(180)=>333,chr(181)=>500,chr(182)=>523,chr(183)=>250,chr(184)=>333,chr(185)=>300,chr(186)=>310,chr(187)=>500,chr(188)=>750,chr(189)=>750,chr(190)=>750,chr(191)=>500,chr(192)=>611,chr(193)=>611,chr(194)=>611,chr(195)=>611,chr(196)=>611,chr(197)=>611, + chr(198)=>889,chr(199)=>667,chr(200)=>611,chr(201)=>611,chr(202)=>611,chr(203)=>611,chr(204)=>333,chr(205)=>333,chr(206)=>333,chr(207)=>333,chr(208)=>722,chr(209)=>667,chr(210)=>722,chr(211)=>722,chr(212)=>722,chr(213)=>722,chr(214)=>722,chr(215)=>675,chr(216)=>722,chr(217)=>722,chr(218)=>722,chr(219)=>722, + chr(220)=>722,chr(221)=>556,chr(222)=>611,chr(223)=>500,chr(224)=>500,chr(225)=>500,chr(226)=>500,chr(227)=>500,chr(228)=>500,chr(229)=>500,chr(230)=>667,chr(231)=>444,chr(232)=>444,chr(233)=>444,chr(234)=>444,chr(235)=>444,chr(236)=>278,chr(237)=>278,chr(238)=>278,chr(239)=>278,chr(240)=>500,chr(241)=>500, + chr(242)=>500,chr(243)=>500,chr(244)=>500,chr(245)=>500,chr(246)=>500,chr(247)=>675,chr(248)=>500,chr(249)=>500,chr(250)=>500,chr(251)=>500,chr(252)=>500,chr(253)=>444,chr(254)=>500,chr(255)=>444); +?> diff --git a/webui/system/helper/fpdf16/font/zapfdingbats.php b/webui/system/helper/fpdf16/font/zapfdingbats.php new file mode 100755 index 00000000..1f926a8c --- /dev/null +++ b/webui/system/helper/fpdf16/font/zapfdingbats.php @@ -0,0 +1,15 @@ +0,chr(1)=>0,chr(2)=>0,chr(3)=>0,chr(4)=>0,chr(5)=>0,chr(6)=>0,chr(7)=>0,chr(8)=>0,chr(9)=>0,chr(10)=>0,chr(11)=>0,chr(12)=>0,chr(13)=>0,chr(14)=>0,chr(15)=>0,chr(16)=>0,chr(17)=>0,chr(18)=>0,chr(19)=>0,chr(20)=>0,chr(21)=>0, + chr(22)=>0,chr(23)=>0,chr(24)=>0,chr(25)=>0,chr(26)=>0,chr(27)=>0,chr(28)=>0,chr(29)=>0,chr(30)=>0,chr(31)=>0,' '=>278,'!'=>974,'"'=>961,'#'=>974,'$'=>980,'%'=>719,'&'=>789,'\''=>790,'('=>791,')'=>690,'*'=>960,'+'=>939, + ','=>549,'-'=>855,'.'=>911,'/'=>933,'0'=>911,'1'=>945,'2'=>974,'3'=>755,'4'=>846,'5'=>762,'6'=>761,'7'=>571,'8'=>677,'9'=>763,':'=>760,';'=>759,'<'=>754,'='=>494,'>'=>552,'?'=>537,'@'=>577,'A'=>692, + 'B'=>786,'C'=>788,'D'=>788,'E'=>790,'F'=>793,'G'=>794,'H'=>816,'I'=>823,'J'=>789,'K'=>841,'L'=>823,'M'=>833,'N'=>816,'O'=>831,'P'=>923,'Q'=>744,'R'=>723,'S'=>749,'T'=>790,'U'=>792,'V'=>695,'W'=>776, + 'X'=>768,'Y'=>792,'Z'=>759,'['=>707,'\\'=>708,']'=>682,'^'=>701,'_'=>826,'`'=>815,'a'=>789,'b'=>789,'c'=>707,'d'=>687,'e'=>696,'f'=>689,'g'=>786,'h'=>787,'i'=>713,'j'=>791,'k'=>785,'l'=>791,'m'=>873, + 'n'=>761,'o'=>762,'p'=>762,'q'=>759,'r'=>759,'s'=>892,'t'=>892,'u'=>788,'v'=>784,'w'=>438,'x'=>138,'y'=>277,'z'=>415,'{'=>392,'|'=>392,'}'=>668,'~'=>668,chr(127)=>0,chr(128)=>390,chr(129)=>390,chr(130)=>317,chr(131)=>317, + chr(132)=>276,chr(133)=>276,chr(134)=>509,chr(135)=>509,chr(136)=>410,chr(137)=>410,chr(138)=>234,chr(139)=>234,chr(140)=>334,chr(141)=>334,chr(142)=>0,chr(143)=>0,chr(144)=>0,chr(145)=>0,chr(146)=>0,chr(147)=>0,chr(148)=>0,chr(149)=>0,chr(150)=>0,chr(151)=>0,chr(152)=>0,chr(153)=>0, + chr(154)=>0,chr(155)=>0,chr(156)=>0,chr(157)=>0,chr(158)=>0,chr(159)=>0,chr(160)=>0,chr(161)=>732,chr(162)=>544,chr(163)=>544,chr(164)=>910,chr(165)=>667,chr(166)=>760,chr(167)=>760,chr(168)=>776,chr(169)=>595,chr(170)=>694,chr(171)=>626,chr(172)=>788,chr(173)=>788,chr(174)=>788,chr(175)=>788, + chr(176)=>788,chr(177)=>788,chr(178)=>788,chr(179)=>788,chr(180)=>788,chr(181)=>788,chr(182)=>788,chr(183)=>788,chr(184)=>788,chr(185)=>788,chr(186)=>788,chr(187)=>788,chr(188)=>788,chr(189)=>788,chr(190)=>788,chr(191)=>788,chr(192)=>788,chr(193)=>788,chr(194)=>788,chr(195)=>788,chr(196)=>788,chr(197)=>788, + chr(198)=>788,chr(199)=>788,chr(200)=>788,chr(201)=>788,chr(202)=>788,chr(203)=>788,chr(204)=>788,chr(205)=>788,chr(206)=>788,chr(207)=>788,chr(208)=>788,chr(209)=>788,chr(210)=>788,chr(211)=>788,chr(212)=>894,chr(213)=>838,chr(214)=>1016,chr(215)=>458,chr(216)=>748,chr(217)=>924,chr(218)=>748,chr(219)=>918, + chr(220)=>927,chr(221)=>928,chr(222)=>928,chr(223)=>834,chr(224)=>873,chr(225)=>828,chr(226)=>924,chr(227)=>924,chr(228)=>917,chr(229)=>930,chr(230)=>931,chr(231)=>463,chr(232)=>883,chr(233)=>836,chr(234)=>836,chr(235)=>867,chr(236)=>867,chr(237)=>696,chr(238)=>696,chr(239)=>874,chr(240)=>0,chr(241)=>874, + chr(242)=>760,chr(243)=>946,chr(244)=>771,chr(245)=>865,chr(246)=>771,chr(247)=>888,chr(248)=>967,chr(249)=>888,chr(250)=>831,chr(251)=>873,chr(252)=>927,chr(253)=>970,chr(254)=>918,chr(255)=>0); +?> diff --git a/webui/system/helper/fpdf16/fpdf.css b/webui/system/helper/fpdf16/fpdf.css new file mode 100755 index 00000000..dd2c5400 --- /dev/null +++ b/webui/system/helper/fpdf16/fpdf.css @@ -0,0 +1,21 @@ +body {font-family:"Times New Roman",serif} +h1 {font:bold 135% Arial,sans-serif; color:#4000A0; margin-bottom:0.9em} +h2 {font:bold 95% Arial,sans-serif; color:#900000; margin-top:1.5em; margin-bottom:1em} +dl.param dt {text-decoration:underline} +dl.param dd {margin-top:1em; margin-bottom:1em} +dl.param ul {margin-top:1em; margin-bottom:1em} +tt, code, kbd {font-family:"Courier New",Courier,monospace; font-size:82%} +div.source {margin-top:1.4em; margin-bottom:1.3em} +div.source pre {display:table; border:1px solid #24246A; width:100%; margin:0em; font-family:inherit; font-size:100%} +div.source code {display:block; border:1px solid #C5C5EC; background-color:#F0F5FF; padding:6px; color:#000000} +div.doc-source {margin-top:1.4em; margin-bottom:1.3em} +div.doc-source pre {display:table; width:100%; margin:0em; font-family:inherit; font-size:100%} +div.doc-source code {display:block; background-color:#E0E0E0; padding:4px} +.kw {color:#000080; font-weight:bold} +.str {color:#CC0000} +.cmt {color:#008000} +p.demo {text-align:center; margin-top:-0.9em} +a.demo {text-decoration:none; font-weight:bold; color:#0000CC} +a.demo:link {text-decoration:none; font-weight:bold; color:#0000CC} +a.demo:hover {text-decoration:none; font-weight:bold; color:#0000FF} +a.demo:active {text-decoration:none; font-weight:bold; color:#0000FF} diff --git a/webui/system/helper/fpdf16/fpdf.php b/webui/system/helper/fpdf16/fpdf.php new file mode 100755 index 00000000..b27ca6df --- /dev/null +++ b/webui/system/helper/fpdf16/fpdf.php @@ -0,0 +1,1732 @@ +_dochecks(); + //Initialization of properties + $this->page=0; + $this->n=2; + $this->buffer=''; + $this->pages=array(); + $this->PageSizes=array(); + $this->state=0; + $this->fonts=array(); + $this->FontFiles=array(); + $this->diffs=array(); + $this->images=array(); + $this->links=array(); + $this->InHeader=false; + $this->InFooter=false; + $this->lasth=0; + $this->FontFamily=''; + $this->FontStyle=''; + $this->FontSizePt=12; + $this->underline=false; + $this->DrawColor='0 G'; + $this->FillColor='0 g'; + $this->TextColor='0 g'; + $this->ColorFlag=false; + $this->ws=0; + //Standard fonts + $this->CoreFonts=array('courier'=>'Courier', 'courierB'=>'Courier-Bold', 'courierI'=>'Courier-Oblique', 'courierBI'=>'Courier-BoldOblique', + 'helvetica'=>'Helvetica', 'helveticaB'=>'Helvetica-Bold', 'helveticaI'=>'Helvetica-Oblique', 'helveticaBI'=>'Helvetica-BoldOblique', + 'times'=>'Times-Roman', 'timesB'=>'Times-Bold', 'timesI'=>'Times-Italic', 'timesBI'=>'Times-BoldItalic', + 'symbol'=>'Symbol', 'zapfdingbats'=>'ZapfDingbats'); + //Scale factor + if($unit=='pt') + $this->k=1; + elseif($unit=='mm') + $this->k=72/25.4; + elseif($unit=='cm') + $this->k=72/2.54; + elseif($unit=='in') + $this->k=72; + else + $this->Error('Incorrect unit: '.$unit); + //Page format + $this->PageFormats=array('a3'=>array(841.89,1190.55), 'a4'=>array(595.28,841.89), 'a5'=>array(420.94,595.28), + 'letter'=>array(612,792), 'legal'=>array(612,1008)); + if(is_string($format)) + $format=$this->_getpageformat($format); + $this->DefPageFormat=$format; + $this->CurPageFormat=$format; + //Page orientation + $orientation=strtolower($orientation); + if($orientation=='p' || $orientation=='portrait') + { + $this->DefOrientation='P'; + $this->w=$this->DefPageFormat[0]; + $this->h=$this->DefPageFormat[1]; + } + elseif($orientation=='l' || $orientation=='landscape') + { + $this->DefOrientation='L'; + $this->w=$this->DefPageFormat[1]; + $this->h=$this->DefPageFormat[0]; + } + else + $this->Error('Incorrect orientation: '.$orientation); + $this->CurOrientation=$this->DefOrientation; + $this->wPt=$this->w*$this->k; + $this->hPt=$this->h*$this->k; + //Page margins (1 cm) + $margin=28.35/$this->k; + $this->SetMargins($margin,$margin); + //Interior cell margin (1 mm) + $this->cMargin=$margin/10; + //Line width (0.2 mm) + $this->LineWidth=.567/$this->k; + //Automatic page break + $this->SetAutoPageBreak(true,2*$margin); + //Full width display mode + $this->SetDisplayMode('fullwidth'); + //Enable compression + $this->SetCompression(true); + //Set default PDF version number + $this->PDFVersion='1.3'; +} + +function SetMargins($left, $top, $right=null) +{ + //Set left, top and right margins + $this->lMargin=$left; + $this->tMargin=$top; + if($right===null) + $right=$left; + $this->rMargin=$right; +} + +function SetLeftMargin($margin) +{ + //Set left margin + $this->lMargin=$margin; + if($this->page>0 && $this->x<$margin) + $this->x=$margin; +} + +function SetTopMargin($margin) +{ + //Set top margin + $this->tMargin=$margin; +} + +function SetRightMargin($margin) +{ + //Set right margin + $this->rMargin=$margin; +} + +function SetAutoPageBreak($auto, $margin=0) +{ + //Set auto page break mode and triggering margin + $this->AutoPageBreak=$auto; + $this->bMargin=$margin; + $this->PageBreakTrigger=$this->h-$margin; +} + +function SetDisplayMode($zoom, $layout='continuous') +{ + //Set display mode in viewer + if($zoom=='fullpage' || $zoom=='fullwidth' || $zoom=='real' || $zoom=='default' || !is_string($zoom)) + $this->ZoomMode=$zoom; + else + $this->Error('Incorrect zoom display mode: '.$zoom); + if($layout=='single' || $layout=='continuous' || $layout=='two' || $layout=='default') + $this->LayoutMode=$layout; + else + $this->Error('Incorrect layout display mode: '.$layout); +} + +function SetCompression($compress) +{ + //Set page compression + if(function_exists('gzcompress')) + $this->compress=$compress; + else + $this->compress=false; +} + +function SetTitle($title, $isUTF8=false) +{ + //Title of document + if($isUTF8) + $title=$this->_UTF8toUTF16($title); + $this->title=$title; +} + +function SetSubject($subject, $isUTF8=false) +{ + //Subject of document + if($isUTF8) + $subject=$this->_UTF8toUTF16($subject); + $this->subject=$subject; +} + +function SetAuthor($author, $isUTF8=false) +{ + //Author of document + if($isUTF8) + $author=$this->_UTF8toUTF16($author); + $this->author=$author; +} + +function SetKeywords($keywords, $isUTF8=false) +{ + //Keywords of document + if($isUTF8) + $keywords=$this->_UTF8toUTF16($keywords); + $this->keywords=$keywords; +} + +function SetCreator($creator, $isUTF8=false) +{ + //Creator of document + if($isUTF8) + $creator=$this->_UTF8toUTF16($creator); + $this->creator=$creator; +} + +function AliasNbPages($alias='{nb}') +{ + //Define an alias for total number of pages + $this->AliasNbPages=$alias; +} + +function Error($msg) +{ + //Fatal error + die('FPDF error: '.$msg); +} + +function Open() +{ + //Begin document + $this->state=1; +} + +function Close() +{ + //Terminate document + if($this->state==3) + return; + if($this->page==0) + $this->AddPage(); + //Page footer + $this->InFooter=true; + $this->Footer(); + $this->InFooter=false; + //Close page + $this->_endpage(); + //Close document + $this->_enddoc(); +} + +function AddPage($orientation='', $format='') +{ + //Start a new page + if($this->state==0) + $this->Open(); + $family=$this->FontFamily; + $style=$this->FontStyle.($this->underline ? 'U' : ''); + $size=$this->FontSizePt; + $lw=$this->LineWidth; + $dc=$this->DrawColor; + $fc=$this->FillColor; + $tc=$this->TextColor; + $cf=$this->ColorFlag; + if($this->page>0) + { + //Page footer + $this->InFooter=true; + $this->Footer(); + $this->InFooter=false; + //Close page + $this->_endpage(); + } + //Start new page + $this->_beginpage($orientation,$format); + //Set line cap style to square + $this->_out('2 J'); + //Set line width + $this->LineWidth=$lw; + $this->_out(sprintf('%.2F w',$lw*$this->k)); + //Set font + if($family) + $this->SetFont($family,$style,$size); + //Set colors + $this->DrawColor=$dc; + if($dc!='0 G') + $this->_out($dc); + $this->FillColor=$fc; + if($fc!='0 g') + $this->_out($fc); + $this->TextColor=$tc; + $this->ColorFlag=$cf; + //Page header + $this->InHeader=true; + $this->Header(); + $this->InHeader=false; + //Restore line width + if($this->LineWidth!=$lw) + { + $this->LineWidth=$lw; + $this->_out(sprintf('%.2F w',$lw*$this->k)); + } + //Restore font + if($family) + $this->SetFont($family,$style,$size); + //Restore colors + if($this->DrawColor!=$dc) + { + $this->DrawColor=$dc; + $this->_out($dc); + } + if($this->FillColor!=$fc) + { + $this->FillColor=$fc; + $this->_out($fc); + } + $this->TextColor=$tc; + $this->ColorFlag=$cf; +} + +function Header() +{ + //To be implemented in your own inherited class +} + +function Footer() +{ + //To be implemented in your own inherited class +} + +function PageNo() +{ + //Get current page number + return $this->page; +} + +function SetDrawColor($r, $g=null, $b=null) +{ + //Set color for all stroking operations + if(($r==0 && $g==0 && $b==0) || $g===null) + $this->DrawColor=sprintf('%.3F G',$r/255); + else + $this->DrawColor=sprintf('%.3F %.3F %.3F RG',$r/255,$g/255,$b/255); + if($this->page>0) + $this->_out($this->DrawColor); +} + +function SetFillColor($r, $g=null, $b=null) +{ + //Set color for all filling operations + if(($r==0 && $g==0 && $b==0) || $g===null) + $this->FillColor=sprintf('%.3F g',$r/255); + else + $this->FillColor=sprintf('%.3F %.3F %.3F rg',$r/255,$g/255,$b/255); + $this->ColorFlag=($this->FillColor!=$this->TextColor); + if($this->page>0) + $this->_out($this->FillColor); +} + +function SetTextColor($r, $g=null, $b=null) +{ + //Set color for text + if(($r==0 && $g==0 && $b==0) || $g===null) + $this->TextColor=sprintf('%.3F g',$r/255); + else + $this->TextColor=sprintf('%.3F %.3F %.3F rg',$r/255,$g/255,$b/255); + $this->ColorFlag=($this->FillColor!=$this->TextColor); +} + +function GetStringWidth($s) +{ + //Get width of a string in the current font + $s=(string)$s; + $cw=&$this->CurrentFont['cw']; + $w=0; + $l=strlen($s); + for($i=0;$i<$l;$i++) + $w+=$cw[$s[$i]]; + return $w*$this->FontSize/1000; +} + +function SetLineWidth($width) +{ + //Set line width + $this->LineWidth=$width; + if($this->page>0) + $this->_out(sprintf('%.2F w',$width*$this->k)); +} + +function Line($x1, $y1, $x2, $y2) +{ + //Draw a line + $this->_out(sprintf('%.2F %.2F m %.2F %.2F l S',$x1*$this->k,($this->h-$y1)*$this->k,$x2*$this->k,($this->h-$y2)*$this->k)); +} + +function Rect($x, $y, $w, $h, $style='') +{ + //Draw a rectangle + if($style=='F') + $op='f'; + elseif($style=='FD' || $style=='DF') + $op='B'; + else + $op='S'; + $this->_out(sprintf('%.2F %.2F %.2F %.2F re %s',$x*$this->k,($this->h-$y)*$this->k,$w*$this->k,-$h*$this->k,$op)); +} + +function AddFont($family, $style='', $file='') +{ + //Add a TrueType or Type1 font + $family=strtolower($family); + if($file=='') + $file=str_replace(' ','',$family).strtolower($style).'.php'; + if($family=='arial') + $family='helvetica'; + $style=strtoupper($style); + if($style=='IB') + $style='BI'; + $fontkey=$family.$style; + if(isset($this->fonts[$fontkey])) + return; + include($this->_getfontpath().$file); + if(!isset($name)) + $this->Error('Could not include font definition file'); + $i=count($this->fonts)+1; + $this->fonts[$fontkey]=array('i'=>$i, 'type'=>$type, 'name'=>$name, 'desc'=>$desc, 'up'=>$up, 'ut'=>$ut, 'cw'=>$cw, 'enc'=>$enc, 'file'=>$file); + if($diff) + { + //Search existing encodings + $d=0; + $nb=count($this->diffs); + for($i=1;$i<=$nb;$i++) + { + if($this->diffs[$i]==$diff) + { + $d=$i; + break; + } + } + if($d==0) + { + $d=$nb+1; + $this->diffs[$d]=$diff; + } + $this->fonts[$fontkey]['diff']=$d; + } + if($file) + { + if($type=='TrueType') + $this->FontFiles[$file]=array('length1'=>$originalsize); + else + $this->FontFiles[$file]=array('length1'=>$size1, 'length2'=>$size2); + } +} + +function SetFont($family, $style='', $size=0) +{ + //Select a font; size given in points + global $fpdf_charwidths; + + $family=strtolower($family); + if($family=='') + $family=$this->FontFamily; + if($family=='arial') + $family='helvetica'; + elseif($family=='symbol' || $family=='zapfdingbats') + $style=''; + $style=strtoupper($style); + if(strpos($style,'U')!==false) + { + $this->underline=true; + $style=str_replace('U','',$style); + } + else + $this->underline=false; + if($style=='IB') + $style='BI'; + if($size==0) + $size=$this->FontSizePt; + //Test if font is already selected + if($this->FontFamily==$family && $this->FontStyle==$style && $this->FontSizePt==$size) + return; + //Test if used for the first time + $fontkey=$family.$style; + if(!isset($this->fonts[$fontkey])) + { + //Check if one of the standard fonts + if(isset($this->CoreFonts[$fontkey])) + { + if(!isset($fpdf_charwidths[$fontkey])) + { + //Load metric file + $file=$family; + if($family=='times' || $family=='helvetica') + $file.=strtolower($style); + include($this->_getfontpath().$file.'.php'); + if(!isset($fpdf_charwidths[$fontkey])) + $this->Error('Could not include font metric file'); + } + $i=count($this->fonts)+1; + $name=$this->CoreFonts[$fontkey]; + $cw=$fpdf_charwidths[$fontkey]; + $this->fonts[$fontkey]=array('i'=>$i, 'type'=>'core', 'name'=>$name, 'up'=>-100, 'ut'=>50, 'cw'=>$cw); + } + else + $this->Error('Undefined font: '.$family.' '.$style); + } + //Select it + $this->FontFamily=$family; + $this->FontStyle=$style; + $this->FontSizePt=$size; + $this->FontSize=$size/$this->k; + $this->CurrentFont=&$this->fonts[$fontkey]; + if($this->page>0) + $this->_out(sprintf('BT /F%d %.2F Tf ET',$this->CurrentFont['i'],$this->FontSizePt)); +} + +function SetFontSize($size) +{ + //Set font size in points + if($this->FontSizePt==$size) + return; + $this->FontSizePt=$size; + $this->FontSize=$size/$this->k; + if($this->page>0) + $this->_out(sprintf('BT /F%d %.2F Tf ET',$this->CurrentFont['i'],$this->FontSizePt)); +} + +function AddLink() +{ + //Create a new internal link + $n=count($this->links)+1; + $this->links[$n]=array(0, 0); + return $n; +} + +function SetLink($link, $y=0, $page=-1) +{ + //Set destination of internal link + if($y==-1) + $y=$this->y; + if($page==-1) + $page=$this->page; + $this->links[$link]=array($page, $y); +} + +function Link($x, $y, $w, $h, $link) +{ + //Put a link on the page + $this->PageLinks[$this->page][]=array($x*$this->k, $this->hPt-$y*$this->k, $w*$this->k, $h*$this->k, $link); +} + +function Text($x, $y, $txt) +{ + //Output a string + $s=sprintf('BT %.2F %.2F Td (%s) Tj ET',$x*$this->k,($this->h-$y)*$this->k,$this->_escape($txt)); + if($this->underline && $txt!='') + $s.=' '.$this->_dounderline($x,$y,$txt); + if($this->ColorFlag) + $s='q '.$this->TextColor.' '.$s.' Q'; + $this->_out($s); +} + +function AcceptPageBreak() +{ + //Accept automatic page break or not + return $this->AutoPageBreak; +} + +function Cell($w, $h=0, $txt='', $border=0, $ln=0, $align='', $fill=false, $link='') +{ + //Output a cell + $k=$this->k; + if($this->y+$h>$this->PageBreakTrigger && !$this->InHeader && !$this->InFooter && $this->AcceptPageBreak()) + { + //Automatic page break + $x=$this->x; + $ws=$this->ws; + if($ws>0) + { + $this->ws=0; + $this->_out('0 Tw'); + } + $this->AddPage($this->CurOrientation,$this->CurPageFormat); + $this->x=$x; + if($ws>0) + { + $this->ws=$ws; + $this->_out(sprintf('%.3F Tw',$ws*$k)); + } + } + if($w==0) + $w=$this->w-$this->rMargin-$this->x; + $s=''; + if($fill || $border==1) + { + if($fill) + $op=($border==1) ? 'B' : 'f'; + else + $op='S'; + $s=sprintf('%.2F %.2F %.2F %.2F re %s ',$this->x*$k,($this->h-$this->y)*$k,$w*$k,-$h*$k,$op); + } + if(is_string($border)) + { + $x=$this->x; + $y=$this->y; + if(strpos($border,'L')!==false) + $s.=sprintf('%.2F %.2F m %.2F %.2F l S ',$x*$k,($this->h-$y)*$k,$x*$k,($this->h-($y+$h))*$k); + if(strpos($border,'T')!==false) + $s.=sprintf('%.2F %.2F m %.2F %.2F l S ',$x*$k,($this->h-$y)*$k,($x+$w)*$k,($this->h-$y)*$k); + if(strpos($border,'R')!==false) + $s.=sprintf('%.2F %.2F m %.2F %.2F l S ',($x+$w)*$k,($this->h-$y)*$k,($x+$w)*$k,($this->h-($y+$h))*$k); + if(strpos($border,'B')!==false) + $s.=sprintf('%.2F %.2F m %.2F %.2F l S ',$x*$k,($this->h-($y+$h))*$k,($x+$w)*$k,($this->h-($y+$h))*$k); + } + if($txt!=='') + { + if($align=='R') + $dx=$w-$this->cMargin-$this->GetStringWidth($txt); + elseif($align=='C') + $dx=($w-$this->GetStringWidth($txt))/2; + else + $dx=$this->cMargin; + if($this->ColorFlag) + $s.='q '.$this->TextColor.' '; + $txt2=str_replace(')','\\)',str_replace('(','\\(',str_replace('\\','\\\\',$txt))); + $s.=sprintf('BT %.2F %.2F Td (%s) Tj ET',($this->x+$dx)*$k,($this->h-($this->y+.5*$h+.3*$this->FontSize))*$k,$txt2); + if($this->underline) + $s.=' '.$this->_dounderline($this->x+$dx,$this->y+.5*$h+.3*$this->FontSize,$txt); + if($this->ColorFlag) + $s.=' Q'; + if($link) + $this->Link($this->x+$dx,$this->y+.5*$h-.5*$this->FontSize,$this->GetStringWidth($txt),$this->FontSize,$link); + } + if($s) + $this->_out($s); + $this->lasth=$h; + if($ln>0) + { + //Go to next line + $this->y+=$h; + if($ln==1) + $this->x=$this->lMargin; + } + else + $this->x+=$w; +} + +function MultiCell($w, $h, $txt, $border=0, $align='J', $fill=false) +{ + //Output text with automatic or explicit line breaks + $cw=&$this->CurrentFont['cw']; + if($w==0) + $w=$this->w-$this->rMargin-$this->x; + $wmax=($w-2*$this->cMargin)*1000/$this->FontSize; + $s=str_replace("\r",'',$txt); + $nb=strlen($s); + if($nb>0 && $s[$nb-1]=="\n") + $nb--; + $b=0; + if($border) + { + if($border==1) + { + $border='LTRB'; + $b='LRT'; + $b2='LR'; + } + else + { + $b2=''; + if(strpos($border,'L')!==false) + $b2.='L'; + if(strpos($border,'R')!==false) + $b2.='R'; + $b=(strpos($border,'T')!==false) ? $b2.'T' : $b2; + } + } + $sep=-1; + $i=0; + $j=0; + $l=0; + $ns=0; + $nl=1; + while($i<$nb) + { + //Get next character + $c=$s[$i]; + if($c=="\n") + { + //Explicit line break + if($this->ws>0) + { + $this->ws=0; + $this->_out('0 Tw'); + } + $this->Cell($w,$h,substr($s,$j,$i-$j),$b,2,$align,$fill); + $i++; + $sep=-1; + $j=$i; + $l=0; + $ns=0; + $nl++; + if($border && $nl==2) + $b=$b2; + continue; + } + if($c==' ') + { + $sep=$i; + $ls=$l; + $ns++; + } + $l+=$cw[$c]; + if($l>$wmax) + { + //Automatic line break + if($sep==-1) + { + if($i==$j) + $i++; + if($this->ws>0) + { + $this->ws=0; + $this->_out('0 Tw'); + } + $this->Cell($w,$h,substr($s,$j,$i-$j),$b,2,$align,$fill); + } + else + { + if($align=='J') + { + $this->ws=($ns>1) ? ($wmax-$ls)/1000*$this->FontSize/($ns-1) : 0; + $this->_out(sprintf('%.3F Tw',$this->ws*$this->k)); + } + $this->Cell($w,$h,substr($s,$j,$sep-$j),$b,2,$align,$fill); + $i=$sep+1; + } + $sep=-1; + $j=$i; + $l=0; + $ns=0; + $nl++; + if($border && $nl==2) + $b=$b2; + } + else + $i++; + } + //Last chunk + if($this->ws>0) + { + $this->ws=0; + $this->_out('0 Tw'); + } + if($border && strpos($border,'B')!==false) + $b.='B'; + $this->Cell($w,$h,substr($s,$j,$i-$j),$b,2,$align,$fill); + $this->x=$this->lMargin; +} + +function Write($h, $txt, $link='') +{ + //Output text in flowing mode + $cw=&$this->CurrentFont['cw']; + $w=$this->w-$this->rMargin-$this->x; + $wmax=($w-2*$this->cMargin)*1000/$this->FontSize; + $s=str_replace("\r",'',$txt); + $nb=strlen($s); + $sep=-1; + $i=0; + $j=0; + $l=0; + $nl=1; + while($i<$nb) + { + //Get next character + $c=$s[$i]; + if($c=="\n") + { + //Explicit line break + $this->Cell($w,$h,substr($s,$j,$i-$j),0,2,'',0,$link); + $i++; + $sep=-1; + $j=$i; + $l=0; + if($nl==1) + { + $this->x=$this->lMargin; + $w=$this->w-$this->rMargin-$this->x; + $wmax=($w-2*$this->cMargin)*1000/$this->FontSize; + } + $nl++; + continue; + } + if($c==' ') + $sep=$i; + $l+=$cw[$c]; + if($l>$wmax) + { + //Automatic line break + if($sep==-1) + { + if($this->x>$this->lMargin) + { + //Move to next line + $this->x=$this->lMargin; + $this->y+=$h; + $w=$this->w-$this->rMargin-$this->x; + $wmax=($w-2*$this->cMargin)*1000/$this->FontSize; + $i++; + $nl++; + continue; + } + if($i==$j) + $i++; + $this->Cell($w,$h,substr($s,$j,$i-$j),0,2,'',0,$link); + } + else + { + $this->Cell($w,$h,substr($s,$j,$sep-$j),0,2,'',0,$link); + $i=$sep+1; + } + $sep=-1; + $j=$i; + $l=0; + if($nl==1) + { + $this->x=$this->lMargin; + $w=$this->w-$this->rMargin-$this->x; + $wmax=($w-2*$this->cMargin)*1000/$this->FontSize; + } + $nl++; + } + else + $i++; + } + //Last chunk + if($i!=$j) + $this->Cell($l/1000*$this->FontSize,$h,substr($s,$j),0,0,'',0,$link); +} + +function Ln($h=null) +{ + //Line feed; default value is last cell height + $this->x=$this->lMargin; + if($h===null) + $this->y+=$this->lasth; + else + $this->y+=$h; +} + +function Image($file, $x=null, $y=null, $w=0, $h=0, $type='', $link='') +{ + //Put an image on the page + if(!isset($this->images[$file])) + { + //First use of this image, get info + if($type=='') + { + $pos=strrpos($file,'.'); + if(!$pos) + $this->Error('Image file has no extension and no type was specified: '.$file); + $type=substr($file,$pos+1); + } + $type=strtolower($type); + if($type=='jpeg') + $type='jpg'; + $mtd='_parse'.$type; + if(!method_exists($this,$mtd)) + $this->Error('Unsupported image type: '.$type); + $info=$this->$mtd($file); + $info['i']=count($this->images)+1; + $this->images[$file]=$info; + } + else + $info=$this->images[$file]; + //Automatic width and height calculation if needed + if($w==0 && $h==0) + { + //Put image at 72 dpi + $w=$info['w']/$this->k; + $h=$info['h']/$this->k; + } + elseif($w==0) + $w=$h*$info['w']/$info['h']; + elseif($h==0) + $h=$w*$info['h']/$info['w']; + //Flowing mode + if($y===null) + { + if($this->y+$h>$this->PageBreakTrigger && !$this->InHeader && !$this->InFooter && $this->AcceptPageBreak()) + { + //Automatic page break + $x2=$this->x; + $this->AddPage($this->CurOrientation,$this->CurPageFormat); + $this->x=$x2; + } + $y=$this->y; + $this->y+=$h; + } + if($x===null) + $x=$this->x; + $this->_out(sprintf('q %.2F 0 0 %.2F %.2F %.2F cm /I%d Do Q',$w*$this->k,$h*$this->k,$x*$this->k,($this->h-($y+$h))*$this->k,$info['i'])); + if($link) + $this->Link($x,$y,$w,$h,$link); +} + +function GetX() +{ + //Get x position + return $this->x; +} + +function SetX($x) +{ + //Set x position + if($x>=0) + $this->x=$x; + else + $this->x=$this->w+$x; +} + +function GetY() +{ + //Get y position + return $this->y; +} + +function SetY($y) +{ + //Set y position and reset x + $this->x=$this->lMargin; + if($y>=0) + $this->y=$y; + else + $this->y=$this->h+$y; +} + +function SetXY($x, $y) +{ + //Set x and y positions + $this->SetY($y); + $this->SetX($x); +} + +function Output($name='', $dest='') +{ + //Output PDF to some destination + if($this->state<3) + $this->Close(); + $dest=strtoupper($dest); + if($dest=='') + { + if($name=='') + { + $name='doc.pdf'; + $dest='I'; + } + else + $dest='F'; + } + switch($dest) + { + case 'I': + //Send to standard output + if(ob_get_length()) + $this->Error('Some data has already been output, can\'t send PDF file'); + if(php_sapi_name()!='cli') + { + //We send to a browser + header('Content-Type: application/pdf'); + if(headers_sent()) + $this->Error('Some data has already been output, can\'t send PDF file'); + header('Content-Length: '.strlen($this->buffer)); + header('Content-Disposition: inline; filename="'.$name.'"'); + header('Cache-Control: private, max-age=0, must-revalidate'); + header('Pragma: public'); + ini_set('zlib.output_compression','0'); + } + echo $this->buffer; + break; + case 'D': + //Download file + if(ob_get_length()) + $this->Error('Some data has already been output, can\'t send PDF file'); + header('Content-Type: application/x-download'); + if(headers_sent()) + $this->Error('Some data has already been output, can\'t send PDF file'); + header('Content-Length: '.strlen($this->buffer)); + header('Content-Disposition: attachment; filename="'.$name.'"'); + header('Cache-Control: private, max-age=0, must-revalidate'); + header('Pragma: public'); + ini_set('zlib.output_compression','0'); + echo $this->buffer; + break; + case 'F': + //Save to local file + $f=fopen($name,'wb'); + if(!$f) + $this->Error('Unable to create output file: '.$name); + fwrite($f,$this->buffer,strlen($this->buffer)); + fclose($f); + break; + case 'S': + //Return as a string + return $this->buffer; + default: + $this->Error('Incorrect output destination: '.$dest); + } + return ''; +} + +/******************************************************************************* +* * +* Protected methods * +* * +*******************************************************************************/ +function _dochecks() +{ + //Check availability of %F + if(sprintf('%.1F',1.0)!='1.0') + $this->Error('This version of PHP is not supported'); + //Check mbstring overloading + if(ini_get('mbstring.func_overload') & 2) + $this->Error('mbstring overloading must be disabled'); + //Disable runtime magic quotes + if(get_magic_quotes_runtime()) + @set_magic_quotes_runtime(0); +} + +function _getpageformat($format) +{ + $format=strtolower($format); + if(!isset($this->PageFormats[$format])) + $this->Error('Unknown page format: '.$format); + $a=$this->PageFormats[$format]; + return array($a[0]/$this->k, $a[1]/$this->k); +} + +function _getfontpath() +{ + if(!defined('FPDF_FONTPATH') && is_dir(dirname(__FILE__).'/font')) + define('FPDF_FONTPATH',dirname(__FILE__).'/font/'); + return defined('FPDF_FONTPATH') ? FPDF_FONTPATH : ''; +} + +function _beginpage($orientation, $format) +{ + $this->page++; + $this->pages[$this->page]=''; + $this->state=2; + $this->x=$this->lMargin; + $this->y=$this->tMargin; + $this->FontFamily=''; + //Check page size + if($orientation=='') + $orientation=$this->DefOrientation; + else + $orientation=strtoupper($orientation[0]); + if($format=='') + $format=$this->DefPageFormat; + else + { + if(is_string($format)) + $format=$this->_getpageformat($format); + } + if($orientation!=$this->CurOrientation || $format[0]!=$this->CurPageFormat[0] || $format[1]!=$this->CurPageFormat[1]) + { + //New size + if($orientation=='P') + { + $this->w=$format[0]; + $this->h=$format[1]; + } + else + { + $this->w=$format[1]; + $this->h=$format[0]; + } + $this->wPt=$this->w*$this->k; + $this->hPt=$this->h*$this->k; + $this->PageBreakTrigger=$this->h-$this->bMargin; + $this->CurOrientation=$orientation; + $this->CurPageFormat=$format; + } + if($orientation!=$this->DefOrientation || $format[0]!=$this->DefPageFormat[0] || $format[1]!=$this->DefPageFormat[1]) + $this->PageSizes[$this->page]=array($this->wPt, $this->hPt); +} + +function _endpage() +{ + $this->state=1; +} + +function _escape($s) +{ + //Escape special characters in strings + $s=str_replace('\\','\\\\',$s); + $s=str_replace('(','\\(',$s); + $s=str_replace(')','\\)',$s); + $s=str_replace("\r",'\\r',$s); + return $s; +} + +function _textstring($s) +{ + //Format a text string + return '('.$this->_escape($s).')'; +} + +function _UTF8toUTF16($s) +{ + //Convert UTF-8 to UTF-16BE with BOM + $res="\xFE\xFF"; + $nb=strlen($s); + $i=0; + while($i<$nb) + { + $c1=ord($s[$i++]); + if($c1>=224) + { + //3-byte character + $c2=ord($s[$i++]); + $c3=ord($s[$i++]); + $res.=chr((($c1 & 0x0F)<<4) + (($c2 & 0x3C)>>2)); + $res.=chr((($c2 & 0x03)<<6) + ($c3 & 0x3F)); + } + elseif($c1>=192) + { + //2-byte character + $c2=ord($s[$i++]); + $res.=chr(($c1 & 0x1C)>>2); + $res.=chr((($c1 & 0x03)<<6) + ($c2 & 0x3F)); + } + else + { + //Single-byte character + $res.="\0".chr($c1); + } + } + return $res; +} + +function _dounderline($x, $y, $txt) +{ + //Underline text + $up=$this->CurrentFont['up']; + $ut=$this->CurrentFont['ut']; + $w=$this->GetStringWidth($txt)+$this->ws*substr_count($txt,' '); + return sprintf('%.2F %.2F %.2F %.2F re f',$x*$this->k,($this->h-($y-$up/1000*$this->FontSize))*$this->k,$w*$this->k,-$ut/1000*$this->FontSizePt); +} + +function _parsejpg($file) +{ + //Extract info from a JPEG file + $a=GetImageSize($file); + if(!$a) + $this->Error('Missing or incorrect image file: '.$file); + if($a[2]!=2) + $this->Error('Not a JPEG file: '.$file); + if(!isset($a['channels']) || $a['channels']==3) + $colspace='DeviceRGB'; + elseif($a['channels']==4) + $colspace='DeviceCMYK'; + else + $colspace='DeviceGray'; + $bpc=isset($a['bits']) ? $a['bits'] : 8; + //Read whole file + $f=fopen($file,'rb'); + $data=''; + while(!feof($f)) + $data.=fread($f,8192); + fclose($f); + return array('w'=>$a[0], 'h'=>$a[1], 'cs'=>$colspace, 'bpc'=>$bpc, 'f'=>'DCTDecode', 'data'=>$data); +} + +function _parsepng($file) +{ + //Extract info from a PNG file + $f=fopen($file,'rb'); + if(!$f) + $this->Error('Can\'t open image file: '.$file); + //Check signature + if($this->_readstream($f,8)!=chr(137).'PNG'.chr(13).chr(10).chr(26).chr(10)) + $this->Error('Not a PNG file: '.$file); + //Read header chunk + $this->_readstream($f,4); + if($this->_readstream($f,4)!='IHDR') + $this->Error('Incorrect PNG file: '.$file); + $w=$this->_readint($f); + $h=$this->_readint($f); + $bpc=ord($this->_readstream($f,1)); + if($bpc>8) + $this->Error('16-bit depth not supported: '.$file); + $ct=ord($this->_readstream($f,1)); + if($ct==0) + $colspace='DeviceGray'; + elseif($ct==2) + $colspace='DeviceRGB'; + elseif($ct==3) + $colspace='Indexed'; + else + $this->Error('Alpha channel not supported: '.$file); + if(ord($this->_readstream($f,1))!=0) + $this->Error('Unknown compression method: '.$file); + if(ord($this->_readstream($f,1))!=0) + $this->Error('Unknown filter method: '.$file); + if(ord($this->_readstream($f,1))!=0) + $this->Error('Interlacing not supported: '.$file); + $this->_readstream($f,4); + $parms='/DecodeParms <>'; + //Scan chunks looking for palette, transparency and image data + $pal=''; + $trns=''; + $data=''; + do + { + $n=$this->_readint($f); + $type=$this->_readstream($f,4); + if($type=='PLTE') + { + //Read palette + $pal=$this->_readstream($f,$n); + $this->_readstream($f,4); + } + elseif($type=='tRNS') + { + //Read transparency info + $t=$this->_readstream($f,$n); + if($ct==0) + $trns=array(ord(substr($t,1,1))); + elseif($ct==2) + $trns=array(ord(substr($t,1,1)), ord(substr($t,3,1)), ord(substr($t,5,1))); + else + { + $pos=strpos($t,chr(0)); + if($pos!==false) + $trns=array($pos); + } + $this->_readstream($f,4); + } + elseif($type=='IDAT') + { + //Read image data block + $data.=$this->_readstream($f,$n); + $this->_readstream($f,4); + } + elseif($type=='IEND') + break; + else + $this->_readstream($f,$n+4); + } + while($n); + if($colspace=='Indexed' && empty($pal)) + $this->Error('Missing palette in '.$file); + fclose($f); + return array('w'=>$w, 'h'=>$h, 'cs'=>$colspace, 'bpc'=>$bpc, 'f'=>'FlateDecode', 'parms'=>$parms, 'pal'=>$pal, 'trns'=>$trns, 'data'=>$data); +} + +function _readstream($f, $n) +{ + //Read n bytes from stream + $res=''; + while($n>0 && !feof($f)) + { + $s=fread($f,$n); + if($s===false) + $this->Error('Error while reading stream'); + $n-=strlen($s); + $res.=$s; + } + if($n>0) + $this->Error('Unexpected end of stream'); + return $res; +} + +function _readint($f) +{ + //Read a 4-byte integer from stream + $a=unpack('Ni',$this->_readstream($f,4)); + return $a['i']; +} + +function _parsegif($file) +{ + //Extract info from a GIF file (via PNG conversion) + if(!function_exists('imagepng')) + $this->Error('GD extension is required for GIF support'); + if(!function_exists('imagecreatefromgif')) + $this->Error('GD has no GIF read support'); + $im=imagecreatefromgif($file); + if(!$im) + $this->Error('Missing or incorrect image file: '.$file); + imageinterlace($im,0); + $tmp=tempnam('.','gif'); + if(!$tmp) + $this->Error('Unable to create a temporary file'); + if(!imagepng($im,$tmp)) + $this->Error('Error while saving to temporary file'); + imagedestroy($im); + $info=$this->_parsepng($tmp); + unlink($tmp); + return $info; +} + +function _newobj() +{ + //Begin a new object + $this->n++; + $this->offsets[$this->n]=strlen($this->buffer); + $this->_out($this->n.' 0 obj'); +} + +function _putstream($s) +{ + $this->_out('stream'); + $this->_out($s); + $this->_out('endstream'); +} + +function _out($s) +{ + //Add a line to the document + if($this->state==2) + $this->pages[$this->page].=$s."\n"; + else + $this->buffer.=$s."\n"; +} + +function _putpages() +{ + $nb=$this->page; + if(!empty($this->AliasNbPages)) + { + //Replace number of pages + for($n=1;$n<=$nb;$n++) + $this->pages[$n]=str_replace($this->AliasNbPages,$nb,$this->pages[$n]); + } + if($this->DefOrientation=='P') + { + $wPt=$this->DefPageFormat[0]*$this->k; + $hPt=$this->DefPageFormat[1]*$this->k; + } + else + { + $wPt=$this->DefPageFormat[1]*$this->k; + $hPt=$this->DefPageFormat[0]*$this->k; + } + $filter=($this->compress) ? '/Filter /FlateDecode ' : ''; + for($n=1;$n<=$nb;$n++) + { + //Page + $this->_newobj(); + $this->_out('<_out('/Parent 1 0 R'); + if(isset($this->PageSizes[$n])) + $this->_out(sprintf('/MediaBox [0 0 %.2F %.2F]',$this->PageSizes[$n][0],$this->PageSizes[$n][1])); + $this->_out('/Resources 2 0 R'); + if(isset($this->PageLinks[$n])) + { + //Links + $annots='/Annots ['; + foreach($this->PageLinks[$n] as $pl) + { + $rect=sprintf('%.2F %.2F %.2F %.2F',$pl[0],$pl[1],$pl[0]+$pl[2],$pl[1]-$pl[3]); + $annots.='<_textstring($pl[4]).'>>>>'; + else + { + $l=$this->links[$pl[4]]; + $h=isset($this->PageSizes[$l[0]]) ? $this->PageSizes[$l[0]][1] : $hPt; + $annots.=sprintf('/Dest [%d 0 R /XYZ 0 %.2F null]>>',1+2*$l[0],$h-$l[1]*$this->k); + } + } + $this->_out($annots.']'); + } + $this->_out('/Contents '.($this->n+1).' 0 R>>'); + $this->_out('endobj'); + //Page content + $p=($this->compress) ? gzcompress($this->pages[$n]) : $this->pages[$n]; + $this->_newobj(); + $this->_out('<<'.$filter.'/Length '.strlen($p).'>>'); + $this->_putstream($p); + $this->_out('endobj'); + } + //Pages root + $this->offsets[1]=strlen($this->buffer); + $this->_out('1 0 obj'); + $this->_out('<_out($kids.']'); + $this->_out('/Count '.$nb); + $this->_out(sprintf('/MediaBox [0 0 %.2F %.2F]',$wPt,$hPt)); + $this->_out('>>'); + $this->_out('endobj'); +} + +function _putfonts() +{ + $nf=$this->n; + foreach($this->diffs as $diff) + { + //Encodings + $this->_newobj(); + $this->_out('<>'); + $this->_out('endobj'); + } + foreach($this->FontFiles as $file=>$info) + { + //Font file embedding + $this->_newobj(); + $this->FontFiles[$file]['n']=$this->n; + $font=''; + $f=fopen($this->_getfontpath().$file,'rb',1); + if(!$f) + $this->Error('Font file not found'); + while(!feof($f)) + $font.=fread($f,8192); + fclose($f); + $compressed=(substr($file,-2)=='.z'); + if(!$compressed && isset($info['length2'])) + { + $header=(ord($font[0])==128); + if($header) + { + //Strip first binary header + $font=substr($font,6); + } + if($header && ord($font[$info['length1']])==128) + { + //Strip second binary header + $font=substr($font,0,$info['length1']).substr($font,$info['length1']+6); + } + } + $this->_out('<_out('/Filter /FlateDecode'); + $this->_out('/Length1 '.$info['length1']); + if(isset($info['length2'])) + $this->_out('/Length2 '.$info['length2'].' /Length3 0'); + $this->_out('>>'); + $this->_putstream($font); + $this->_out('endobj'); + } + foreach($this->fonts as $k=>$font) + { + //Font objects + $this->fonts[$k]['n']=$this->n+1; + $type=$font['type']; + $name=$font['name']; + if($type=='core') + { + //Standard font + $this->_newobj(); + $this->_out('<_out('/BaseFont /'.$name); + $this->_out('/Subtype /Type1'); + if($name!='Symbol' && $name!='ZapfDingbats') + $this->_out('/Encoding /WinAnsiEncoding'); + $this->_out('>>'); + $this->_out('endobj'); + } + elseif($type=='Type1' || $type=='TrueType') + { + //Additional Type1 or TrueType font + $this->_newobj(); + $this->_out('<_out('/BaseFont /'.$name); + $this->_out('/Subtype /'.$type); + $this->_out('/FirstChar 32 /LastChar 255'); + $this->_out('/Widths '.($this->n+1).' 0 R'); + $this->_out('/FontDescriptor '.($this->n+2).' 0 R'); + if($font['enc']) + { + if(isset($font['diff'])) + $this->_out('/Encoding '.($nf+$font['diff']).' 0 R'); + else + $this->_out('/Encoding /WinAnsiEncoding'); + } + $this->_out('>>'); + $this->_out('endobj'); + //Widths + $this->_newobj(); + $cw=&$font['cw']; + $s='['; + for($i=32;$i<=255;$i++) + $s.=$cw[chr($i)].' '; + $this->_out($s.']'); + $this->_out('endobj'); + //Descriptor + $this->_newobj(); + $s='<$v) + $s.=' /'.$k.' '.$v; + $file=$font['file']; + if($file) + $s.=' /FontFile'.($type=='Type1' ? '' : '2').' '.$this->FontFiles[$file]['n'].' 0 R'; + $this->_out($s.'>>'); + $this->_out('endobj'); + } + else + { + //Allow for additional types + $mtd='_put'.strtolower($type); + if(!method_exists($this,$mtd)) + $this->Error('Unsupported font type: '.$type); + $this->$mtd($font); + } + } +} + +function _putimages() +{ + $filter=($this->compress) ? '/Filter /FlateDecode ' : ''; + reset($this->images); + while(list($file,$info)=each($this->images)) + { + $this->_newobj(); + $this->images[$file]['n']=$this->n; + $this->_out('<_out('/Subtype /Image'); + $this->_out('/Width '.$info['w']); + $this->_out('/Height '.$info['h']); + if($info['cs']=='Indexed') + $this->_out('/ColorSpace [/Indexed /DeviceRGB '.(strlen($info['pal'])/3-1).' '.($this->n+1).' 0 R]'); + else + { + $this->_out('/ColorSpace /'.$info['cs']); + if($info['cs']=='DeviceCMYK') + $this->_out('/Decode [1 0 1 0 1 0 1 0]'); + } + $this->_out('/BitsPerComponent '.$info['bpc']); + if(isset($info['f'])) + $this->_out('/Filter /'.$info['f']); + if(isset($info['parms'])) + $this->_out($info['parms']); + if(isset($info['trns']) && is_array($info['trns'])) + { + $trns=''; + for($i=0;$i_out('/Mask ['.$trns.']'); + } + $this->_out('/Length '.strlen($info['data']).'>>'); + $this->_putstream($info['data']); + unset($this->images[$file]['data']); + $this->_out('endobj'); + //Palette + if($info['cs']=='Indexed') + { + $this->_newobj(); + $pal=($this->compress) ? gzcompress($info['pal']) : $info['pal']; + $this->_out('<<'.$filter.'/Length '.strlen($pal).'>>'); + $this->_putstream($pal); + $this->_out('endobj'); + } + } +} + +function _putxobjectdict() +{ + foreach($this->images as $image) + $this->_out('/I'.$image['i'].' '.$image['n'].' 0 R'); +} + +function _putresourcedict() +{ + $this->_out('/ProcSet [/PDF /Text /ImageB /ImageC /ImageI]'); + $this->_out('/Font <<'); + foreach($this->fonts as $font) + $this->_out('/F'.$font['i'].' '.$font['n'].' 0 R'); + $this->_out('>>'); + $this->_out('/XObject <<'); + $this->_putxobjectdict(); + $this->_out('>>'); +} + +function _putresources() +{ + $this->_putfonts(); + $this->_putimages(); + //Resource dictionary + $this->offsets[2]=strlen($this->buffer); + $this->_out('2 0 obj'); + $this->_out('<<'); + $this->_putresourcedict(); + $this->_out('>>'); + $this->_out('endobj'); +} + +function _putinfo() +{ + $this->_out('/Producer '.$this->_textstring('FPDF '.FPDF_VERSION)); + if(!empty($this->title)) + $this->_out('/Title '.$this->_textstring($this->title)); + if(!empty($this->subject)) + $this->_out('/Subject '.$this->_textstring($this->subject)); + if(!empty($this->author)) + $this->_out('/Author '.$this->_textstring($this->author)); + if(!empty($this->keywords)) + $this->_out('/Keywords '.$this->_textstring($this->keywords)); + if(!empty($this->creator)) + $this->_out('/Creator '.$this->_textstring($this->creator)); + $this->_out('/CreationDate '.$this->_textstring('D:'.@date('YmdHis'))); +} + +function _putcatalog() +{ + $this->_out('/Type /Catalog'); + $this->_out('/Pages 1 0 R'); + if($this->ZoomMode=='fullpage') + $this->_out('/OpenAction [3 0 R /Fit]'); + elseif($this->ZoomMode=='fullwidth') + $this->_out('/OpenAction [3 0 R /FitH null]'); + elseif($this->ZoomMode=='real') + $this->_out('/OpenAction [3 0 R /XYZ null null 1]'); + elseif(!is_string($this->ZoomMode)) + $this->_out('/OpenAction [3 0 R /XYZ null null '.($this->ZoomMode/100).']'); + if($this->LayoutMode=='single') + $this->_out('/PageLayout /SinglePage'); + elseif($this->LayoutMode=='continuous') + $this->_out('/PageLayout /OneColumn'); + elseif($this->LayoutMode=='two') + $this->_out('/PageLayout /TwoColumnLeft'); +} + +function _putheader() +{ + $this->_out('%PDF-'.$this->PDFVersion); +} + +function _puttrailer() +{ + $this->_out('/Size '.($this->n+1)); + $this->_out('/Root '.$this->n.' 0 R'); + $this->_out('/Info '.($this->n-1).' 0 R'); +} + +function _enddoc() +{ + $this->_putheader(); + $this->_putpages(); + $this->_putresources(); + //Info + $this->_newobj(); + $this->_out('<<'); + $this->_putinfo(); + $this->_out('>>'); + $this->_out('endobj'); + //Catalog + $this->_newobj(); + $this->_out('<<'); + $this->_putcatalog(); + $this->_out('>>'); + $this->_out('endobj'); + //Cross-ref + $o=strlen($this->buffer); + $this->_out('xref'); + $this->_out('0 '.($this->n+1)); + $this->_out('0000000000 65535 f '); + for($i=1;$i<=$this->n;$i++) + $this->_out(sprintf('%010d 00000 n ',$this->offsets[$i])); + //Trailer + $this->_out('trailer'); + $this->_out('<<'); + $this->_puttrailer(); + $this->_out('>>'); + $this->_out('startxref'); + $this->_out($o); + $this->_out('%%EOF'); + $this->state=3; +} +//End of class +} + +//Handle special IE contype request +if(isset($_SERVER['HTTP_USER_AGENT']) && $_SERVER['HTTP_USER_AGENT']=='contype') +{ + header('Content-Type: application/pdf'); + exit; +} + +?> diff --git a/webui/system/helper/libchart/COPYING b/webui/system/helper/libchart/COPYING new file mode 100644 index 00000000..94a9ed02 --- /dev/null +++ b/webui/system/helper/libchart/COPYING @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/webui/system/helper/libchart/ChangeLog b/webui/system/helper/libchart/ChangeLog new file mode 100644 index 00000000..8041d679 --- /dev/null +++ b/webui/system/helper/libchart/ChangeLog @@ -0,0 +1,57 @@ +Libchart ChangeLog +================== +(C) 2005-2010 Jean-Marc Trémeaux + + +VERSION 1.2.2: (2010-10-12) +========== + BUGFIXES: + * Ability to change colors. + * Fix #1 : Pie chart filled with solid color when percentage < 1. + +VERSION 1.2.1: (2008-04-10) +========== + BUGFIXES: + * Ability to set the upper/lower bounds (regression). + * HorizontalBarChart: a small box is shown when x = 0 (regression). + * Multiple series charts: when we go over the maximum series count, loop over color. + * Multiple series bar chart: brown color is shown twice. + * Pie chart : if some relative percentage is null, the whole diagram is filled in by one color. + * Ability to use negative values in bar chart. + +VERSION 1.2: (2007-08-13) +========== + LICENSE: + * Change of license to GPL v3 + + FEATURES: + * Multiple line charts + * Multiple vertical and horizontal bar charts + * Customizable layout (plot) + + REFACTORING: + * Support for PHP4 is deprecated, as PHP 4 has reached its end of life. + * Use of PHP5 OO constructs + * Use of setLowerBound(null) if you want to revert to the old behaviour. + + BUGFIXES: + * Removed undefined IMG_ARC_FILL constant + * Added missing default parameter in HorizontalChart::render() + * Fixed decimal values in Bar Charts + * Typo in default logo + * Crashed when no point was defined + * Crashed when all values were set to 0 + +Version 1.0: (2005-09-30) +========== + INITIAL RELEASE + diff --git a/webui/system/helper/libchart/README b/webui/system/helper/libchart/README new file mode 100644 index 00000000..4f0e0107 --- /dev/null +++ b/webui/system/helper/libchart/README @@ -0,0 +1,47 @@ + + Libchart - Simple PHP chart drawing library +============================================= + +Libchart is a free chart creation PHP library, that is easy to use. + +-------------------------------------------------------------------------------- + + + Features +========== + + * Bar charts (horizontal or vertical). + * Pie charts. + * Line charts. + * Compatibility with PHP 5. + +-------------------------------------------------------------------------------- + + + Dependencies +============== + + * PHP 5, compiled with: + * GD 2+ + * FreeType 2+ + +-------------------------------------------------------------------------------- + + + Installation +============== + +In order to use Libchart, unpack the archive in you project directory and +include libchart.php. Please have a look at the demo files for more information. +You need to chmod 777 the "generated" directory in order to generate the demos. +There is also a tutorial available at the project homepage. + + +-------------------------------------------------------------------------------- + + + Contact info +============== + +WWW: http://naku.dohcrew.com/libchart/ +MAIL: jm.tremeaux at gmail dot com diff --git a/webui/system/helper/libchart/classes/libchart.php b/webui/system/helper/libchart/classes/libchart.php new file mode 100644 index 00000000..20ca2391 --- /dev/null +++ b/webui/system/helper/libchart/classes/libchart.php @@ -0,0 +1,42 @@ +. + * + */ + + require_once 'model/Point.php'; + require_once 'model/DataSet.php'; + require_once 'model/XYDataSet.php'; + require_once 'model/XYSeriesDataSet.php'; + + require_once 'view/primitive/Padding.php'; + require_once 'view/primitive/Rectangle.php'; + require_once 'view/primitive/Primitive.php'; + require_once 'view/text/Text.php'; + require_once 'view/color/Color.php'; + require_once 'view/color/ColorSet.php'; + require_once 'view/color/Palette.php'; + require_once 'view/axis/Bound.php'; + require_once 'view/axis/Axis.php'; + require_once 'view/plot/Plot.php'; + require_once 'view/caption/Caption.php'; + require_once 'view/chart/Chart.php'; + require_once 'view/chart/BarChart.php'; + require_once 'view/chart/VerticalBarChart.php'; + require_once 'view/chart/HorizontalBarChart.php'; + require_once 'view/chart/LineChart.php'; + require_once 'view/chart/PieChart.php'; +?> \ No newline at end of file diff --git a/webui/system/helper/libchart/classes/model/DataSet.php b/webui/system/helper/libchart/classes/model/DataSet.php new file mode 100644 index 00000000..a84e7e1e --- /dev/null +++ b/webui/system/helper/libchart/classes/model/DataSet.php @@ -0,0 +1,28 @@ +. + * + */ + + /** + * Superclass of all data sets. + * + * @author Jean-Marc Trémeaux (jm.tremeaux at gmail.com) + * Created on 10 may 2007 + */ + abstract class DataSet { + } +?> \ No newline at end of file diff --git a/webui/system/helper/libchart/classes/model/Point.php b/webui/system/helper/libchart/classes/model/Point.php new file mode 100644 index 00000000..161374f9 --- /dev/null +++ b/webui/system/helper/libchart/classes/model/Point.php @@ -0,0 +1,59 @@ +. + * + */ + + /** + * Point of coordinates (X,Y). + * The value of X isn't really of interest, but X is used as a label to display on the horizontal axis. + * + * @author Jean-Marc Trémeaux (jm.tremeaux at gmail.com) + */ + class Point { + private $x; + private $y; + + /** + * Creates a new sampling point of coordinates (x, y) + * + * @param integer x coordinate (label) + * @param integer y coordinate (value) + */ + public function Point($x, $y) { + $this->x = $x; + $this->y = $y; + } + + /** + * Gets the x coordinate (label). + * + * @return integer x coordinate (label) + */ + public function getX() { + return $this->x; + } + + /** + * Gets the y coordinate (value). + * + * @return integer y coordinate (value) + */ + public function getY() { + return $this->y; + } + } +?> \ No newline at end of file diff --git a/webui/system/helper/libchart/classes/model/XYDataSet.php b/webui/system/helper/libchart/classes/model/XYDataSet.php new file mode 100644 index 00000000..523e1714 --- /dev/null +++ b/webui/system/helper/libchart/classes/model/XYDataSet.php @@ -0,0 +1,56 @@ +. + * + */ + + /** + * Set of data in the form of (x, y) items. + * + * @author Jean-Marc Trémeaux (jm.tremeaux at gmail.com) + * Created on 10 may 2007 + */ + class XYDataSet extends DataSet { + private $pointList; + + /** + * Constructor of XYDataSet. + * + */ + public function XYDataSet() { + $this->pointList = array(); + } + + /** + * Add a new point to the dataset. + * + * @param Point Point to add to the dataset + */ + + public function addPoint($point) { + array_push($this->pointList, $point); + } + + /** + * Getter of pointList. + * + * @return List of points. + */ + public function getPointList() { + return $this->pointList; + } + } +?> \ No newline at end of file diff --git a/webui/system/helper/libchart/classes/model/XYSeriesDataSet.php b/webui/system/helper/libchart/classes/model/XYSeriesDataSet.php new file mode 100644 index 00000000..a9538009 --- /dev/null +++ b/webui/system/helper/libchart/classes/model/XYSeriesDataSet.php @@ -0,0 +1,76 @@ +. + * + */ + + /** + * This dataset comprises several series of points and is used to plot multiple lines charts. + * Each serie is a XYDataSet. + * + * @author Jean-Marc Trémeaux (jm.tremeaux at gmail.com) + * Created on 20 july 2007 + */ + class XYSeriesDataSet extends DataSet { + /** + * List of titles + */ + private $titleList; + + /** + * List of XYDataSet. + */ + private $serieList; + + /** + * Constructor of XYSeriesDataSet. + * + */ + public function XYSeriesDataSet() { + $this->titleList = array(); + $this->serieList = array(); + } + + /** + * Add a new serie to the dataset. + * + * @param string Title (label) of the serie. + * @param XYDataSet Serie of points to add + */ + public function addSerie($title, $serie) { + array_push($this->titleList, $title); + array_push($this->serieList, $serie); + } + + /** + * Getter of titleList. + * + * @return List of titles. + */ + public function getTitleList() { + return $this->titleList; + } + + /** + * Getter of serieList. + * + * @return List of series. + */ + public function getSerieList() { + return $this->serieList; + } + } +?> \ No newline at end of file diff --git a/webui/system/helper/libchart/classes/view/axis/Axis.php b/webui/system/helper/libchart/classes/view/axis/Axis.php new file mode 100644 index 00000000..bcf3895e --- /dev/null +++ b/webui/system/helper/libchart/classes/view/axis/Axis.php @@ -0,0 +1,130 @@ +. + * + */ + + /** + * Automatic axis boundaries and ticks calibration + * + * @author Jean-Marc Trémeaux (jm.tremeaux at gmail.com) + */ + class Axis { + private $min; + private $max; + private $guide; + private $delta; + private $magnitude; + private $displayMin; + private $displayMax; + private $tics; + + /** + * Creates a new axis formatter. + * + * @param integer minimum value on the axis + * @param integer maximum value on the axis + */ + public function Axis($min, $max) { + $this->min = $min; + $this->max = $max; + + $this->guide = 10; + } + + /** + * Computes value between two ticks. + */ + public function quantizeTics() { + // Approximate number of decades, in [1..10[ + $norm = $this->delta / $this->magnitude; + + // Approximate number of tics per decade + $posns = $this->guide / $norm; + + if ($posns > 20) { + $tics = 0.05; // e.g. 0, .05, .10, ... + } else if ($posns > 10) { + $tics = 0.2; // e.g. 0, .1, .2, ... + } else if ($posns > 5) { + $tics = 0.4; // e.g. 0, 0.2, 0.4, ... + } else if ($posns > 3) { + $tics = 0.5; // e.g. 0, 0.5, 1, ... + } else if ($posns > 2) { + $tics = 1; // e.g. 0, 1, 2, ... + } else if ($posns > 0.25) { + $tics = 2; // e.g. 0, 2, 4, 6 + } else { + $tics = ceil($norm); + } + + $this->tics = $tics * $this->magnitude; + } + + /** + * Computes automatic boundaries on the axis + */ + public function computeBoundaries() { + // Range + $this->delta = abs($this->max - $this->min); + + // Check for null distribution + if ($this->delta == 0) + $this->delta = 1; + + // Order of magnitude of range + $this->magnitude = pow(10, floor(log10($this->delta))); + + $this->quantizeTics(); + + $this->displayMin = floor($this->min / $this->tics) * $this->tics; + $this->displayMax = ceil($this->max / $this->tics) * $this->tics; + $this->displayDelta = $this->displayMax - $this->displayMin; + + // Check for null distribution + if ($this->displayDelta == 0) { + $this->displayDelta = 1; + } + } + + /** + * Get the lower boundary on the axis3 + * + * @return integer lower boundary on the axis + */ + public function getLowerBoundary() { + return $this->displayMin; + } + + /** + * Get the upper boundary on the axis3 + * + * @return integer upper boundary on the axis + */ + public function getUpperBoundary() { + return $this->displayMax; + } + + /** + * Get the value between two ticks3 + * + * @return integer value between two ticks + */ + public function getTics() { + return $this->tics; + } + } +?> \ No newline at end of file diff --git a/webui/system/helper/libchart/classes/view/axis/Bound.php b/webui/system/helper/libchart/classes/view/axis/Bound.php new file mode 100644 index 00000000..d896cbf1 --- /dev/null +++ b/webui/system/helper/libchart/classes/view/axis/Bound.php @@ -0,0 +1,156 @@ +. + * + */ + + /** + * Object representing the bounds of a dataset (its minimal and maximal values) on its vertical axis. + * The bounds are automatically calculated from a XYDataSet or XYSeriesDataSet. + * Default (calculated) bounds can be overriden using the setLowerBound() and setUpperBound() methods. + * + * @author Jean-Marc Trémeaux (jm.tremeaux at gmail.com) + * Created on 25 july 2007 + */ + class Bound { + /** + * Manually set lower bound, overrides the value calculated by computeBound(). + */ + private $lowerBound = null; + + /** + * Manually set upper bound, overrides the value calculated by computeBound(). + */ + private $upperBound = null; + + /** + * Computed min bound. + */ + private $yMinValue = null; + + /** + * Computed max bound. + */ + private $yMaxValue = null; + + /** + * Compute the boundaries on the axis. + * + * @param dataSet The data set + */ + public function computeBound($dataSet) { + // Check if the data set is empty + $dataSetEmpty = true; + $serieList = null; + if ($dataSet instanceof XYDataSet) { + $pointList = $dataSet->getPointList(); + $dataSetEmpty = count($pointList) == 0; + + if (!$dataSetEmpty) { + // Process it as a serie + $serieList = array(); + array_push($serieList, $dataSet); + } + } else if ($dataSet instanceof XYSeriesDataSet) { + $serieList = $dataSet->getSerieList(); + if (count($serieList) > 0) { + $serie = current($serieList); + $dataSetEmpty = count($serie) == 0; + } + } else { + die("Error: unknown dataset type"); + } + + // If the dataset is empty, default some bounds + $yMin = 0; + $yMax = 1; + if (!$dataSetEmpty) { + // Compute lower and upper bound on the value axis + unset($yMin); + unset($yMax); + + foreach ($serieList as $serie) { + foreach ($serie->getPointList() as $point) { + $y = $point->getY(); + + if (!isset($yMin)) { + $yMin = $y; + $yMax = $y; + } else { + if ($y < $yMin) { + $yMin = $y; + } + + if ($y > $yMax) { + $yMax = $y; + } + } + } + } + } + + // If user specified bounds and they are actually greater than computer bounds, override computed bounds + if (isset($this->lowerBound) && $this->lowerBound < $yMin) { + $this->yMinValue = $this->lowerBound; + } else { + $this->yMinValue = $yMin; + } + + if (isset($this->upperBound) && $this->upperBound > $yMax) { + $this->yMaxValue = $this->upperBound; + } else { + $this->yMaxValue = $yMax; + } + } + + /** + * Getter of yMinValue. + * + * @return min bound + */ + public function getYMinValue() { + return $this->yMinValue; + } + + /** + * Getter of yMaxValue. + * + * @return max bound + */ + public function getYMaxValue() { + return $this->yMaxValue; + } + + /** + * Set manually the lower boundary value (overrides the automatic formatting). + * Typical usage is to set the bars starting from zero. + * + * @param double lower boundary value + */ + public function setLowerBound($lowerBound) { + $this->lowerBound = $lowerBound; + } + + /** + * Set manually the upper boundary value (overrides the automatic formatting). + * + * @param double upper boundary value + */ + public function setUpperBound($upperBound) { + $this->upperBound = $upperBound; + } + } +?> \ No newline at end of file diff --git a/webui/system/helper/libchart/classes/view/caption/Caption.php b/webui/system/helper/libchart/classes/view/caption/Caption.php new file mode 100644 index 00000000..8abde8f7 --- /dev/null +++ b/webui/system/helper/libchart/classes/view/caption/Caption.php @@ -0,0 +1,112 @@ +. + * + */ + + /** + * Caption. + * + * @author Jean-Marc Trémeaux (jm.tremeaux at gmail.com) + * Created on 30 july 2007 + */ + class Caption { + protected $labelBoxWidth; + protected $labelBoxHeight; + + // Plot + protected $plot; + + // Label list + protected $labelList; + + // Color set + protected $colorSet; + + /** + * Constructor of Caption + */ + public function Caption() { + $this->labelBoxWidth = 15; + $this->labelBoxHeight = 15; + } + + /** + * Render the caption. + */ + public function render() { + // Get graphical obects + $img = $this->plot->getImg(); + $palette = $this->plot->getPalette(); + $text = $this->plot->getText(); + $primitive = $this->plot->getPrimitive(); + + // Get the caption area + $captionArea = $this->plot->getCaptionArea(); + + // Get the pie color set + $colorSet = $this->colorSet; + $colorSet->reset(); + + $i = 0; + foreach ($this->labelList as $label) { + // Get the next color + $color = $colorSet->currentColor(); + $colorSet->next(); + + $boxX1 = $captionArea->x1; + $boxX2 = $boxX1 + $this->labelBoxWidth; + $boxY1 = $captionArea->y1 + 5 + $i * ($this->labelBoxHeight + 5); + $boxY2 = $boxY1 + $this->labelBoxHeight; + + $primitive->outlinedBox($boxX1, $boxY1, $boxX2, $boxY2, $palette->axisColor[0], $palette->axisColor[1]); + imagefilledrectangle($img, $boxX1 + 2, $boxY1 + 2, $boxX2 - 2, $boxY2 - 2, $color->getColor($img)); + + $text->printText($img, $boxX2 + 5, $boxY1 + $this->labelBoxHeight / 2, $this->plot->getTextColor(), $label, $text->fontCondensed, $text->VERTICAL_CENTER_ALIGN); + + $i++; + } + } + + /** + * Sets the plot. + * + * @param Plot The plot + */ + public function setPlot($plot) { + $this->plot = $plot; + } + + /** + * Sets the label list. + * + * @param Array label list + */ + public function setLabelList($labelList) { + $this->labelList = $labelList; + } + + + /** + * Sets the color set. + * + * @param Array Color set + */ + public function setColorSet($colorSet) { + $this->colorSet = $colorSet; + } + } +?> \ No newline at end of file diff --git a/webui/system/helper/libchart/classes/view/chart/BarChart.php b/webui/system/helper/libchart/classes/view/chart/BarChart.php new file mode 100644 index 00000000..cc4a7b6f --- /dev/null +++ b/webui/system/helper/libchart/classes/view/chart/BarChart.php @@ -0,0 +1,183 @@ +. + * + */ + + /** + * Base abstract class for rendering both horizontal and vertical bar charts. + * + * @author Jean-Marc Trémeaux (jm.tremeaux at gmail.com) + */ + abstract class BarChart extends Chart { + protected $bound; + protected $axis; + protected $hasSeveralSerie; + + /** + * Creates a new bar chart. + * + * @param integer width of the image + * @param integer height of the image + */ + protected function BarChart($width, $height) { + parent::Chart($width, $height); + + // Initialize the bounds + $this->bound = new Bound(); + $this->bound->setLowerBound(0); + } + + /** + * Compute the axis. + */ + protected function computeAxis() { + $this->axis = new Axis($this->bound->getYMinValue(), $this->bound->getYMaxValue()); + $this->axis->computeBoundaries(); + } + + /** + * Create the image. + */ + protected function createImage() { + parent::createImage(); + + // Get graphical obects + $img = $this->plot->getImg(); + $palette = $this->plot->getPalette(); + $text = $this->plot->getText(); + $primitive = $this->plot->getPrimitive(); + + // Get the graph area + $graphArea = $this->plot->getGraphArea(); + + // Aqua-like background + for ($i = $graphArea->y1; $i < $graphArea->y2; $i++) { + $color = $palette->backgroundColor[($i + 3) % 4]; + $primitive->line($graphArea->x1, $i, $graphArea->x2, $i, $color); + } + + // Axis + imagerectangle($img, $graphArea->x1 - 1, $graphArea->y1, $graphArea->x1, $graphArea->y2, $palette->axisColor[0]->getColor($img)); + imagerectangle($img, $graphArea->x1 - 1, $graphArea->y2, $graphArea->x2, $graphArea->y2 + 1, $palette->axisColor[0]->getColor($img)); + } + + /** + * Returns true if the data set has some data. + * @param minNumberOfPoint Minimum number of points (1 for bars, 2 for lines). + * + * @return true if data set empty + */ + protected function isEmptyDataSet($minNumberOfPoint) { + if ($this->dataSet instanceof XYDataSet) { + $pointList = $this->dataSet->getPointList(); + $pointCount = count($pointList); + return $pointCount < $minNumberOfPoint; + } else if ($this->dataSet instanceof XYSeriesDataSet) { + $serieList = $this->dataSet->getSerieList(); + reset($serieList); + if (count($serieList) > 0) { + $serie = current($serieList); + $pointList = $serie->getPointList(); + $pointCount = count($pointList); + return $pointCount < $minNumberOfPoint; + } + } else { + die("Error: unknown dataset type"); + } + } + + /** + * Checks the data model before rendering the graph. + */ + protected function checkDataModel() { + // Check if a dataset was defined + if (!$this->dataSet) { + die("Error: No dataset defined."); + } + + // Bar charts accept both XYDataSet and XYSeriesDataSet + if ($this->dataSet instanceof XYDataSet) { + // The dataset contains only one serie + $this->hasSeveralSerie = false; + } else if ($this->dataSet instanceof XYSeriesDataSet) { + // Check if each series has the same number of points + unset($lastPointCount); + $serieList = $this->dataSet->getSerieList(); + for ($i = 0; $i < count($serieList); $i++) { + $serie = $serieList[$i]; + $pointCount = count($serie->getPointList()); + if (isset($lastPointCount) && $pointCount != $lastPointCount) { + die("Error: serie <" . $i . "> doesn't have the same number of points as last serie (last one: <" . $lastPointCount. ">, this one: <" . $pointCount. ">)."); + } + $lastPointCount = $pointCount; + } + + // The dataset contains several series + $this->hasSeveralSerie = true; + } else { + die("Error: Bar chart accept only XYDataSet and XYSeriesDataSet"); + } + } + + /** + * Return the data as a series list (for consistency). + * + * @return List of series + */ + protected function getDataAsSerieList() { + // Get the data as a series list + $serieList = null; + if ($this->dataSet instanceof XYSeriesDataSet) { + $serieList = $this->dataSet->getSerieList(); + } else if ($this->dataSet instanceof XYDataSet) { + $serieList = array(); + array_push($serieList, $this->dataSet); + } + + return $serieList; + } + + /** + * Return the first serie of the list, or the dataSet itself if there is no serie. + * + * @return XYDataSet + */ + protected function getFirstSerieOfList() { + $pointList = null; + if ($this->dataSet instanceof XYSeriesDataSet) { + // For a series dataset, print the legend from the first serie + $serieList = $this->dataSet->getSerieList(); + reset($serieList); + $serie = current($serieList); + $pointList = $serie->getPointList(); + } else if ($this->dataSet instanceof XYDataSet) { + $pointList = $this->dataSet->getPointList(); + } + + return $pointList; + } + + /** + * Retourns the bound. + * + * @return bound Bound + */ + public function getBound() { + return $this->bound; + } + } +?> \ No newline at end of file diff --git a/webui/system/helper/libchart/classes/view/chart/Chart.php b/webui/system/helper/libchart/classes/view/chart/Chart.php new file mode 100644 index 00000000..f91f77f4 --- /dev/null +++ b/webui/system/helper/libchart/classes/view/chart/Chart.php @@ -0,0 +1,102 @@ +. + * + */ + + /*! \mainpage Libchart + * + * This is the reference API, automatically compiled by Doxygen. + * You can find here information that is not covered by the tutorial. + * + */ + + /** + * Base chart class. + * + * @author Jean-Marc Trémeaux (jm.tremeaux at gmail.com) + */ + abstract class Chart { + /** + * The data set. + */ + protected $dataSet; + + /** + * Plot (holds graphical attributes). + */ + protected $plot; + + /** + * Abstract constructor of Chart. + * + * @param integer width of the image + * @param integer height of the image + */ + protected function Chart($width, $height) { + // Creates the plot + $this->plot = new Plot($width, $height); + $this->plot->setTitle("Untitled chart"); + //$this->plot->setLogoFileName(dirname(__FILE__) . "/../../../images/PoweredBy.png"); + } + + /** + * Checks the data model before rendering the graph. + */ + protected function checkDataModel() { + // Check if a dataset was defined + if (!$this->dataSet) { + die("Error: No dataset defined."); + } + + // Maybe no points are defined, but that's ok. This will yield and empty graph with default boundaries. + } + + /** + * Create the image. + */ + protected function createImage() { + $this->plot->createImage(); + } + + /** + * Sets the data set. + * + * @param dataSet The data set + */ + public function setDataSet($dataSet) { + $this->dataSet = $dataSet; + } + + /** + * Return the plot. + * + * @return plot + */ + public function getPlot() { + return $this->plot; + } + + /** + * Sets the title. + * + * @param string New title + */ + public function setTitle($title) { + $this->plot->setTitle($title); + } + } +?> diff --git a/webui/system/helper/libchart/classes/view/chart/HorizontalBarChart.php b/webui/system/helper/libchart/classes/view/chart/HorizontalBarChart.php new file mode 100644 index 00000000..f1e018c4 --- /dev/null +++ b/webui/system/helper/libchart/classes/view/chart/HorizontalBarChart.php @@ -0,0 +1,217 @@ +. + * + */ + + /** + * Horizontal bar chart + * + * @author Jean-Marc Trémeaux (jm.tremeaux at gmail.com) + */ + class HorizontalBarChart extends BarChart { + /** + * Ratio of empty space beside the bars. + */ + private $emptyToFullRatio; + + /** + * Creates a new horizontal bar chart. + * + * @param integer width of the image + * @param integer height of the image + */ + public function HorizontalBarChart($width = 600, $height = 250) { + parent::BarChart($width, $height); + + $this->emptyToFullRatio = 1 / 5; + $this->plot->setGraphPadding(new Padding(5, 30, 30, 50)); + } + + /** + * Computes the layout. + */ + protected function computeLayout() { + if ($this->hasSeveralSerie) { + $this->plot->setHasCaption(true); + } + $this->plot->computeLayout(); + } + + /** + * Print the axis. + */ + protected function printAxis() { + $minValue = $this->axis->getLowerBoundary(); + $maxValue = $this->axis->getUpperBoundary(); + $stepValue = $this->axis->getTics(); + + // Get graphical obects + $img = $this->plot->getImg(); + $palette = $this->plot->getPalette(); + $text = $this->plot->getText(); + + // Get the graph area + $graphArea = $this->plot->getGraphArea(); + + // Horizontal axis + for ($value = $minValue; $value <= $maxValue; $value += $stepValue) { + $x = $graphArea->x1 + ($value - $minValue) * ($graphArea->x2 - $graphArea->x1) / ($this->axis->displayDelta); + + imagerectangle($img, $x - 1, $graphArea->y2 + 2, $x, $graphArea->y2 + 3, $palette->axisColor[0]->getColor($img)); + imagerectangle($img, $x - 1, $graphArea->y2, $x, $graphArea->y2 + 1, $palette->axisColor[1]->getColor($img)); + + $text->printText($img, $x, $graphArea->y2 + 5, $this->plot->getTextColor(), $value, $text->fontCondensed, $text->HORIZONTAL_CENTER_ALIGN); + } + + // Get first serie of a list + $pointList = $this->getFirstSerieOfList(); + + // Vertical Axis + $pointCount = count($pointList); + reset($pointList); + $rowHeight = ($graphArea->y2 - $graphArea->y1) / $pointCount; + reset($pointList); + for ($i = 0; $i <= $pointCount; $i++) { + $y = $graphArea->y2 - $i * $rowHeight; + + imagerectangle($img, $graphArea->x1 - 3, $y, $graphArea->x1 - 2, $y + 1, $palette->axisColor[0]->getColor($img)); + imagerectangle($img, $graphArea->x1 - 1, $y, $graphArea->x1, $y + 1, $palette->axisColor[1]->getColor($img)); + + if ($i < $pointCount) { + $point = current($pointList); + next($pointList); + + $label = $point->getX(); + + $text->printText($img, $graphArea->x1 - 5, $y - $rowHeight / 2, $this->plot->getTextColor(), $label, $text->fontCondensed, $text->HORIZONTAL_RIGHT_ALIGN | $text->VERTICAL_CENTER_ALIGN); + } + } + } + + /** + * Print the bars. + */ + protected function printBar() { + // Get the data as a list of series for consistency + $serieList = $this->getDataAsSerieList(); + + // Get graphical obects + $img = $this->plot->getImg(); + $palette = $this->plot->getPalette(); + $text = $this->plot->getText(); + + // Get the graph area + $graphArea = $this->plot->getGraphArea(); + + $minValue = $this->axis->getLowerBoundary(); + $maxValue = $this->axis->getUpperBoundary(); + $stepValue = $this->axis->getTics(); + + $barColorSet = $palette->barColorSet; + $barColorSet->reset(); + + $serieCount = count($serieList); + for ($j = 0; $j < $serieCount; $j++) { + $serie = $serieList[$j]; + $pointList = $serie->getPointList(); + $pointCount = count($pointList); + reset($pointList); + + // Get the next color + $color = $barColorSet->currentColor(); + $shadowColor = $barColorSet->currentShadowColor(); + $barColorSet->next(); + + $rowHeight = ($graphArea->y2 - $graphArea->y1) / $pointCount; + for ($i = 0; $i < $pointCount; $i++) { + $y = $graphArea->y2 - $i * $rowHeight; + + $point = current($pointList); + next($pointList); + + $value = $point->getY(); + + $xmax = $graphArea->x1 + ($value - $minValue) * ($graphArea->x2 - $graphArea->x1) / ($this->axis->displayDelta); + + // Bar dimensions + $yWithMargin = $y - $rowHeight * $this->emptyToFullRatio; + $rowWidthWithMargin = $rowHeight * (1 - $this->emptyToFullRatio * 2); + $barWidth = $rowWidthWithMargin / $serieCount; + $barOffset = $barWidth * $j; + $y1 = $yWithMargin - $barWidth - $barOffset; + $y2 = $yWithMargin - $barOffset - 1; + + // Text + $text->printText($img, $xmax + 5, $y2 - $barWidth / 2, $this->plot->getTextColor(), $value, $text->fontCondensed, $text->VERTICAL_CENTER_ALIGN); + + imagefilledrectangle($img, $graphArea->x1 + 1, $y1, $xmax, $y2, $shadowColor->getColor($img)); + + // Prevents drawing a small box when x = 0 + if ($graphArea->x1 != $xmax) { + imagefilledrectangle($img, $graphArea->x1 + 2, $y1 + 1, $xmax - 4, $y2, $color->getColor($img)); + } + } + } + } + + /** + * Renders the caption. + */ + protected function printCaption() { + // Get the list of labels + $labelList = $this->dataSet->getTitleList(); + + // Create the caption + $caption = new Caption(); + $caption->setPlot($this->plot); + $caption->setLabelList($labelList); + + $palette = $this->plot->getPalette(); + $barColorSet = $palette->barColorSet; + $caption->setColorSet($barColorSet); + + // Render the caption + $caption->render(); + } + + /** + * Render the chart image. + * + * @param string name of the file to render the image to (optional) + */ + public function render($fileName = null) { + // Check the data model + $this->checkDataModel(); + + $this->bound->computeBound($this->dataSet); + $this->computeAxis(); + $this->computeLayout(); + $this->createImage(); + $this->plot->printLogo(); + $this->plot->printTitle(); + if (!$this->isEmptyDataSet(1)) { + $this->printAxis(); + $this->printBar(); + if ($this->hasSeveralSerie) { + $this->printCaption(); + } + } + + $this->plot->render($fileName); + } + } +?> \ No newline at end of file diff --git a/webui/system/helper/libchart/classes/view/chart/LineChart.php b/webui/system/helper/libchart/classes/view/chart/LineChart.php new file mode 100644 index 00000000..cc7038bd --- /dev/null +++ b/webui/system/helper/libchart/classes/view/chart/LineChart.php @@ -0,0 +1,200 @@ +. + * + */ + + /** + * Line chart. + * + * @author Jean-Marc Trémeaux (jm.tremeaux at gmail.com) + */ + class LineChart extends BarChart { + /** + * Creates a new line chart. + * Line charts allow for XYDataSet and XYSeriesDataSet in order to plot several lines. + * + * @param integer width of the image + * @param integer height of the image + */ + public function LineChart($width = 600, $height = 250) { + parent::BarChart($width, $height); + + $this->plot->setGraphPadding(new Padding(5, 30, 50, 50)); + } + + /** + * Computes the layout. + */ + protected function computeLayout() { + if ($this->hasSeveralSerie) { + $this->plot->setHasCaption(true); + } + $this->plot->computeLayout(); + } + + /** + * Print the axis. + */ + protected function printAxis() { + $minValue = $this->axis->getLowerBoundary(); + $maxValue = $this->axis->getUpperBoundary(); + $stepValue = $this->axis->getTics(); + + // Get graphical obects + $img = $this->plot->getImg(); + $palette = $this->plot->getPalette(); + $text = $this->plot->getText(); + + // Get the graph area + $graphArea = $this->plot->getGraphArea(); + + // Vertical axis + for ($value = $minValue; $value <= $maxValue; $value += $stepValue) { + $y = $graphArea->y2 - ($value - $minValue) * ($graphArea->y2 - $graphArea->y1) / ($this->axis->displayDelta); + + imagerectangle($img, $graphArea->x1 - 3, $y, $graphArea->x1 - 2, $y + 1, $palette->axisColor[0]->getColor($img)); + imagerectangle($img, $graphArea->x1 - 1, $y, $graphArea->x1, $y + 1, $palette->axisColor[1]->getColor($img)); + + $text->printText($img, $graphArea->x1 - 5, $y, $this->plot->getTextColor(), $value, $text->fontCondensed, $text->HORIZONTAL_RIGHT_ALIGN | $text->VERTICAL_CENTER_ALIGN); + } + + // Get first serie of a list + $pointList = $this->getFirstSerieOfList(); + + // Horizontal Axis + $pointCount = count($pointList); + reset($pointList); + $columnWidth = ($graphArea->x2 - $graphArea->x1) / ($pointCount - 1); + + for ($i = 0; $i < $pointCount; $i++) { + $x = $graphArea->x1 + $i * $columnWidth; + + imagerectangle($img, $x - 1, $graphArea->y2 + 2, $x, $graphArea->y2 + 3, $palette->axisColor[0]->getColor($img)); + imagerectangle($img, $x - 1, $graphArea->y2, $x, $graphArea->y2 + 1, $palette->axisColor[1]->getColor($img)); + + $point = current($pointList); + next($pointList); + + $label = $point->getX(); + + $text->printDiagonal($img, $x - 5, $graphArea->y2 + 10, $this->plot->getTextColor(), $label); + } + } + + /** + * Print the lines. + */ + protected function printLine() { + $minValue = $this->axis->getLowerBoundary(); + $maxValue = $this->axis->getUpperBoundary(); + + // Get the data as a list of series for consistency + $serieList = $this->getDataAsSerieList(); + + // Get graphical obects + $img = $this->plot->getImg(); + $palette = $this->plot->getPalette(); + $text = $this->plot->getText(); + $primitive = $this->plot->getPrimitive(); + + // Get the graph area + $graphArea = $this->plot->getGraphArea(); + + $lineColorSet = $palette->lineColorSet; + $lineColorSet->reset(); + for ($j = 0; $j < count($serieList); $j++) { + $serie = $serieList[$j]; + $pointList = $serie->getPointList(); + $pointCount = count($pointList); + reset($pointList); + + $columnWidth = ($graphArea->x2 - $graphArea->x1) / ($pointCount - 1); + + $lineColor = $lineColorSet->currentColor(); + $lineColorShadow = $lineColorSet->currentShadowColor(); + $lineColorSet->next(); + $x1 = null; + $y1 = null; + for ($i = 0; $i < $pointCount; $i++) { + $x2 = $graphArea->x1 + $i * $columnWidth; + + $point = current($pointList); + next($pointList); + + $value = $point->getY(); + + $y2 = $graphArea->y2 - ($value - $minValue) * ($graphArea->y2 - $graphArea->y1) / ($this->axis->displayDelta); + + // Draw line + if ($x1) { + $primitive->line($x1, $y1, $x2, $y2, $lineColor, 4); + $primitive->line($x1, $y1 - 1, $x2, $y2 - 1, $lineColorShadow, 2); + } + + $x1 = $x2; + $y1 = $y2; + } + } + } + + /** + * Renders the caption. + */ + protected function printCaption() { + // Get the list of labels + $labelList = $this->dataSet->getTitleList(); + + // Create the caption + $caption = new Caption(); + $caption->setPlot($this->plot); + $caption->setLabelList($labelList); + + $palette = $this->plot->getPalette(); + $lineColorSet = $palette->lineColorSet; + $caption->setColorSet($lineColorSet); + + // Render the caption + $caption->render(); + } + + /** + * Render the chart image. + * + * @param string name of the file to render the image to (optional) + */ + public function render($fileName = null) { + // Check the data model + $this->checkDataModel(); + + $this->bound->computeBound($this->dataSet); + $this->computeAxis(); + $this->computeLayout(); + $this->createImage(); + $this->plot->printLogo(); + $this->plot->printTitle(); + if (!$this->isEmptyDataSet(2)) { + $this->printAxis(); + $this->printLine(); + if ($this->hasSeveralSerie) { + $this->printCaption(); + } + } + + $this->plot->render($fileName); + } + } +?> \ No newline at end of file diff --git a/webui/system/helper/libchart/classes/view/chart/PieChart.php b/webui/system/helper/libchart/classes/view/chart/PieChart.php new file mode 100644 index 00000000..6d4958ec --- /dev/null +++ b/webui/system/helper/libchart/classes/view/chart/PieChart.php @@ -0,0 +1,261 @@ +. + * + */ + + /** + * Pie chart. + * + * @author Jean-Marc Trémeaux (jm.tremeaux at gmail.com) + */ + class PieChart extends Chart { + protected $pieCenterX; + protected $pieCenterY; + + /** + * Constructor of a pie chart. + * + * @param integer width of the image + * @param integer height of the image + */ + public function PieChart($width = 600, $height = 250) { + parent::Chart($width, $height); + $this->plot->setGraphPadding(new Padding(15, 10, 30, 30)); + } + + /** + * Computes the layout. + */ + protected function computeLayout() { + $this->plot->setHasCaption(true); + $this->plot->computeLayout(); + + // Get the graph area + $graphArea = $this->plot->getGraphArea(); + + // Compute the coordinates of the pie + $this->pieCenterX = $graphArea->x1 + ($graphArea->x2 - $graphArea->x1) / 2; + $this->pieCenterY = $graphArea->y1 + ($graphArea->y2 - $graphArea->y1) / 2; + + $this->pieWidth = round(($graphArea->x2 - $graphArea->x1) * 4 / 5); + $this->pieHeight = round(($graphArea->y2 - $graphArea->y1) * 3.7 / 5); + $this->pieDepth = round($this->pieWidth * 0.05); + } + + /** + * Compare two sampling point values, order from biggest to lowest value. + * + * @param double first value + * @param double second value + * @return integer result of the comparison + */ + protected function sortPie($v1, $v2) { + return $v1[0] == $v2[0] ? 0 : + $v1[0] > $v2[0] ? -1 : + 1; + } + + /** + * Compute pie values in percentage and sort them. + */ + protected function computePercent() { + $this->total = 0; + $this->percent = array(); + + $pointList = $this->dataSet->getPointList(); + foreach ($pointList as $point) { + $this->total += $point->getY(); + } + + foreach ($pointList as $point) { + $percent = $this->total == 0 ? 0 : 100 * $point->getY() / $this->total; + + array_push($this->percent, array($percent, $point)); + } + + usort($this->percent, array("PieChart", "sortPie")); + } + + /** + * Creates the pie chart image. + */ + protected function createImage() { + parent::createImage(); + + // Get graphical obects + $img = $this->plot->getImg(); + $palette = $this->plot->getPalette(); + $primitive = $this->plot->getPrimitive(); + + // Get the graph area + $graphArea = $this->plot->getGraphArea(); + + // Legend box + $primitive->outlinedBox($graphArea->x1, $graphArea->y1, $graphArea->x2, $graphArea->y2, $palette->axisColor[0], $palette->axisColor[1]); + + // Aqua-like background + for ($i = $graphArea->y1 + 2; $i < $graphArea->y2 - 1; $i++) { + $color = $palette->backgroundColor[($i + 3) % 4]; + $primitive->line($graphArea->x1 + 2, $i, $graphArea->x2 - 2, $i, $color); + } + } + + /** + * Renders the caption. + */ + protected function printCaption() { + // Create a list of labels + $labelList = array(); + foreach($this->percent as $percent) { + list($percent, $point) = $percent; + $label = $point->getX(); + + array_push($labelList, $label); + } + + // Create the caption + $caption = new Caption(); + $caption->setPlot($this->plot); + $caption->setLabelList($labelList); + + $palette = $this->plot->getPalette(); + $pieColorSet = $palette->pieColorSet; + $caption->setColorSet($pieColorSet); + + // Render the caption + $caption->render(); + } + + /** + * Draw a 2D disc. + * + * @param integer Center coordinate (y) + * @param array Colors for each portion + * @param bitfield Drawing mode + */ + protected function drawDisc($cy, $colorArray, $mode) { + // Get graphical obects + $img = $this->plot->getImg(); + + $i = 0; + $oldAngle = 0; + $percentTotal = 0; + + foreach ($this->percent as $a) { + list ($percent, $point) = $a; + + // If value is null, don't draw this arc + if ($percent <= 0) { + continue; + } + + $color = $colorArray[$i % count($colorArray)]; + + $percentTotal += $percent; + $newAngle = $percentTotal * 360 / 100; + + // imagefilledarc doesn't like null values (#1) + if ($newAngle - $oldAngle >= 1) { + imagefilledarc($img, $this->pieCenterX, $cy, $this->pieWidth, $this->pieHeight, $oldAngle, $newAngle, $color->getColor($img), $mode); + } + + $oldAngle = $newAngle; + + $i++; + } + } + + /** + * Print the percentage text. + */ + protected function drawPercent() { + // Get graphical obects + $img = $this->plot->getImg(); + $palette = $this->plot->getPalette(); + $text = $this->plot->getText(); + $primitive = $this->plot->getPrimitive(); + + $angle1 = 0; + $percentTotal = 0; + + foreach ($this->percent as $a) { + list ($percent, $point) = $a; + + // If value is null, the arc isn't drawn, no need to display percent + if ($percent <= 0) { + continue; + } + + $percentTotal += $percent; + $angle2 = $percentTotal * 2 * M_PI / 100; + + $angle = $angle1 + ($angle2 - $angle1) / 2; + $label = number_format($percent) . "%"; + + $x = cos($angle) * ($this->pieWidth + 35) / 2 + $this->pieCenterX; + $y = sin($angle) * ($this->pieHeight + 35) / 2 + $this->pieCenterY; + + $text->printText($img, $x, $y, $this->plot->getTextColor(), $label, $text->fontCondensed, $text->HORIZONTAL_CENTER_ALIGN | $text->VERTICAL_CENTER_ALIGN); + + $angle1 = $angle2; + } + } + + /** + * Print the pie chart. + */ + protected function printPie() { + // Get graphical obects + $img = $this->plot->getImg(); + $palette = $this->plot->getPalette(); + $text = $this->plot->getText(); + $primitive = $this->plot->getPrimitive(); + + // Get the pie color set + $pieColorSet = $palette->pieColorSet; + $pieColorSet->reset(); + + // Silhouette + for ($cy = $this->pieCenterY + $this->pieDepth / 2; $cy >= $this->pieCenterY - $this->pieDepth / 2; $cy--) { + $this->drawDisc($cy, $palette->pieColorSet->shadowColorList, IMG_ARC_EDGED); + } + + // Top + $this->drawDisc($this->pieCenterY - $this->pieDepth / 2, $palette->pieColorSet->colorList, IMG_ARC_PIE); + + // Top Outline + $this->drawPercent(); + } + + /** + * Render the chart image. + * + * @param string name of the file to render the image to (optional) + */ + public function render($fileName = null) { + $this->computePercent(); + $this->computeLayout(); + $this->createImage(); + $this->plot->printLogo(); + $this->plot->printTitle(); + $this->printPie(); + $this->printCaption(); + + $this->plot->render($fileName); + } + } +?> \ No newline at end of file diff --git a/webui/system/helper/libchart/classes/view/chart/VerticalBarChart.php b/webui/system/helper/libchart/classes/view/chart/VerticalBarChart.php new file mode 100644 index 00000000..badd119a --- /dev/null +++ b/webui/system/helper/libchart/classes/view/chart/VerticalBarChart.php @@ -0,0 +1,217 @@ +. + * + */ + + /** + * Chart composed of vertical bars. + * + * @author Jean-Marc Trémeaux (jm.tremeaux at gmail.com) + */ + class VerticalBarChart extends BarChart { + /** + * Ratio of empty space beside the bars. + */ + private $emptyToFullRatio; + + /** + * Creates a new vertical bar chart + * + * @param integer width of the image + * @param integer height of the image + */ + public function VerticalBarChart($width = 600, $height = 250) { + parent::BarChart($width, $height); + + $this->emptyToFullRatio = 1 / 5; + $this->plot->setGraphPadding(new Padding(5, 30, 50, 50)); + } + + /** + * Computes the layout. + */ + protected function computeLayout() { + if ($this->hasSeveralSerie) { + $this->plot->setHasCaption(true); + } + $this->plot->computeLayout(); + } + + /** + * Print the horizontal and veritcal axis. + */ + protected function printAxis() { + $minValue = $this->axis->getLowerBoundary(); + $maxValue = $this->axis->getUpperBoundary(); + $stepValue = $this->axis->getTics(); + + // Get graphical obects + $img = $this->plot->getImg(); + $palette = $this->plot->getPalette(); + $text = $this->plot->getText(); + + // Get the graph area + $graphArea = $this->plot->getGraphArea(); + + // Vertical axis + for ($value = $minValue; $value <= $maxValue; $value += $stepValue) { + $y = $graphArea->y2 - ($value - $minValue) * ($graphArea->y2 - $graphArea->y1) / ($this->axis->displayDelta); + + imagerectangle($img, $graphArea->x1 - 3, $y, $graphArea->x1 - 2, $y + 1, $palette->axisColor[0]->getColor($img)); + imagerectangle($img, $graphArea->x1 - 1, $y, $graphArea->x1, $y + 1, $palette->axisColor[1]->getColor($img)); + + $text->printText($img, $graphArea->x1 - 5, $y, $this->plot->getTextColor(), $value, $text->fontCondensed, $text->HORIZONTAL_RIGHT_ALIGN | $text->VERTICAL_CENTER_ALIGN); + } + + // Get first serie of a list + $pointList = $this->getFirstSerieOfList(); + + // Horizontal Axis + $pointCount = count($pointList); + reset($pointList); + $columnWidth = ($graphArea->x2 - $graphArea->x1) / $pointCount; + for ($i = 0; $i <= $pointCount; $i++) { + $x = $graphArea->x1 + $i * $columnWidth; + + imagerectangle($img, $x - 1, $graphArea->y2 + 2, $x, $graphArea->y2 + 3, $palette->axisColor[0]->getColor($img)); + imagerectangle($img, $x - 1, $graphArea->y2, $x, $graphArea->y2 + 1, $palette->axisColor[1]->getColor($img)); + + if ($i < $pointCount) { + $point = current($pointList); + next($pointList); + + $label = $point->getX(); + + $text->printDiagonal($img, $x + $columnWidth * 1 / 3, $graphArea->y2 + 10, $this->plot->getTextColor(), $label); + } + } + } + + /** + * Print the bars. + */ + protected function printBar() { + // Get the data as a list of series for consistency + $serieList = $this->getDataAsSerieList(); + + // Get graphical obects + $img = $this->plot->getImg(); + $palette = $this->plot->getPalette(); + $text = $this->plot->getText(); + + // Get the graph area + $graphArea = $this->plot->getGraphArea(); + + $barColorSet = $palette->barColorSet; + $barColorSet->reset(); + + $minValue = $this->axis->getLowerBoundary(); + $maxValue = $this->axis->getUpperBoundary(); + $stepValue = $this->axis->getTics(); + + $serieCount = count($serieList); + for ($j = 0; $j < $serieCount; $j++) { + $serie = $serieList[$j]; + $pointList = $serie->getPointList(); + $pointCount = count($pointList); + reset($pointList); + + // Get the next color + $color = $barColorSet->currentColor(); + $shadowColor = $barColorSet->currentShadowColor(); + $barColorSet->next(); + + $columnWidth = ($graphArea->x2 - $graphArea->x1) / $pointCount; + for ($i = 0; $i < $pointCount; $i++) { + $x = $graphArea->x1 + $i * $columnWidth; + + $point = current($pointList); + next($pointList); + + $value = $point->getY(); + + $ymin = $graphArea->y2 - ($value - $minValue) * ($graphArea->y2 - $graphArea->y1) / ($this->axis->displayDelta); + + // Bar dimensions + $xWithMargin = $x + $columnWidth * $this->emptyToFullRatio; + $columnWidthWithMargin = $columnWidth * (1 - $this->emptyToFullRatio * 2); + $barWidth = $columnWidthWithMargin / $serieCount; + $barOffset = $barWidth * $j; + $x1 = $xWithMargin + $barOffset; + $x2 = $xWithMargin + $barWidth + $barOffset - 1; + + // Text + $text->printText($img, $x1 + $barWidth / 2 , $ymin - 5, $this->plot->getTextColor(), $value, $text->fontCondensed, $text->HORIZONTAL_CENTER_ALIGN | $text->VERTICAL_BOTTOM_ALIGN); + + // Vertical bar + imagefilledrectangle($img, $x1, $ymin, $x2, $graphArea->y2 - 1, $shadowColor->getColor($img)); + + // Prevents drawing a small box when y = 0 + if ($ymin != $graphArea->y2) { + imagefilledrectangle($img, $x1 + 1, $ymin + 1, $x2 - 4, $graphArea->y2 - 1, $color->getColor($img)); + } + } + } + } + + /** + * Renders the caption. + */ + protected function printCaption() { + // Get the list of labels + $labelList = $this->dataSet->getTitleList(); + + // Create the caption + $caption = new Caption(); + $caption->setPlot($this->plot); + $caption->setLabelList($labelList); + + $palette = $this->plot->getPalette(); + $barColorSet = $palette->barColorSet; + $caption->setColorSet($barColorSet); + + // Render the caption + $caption->render(); + } + + /** + * Render the chart image. + * + * @param string name of the file to render the image to (optional) + */ + public function render($fileName = null) { + // Check the data model + $this->checkDataModel(); + + $this->bound->computeBound($this->dataSet); + $this->computeAxis(); + $this->computeLayout(); + $this->createImage(); + $this->plot->printLogo(); + $this->plot->printTitle(); + if (!$this->isEmptyDataSet(1)) { + $this->printAxis(); + $this->printBar(); + if ($this->hasSeveralSerie) { + $this->printCaption(); + } + } + + $this->plot->render($fileName); + } + } +?> \ No newline at end of file diff --git a/webui/system/helper/libchart/classes/view/color/Color.php b/webui/system/helper/libchart/classes/view/color/Color.php new file mode 100644 index 00000000..6d686e68 --- /dev/null +++ b/webui/system/helper/libchart/classes/view/color/Color.php @@ -0,0 +1,99 @@ +. + * + */ + + /** + * Color. + * + * @author Jean-Marc Trémeaux (jm.tremeaux at gmail.com) + */ + class Color { + private $red; + private $green; + private $blue; + private $alpha; + private $gdColor; + + /** + * Creates a new color + * + * @param integer red [0..255] + * @param integer green [0..255] + * @param integer blue [0..255] + * @param integer alpha [0..255] + */ + public function Color($red, $green, $blue, $alpha = 0) { + $this->red = (int) $red; + $this->green = (int) $green; + $this->blue = (int) $blue; + $this->alpha = (int) round($alpha * 127.0 / 255); + + $this->gdColor = null; + } + + /** + * Get GD color. + * + * @param $img GD image resource + */ + public function getColor($img) { + // Checks if color has already been allocated + if (!$this->gdColor) { + if ($this->alpha == 0 || !function_exists('imagecolorallocatealpha')) { + $this->gdColor = imagecolorallocate($img, $this->red, $this->green, $this->blue); + } else { + $this->gdColor = imagecolorallocatealpha($img, $this->red, $this->green, $this->blue, $this->alpha); + } + } + + // Returns GD color + return $this->gdColor; + } + + /** + * Clip a color component in the interval [0..255] + * + * @param integer Component + * @return Clipped component + */ + public function clip($component) { + if ($component < 0) { + $component = 0; + } else if ($component > 255) { + $component = 255; + } + + return $component; + } + + /** + * Return a new color, which is a shadow of this one. + * + * @param double Multiplication factor + * @return Shadow color + */ + public function getShadowColor($shadowFactor) { + $red = $this->clip($this->red * $shadowFactor); + $green = $this->clip($this->green * $shadowFactor); + $blue = $this->clip($this->blue * $shadowFactor); + $shadowColor = new Color($red, $green, $blue); + + return $shadowColor; + } + } +?> \ No newline at end of file diff --git a/webui/system/helper/libchart/classes/view/color/ColorSet.php b/webui/system/helper/libchart/classes/view/color/ColorSet.php new file mode 100644 index 00000000..71cc3b34 --- /dev/null +++ b/webui/system/helper/libchart/classes/view/color/ColorSet.php @@ -0,0 +1,88 @@ +. + * + */ + + /** + * A set of colors, used for drawing series of data. + * + * @author Jean-Marc Trémeaux (jm.tremeaux at gmail.com) + * Created on 26 july 2007 + */ + class ColorSet { + public $colorList; + public $shadowColorList; + + /** + * ColorSet constructor. + * + * @param $shadowFactor Shadow factor + * @param $colorArray Colors as an array + */ + public function ColorSet($colorList, $shadowFactor) { + $this->colorList = $colorList; + $this->shadowColorList = array(); + + // Generate the shadow color set + foreach ($colorList as $color) { + $shadowColor = $color->getShadowColor($shadowFactor); + + array_push($this->shadowColorList, $shadowColor); + } + } + + /** + * Reset the iterator over the collections of colors. + */ + public function reset() { + reset($this->colorList); + reset($this->shadowColorList); + } + + /** + * Iterate over the colors and shadow colors. When we go after the last one, loop over. + * + */ + public function next() { + $value = next($this->colorList); + next($this->shadowColorList); + + // When we go after the last value, loop over. + if ($value == FALSE) { + $this->reset(); + } + } + + /** + * Returns the current color. + * + * @return Current color + */ + public function currentColor() { + return current($this->colorList); + } + + /** + * Returns the current shadow color. + * + * @return Current shadow color + */ + public function currentShadowColor() { + return current($this->shadowColorList); + } + } +?> \ No newline at end of file diff --git a/webui/system/helper/libchart/classes/view/color/Palette.php b/webui/system/helper/libchart/classes/view/color/Palette.php new file mode 100644 index 00000000..21557be9 --- /dev/null +++ b/webui/system/helper/libchart/classes/view/color/Palette.php @@ -0,0 +1,156 @@ +. + * + */ + + /** + * Color palette shared by all chart types. + * + * @author Jean-Marc Trémeaux (jm.tremeaux at gmail.com) + * Created on 25 july 2007 + */ + class Palette { + // Plot attributes + public $red; + public $axisColor; + public $backgroundColor; + + // Specific chart attributes + public $barColorSet; + public $lineColorSet; + public $pieColorSet; + + /** + * Palette constructor. + */ + public function Palette() { + $this->red = new Color(255, 0, 0); + + // Set the colors for the horizontal and vertical axis + $this->setAxisColor(array( + new Color(201, 201, 201), + new Color(158, 158, 158) + )); + + // Set the colors for the background + $this->setBackgroundColor(array( + new Color(242, 242, 242), + new Color(231, 231, 231), + new Color(239, 239, 239), + new Color(253, 253, 253) + )); + + // Set the colors for the bars + $this->setBarColor(array( + new Color(42, 71, 181), + new Color(243, 198, 118), + new Color(128, 63, 35), + new Color(195, 45, 28), + new Color(224, 198, 165), + new Color(239, 238, 218), + new Color(40, 72, 59), + new Color(71, 112, 132), + new Color(167, 192, 199), + new Color(218, 233, 202) + )); + + // Set the colors for the lines + $this->setLineColor(array( + new Color(172, 172, 210), + new Color(2, 78, 0), + new Color(148, 170, 36), + new Color(233, 191, 49), + new Color(240, 127, 41), + new Color(243, 63, 34), + new Color(190, 71, 47), + new Color(135, 81, 60), + new Color(128, 78, 162), + new Color(121, 75, 255), + new Color(142, 165, 250), + new Color(162, 254, 239), + new Color(137, 240, 166), + new Color(104, 221, 71), + new Color(98, 174, 35), + new Color(93, 129, 1) + )); + + // Set the colors for the pie + $this->setPieColor(array( + new Color(2, 78, 0), + new Color(148, 170, 36), + new Color(233, 191, 49), + new Color(240, 127, 41), + new Color(243, 63, 34), + new Color(190, 71, 47), + new Color(135, 81, 60), + new Color(128, 78, 162), + new Color(121, 75, 255), + new Color(142, 165, 250), + new Color(162, 254, 239), + new Color(137, 240, 166), + new Color(104, 221, 71), + new Color(98, 174, 35), + new Color(93, 129, 1) + )); + } + + /** + * Set the colors for the axis. + * + * @param colors Array of Color + */ + public function setAxisColor($colors) { + $this->axisColor = $colors; + } + + /** + * Set the colors for the background. + * + * @param colors Array of Color + */ + public function setBackgroundColor($colors) { + $this->backgroundColor = $colors; + } + + /** + * Set the colors for the bar charts. + * + * @param colors Array of Color + */ + public function setBarColor($colors) { + $this->barColorSet = new ColorSet($colors, 0.75); + } + + /** + * Set the colors for the line charts. + * + * @param colors Array of Color + */ + public function setLineColor($colors) { + $this->lineColorSet = new ColorSet($colors, 0.75); + } + + /** + * Set the colors for the pie charts. + * + * @param colors Array of Color + */ + public function setPieColor($colors) { + $this->pieColorSet = new ColorSet($colors, 0.7); + } + } +?> \ No newline at end of file diff --git a/webui/system/helper/libchart/classes/view/plot/Plot.php b/webui/system/helper/libchart/classes/view/plot/Plot.php new file mode 100644 index 00000000..5e6b8d25 --- /dev/null +++ b/webui/system/helper/libchart/classes/view/plot/Plot.php @@ -0,0 +1,443 @@ +. + * + */ + + /** + * The plot holds graphical attributes, and is responsible for computing the layout of the graph. + * The layout is quite simple right now, with 4 areas laid out like that: + * (of course this is subject to change in the future). + * + * output area------------------------------------------------| + * | (outer padding) | + * | image area--------------------------------------------| | + * | | (title padding) | | + * | | title area----------------------------------------| | | + * | | |-------------------------------------------------| | | + * | | | | + * | | (graph padding) (caption padding) | | + * | | graph area----------------| caption area---------| | | + * | | | | | | | | + * | | | | | | | | + * | | | | | | | | + * | | | | | | | | + * | | | | | | | | + * | | |-------------------------| |--------------------| | | + * | | | | + * | |-----------------------------------------------------| | + * | | + * |----------------------------------------------------------| + * + * All area dimensions are known in advance , and the optional logo is drawn in absolute coordinates. + * + * @author Jean-Marc Trémeaux (jm.tremeaux at gmail.com) + * Created on 27 july 2007 + */ + class Plot { + // Style properties + protected $title; + + /** + * Location of the logo. Can be overriden to your personalized logo. + */ + protected $logoFileName; + + /** + * Outer area, whose dimension is the same as the PNG returned. + */ + protected $outputArea; + + /** + * Outer padding surrounding the whole image, everything outside is blank. + */ + protected $outerPadding; + + /** + * Coordinates of the area inside the outer padding. + */ + protected $imageArea; + + /** + * Fixed title height in pixels. + */ + protected $titleHeight; + + /** + * Padding of the title area. + */ + protected $titlePadding; + + /** + * Coordinates of the title area. + */ + protected $titleArea; + + /** + * True if the plot has a caption. + */ + protected $hasCaption; + + /** + * Ratio of graph/caption in width. + */ + protected $graphCaptionRatio; + + /** + * Padding of the graph area. + */ + protected $graphPadding; + + /** + * Coordinates of the graph area. + */ + protected $graphArea; + + /** + * Padding of the caption area. + */ + protected $captionPadding; + + /** + * Coordinates of the caption area. + */ + protected $captionArea; + + /** + * Text writer. + */ + protected $text; + + /** + * Color palette. + */ + protected $palette; + + /** + * GD image + */ + protected $img; + + /** + * Drawing primitives + */ + protected $primitive; + + protected $backGroundColor; + protected $textColor; + + /** + * Constructor of Plot. + * + * @param integer width of the image + * @param integer height of the image + */ + public function Plot($width, $height) { + $this->width = $width; + $this->height = $height; + + $this->text = new Text(); + $this->palette = new Palette(); + + // Default layout + $this->outputArea = new Rectangle(0, 0, $width - 1, $height - 1); + $this->outerPadding = new Padding(5); + $this->titleHeight = 26; + $this->titlePadding = new Padding(5); + $this->hasCaption = false; + $this->graphCaptionRatio = 0.50; + $this->graphPadding = new Padding(50); + $this->captionPadding = new Padding(15); + } + + /** + * Compute the area inside the outer padding (outside is white). + */ + private function computeImageArea() { + $this->imageArea = $this->outputArea->getPaddedRectangle($this->outerPadding); + } + + /** + * Compute the title area. + */ + private function computeTitleArea() { + $titleUnpaddedBottom = $this->imageArea->y1 + $this->titleHeight + $this->titlePadding->top + $this->titlePadding->bottom; + $titleArea = new Rectangle( + $this->imageArea->x1, + $this->imageArea->y1, + $this->imageArea->x2, + $titleUnpaddedBottom - 1 + ); + $this->titleArea = $titleArea->getPaddedRectangle($this->titlePadding); + } + + /** + * Compute the graph area. + */ + private function computeGraphArea() { + $titleUnpaddedBottom = $this->imageArea->y1 + $this->titleHeight + $this->titlePadding->top + $this->titlePadding->bottom; + $graphArea = null; + if ($this->hasCaption) { + $graphUnpaddedRight = $this->imageArea->x1 + ($this->imageArea->x2 - $this->imageArea->x1) * $this->graphCaptionRatio + + $this->graphPadding->left + $this->graphPadding->right; + $graphArea = new Rectangle( + $this->imageArea->x1, + $titleUnpaddedBottom, + $graphUnpaddedRight - 1, + $this->imageArea->y2 + ); + } else { + $graphArea = new Rectangle( + $this->imageArea->x1+70, + $titleUnpaddedBottom, + $this->imageArea->x2, + $this->imageArea->y2 + ); + } + $this->graphArea = $graphArea->getPaddedRectangle($this->graphPadding); + } + + /** + * Compute the caption area. + */ + private function computeCaptionArea() { + $graphUnpaddedRight = $this->imageArea->x1 + ($this->imageArea->x2 - $this->imageArea->x1) * $this->graphCaptionRatio + + $this->graphPadding->left + $this->graphPadding->right; + $titleUnpaddedBottom = $this->imageArea->y1 + $this->titleHeight + $this->titlePadding->top + $this->titlePadding->bottom; + $captionArea = new Rectangle( + $graphUnpaddedRight, + $titleUnpaddedBottom, + $this->imageArea->x2, + $this->imageArea->y2 + ); + $this->captionArea = $captionArea->getPaddedRectangle($this->captionPadding); + } + + /** + * Compute the layout of all areas of the graph. + */ + public function computeLayout() { + $this->computeImageArea(); + $this->computeTitleArea(); + $this->computeGraphArea(); + if ($this->hasCaption) { + $this->computeCaptionArea(); + } + } + + /** + * Creates and initialize the image. + */ + public function createImage() { + $this->img = imagecreatetruecolor($this->width, $this->height); + + $this->primitive = new Primitive($this->img); + + $this->backGroundColor = new Color(255, 255, 255); + $this->textColor = new Color(0, 0, 0); + + // White background + imagefilledrectangle($this->img, 0, 0, $this->width - 1, $this->height - 1, $this->backGroundColor->getColor($this->img)); + + //imagerectangle($this->img, $this->imageArea->x1, $this->imageArea->y1, $this->imageArea->x2, $this->imageArea->y2, $this->palette->red->getColor($this->img)); + } + + /** + * Print the title to the image. + */ + public function printTitle() { + $yCenter = $this->titleArea->y1 + ($this->titleArea->y2 - $this->titleArea->y1) / 2; + $this->text->printCentered($this->img, $yCenter, $this->textColor, $this->title, $this->text->fontCondensedBold); + } + + /** + * Print the logo image to the image. + */ + public function printLogo() { + @$logoImage = imageCreateFromPNG($this->logoFileName); + + if ($logoImage) { + imagecopymerge($this->img, $logoImage, 2 * $this->outerPadding->left, $this->outerPadding->top, 0, 0, imagesx($logoImage), imagesy($logoImage), 100); + } + } + + /** + * Renders to a file or to standard output. + * + * @param fileName File name (optional) + */ + public function render($fileName) { + if (isset($fileName)) { + imagepng($this->img, $fileName); + } else { + imagepng($this->img); + } + } + + /** + * Sets the title. + * + * @param string New title + */ + public function setTitle($title) { + $this->title = $title; + } + + /** + * Sets the logo image file name. + * + * @param string New logo image file name + */ + public function setLogoFileName($logoFileName) { + $this->logoFileName = $logoFileName; + } + + /** + * Return the GD image. + * + * @return GD Image + */ + public function getImg() { + return $this->img; + } + + /** + * Return the palette. + * + * @return palette + */ + public function getPalette() { + return $this->palette; + } + + /** + * Return the text. + * + * @return text + */ + public function getText() { + return $this->text; + } + + /** + * Return the primitive. + * + * @return primitive + */ + public function getPrimitive() { + return $this->primitive; + } + + /** + * Return the outer padding. + * + * @param integer Outer padding value in pixels + */ + public function getOuterPadding() { + return $outerPadding; + } + + /** + * Set the outer padding. + * + * @param integer Outer padding value in pixels + */ + public function setOuterPadding($outerPadding) { + $this->outerPadding = $outerPadding; + } + + /** + * Return the title height. + * + * @param integer title height + */ + public function setTitleHeight($titleHeight) { + $this->titleHeight = $titleHeight; + } + + /** + * Return the title padding. + * + * @param integer title padding + */ + public function setTitlePadding($titlePadding) { + $this->titlePadding = $titlePadding; + } + + /** + * Return the graph padding. + * + * @param integer graph padding + */ + public function setGraphPadding($graphPadding) { + $this->graphPadding = $graphPadding; + } + + /** + * Set if the graph has a caption. + * + * @param boolean graph has a caption + */ + public function setHasCaption($hasCaption) { + $this->hasCaption = $hasCaption; + } + + /** + * Set the caption padding. + * + * @param integer caption padding + */ + public function setCaptionPadding($captionPadding) { + $this->captionPadding = $captionPadding; + } + + /** + * Set the graph/caption ratio. + * + * @param integer caption padding + */ + public function setGraphCaptionRatio($graphCaptionRatio) { + $this->graphCaptionRatio = $graphCaptionRatio; + } + + /** + * Return the graph area. + * + * @return graph area + */ + public function getGraphArea() { + return $this->graphArea; + } + + /** + * Return the caption area. + * + * @return caption area + */ + public function getCaptionArea() { + return $this->captionArea; + } + + /** + * Return the text color. + * + * @return text color + */ + public function getTextColor() { + return $this->textColor; + } + } +?> diff --git a/webui/system/helper/libchart/classes/view/primitive/Padding.php b/webui/system/helper/libchart/classes/view/primitive/Padding.php new file mode 100644 index 00000000..79662252 --- /dev/null +++ b/webui/system/helper/libchart/classes/view/primitive/Padding.php @@ -0,0 +1,68 @@ +. + * + */ + + /** + * Primitive geometric object representing a padding. + * + * @author Jean-Marc Trémeaux (jm.tremeaux at gmail.com) + * @Created on 27 july 2007 + */ + class Padding { + /** + * Top padding. + */ + public $top; + + /** + * Right padding. + */ + public $right; + + /** + * Bottom padding. + */ + public $bottom; + + /** + * Left padding. + */ + public $left; + + /** + * Creates a new padding. + * + * @param integer Top padding + * @param integer Right padding + * @param integer Bottom padding + * @param integer Left padding + */ + public function Padding($top, $right = null, $bottom = null, $left = null) { + $this->top = $top; + if ($right == null) { + $this->right = $top; + $this->bottom = $top; + $this->left = $top; + } else { + $this->right = $right; + $this->bottom = $bottom; + $this->left = $left; + } + } + } +?> \ No newline at end of file diff --git a/webui/system/helper/libchart/classes/view/primitive/Primitive.php b/webui/system/helper/libchart/classes/view/primitive/Primitive.php new file mode 100644 index 00000000..610bd2d8 --- /dev/null +++ b/webui/system/helper/libchart/classes/view/primitive/Primitive.php @@ -0,0 +1,70 @@ +. + * + */ + + /** + * Graphic primitives, extends GD with chart related primitives. + * + * @author Jean-Marc Trémeaux (jm.tremeaux at gmail.com) + */ + class Primitive { + private $img; + + /** + * Creates a new primitive object + * + * @param resource GD image resource + */ + public function Primitive($img) { + $this->img = $img; + } + + /** + * Draws a straight line. + * + * @param integer line start (X) + * @param integer line start (Y) + * @param integer line end (X) + * @param integer line end (Y) + * @param Color line color + */ + public function line($x1, $y1, $x2, $y2, $color, $width = 1) { + imagefilledpolygon($this->img, array($x1, $y1 - $width / 2, $x1, $y1 + $width / 2, $x2, $y2 + $width / 2, $x2, $y2 - $width / 2), 4, $color->getColor($this->img)); + // imageline($this->img, $x1, $y1, $x2, $y2, $color->getColor($this->img)); + } + + /** + * Draw a filled gray box with thick borders and darker corners. + * + * @param integer top left coordinate (x) + * @param integer top left coordinate (y) + * @param integer bottom right coordinate (x) + * @param integer bottom right coordinate (y) + * @param Color edge color + * @param Color corner color + */ + public function outlinedBox($x1, $y1, $x2, $y2, $color0, $color1) { + imagefilledrectangle($this->img, $x1, $y1, $x2, $y2, $color0->getColor($this->img)); + imagerectangle($this->img, $x1, $y1, $x1 + 1, $y1 + 1, $color1->getColor($this->img)); + imagerectangle($this->img, $x2 - 1, $y1, $x2, $y1 + 1, $color1->getColor($this->img)); + imagerectangle($this->img, $x1, $y2 - 1, $x1 + 1, $y2, $color1->getColor($this->img)); + imagerectangle($this->img, $x2 - 1, $y2 - 1, $x2, $y2, $color1->getColor($this->img)); + } + + } +?> \ No newline at end of file diff --git a/webui/system/helper/libchart/classes/view/primitive/Rectangle.php b/webui/system/helper/libchart/classes/view/primitive/Rectangle.php new file mode 100644 index 00000000..7129910b --- /dev/null +++ b/webui/system/helper/libchart/classes/view/primitive/Rectangle.php @@ -0,0 +1,80 @@ +. + * + */ + + /** + * A rectangle identified by the top-left and the bottom-right corners. + * + * @author Jean-Marc Trémeaux (jm.tremeaux at gmail.com) + * @Created on 27 july 2007 + */ + class Rectangle { + /** + * Top left X. + */ + public $x1; + + /** + * Top left Y. + */ + public $y1; + + /** + * Bottom right X. + */ + public $x2; + + /** + * Bottom right Y. + */ + public $y2; + + /** + * Constructor of Rectangle. + * + * @param x1 Left edge coordinate + * @param y1 Upper edge coordinate + * @param x2 Right edge coordinate + * @param y2 Bottom edge coordinate + */ + public function Rectangle($x1, $y1, $x2, $y2) { + $this->x1 = $x1; + $this->y1 = $y1; + $this->x2 = $x2; + $this->y2 = $y2; + } + + /** + * Apply a padding and returns the resulting rectangle. + * The result is an enlarged rectangle. + * + * @return Padded rectangle + */ + public function getPaddedRectangle($padding) { + $rectangle = new Rectangle( + $this->x1 + $padding->left, + $this->y1 + $padding->top, + $this->x2 - $padding->right, + $this->y2 - $padding->bottom + ); + + //echo "(" . $this->x1 . "," . $this->y1 . ") (" . $this->x2 . "," . $this->y2 . ")
"; + return $rectangle; + } + } +?> \ No newline at end of file diff --git a/webui/system/helper/libchart/classes/view/text/Text.php b/webui/system/helper/libchart/classes/view/text/Text.php new file mode 100644 index 00000000..7ba1838e --- /dev/null +++ b/webui/system/helper/libchart/classes/view/text/Text.php @@ -0,0 +1,129 @@ +. + * + */ + + /** + * Text drawing helper + * + * @author Jean-Marc Trémeaux (jm.tremeaux at gmail.com) + */ + class Text { + public $HORIZONTAL_LEFT_ALIGN = 1; + public $HORIZONTAL_CENTER_ALIGN = 2; + public $HORIZONTAL_RIGHT_ALIGN = 4; + public $VERTICAL_TOP_ALIGN = 8; + public $VERTICAL_CENTER_ALIGN = 16; + public $VERTICAL_BOTTOM_ALIGN = 32; + + /** + * Creates a new text drawing helper. + */ + public function Text() { + $baseDir = dirname(__FILE__) . "/../../../"; + + // Free low-res fonts based on Bitstream Vera + $this->fontCondensed = $baseDir . "fonts/DejaVuSansCondensed.ttf"; + $this->fontCondensedBold = $baseDir . "fonts/DejaVuSansCondensed-Bold.ttf"; + } + + /** + * Print text. + * + * @param Image GD image + * @param integer text coordinate (x) + * @param integer text coordinate (y) + * @param Color text color + * @param string text value + * @param string font file name + * @param bitfield text alignment + */ + public function printText($img, $px, $py, $color, $text, $fontFileName, $align = 0) { + if (!($align & $this->HORIZONTAL_CENTER_ALIGN) && !($align & $this->HORIZONTAL_RIGHT_ALIGN)) { + $align |= $this->HORIZONTAL_LEFT_ALIGN; + } + + if (!($align & $this->VERTICAL_CENTER_ALIGN) && !($align & $this->VERTICAL_BOTTOM_ALIGN)) { + $align |= $this->VERTICAL_TOP_ALIGN; + } + + $fontSize = 8; + $lineSpacing = 1; + + list ($llx, $lly, $lrx, $lry, $urx, $ury, $ulx, $uly) = imageftbbox($fontSize, 0, $fontFileName, $text, array("linespacing" => $lineSpacing)); + + $textWidth = $lrx - $llx; + $textHeight = $lry - $ury; + + $angle = 0; + + if ($align & $this->HORIZONTAL_CENTER_ALIGN) { + $px -= $textWidth / 2; + } + + if ($align & $this->HORIZONTAL_RIGHT_ALIGN) { + $px -= $textWidth; + } + + if ($align & $this->VERTICAL_CENTER_ALIGN) { + $py += $textHeight / 2; + } + + if ($align & $this->VERTICAL_TOP_ALIGN) { + $py += $textHeight; + } + + imagettftext($img, $fontSize, $angle, $px, $py, $color->getColor($img), $fontFileName, $text); + } + + /** + * Print text centered horizontally on the image. + * + * @param Image GD image + * @param integer text coordinate (y) + * @param Color text color + * @param string text value + * @param string font file name + */ + public function printCentered($img, $py, $color, $text, $fontFileName) { + $this->printText($img, imagesx($img) / 2, $py, $color, $text, $fontFileName, $this->HORIZONTAL_CENTER_ALIGN | $this->VERTICAL_CENTER_ALIGN); + } + + /** + * Print text in diagonal. + * + * @param Image GD image + * @param integer text coordinate (x) + * @param integer text coordinate (y) + * @param Color text color + * @param string text value + */ + public function printDiagonal($img, $px, $py, $color, $text) { + $fontSize = 8; + $fontFileName = $this->fontCondensed; + + $lineSpacing = 1; + + list ($lx, $ly, $rx, $ry) = imageftbbox($fontSize, 0, $fontFileName, $text, array("linespacing" => $lineSpacing)); + $textWidth = $rx - $lx; + + $angle = -45; + + imagettftext($img, $fontSize, $angle, $px, $py, $color->getColor($img), $fontFileName, $text); + } + } +?> \ No newline at end of file diff --git a/webui/system/helper/libchart/fonts/DejaVuSansCondensed-Bold.ttf b/webui/system/helper/libchart/fonts/DejaVuSansCondensed-Bold.ttf new file mode 100644 index 0000000000000000000000000000000000000000..6f4e42ecee285c78e382a287a5ef36b077cdfbb1 GIT binary patch literal 62716 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 literal 0 HcmV?d00001 diff --git a/webui/system/helper/libchart/fonts/DejaVuSansCondensed.ttf b/webui/system/helper/libchart/fonts/DejaVuSansCondensed.ttf new file mode 100644 index 0000000000000000000000000000000000000000..12af35728fd1fc8a6aa16fd9f1f51b9dc9634c43 GIT binary patch literal 73144 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 Zr9Sl^pZxzo-p@%9{g7EJx%^u0{{;fX5Rm`? literal 0 HcmV?d00001 diff --git a/webui/system/helper/libchart/images/PoweredBy.png b/webui/system/helper/libchart/images/PoweredBy.png new file mode 100644 index 0000000000000000000000000000000000000000..6c5290c879c7fc6b8cfc0549ac2e3343d1eb2e2a GIT binary patch literal 1608 zcmV-O2DkZ%P)WFU8GbZ8({Xk{QrNlj4iWF>9@00pc`L_t(o!`)bKOjB1B zKd-O+6Rp(%)+`7`Yl#og_6a5}8ga^$7&S{)7ZS=Cw3}rN%LpM;F{o^$aq0rj$e3|1 z6*HzHIu;!eP~tw|f~BEU_}7Pbg3`<5BAKoFNU;do5z9BydEr=M$b zUJn3bRu*6wh7fx8>{)DVti$1$=aj}Udh;yZx6CO^3yaE`{r6aZEk3H(lzi2AyDQ+e z+U<5Om)qRjOp+u?lC7<+0I+@gcDLJo;J|_N=g-@0w!*@~k&%&%j0~AfcJACcdRI!N z^2UuDEW2K>7mLLjjfVA7PoKVi z{rat2w<;?u*-M%gg7TBsXv+^R-Qmktzx+Dzh2ebRh0AySg@Dm<9QSxUZnvAu;B>LQ``2HZQED&*%wXz(m^B=nayUC$s`hq z06;F6U%Ys6!-fq!9?x#KM@B|QMMXV)_z)qa*XsoW0nG&fVAPoF-u*=%C5nB~Uxy~@xloDgF&a$(U-}|$&-_le$)l@iNK3Ycx-NkqVn_e zRVo!plK!0t81~Wuc|E>e7jpSiR#s-QSfo;^--n`ma`Yu);4XxSs<8n+Q*%)zf(P7+WaR|Gs)CUb4}D&AmHbb$Cym-P&-hwc*%@dFlQ>J1i{h)f%R~y!3OM_}p#$<~9k#p!gdA~L5I z1%lPP0_YJ~I;(~u2%@vI)8%rNmX-p5(P$hS8w&~wLI|nV>VbiQ(a}++_@yf)zdC|| zdIXH4zg)k2$9e!5ce?URYCC>9fn-5AUl*JGm{{Q#>Pg3(9N4Slai8TGFfwTGYf*OtSp&KR!~qN z5{c^T>!)rzDJh8|#k>�Df%md0%_-_rZINB{(cX5VLWmAQI=`sj|cma?_VC3Hv|) zHKL{Eo~h>R+s2;W@v$MmFdkp9QA%ju-IXE{2JpXN0m@(L7zfUZ9pQuk0000data = array_merge($this->data, $_); + } + else { + exit('Error: Could not load language ' . $file . '!'); + } + + } + + + public function get($key) { + return (isset($this->data[$key]) ? $this->data[$key] : $key); + } + + +} + + + + + + +?> diff --git a/webui/system/ldap.php b/webui/system/ldap.php new file mode 100644 index 00000000..bd04105a --- /dev/null +++ b/webui/system/ldap.php @@ -0,0 +1,50 @@ +driver = new $driver($ldaphost, $binddn, $bindpw); + } + + + public function ldap_query($basedn, $filter, $justthese) { + return $this->driver->query($basedn, $filter, $justthese); + } + + + public function ldap_add($dn, $entry) { + return @$this->driver->add($dn, $entry); + } + + + public function ldap_modify($dn, $entry) { + return @$this->driver->modify($dn, $entry); + } + + + public function ldap_rename($dn, $newrdn, $newparent) { + return @$this->driver->rename($dn, $newrdn, $newparent); + } + + + public function ldap_replace($dn, $entry) { + return @$this->driver->replace($dn, $entry); + } + + + public function ldap_delete($dn) { + return @$this->driver->delete($dn); + } + + +} + + +?> diff --git a/webui/system/loader.php b/webui/system/loader.php new file mode 100644 index 00000000..299e1a8d --- /dev/null +++ b/webui/system/loader.php @@ -0,0 +1,85 @@ + 2){ + unset($x[1]); + $model = join("/", $x); + } + + $class = 'Model' . preg_replace('/[^a-zA-Z0-9]/', '', $model); + + if (file_exists($file)) { + include_once($file); + + Registry::set('model_' . str_replace('/', '_', $model), new $class()); + } else { + exit('Error: Could not load model ' . $model . '!'); + } + } + + + public function database($driver, $hostname, $username, $password, $database, $prefix = NULL, $charset = 'UTF8') { + $file = DIR_SYSTEM . 'database/' . $driver . '.php'; + $class = 'Database' . preg_replace('/[^a-zA-Z0-9]/', '', $driver); + + if (file_exists($file)) { + include_once($file); + + Registry::set(str_replace('/', '_', $driver), new $class()); + } else { + exit('Error: Could not load database ' . $drvier . '!'); + } + } + + + public function helper($helper) { + $file = DIR_SYSTEM . 'helper/' . $helper . '.php'; + + if (file_exists($file)) { + include_once($file); + } else { + exit('Error: Could not load helper ' . $helper . '!'); + } + } + + + public function config($config) { + $this->config->load($config); + } + + + public function language($language) { + $this->language->load($language); + } + +} + + +?> diff --git a/webui/system/mail.php b/webui/system/mail.php new file mode 100644 index 00000000..3cebda18 --- /dev/null +++ b/webui/system/mail.php @@ -0,0 +1,128 @@ +to = $to; + } + + public function setFrom($from) { + $this->from = $from; + } + + public function setSender($sender) { + $this->sender = $sender; + } + + public function setSubject($subject) { + $this->subject = $subject; + } + + public function setText($text) { + $this->text = $text; + } + + public function setHtml($html) { + $this->html = $html; + } + + public function addAttachment($attachments, $embed = FALSE) { + $this->attachments[] = $attachments; + } + + public function send() { + if (!$this->to) { + exit('Error: E-Mail to required!'); + } + + if (!$this->from) { + exit('Error: E-Mail from required!'); + } + + if (!$this->sender) { + exit('Error: E-Mail sender required!'); + } + + if (!$this->subject) { + exit('Error: E-Mail subject required!'); + } + + if ((!$this->text) && (!$this->html)) { + exit('Error: E-Mail message required!'); + } + + if (is_array($this->to)) { + $to = implode($this->to, ','); + } else { + $to = $this->to; + } + + $boundary = '----=_NextPart_' . md5(rand()); + + if (strtoupper(substr(PHP_OS, 0, 3) == 'WIN')) { + $eol = "\r\n"; + } elseif (strtoupper(substr(PHP_OS, 0, 3)=='MAC')) { + $eol = "\r"; + } else { + $eol = "\n"; + } + + $headers = 'From: ' . $this->sender . ' <' . $this->from . '>' . $eol; + $headers .= 'Reply-To: ' . $this->sender . ' <' . $this->from . '>' . $eol; + $headers .= 'MIME-Version: 1.0' . $eol; + $headers .= 'Content-Type: multipart/mixed; boundary="' . $boundary . '"' . $eol . $eol; + + if (!$this->html) { + $message = '--' . $boundary . $eol; + $message .= 'Content-Type: text/plain; charset="utf-8"' . $eol; + $message .= 'Content-Transfer-Encoding: base64' . $eol . $eol; + $message .= chunk_split(base64_encode($this->text)); + } else { + $message = '--' . $boundary . $eol; + $message .= 'Content-Type: multipart/alternative; boundary="' . $boundary . '_alt"' . $eol . $eol; + $message .= '--' . $boundary . '_alt' . $eol; + $message .= 'Content-Type: text/plain; charset="utf-8"' . $eol; + $message .= 'Content-Transfer-Encoding: base64' . $eol; + + if ($this->text) { + $message .= chunk_split(base64_encode($this->text)); + } else { + $message .= chunk_split(base64_encode('This is a HTML email and your email client software does not support HTML email!')); + } + + $message .= '--' . $boundary . '_alt' . $eol; + $message .= 'Content-Type: text/html; charset="utf-8"' . $eol; + $message .= 'Content-Transfer-Encoding: base64' . $eol . $eol; + $message .= chunk_split(base64_encode($this->html)); + $message .= '--' . $boundary . '_alt--' . $eol; + } + + foreach ($this->attachments as $attachment) { + $filename = basename($attachment); + $handle = fopen($attachment, 'r'); + $content = fread($handle, filesize($attachment)); + + fclose($handle); + + $message .= '--' . $boundary . $eol; + $message .= 'Content-Type: application/octetstream' . $eol; + $message .= 'Content-Transfer-Encoding: base64' . $eol; + $message .= 'Content-Disposition: attachment; filename="' . $filename . '"' . $eol; + $message .= 'Content-ID: <' . $filename . '>' . $eol . $eol; + $message .= chunk_split(base64_encode($content)); + } + + ini_set('sendmail_from', $this->from); + + mail($to, $this->subject, $message, $headers); + } +} +?> diff --git a/webui/system/misc.php b/webui/system/misc.php new file mode 100644 index 00000000..35c8ac6b --- /dev/null +++ b/webui/system/misc.php @@ -0,0 +1,439 @@ +query("SELECT id FROM " . TABLE_META . " WHERE piler_id=?", array($piler_id)); + if(isset($query->row['id'])) { $id = $query->row['id']; } + } + + $query = $db->query("INSERT INTO " . TABLE_AUDIT . " (ts, email, action, ipaddr, meta_id, description) VALUES(?,?,?,?,?,?)", array(time(), $email, $action, $ipaddr, $id, $description)); + return $db->countAffected(); +} + + +function getAuthenticatedUsername() { + + if(isset($_SESSION['username'])){ return $_SESSION['username']; } + + return ""; +} + + +function isAdminUser() { + if(isset($_SESSION['admin_user']) && $_SESSION['admin_user'] == 1){ return 1; } + + return 0; +} + + +function isAuditorUser() { + if(isset($_SESSION['auditor_user']) && $_SESSION['admin_user'] == 2){ return 1; } + + return 0; +} + + +function isReadonlyAdmin() { + if(isset($_SESSION['admin_user']) && $_SESSION['admin_user'] == 3){ return 1; } + + return 0; +} + + +function logout() { + AUDIT(ACTION_LOGOUT, $_SESSION['email'], '', '', ''); + + $_SESSION['username'] = ""; + $_SESSION['admin_user'] = 0; + + unset($_SESSION['username']); + unset($_SESSION['admin_user']); + + Registry::set('username', ''); + +} + + +function isBinary($num = '') { + if($num == 0 || $num == 1){ return 1; } + + return 0; +} + + +function get_page_length() { + $page_len = PAGE_LEN; + + if(isset($_SESSION['pagelen']) && is_numeric($_SESSION['pagelen']) && $_SESSION['pagelen'] >= 10 && $_SESSION['pagelen'] <= 50) { + $page_len = $_SESSION['pagelen']; + } + + return $page_len; +} + + +function checkemail($email, $domains) { + if(validemail($email) == 0){ + return 0; + } + + if($email == 'admin@local') { return 1; } + + + list($u, $d) = explode('@', $email); + + foreach ($domains as $domain) { + if($domain == $d){ return 1; } + } + + return -1; +} + + +function validemail($email = '') { + if($email == '') { return 0; } + + if($email == 'admin@local') { return 1; } + + if(preg_match('/^[_a-zA-Z0-9-]+(\.[_a-zA-Z0-9-]+)*@[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)*(\.[a-zA-Z]{2,5})$/', $email)) { + return 1; + } + + return 0; +} + + +function first_n_characters($what, $n){ + $x = ""; + $len = 0; + + $a = explode(" ", $what); + while(list($k, $v) = each($a)){ + $x .= "$v "; $len += strlen($v) + 1; + if($len >= $n){ return $x . "..."; } + } + + return $x . "..."; +} + + +function short_email($email) { + if(strlen($email) > 25) { + return substr($email, 0, 25) . "..."; + } + + else return $email; +} + + +function verify_piler_id($id = '') { + if($id == '') { return 0; } + + if(preg_match("/^([0-9a-f]+)$/", $id)) { return 1; } + + return 0; +} + + +function createTempName($dir = '', $prefix = '') { + $length = 8; + $rnd = ""; + $aZ09 = array_merge(range('A', 'Z'), range('a', 'z'),range(0, 9)); + + for($c=0; $c < $length; $c++) { + $rnd .= $aZ09[mt_rand(0, count($aZ09)-1)]; + } + + return $dir . "/" . $prefix . $rnd; +} + + +function read_konfig($configfile = '') { + $cfg = array(); + + if($configfile == '') { return $cfg; } + + $fp = fopen($configfile, "r"); + if($fp) { + while(($line = fgets($fp, 4096))) { + $line = trim($line); + + if($line[0] == '#' || $line[0] == ';') { continue; } + + list($host, $basedn, $binddn, $bindpw, $type, $domain, $gid, $policy_group) = explode(":", $line); + + $cfg[] = array( + 'ldap_host' => $host, + 'ldap_basedn' => $basedn, + 'ldap_binddn' => $binddn, + 'ldap_bindpw' => $bindpw, + 'type' => $type, + 'domain' => $domain, + 'gid' => $gid, + 'policy_group' => $policy_group + ); + } + + + fclose($fp); + } + + + return $cfg; +} + + +function my_qp_encode($s){ + $res = ""; + + $a = explode("\n", $s); + while(list($k, $v) = each($a)){ + $part = ""; + + for($i=0; $i 0 && ($i % 76) == 0) $part .= "=\r\n"; + + $c = substr($v, $i, 1); + if(ord($c) >= 128){ + $c = "=" . strtoupper(dechex(ord($c))); + } + + if($c == ' ') { $c = '_'; } + + $part .= $c; + } + + $res .= $part . "\n"; + } + + return $res; +} + + +function format_qshape($desc = '', $filename = '') { + $leadingspaces = 999; + + if($filename == '' || !file_exists($filename) ) { return array(); } + + $stat = stat($filename); + + $s = file_get_contents($filename); + + $a = explode("\n", $s); + while(list($k, $v) = each($a)){ + $len1 = strlen($v); + $v = preg_replace("/^\ {0,}/", "", $v); + $delta = $len1 - strlen($v); + if($len1 > 5 && $delta < $leadingspaces) { $leadingspaces = $delta; } + } + + reset($a); $s=""; + + while(list($k, $v) = each($a)){ + $s .= substr($v, $leadingspaces, strlen($v)) . "\n"; + } + + return array('desc' => $desc, 'date' => date(LOG_DATE_FORMAT, $stat['ctime']), 'lines' => $s); +} + + +function nice_size($size = 0) { + if($size < 1000) return "1k"; + if($size < 100000) return round($size/1000) . "k"; + + return sprintf("%.1f", $size/1000000) . "M"; +} + + +function assemble_search_url($term = '') { + $term_value = ""; + + if($term == '') { return $term_value; } + + parse_str($term, $a); + +//print_r($a); + + if(isset($a['search'])) { $term_value = $a['search']; } + + if(isset($a['f'])) { + foreach($a['f'] as $f) { + $val = array_shift($a['v']); + + if($val == '') { continue; } + + if($f == 'from') { $term_value .= ", from: " . $val; } + if($f == 'to') { $term_value .= ", to: " . $val; } + if($f == 'subject') { $term_value .= ", subj: " . $val; } + if($f == 'body') { $term_value .= ", body: " . $val; } + } + } + + if(isset($a['from'])) { $term_value .= ", from: " . $a['from'];} + if(isset($a['to'])) { $term_value .= ", to: " . $a['to'];} + if(isset($a['subject'])) { $term_value .= ", text: " . $a['subject'];} + + if(isset($a['date1'])) { $term_value .= ", date1: " . $a['date1']; } + if(isset($a['date2'])) { $term_value .= ", date2: " . $a['date2']; } + if(isset($a['direction'])) { $term_value .= ", d: " . $a['direction']; } + + if(isset($a['sort'])) { $term_value .= ", sort: " . $a['sort']; } + if(isset($a['order'])) { $term_value .= ", order: " . $a['order']; } + + + $term_value = preg_replace("/^\, /", "", $term_value); + + return $term_value; +} + + +function fix_email_address($email = '') { + return preg_replace("/(^\ {0,}|\ {0,}$)/", "", $email); +} + + +function assemble_search_term($data = array()) { + $term = ""; + + if(isset($data['advanced']) && $data['advanced'] == 1) { + $term = "advanced=1&date1=" . $data['date1'] . "&date2=" . $data['date2']; + + $term .= "&from=" . $data['from']; + for($i=2; $i/", ">", $s); + $s = preg_replace("/\= 1 && $a == "") { return "search.php?page=$page"; } + + return "search.php?page=$page&$a";*/ +} + + +function parse_string_to_array($s = '', $arr = array()) { + $a = array(); + + parse_str($s, $a); + + while(list($k, $v) = each($a)) { + if(!isset($arr[$k]) || $arr[$k] == '') $arr[$k] = $v; + } + +} + + +function fetch_url($url = '') { + if($url == '') { return ''; } + + $ch = curl_init(); + + curl_setopt($ch, CURLOPT_URL, $url); + curl_setopt($ch, CURLOPT_HEADER, 0); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); + + $result = curl_exec($ch); + + curl_close($ch); + + return $result; +} + + +function fixup_date_condition($field = '', $date1 = 0, $date2 = 0) { + $date = ""; + + if($date1) { + list($y,$m,$d) = explode("-", $date1); + $date1 = mktime(0, 0, 0, $m, $d, $y); + + if($date1 > 0) { $date .= "$field >= $date1 "; } + } + + if($date2) { + list($y,$m,$d) = explode("-", $date2); + $date2 = mktime(23, 59, 59, $m, $d, $y); + + if($date2 > 0) { + if($date) { $date .= " AND "; } + $date .= "$field <= $date2 "; + } + } + + //if($date) { $date .= " AND "; } + + return $date; +} + + +function make_short_string($what, $length) { + return strlen($what) > $length ? substr($what, 0, $length) . "..." : $what; +} + + +?> diff --git a/webui/system/model.php b/webui/system/model.php new file mode 100644 index 00000000..49951a05 --- /dev/null +++ b/webui/system/model.php @@ -0,0 +1,17 @@ + diff --git a/webui/system/registry.php b/webui/system/registry.php new file mode 100644 index 00000000..d389b038 --- /dev/null +++ b/webui/system/registry.php @@ -0,0 +1,25 @@ + diff --git a/webui/system/request.php b/webui/system/request.php new file mode 100644 index 00000000..adbd7747 --- /dev/null +++ b/webui/system/request.php @@ -0,0 +1,42 @@ +get =& $this->clean($_GET); + $this->post =& $this->clean($_POST); + $this->cookie =& $this->clean($_COOKIE); + $this->files =& $this->clean($_FILES); + $this->server =& $this->clean($_SERVER); + + if(isset($_SERVER['REQUEST_URI'])) { + $this->fixed_request_uri = preg_replace("/\/([\w]+)\.php\?{0,1}/", "", $_SERVER['REQUEST_URI']); + } + + } + + + public function clean($data) { + if (is_array($data)) { + foreach ($data as $key => $value) { + $data[$key] =& $this->clean($value); + } + } else { + //$data = htmlspecialchars($data, ENT_QUOTES, 'UTF-8'); + } + + return $data; + } + + +} + + +?> diff --git a/webui/system/router.php b/webui/system/router.php new file mode 100644 index 00000000..e6e94771 --- /dev/null +++ b/webui/system/router.php @@ -0,0 +1,50 @@ +sanitize_path($route); + + $file = DIR_APPLICATION . $path . '.php'; + + if(is_file($file)){ + $this->class = $path; + } + + if($args){ + $this->args = $args; + } + + $this->method = 'index'; + } + + + public function getClass(){ + return $this->class; + } + + + public function getMethod(){ + return $this->method; + } + + + public function getArgs(){ + return $this->args; + } + + +} + + +?> diff --git a/webui/system/startup.php b/webui/system/startup.php new file mode 100644 index 00000000..f100e612 --- /dev/null +++ b/webui/system/startup.php @@ -0,0 +1,20 @@ + diff --git a/webui/view/javascript/colorbox.js b/webui/view/javascript/colorbox.js new file mode 100644 index 00000000..a82c6afd --- /dev/null +++ b/webui/view/javascript/colorbox.js @@ -0,0 +1,888 @@ +// ColorBox v1.3.19 - jQuery lightbox plugin +// (c) 2011 Jack Moore - jacklmoore.com +// License: http://www.opensource.org/licenses/mit-license.php +(function ($, document, window) { + var + // Default settings object. + // See http://jacklmoore.com/colorbox for details. + defaults = { + transition: "elastic", + speed: 300, + width: false, + initialWidth: "600", + innerWidth: false, + maxWidth: false, + height: false, + initialHeight: "450", + innerHeight: false, + maxHeight: false, + scalePhotos: true, + scrolling: true, + inline: false, + html: false, + iframe: false, + fastIframe: true, + photo: false, + href: false, + title: false, + rel: false, + opacity: 0.9, + preloading: true, + current: "image {current} of {total}", + previous: "previous", + next: "next", + close: "close", + open: false, + returnFocus: true, + reposition: true, + loop: true, + slideshow: false, + slideshowAuto: true, + slideshowSpeed: 2500, + slideshowStart: "start slideshow", + slideshowStop: "stop slideshow", + onOpen: false, + onLoad: false, + onComplete: false, + onCleanup: false, + onClosed: false, + overlayClose: true, + escKey: true, + arrowKey: true, + top: false, + bottom: false, + left: false, + right: false, + fixed: false, + data: undefined + }, + + // Abstracting the HTML and event identifiers for easy rebranding + colorbox = 'colorbox', + prefix = 'cbox', + boxElement = prefix + 'Element', + + // Events + event_open = prefix + '_open', + event_load = prefix + '_load', + event_complete = prefix + '_complete', + event_cleanup = prefix + '_cleanup', + event_closed = prefix + '_closed', + event_purge = prefix + '_purge', + + // Special Handling for IE + isIE = !$.support.opacity && !$.support.style, // IE7 & IE8 + isIE6 = isIE && !window.XMLHttpRequest, // IE6 + event_ie6 = prefix + '_IE6', + + // Cached jQuery Object Variables + $overlay, + $box, + $wrap, + $content, + $topBorder, + $leftBorder, + $rightBorder, + $bottomBorder, + $related, + $window, + $loaded, + $loadingBay, + $loadingOverlay, + $title, + $current, + $slideshow, + $next, + $prev, + $close, + $groupControls, + + // Variables for cached values or use across multiple functions + settings, + interfaceHeight, + interfaceWidth, + loadedHeight, + loadedWidth, + element, + index, + photo, + open, + active, + closing, + loadingTimer, + publicMethod, + div = "div", + init; + + // **************** + // HELPER FUNCTIONS + // **************** + + // Convience function for creating new jQuery objects + function $tag(tag, id, css) { + var element = document.createElement(tag); + + if (id) { + element.id = prefix + id; + } + + if (css) { + element.style.cssText = css; + } + + return $(element); + } + + // Determine the next and previous members in a group. + function getIndex(increment) { + var + max = $related.length, + newIndex = (index + increment) % max; + + return (newIndex < 0) ? max + newIndex : newIndex; + } + + // Convert '%' and 'px' values to integers + function setSize(size, dimension) { + return Math.round((/%/.test(size) ? ((dimension === 'x' ? $window.width() : $window.height()) / 100) : 1) * parseInt(size, 10)); + } + + // Checks an href to see if it is a photo. + // There is a force photo option (photo: true) for hrefs that cannot be matched by this regex. + function isImage(url) { + return settings.photo || /\.(gif|png|jpe?g|bmp|ico)((#|\?).*)?$/i.test(url); + } + + // Assigns function results to their respective properties + function makeSettings() { + var i; + settings = $.extend({}, $.data(element, colorbox)); + + for (i in settings) { + if ($.isFunction(settings[i]) && i.slice(0, 2) !== 'on') { // checks to make sure the function isn't one of the callbacks, they will be handled at the appropriate time. + settings[i] = settings[i].call(element); + } + } + + settings.rel = settings.rel || element.rel || 'nofollow'; + settings.href = settings.href || $(element).attr('href'); + settings.title = settings.title || element.title; + + if (typeof settings.href === "string") { + settings.href = $.trim(settings.href); + } + } + + function trigger(event, callback) { + $.event.trigger(event); + if (callback) { + callback.call(element); + } + } + + // Slideshow functionality + function slideshow() { + var + timeOut, + className = prefix + "Slideshow_", + click = "click." + prefix, + start, + stop, + clear; + + if (settings.slideshow && $related[1]) { + start = function () { + $slideshow + .text(settings.slideshowStop) + .unbind(click) + .bind(event_complete, function () { + if (settings.loop || $related[index + 1]) { + timeOut = setTimeout(publicMethod.next, settings.slideshowSpeed); + } + }) + .bind(event_load, function () { + clearTimeout(timeOut); + }) + .one(click + ' ' + event_cleanup, stop); + $box.removeClass(className + "off").addClass(className + "on"); + timeOut = setTimeout(publicMethod.next, settings.slideshowSpeed); + }; + + stop = function () { + clearTimeout(timeOut); + $slideshow + .text(settings.slideshowStart) + .unbind([event_complete, event_load, event_cleanup, click].join(' ')) + .one(click, function () { + publicMethod.next(); + start(); + }); + $box.removeClass(className + "on").addClass(className + "off"); + }; + + if (settings.slideshowAuto) { + start(); + } else { + stop(); + } + } else { + $box.removeClass(className + "off " + className + "on"); + } + } + + function launch(target) { + if (!closing) { + + element = target; + + makeSettings(); + + $related = $(element); + + index = 0; + + if (settings.rel !== 'nofollow') { + $related = $('.' + boxElement).filter(function () { + var relRelated = $.data(this, colorbox).rel || this.rel; + return (relRelated === settings.rel); + }); + index = $related.index(element); + + // Check direct calls to ColorBox. + if (index === -1) { + $related = $related.add(element); + index = $related.length - 1; + } + } + + if (!open) { + open = active = true; // Prevents the page-change action from queuing up if the visitor holds down the left or right keys. + + $box.show(); + + if (settings.returnFocus) { + $(element).blur().one(event_closed, function () { + $(this).focus(); + }); + } + + // +settings.opacity avoids a problem in IE when using non-zero-prefixed-string-values, like '.5' + $overlay.css({"opacity": +settings.opacity, "cursor": settings.overlayClose ? "pointer" : "auto"}).show(); + + // Opens inital empty ColorBox prior to content being loaded. + settings.w = setSize(settings.initialWidth, 'x'); + settings.h = setSize(settings.initialHeight, 'y'); + publicMethod.position(); + + if (isIE6) { + $window.bind('resize.' + event_ie6 + ' scroll.' + event_ie6, function () { + $overlay.css({width: $window.width(), height: $window.height(), top: $window.scrollTop(), left: $window.scrollLeft()}); + }).trigger('resize.' + event_ie6); + } + + trigger(event_open, settings.onOpen); + + $groupControls.add($title).hide(); + + $close.html(settings.close).show(); + } + + publicMethod.load(true); + } + } + + // ColorBox's markup needs to be added to the DOM prior to being called + // so that the browser will go ahead and load the CSS background images. + function appendHTML() { + if (!$box && document.body) { + init = false; + + $window = $(window); + $box = $tag(div).attr({id: colorbox, 'class': isIE ? prefix + (isIE6 ? 'IE6' : 'IE') : ''}).hide(); + $overlay = $tag(div, "Overlay", isIE6 ? 'position:absolute' : '').hide(); + $wrap = $tag(div, "Wrapper"); + $content = $tag(div, "Content").append( + $loaded = $tag(div, "LoadedContent", 'width:0; height:0; overflow:hidden'), + $loadingOverlay = $tag(div, "LoadingOverlay").add($tag(div, "LoadingGraphic")), + $title = $tag(div, "Title"), + $current = $tag(div, "Current"), + $next = $tag(div, "Next"), + $prev = $tag(div, "Previous"), + $slideshow = $tag(div, "Slideshow").bind(event_open, slideshow), + $close = $tag(div, "Close") + ); + + $wrap.append( // The 3x3 Grid that makes up ColorBox + $tag(div).append( + $tag(div, "TopLeft"), + $topBorder = $tag(div, "TopCenter"), + $tag(div, "TopRight") + ), + $tag(div, false, 'clear:left').append( + $leftBorder = $tag(div, "MiddleLeft"), + $content, + $rightBorder = $tag(div, "MiddleRight") + ), + $tag(div, false, 'clear:left').append( + $tag(div, "BottomLeft"), + $bottomBorder = $tag(div, "BottomCenter"), + $tag(div, "BottomRight") + ) + ).find('div div').css({'float': 'left'}); + + $loadingBay = $tag(div, false, 'position:absolute; width:9999px; visibility:hidden; display:none'); + + $groupControls = $next.add($prev).add($current).add($slideshow); + + $(document.body).append($overlay, $box.append($wrap, $loadingBay)); + } + } + + // Add ColorBox's event bindings + function addBindings() { + if ($box) { + if (!init) { + init = true; + + // Cache values needed for size calculations + interfaceHeight = $topBorder.height() + $bottomBorder.height() + $content.outerHeight(true) - $content.height();//Subtraction needed for IE6 + interfaceWidth = $leftBorder.width() + $rightBorder.width() + $content.outerWidth(true) - $content.width(); + loadedHeight = $loaded.outerHeight(true); + loadedWidth = $loaded.outerWidth(true); + + // Setting padding to remove the need to do size conversions during the animation step. + $box.css({"padding-bottom": interfaceHeight, "padding-right": interfaceWidth}); + + // Anonymous functions here keep the public method from being cached, thereby allowing them to be redefined on the fly. + $next.click(function () { + publicMethod.next(); + }); + $prev.click(function () { + publicMethod.prev(); + }); + $close.click(function () { + publicMethod.close(); + }); + $overlay.click(function () { + if (settings.overlayClose) { + publicMethod.close(); + } + }); + + // Key Bindings + $(document).bind('keydown.' + prefix, function (e) { + var key = e.keyCode; + if (open && settings.escKey && key === 27) { + e.preventDefault(); + publicMethod.close(); + } + if (open && settings.arrowKey && $related[1]) { + if (key === 37) { + e.preventDefault(); + $prev.click(); + } else if (key === 39) { + e.preventDefault(); + $next.click(); + } + } + }); + + $('.' + boxElement, document).live('click', function (e) { + // ignore non-left-mouse-clicks and clicks modified with ctrl / command, shift, or alt. + // See: http://jacklmoore.com/notes/click-events/ + if (!(e.which > 1 || e.shiftKey || e.altKey || e.metaKey)) { + e.preventDefault(); + launch(this); + } + }); + } + return true; + } + return false; + } + + // Don't do anything if ColorBox already exists. + if ($.colorbox) { + return; + } + + // Append the HTML when the DOM loads + $(appendHTML); + + + // **************** + // PUBLIC FUNCTIONS + // Usage format: $.fn.colorbox.close(); + // Usage from within an iframe: parent.$.fn.colorbox.close(); + // **************** + + publicMethod = $.fn[colorbox] = $[colorbox] = function (options, callback) { + var $this = this; + + options = options || {}; + + appendHTML(); + + if (addBindings()) { + if (!$this[0]) { + if ($this.selector) { // if a selector was given and it didn't match any elements, go ahead and exit. + return $this; + } + // if no selector was given (ie. $.colorbox()), create a temporary element to work with + $this = $(''); + options.open = true; // assume an immediate open + } + + if (callback) { + options.onComplete = callback; + } + + $this.each(function () { + $.data(this, colorbox, $.extend({}, $.data(this, colorbox) || defaults, options)); + }).addClass(boxElement); + + if (($.isFunction(options.open) && options.open.call($this)) || options.open) { + launch($this[0]); + } + } + + return $this; + }; + + publicMethod.position = function (speed, loadedCallback) { + var + top = 0, + left = 0, + offset = $box.offset(), + scrollTop = $window.scrollTop(), + scrollLeft = $window.scrollLeft(); + + $window.unbind('resize.' + prefix); + + // remove the modal so that it doesn't influence the document width/height + $box.css({top: -9e4, left: -9e4}); + + if (settings.fixed && !isIE6) { + offset.top -= scrollTop; + offset.left -= scrollLeft; + $box.css({position: 'fixed'}); + } else { + top = scrollTop; + left = scrollLeft; + $box.css({position: 'absolute'}); + } + + // keeps the top and left positions within the browser's viewport. + if (settings.right !== false) { + left += Math.max($window.width() - settings.w - loadedWidth - interfaceWidth - setSize(settings.right, 'x'), 0); + } else if (settings.left !== false) { + left += setSize(settings.left, 'x'); + } else { + left += Math.round(Math.max($window.width() - settings.w - loadedWidth - interfaceWidth, 0) / 2); + } + + if (settings.bottom !== false) { + top += Math.max($window.height() - settings.h - loadedHeight - interfaceHeight - setSize(settings.bottom, 'y'), 0); + } else if (settings.top !== false) { + top += setSize(settings.top, 'y'); + } else { + top += Math.round(Math.max($window.height() - settings.h - loadedHeight - interfaceHeight, 0) / 2); + } + + $box.css({top: offset.top, left: offset.left}); + + // setting the speed to 0 to reduce the delay between same-sized content. + speed = ($box.width() === settings.w + loadedWidth && $box.height() === settings.h + loadedHeight) ? 0 : speed || 0; + + // this gives the wrapper plenty of breathing room so it's floated contents can move around smoothly, + // but it has to be shrank down around the size of div#colorbox when it's done. If not, + // it can invoke an obscure IE bug when using iframes. + $wrap[0].style.width = $wrap[0].style.height = "9999px"; + + function modalDimensions(that) { + $topBorder[0].style.width = $bottomBorder[0].style.width = $content[0].style.width = that.style.width; + $content[0].style.height = $leftBorder[0].style.height = $rightBorder[0].style.height = that.style.height; + } + + $box.dequeue().animate({width: settings.w + loadedWidth, height: settings.h + loadedHeight, top: top, left: left}, { + duration: speed, + complete: function () { + modalDimensions(this); + + active = false; + + // shrink the wrapper down to exactly the size of colorbox to avoid a bug in IE's iframe implementation. + $wrap[0].style.width = (settings.w + loadedWidth + interfaceWidth) + "px"; + $wrap[0].style.height = (settings.h + loadedHeight + interfaceHeight) + "px"; + + if (settings.reposition) { + setTimeout(function () { // small delay before binding onresize due to an IE8 bug. + $window.bind('resize.' + prefix, publicMethod.position); + }, 1); + } + + if (loadedCallback) { + loadedCallback(); + } + }, + step: function () { + modalDimensions(this); + } + }); + }; + + publicMethod.resize = function (options) { + if (open) { + options = options || {}; + + if (options.width) { + settings.w = setSize(options.width, 'x') - loadedWidth - interfaceWidth; + } + if (options.innerWidth) { + settings.w = setSize(options.innerWidth, 'x'); + } + $loaded.css({width: settings.w}); + + if (options.height) { + settings.h = setSize(options.height, 'y') - loadedHeight - interfaceHeight; + } + if (options.innerHeight) { + settings.h = setSize(options.innerHeight, 'y'); + } + if (!options.innerHeight && !options.height) { + $loaded.css({height: "auto"}); + settings.h = $loaded.height(); + } + $loaded.css({height: settings.h}); + + publicMethod.position(settings.transition === "none" ? 0 : settings.speed); + } + }; + + publicMethod.prep = function (object) { + if (!open) { + return; + } + + var callback, speed = settings.transition === "none" ? 0 : settings.speed; + + $loaded.remove(); + $loaded = $tag(div, 'LoadedContent').append(object); + + function getWidth() { + settings.w = settings.w || $loaded.width(); + settings.w = settings.mw && settings.mw < settings.w ? settings.mw : settings.w; + return settings.w; + } + function getHeight() { + settings.h = settings.h || $loaded.height(); + settings.h = settings.mh && settings.mh < settings.h ? settings.mh : settings.h; + return settings.h; + } + + $loaded.hide() + .appendTo($loadingBay.show())// content has to be appended to the DOM for accurate size calculations. + .css({width: getWidth(), overflow: settings.scrolling ? 'auto' : 'hidden'}) + .css({height: getHeight()})// sets the height independently from the width in case the new width influences the value of height. + .prependTo($content); + + $loadingBay.hide(); + + // floating the IMG removes the bottom line-height and fixed a problem where IE miscalculates the width of the parent element as 100% of the document width. + //$(photo).css({'float': 'none', marginLeft: 'auto', marginRight: 'auto'}); + + $(photo).css({'float': 'none'}); + + // Hides SELECT elements in IE6 because they would otherwise sit on top of the overlay. + if (isIE6) { + $('select').not($box.find('select')).filter(function () { + return this.style.visibility !== 'hidden'; + }).css({'visibility': 'hidden'}).one(event_cleanup, function () { + this.style.visibility = 'inherit'; + }); + } + + callback = function () { + var preload, i, total = $related.length, iframe, frameBorder = 'frameBorder', allowTransparency = 'allowTransparency', complete, src, img; + + if (!open) { + return; + } + + function removeFilter() { + if (isIE) { + $box[0].style.removeAttribute('filter'); + } + } + + complete = function () { + clearTimeout(loadingTimer); + $loadingOverlay.hide(); + trigger(event_complete, settings.onComplete); + }; + + if (isIE) { + //This fadeIn helps the bicubic resampling to kick-in. + if (photo) { + $loaded.fadeIn(100); + } + } + + $title.html(settings.title).add($loaded).show(); + + if (total > 1) { // handle grouping + if (typeof settings.current === "string") { + $current.html(settings.current.replace('{current}', index + 1).replace('{total}', total)).show(); + } + + $next[(settings.loop || index < total - 1) ? "show" : "hide"]().html(settings.next); + $prev[(settings.loop || index) ? "show" : "hide"]().html(settings.previous); + + if (settings.slideshow) { + $slideshow.show(); + } + + // Preloads images within a rel group + if (settings.preloading) { + preload = [ + getIndex(-1), + getIndex(1) + ]; + while (i = $related[preload.pop()]) { + src = $.data(i, colorbox).href || i.href; + if ($.isFunction(src)) { + src = src.call(i); + } + if (isImage(src)) { + img = new Image(); + img.src = src; + } + } + } + } else { + $groupControls.hide(); + } + + if (settings.iframe) { + iframe = $tag('iframe')[0]; + + if (frameBorder in iframe) { + iframe[frameBorder] = 0; + } + if (allowTransparency in iframe) { + iframe[allowTransparency] = "true"; + } + // give the iframe a unique name to prevent caching + iframe.name = prefix + (+new Date()); + if (settings.fastIframe) { + complete(); + } else { + $(iframe).one('load', complete); + } + iframe.src = settings.href; + if (!settings.scrolling) { + iframe.scrolling = "no"; + } + $(iframe).addClass(prefix + 'Iframe').appendTo($loaded).one(event_purge, function () { + iframe.src = "//about:blank"; + }); + } else { + complete(); + } + + if (settings.transition === 'fade') { + $box.fadeTo(speed, 1, removeFilter); + } else { + removeFilter(); + } + }; + + if (settings.transition === 'fade') { + $box.fadeTo(speed, 0, function () { + publicMethod.position(0, callback); + }); + } else { + publicMethod.position(speed, callback); + } + }; + + publicMethod.load = function (launched) { + var href, setResize, prep = publicMethod.prep; + + active = true; + + photo = false; + + element = $related[index]; + + if (!launched) { + makeSettings(); + } + + trigger(event_purge); + + trigger(event_load, settings.onLoad); + + settings.h = settings.height ? + setSize(settings.height, 'y') - loadedHeight - interfaceHeight : + settings.innerHeight && setSize(settings.innerHeight, 'y'); + + settings.w = settings.width ? + setSize(settings.width, 'x') - loadedWidth - interfaceWidth : + settings.innerWidth && setSize(settings.innerWidth, 'x'); + + // Sets the minimum dimensions for use in image scaling + settings.mw = settings.w; + settings.mh = settings.h; + + // Re-evaluate the minimum width and height based on maxWidth and maxHeight values. + // If the width or height exceed the maxWidth or maxHeight, use the maximum values instead. + if (settings.maxWidth) { + settings.mw = setSize(settings.maxWidth, 'x') - loadedWidth - interfaceWidth; + settings.mw = settings.w && settings.w < settings.mw ? settings.w : settings.mw; + } + if (settings.maxHeight) { + settings.mh = setSize(settings.maxHeight, 'y') - loadedHeight - interfaceHeight; + settings.mh = settings.h && settings.h < settings.mh ? settings.h : settings.mh; + } + + href = settings.href; + + loadingTimer = setTimeout(function () { + $loadingOverlay.show(); + }, 100); + + if (settings.inline) { + // Inserts an empty placeholder where inline content is being pulled from. + // An event is bound to put inline content back when ColorBox closes or loads new content. + $tag(div).hide().insertBefore($(href)[0]).one(event_purge, function () { + $(this).replaceWith($loaded.children()); + }); + prep($(href)); + } else if (settings.iframe) { + // IFrame element won't be added to the DOM until it is ready to be displayed, + // to avoid problems with DOM-ready JS that might be trying to run in that iframe. + prep(" "); + } else if (settings.html) { + prep(settings.html); + } else if (isImage(href)) { + $(photo = new Image()) + .addClass(prefix + 'Photo') + .error(function () { + settings.title = false; + prep($tag(div, 'Error').text('This image could not be loaded')); + }) + .load(function () { + var percent; + photo.onload = null; //stops animated gifs from firing the onload repeatedly. + + if (settings.scalePhotos) { + setResize = function () { + photo.height -= photo.height * percent; + photo.width -= photo.width * percent; + }; + if (settings.mw && photo.width > settings.mw) { + percent = (photo.width - settings.mw) / photo.width; + setResize(); + } + if (settings.mh && photo.height > settings.mh) { + percent = (photo.height - settings.mh) / photo.height; + setResize(); + } + } + + if (settings.h) { + photo.style.marginTop = Math.max(settings.h - photo.height, 0) / 2 + 'px'; + } + + if ($related[1] && (settings.loop || $related[index + 1])) { + photo.style.cursor = 'pointer'; + photo.onclick = function () { + publicMethod.next(); + }; + } + + if (isIE) { + photo.style.msInterpolationMode = 'bicubic'; + } + + setTimeout(function () { // A pause because Chrome will sometimes report a 0 by 0 size otherwise. + prep(photo); + }, 1); + }); + + setTimeout(function () { // A pause because Opera 10.6+ will sometimes not run the onload function otherwise. + photo.src = href; + }, 1); + } else if (href) { + $loadingBay.load(href, settings.data, function (data, status, xhr) { + prep(status === 'error' ? $tag(div, 'Error').text('Request unsuccessful: ' + xhr.statusText) : $(this).contents()); + }); + } + }; + + // Navigates to the next page/image in a set. + publicMethod.next = function () { + if (!active && $related[1] && (settings.loop || $related[index + 1])) { + index = getIndex(1); + publicMethod.load(); + } + }; + + publicMethod.prev = function () { + if (!active && $related[1] && (settings.loop || index)) { + index = getIndex(-1); + publicMethod.load(); + } + }; + + // Note: to use this within an iframe use the following format: parent.$.fn.colorbox.close(); + publicMethod.close = function () { + if (open && !closing) { + + closing = true; + + open = false; + + trigger(event_cleanup, settings.onCleanup); + + $window.unbind('.' + prefix + ' .' + event_ie6); + + $overlay.fadeTo(200, 0); + + $box.stop().fadeTo(300, 0, function () { + + $box.add($overlay).css({'opacity': 1, cursor: 'auto'}).hide(); + + trigger(event_purge); + + $loaded.remove(); + + setTimeout(function () { + closing = false; + trigger(event_closed, settings.onClosed); + }, 1); + }); + } + }; + + // Removes changes ColorBox made to the document, but does not remove the plugin + // from jQuery. + publicMethod.remove = function () { + $([]).add($box).add($overlay).remove(); + $box = null; + $('.' + boxElement) + .removeData(colorbox) + .removeClass(boxElement) + .die(); + }; + + // A method for fetching the current element ColorBox is referencing. + // returns a jQuery object. + publicMethod.element = function () { + return $(element); + }; + + publicMethod.settings = defaults; + +}(jQuery, document, this)); \ No newline at end of file diff --git a/webui/view/javascript/jquery-1.4.2.min.js b/webui/view/javascript/jquery-1.4.2.min.js new file mode 100644 index 00000000..7c243080 --- /dev/null +++ b/webui/view/javascript/jquery-1.4.2.min.js @@ -0,0 +1,154 @@ +/*! + * jQuery JavaScript Library v1.4.2 + * http://jquery.com/ + * + * Copyright 2010, John Resig + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * Includes Sizzle.js + * http://sizzlejs.com/ + * Copyright 2010, The Dojo Foundation + * Released under the MIT, BSD, and GPL Licenses. + * + * Date: Sat Feb 13 22:33:48 2010 -0500 + */ +(function(A,w){function ma(){if(!c.isReady){try{s.documentElement.doScroll("left")}catch(a){setTimeout(ma,1);return}c.ready()}}function Qa(a,b){b.src?c.ajax({url:b.src,async:false,dataType:"script"}):c.globalEval(b.text||b.textContent||b.innerHTML||"");b.parentNode&&b.parentNode.removeChild(b)}function X(a,b,d,f,e,j){var i=a.length;if(typeof b==="object"){for(var o in b)X(a,o,b[o],f,e,d);return a}if(d!==w){f=!j&&f&&c.isFunction(d);for(o=0;o)[^>]*$|^#([\w-]+)$/,Ua=/^.[^:#\[\.,]*$/,Va=/\S/, +Wa=/^(\s|\u00A0)+|(\s|\u00A0)+$/g,Xa=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,P=navigator.userAgent,xa=false,Q=[],L,$=Object.prototype.toString,aa=Object.prototype.hasOwnProperty,ba=Array.prototype.push,R=Array.prototype.slice,ya=Array.prototype.indexOf;c.fn=c.prototype={init:function(a,b){var d,f;if(!a)return this;if(a.nodeType){this.context=this[0]=a;this.length=1;return this}if(a==="body"&&!b){this.context=s;this[0]=s.body;this.selector="body";this.length=1;return this}if(typeof a==="string")if((d=Ta.exec(a))&& +(d[1]||!b))if(d[1]){f=b?b.ownerDocument||b:s;if(a=Xa.exec(a))if(c.isPlainObject(b)){a=[s.createElement(a[1])];c.fn.attr.call(a,b,true)}else a=[f.createElement(a[1])];else{a=sa([d[1]],[f]);a=(a.cacheable?a.fragment.cloneNode(true):a.fragment).childNodes}return c.merge(this,a)}else{if(b=s.getElementById(d[2])){if(b.id!==d[2])return T.find(a);this.length=1;this[0]=b}this.context=s;this.selector=a;return this}else if(!b&&/^\w+$/.test(a)){this.selector=a;this.context=s;a=s.getElementsByTagName(a);return c.merge(this, +a)}else return!b||b.jquery?(b||T).find(a):c(b).find(a);else if(c.isFunction(a))return T.ready(a);if(a.selector!==w){this.selector=a.selector;this.context=a.context}return c.makeArray(a,this)},selector:"",jquery:"1.4.2",length:0,size:function(){return this.length},toArray:function(){return R.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this.slice(a)[0]:this[a]},pushStack:function(a,b,d){var f=c();c.isArray(a)?ba.apply(f,a):c.merge(f,a);f.prevObject=this;f.context=this.context;if(b=== +"find")f.selector=this.selector+(this.selector?" ":"")+d;else if(b)f.selector=this.selector+"."+b+"("+d+")";return f},each:function(a,b){return c.each(this,a,b)},ready:function(a){c.bindReady();if(c.isReady)a.call(s,c);else Q&&Q.push(a);return this},eq:function(a){return a===-1?this.slice(a):this.slice(a,+a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(R.apply(this,arguments),"slice",R.call(arguments).join(","))},map:function(a){return this.pushStack(c.map(this, +function(b,d){return a.call(b,d,b)}))},end:function(){return this.prevObject||c(null)},push:ba,sort:[].sort,splice:[].splice};c.fn.init.prototype=c.fn;c.extend=c.fn.extend=function(){var a=arguments[0]||{},b=1,d=arguments.length,f=false,e,j,i,o;if(typeof a==="boolean"){f=a;a=arguments[1]||{};b=2}if(typeof a!=="object"&&!c.isFunction(a))a={};if(d===b){a=this;--b}for(;b
a"; +var e=d.getElementsByTagName("*"),j=d.getElementsByTagName("a")[0];if(!(!e||!e.length||!j)){c.support={leadingWhitespace:d.firstChild.nodeType===3,tbody:!d.getElementsByTagName("tbody").length,htmlSerialize:!!d.getElementsByTagName("link").length,style:/red/.test(j.getAttribute("style")),hrefNormalized:j.getAttribute("href")==="/a",opacity:/^0.55$/.test(j.style.opacity),cssFloat:!!j.style.cssFloat,checkOn:d.getElementsByTagName("input")[0].value==="on",optSelected:s.createElement("select").appendChild(s.createElement("option")).selected, +parentNode:d.removeChild(d.appendChild(s.createElement("div"))).parentNode===null,deleteExpando:true,checkClone:false,scriptEval:false,noCloneEvent:true,boxModel:null};b.type="text/javascript";try{b.appendChild(s.createTextNode("window."+f+"=1;"))}catch(i){}a.insertBefore(b,a.firstChild);if(A[f]){c.support.scriptEval=true;delete A[f]}try{delete b.test}catch(o){c.support.deleteExpando=false}a.removeChild(b);if(d.attachEvent&&d.fireEvent){d.attachEvent("onclick",function k(){c.support.noCloneEvent= +false;d.detachEvent("onclick",k)});d.cloneNode(true).fireEvent("onclick")}d=s.createElement("div");d.innerHTML="";a=s.createDocumentFragment();a.appendChild(d.firstChild);c.support.checkClone=a.cloneNode(true).cloneNode(true).lastChild.checked;c(function(){var k=s.createElement("div");k.style.width=k.style.paddingLeft="1px";s.body.appendChild(k);c.boxModel=c.support.boxModel=k.offsetWidth===2;s.body.removeChild(k).style.display="none"});a=function(k){var n= +s.createElement("div");k="on"+k;var r=k in n;if(!r){n.setAttribute(k,"return;");r=typeof n[k]==="function"}return r};c.support.submitBubbles=a("submit");c.support.changeBubbles=a("change");a=b=d=e=j=null}})();c.props={"for":"htmlFor","class":"className",readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing",rowspan:"rowSpan",colspan:"colSpan",tabindex:"tabIndex",usemap:"useMap",frameborder:"frameBorder"};var G="jQuery"+J(),Ya=0,za={};c.extend({cache:{},expando:G,noData:{embed:true,object:true, +applet:true},data:function(a,b,d){if(!(a.nodeName&&c.noData[a.nodeName.toLowerCase()])){a=a==A?za:a;var f=a[G],e=c.cache;if(!f&&typeof b==="string"&&d===w)return null;f||(f=++Ya);if(typeof b==="object"){a[G]=f;e[f]=c.extend(true,{},b)}else if(!e[f]){a[G]=f;e[f]={}}a=e[f];if(d!==w)a[b]=d;return typeof b==="string"?a[b]:a}},removeData:function(a,b){if(!(a.nodeName&&c.noData[a.nodeName.toLowerCase()])){a=a==A?za:a;var d=a[G],f=c.cache,e=f[d];if(b){if(e){delete e[b];c.isEmptyObject(e)&&c.removeData(a)}}else{if(c.support.deleteExpando)delete a[c.expando]; +else a.removeAttribute&&a.removeAttribute(c.expando);delete f[d]}}}});c.fn.extend({data:function(a,b){if(typeof a==="undefined"&&this.length)return c.data(this[0]);else if(typeof a==="object")return this.each(function(){c.data(this,a)});var d=a.split(".");d[1]=d[1]?"."+d[1]:"";if(b===w){var f=this.triggerHandler("getData"+d[1]+"!",[d[0]]);if(f===w&&this.length)f=c.data(this[0],a);return f===w&&d[1]?this.data(d[0]):f}else return this.trigger("setData"+d[1]+"!",[d[0],b]).each(function(){c.data(this, +a,b)})},removeData:function(a){return this.each(function(){c.removeData(this,a)})}});c.extend({queue:function(a,b,d){if(a){b=(b||"fx")+"queue";var f=c.data(a,b);if(!d)return f||[];if(!f||c.isArray(d))f=c.data(a,b,c.makeArray(d));else f.push(d);return f}},dequeue:function(a,b){b=b||"fx";var d=c.queue(a,b),f=d.shift();if(f==="inprogress")f=d.shift();if(f){b==="fx"&&d.unshift("inprogress");f.call(a,function(){c.dequeue(a,b)})}}});c.fn.extend({queue:function(a,b){if(typeof a!=="string"){b=a;a="fx"}if(b=== +w)return c.queue(this[0],a);return this.each(function(){var d=c.queue(this,a,b);a==="fx"&&d[0]!=="inprogress"&&c.dequeue(this,a)})},dequeue:function(a){return this.each(function(){c.dequeue(this,a)})},delay:function(a,b){a=c.fx?c.fx.speeds[a]||a:a;b=b||"fx";return this.queue(b,function(){var d=this;setTimeout(function(){c.dequeue(d,b)},a)})},clearQueue:function(a){return this.queue(a||"fx",[])}});var Aa=/[\n\t]/g,ca=/\s+/,Za=/\r/g,$a=/href|src|style/,ab=/(button|input)/i,bb=/(button|input|object|select|textarea)/i, +cb=/^(a|area)$/i,Ba=/radio|checkbox/;c.fn.extend({attr:function(a,b){return X(this,a,b,true,c.attr)},removeAttr:function(a){return this.each(function(){c.attr(this,a,"");this.nodeType===1&&this.removeAttribute(a)})},addClass:function(a){if(c.isFunction(a))return this.each(function(n){var r=c(this);r.addClass(a.call(this,n,r.attr("class")))});if(a&&typeof a==="string")for(var b=(a||"").split(ca),d=0,f=this.length;d-1)return true;return false},val:function(a){if(a===w){var b=this[0];if(b){if(c.nodeName(b,"option"))return(b.attributes.value||{}).specified?b.value:b.text;if(c.nodeName(b,"select")){var d=b.selectedIndex,f=[],e=b.options;b=b.type==="select-one";if(d<0)return null;var j=b?d:0;for(d=b?d+1:e.length;j=0;else if(c.nodeName(this,"select")){var u=c.makeArray(r);c("option",this).each(function(){this.selected= +c.inArray(c(this).val(),u)>=0});if(!u.length)this.selectedIndex=-1}else this.value=r}})}});c.extend({attrFn:{val:true,css:true,html:true,text:true,data:true,width:true,height:true,offset:true},attr:function(a,b,d,f){if(!a||a.nodeType===3||a.nodeType===8)return w;if(f&&b in c.attrFn)return c(a)[b](d);f=a.nodeType!==1||!c.isXMLDoc(a);var e=d!==w;b=f&&c.props[b]||b;if(a.nodeType===1){var j=$a.test(b);if(b in a&&f&&!j){if(e){b==="type"&&ab.test(a.nodeName)&&a.parentNode&&c.error("type property can't be changed"); +a[b]=d}if(c.nodeName(a,"form")&&a.getAttributeNode(b))return a.getAttributeNode(b).nodeValue;if(b==="tabIndex")return(b=a.getAttributeNode("tabIndex"))&&b.specified?b.value:bb.test(a.nodeName)||cb.test(a.nodeName)&&a.href?0:w;return a[b]}if(!c.support.style&&f&&b==="style"){if(e)a.style.cssText=""+d;return a.style.cssText}e&&a.setAttribute(b,""+d);a=!c.support.hrefNormalized&&f&&j?a.getAttribute(b,2):a.getAttribute(b);return a===null?w:a}return c.style(a,b,d)}});var O=/\.(.*)$/,db=function(a){return a.replace(/[^\w\s\.\|`]/g, +function(b){return"\\"+b})};c.event={add:function(a,b,d,f){if(!(a.nodeType===3||a.nodeType===8)){if(a.setInterval&&a!==A&&!a.frameElement)a=A;var e,j;if(d.handler){e=d;d=e.handler}if(!d.guid)d.guid=c.guid++;if(j=c.data(a)){var i=j.events=j.events||{},o=j.handle;if(!o)j.handle=o=function(){return typeof c!=="undefined"&&!c.event.triggered?c.event.handle.apply(o.elem,arguments):w};o.elem=a;b=b.split(" ");for(var k,n=0,r;k=b[n++];){j=e?c.extend({},e):{handler:d,data:f};if(k.indexOf(".")>-1){r=k.split("."); +k=r.shift();j.namespace=r.slice(0).sort().join(".")}else{r=[];j.namespace=""}j.type=k;j.guid=d.guid;var u=i[k],z=c.event.special[k]||{};if(!u){u=i[k]=[];if(!z.setup||z.setup.call(a,f,r,o)===false)if(a.addEventListener)a.addEventListener(k,o,false);else a.attachEvent&&a.attachEvent("on"+k,o)}if(z.add){z.add.call(a,j);if(!j.handler.guid)j.handler.guid=d.guid}u.push(j);c.event.global[k]=true}a=null}}},global:{},remove:function(a,b,d,f){if(!(a.nodeType===3||a.nodeType===8)){var e,j=0,i,o,k,n,r,u,z=c.data(a), +C=z&&z.events;if(z&&C){if(b&&b.type){d=b.handler;b=b.type}if(!b||typeof b==="string"&&b.charAt(0)==="."){b=b||"";for(e in C)c.event.remove(a,e+b)}else{for(b=b.split(" ");e=b[j++];){n=e;i=e.indexOf(".")<0;o=[];if(!i){o=e.split(".");e=o.shift();k=new RegExp("(^|\\.)"+c.map(o.slice(0).sort(),db).join("\\.(?:.*\\.)?")+"(\\.|$)")}if(r=C[e])if(d){n=c.event.special[e]||{};for(B=f||0;B=0){a.type= +e=e.slice(0,-1);a.exclusive=true}if(!d){a.stopPropagation();c.event.global[e]&&c.each(c.cache,function(){this.events&&this.events[e]&&c.event.trigger(a,b,this.handle.elem)})}if(!d||d.nodeType===3||d.nodeType===8)return w;a.result=w;a.target=d;b=c.makeArray(b);b.unshift(a)}a.currentTarget=d;(f=c.data(d,"handle"))&&f.apply(d,b);f=d.parentNode||d.ownerDocument;try{if(!(d&&d.nodeName&&c.noData[d.nodeName.toLowerCase()]))if(d["on"+e]&&d["on"+e].apply(d,b)===false)a.result=false}catch(j){}if(!a.isPropagationStopped()&& +f)c.event.trigger(a,b,f,true);else if(!a.isDefaultPrevented()){f=a.target;var i,o=c.nodeName(f,"a")&&e==="click",k=c.event.special[e]||{};if((!k._default||k._default.call(d,a)===false)&&!o&&!(f&&f.nodeName&&c.noData[f.nodeName.toLowerCase()])){try{if(f[e]){if(i=f["on"+e])f["on"+e]=null;c.event.triggered=true;f[e]()}}catch(n){}if(i)f["on"+e]=i;c.event.triggered=false}}},handle:function(a){var b,d,f,e;a=arguments[0]=c.event.fix(a||A.event);a.currentTarget=this;b=a.type.indexOf(".")<0&&!a.exclusive; +if(!b){d=a.type.split(".");a.type=d.shift();f=new RegExp("(^|\\.)"+d.slice(0).sort().join("\\.(?:.*\\.)?")+"(\\.|$)")}e=c.data(this,"events");d=e[a.type];if(e&&d){d=d.slice(0);e=0;for(var j=d.length;e-1?c.map(a.options,function(f){return f.selected}).join("-"):"";else if(a.nodeName.toLowerCase()==="select")d=a.selectedIndex;return d},fa=function(a,b){var d=a.target,f,e;if(!(!da.test(d.nodeName)||d.readOnly)){f=c.data(d,"_change_data");e=Fa(d);if(a.type!=="focusout"||d.type!=="radio")c.data(d,"_change_data", +e);if(!(f===w||e===f))if(f!=null||e){a.type="change";return c.event.trigger(a,b,d)}}};c.event.special.change={filters:{focusout:fa,click:function(a){var b=a.target,d=b.type;if(d==="radio"||d==="checkbox"||b.nodeName.toLowerCase()==="select")return fa.call(this,a)},keydown:function(a){var b=a.target,d=b.type;if(a.keyCode===13&&b.nodeName.toLowerCase()!=="textarea"||a.keyCode===32&&(d==="checkbox"||d==="radio")||d==="select-multiple")return fa.call(this,a)},beforeactivate:function(a){a=a.target;c.data(a, +"_change_data",Fa(a))}},setup:function(){if(this.type==="file")return false;for(var a in ea)c.event.add(this,a+".specialChange",ea[a]);return da.test(this.nodeName)},teardown:function(){c.event.remove(this,".specialChange");return da.test(this.nodeName)}};ea=c.event.special.change.filters}s.addEventListener&&c.each({focus:"focusin",blur:"focusout"},function(a,b){function d(f){f=c.event.fix(f);f.type=b;return c.event.handle.call(this,f)}c.event.special[b]={setup:function(){this.addEventListener(a, +d,true)},teardown:function(){this.removeEventListener(a,d,true)}}});c.each(["bind","one"],function(a,b){c.fn[b]=function(d,f,e){if(typeof d==="object"){for(var j in d)this[b](j,f,d[j],e);return this}if(c.isFunction(f)){e=f;f=w}var i=b==="one"?c.proxy(e,function(k){c(this).unbind(k,i);return e.apply(this,arguments)}):e;if(d==="unload"&&b!=="one")this.one(d,f,e);else{j=0;for(var o=this.length;j0){y=t;break}}t=t[g]}m[q]=y}}}var f=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g, +e=0,j=Object.prototype.toString,i=false,o=true;[0,0].sort(function(){o=false;return 0});var k=function(g,h,l,m){l=l||[];var q=h=h||s;if(h.nodeType!==1&&h.nodeType!==9)return[];if(!g||typeof g!=="string")return l;for(var p=[],v,t,y,S,H=true,M=x(h),I=g;(f.exec(""),v=f.exec(I))!==null;){I=v[3];p.push(v[1]);if(v[2]){S=v[3];break}}if(p.length>1&&r.exec(g))if(p.length===2&&n.relative[p[0]])t=ga(p[0]+p[1],h);else for(t=n.relative[p[0]]?[h]:k(p.shift(),h);p.length;){g=p.shift();if(n.relative[g])g+=p.shift(); +t=ga(g,t)}else{if(!m&&p.length>1&&h.nodeType===9&&!M&&n.match.ID.test(p[0])&&!n.match.ID.test(p[p.length-1])){v=k.find(p.shift(),h,M);h=v.expr?k.filter(v.expr,v.set)[0]:v.set[0]}if(h){v=m?{expr:p.pop(),set:z(m)}:k.find(p.pop(),p.length===1&&(p[0]==="~"||p[0]==="+")&&h.parentNode?h.parentNode:h,M);t=v.expr?k.filter(v.expr,v.set):v.set;if(p.length>0)y=z(t);else H=false;for(;p.length;){var D=p.pop();v=D;if(n.relative[D])v=p.pop();else D="";if(v==null)v=h;n.relative[D](y,v,M)}}else y=[]}y||(y=t);y||k.error(D|| +g);if(j.call(y)==="[object Array]")if(H)if(h&&h.nodeType===1)for(g=0;y[g]!=null;g++){if(y[g]&&(y[g]===true||y[g].nodeType===1&&E(h,y[g])))l.push(t[g])}else for(g=0;y[g]!=null;g++)y[g]&&y[g].nodeType===1&&l.push(t[g]);else l.push.apply(l,y);else z(y,l);if(S){k(S,q,l,m);k.uniqueSort(l)}return l};k.uniqueSort=function(g){if(B){i=o;g.sort(B);if(i)for(var h=1;h":function(g,h){var l=typeof h==="string";if(l&&!/\W/.test(h)){h=h.toLowerCase();for(var m=0,q=g.length;m=0))l||m.push(v);else if(l)h[p]=false;return false},ID:function(g){return g[1].replace(/\\/g,"")},TAG:function(g){return g[1].toLowerCase()}, +CHILD:function(g){if(g[1]==="nth"){var h=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(g[2]==="even"&&"2n"||g[2]==="odd"&&"2n+1"||!/\D/.test(g[2])&&"0n+"+g[2]||g[2]);g[2]=h[1]+(h[2]||1)-0;g[3]=h[3]-0}g[0]=e++;return g},ATTR:function(g,h,l,m,q,p){h=g[1].replace(/\\/g,"");if(!p&&n.attrMap[h])g[1]=n.attrMap[h];if(g[2]==="~=")g[4]=" "+g[4]+" ";return g},PSEUDO:function(g,h,l,m,q){if(g[1]==="not")if((f.exec(g[3])||"").length>1||/^\w/.test(g[3]))g[3]=k(g[3],null,null,h);else{g=k.filter(g[3],h,l,true^q);l||m.push.apply(m, +g);return false}else if(n.match.POS.test(g[0])||n.match.CHILD.test(g[0]))return true;return g},POS:function(g){g.unshift(true);return g}},filters:{enabled:function(g){return g.disabled===false&&g.type!=="hidden"},disabled:function(g){return g.disabled===true},checked:function(g){return g.checked===true},selected:function(g){return g.selected===true},parent:function(g){return!!g.firstChild},empty:function(g){return!g.firstChild},has:function(g,h,l){return!!k(l[3],g).length},header:function(g){return/h\d/i.test(g.nodeName)}, +text:function(g){return"text"===g.type},radio:function(g){return"radio"===g.type},checkbox:function(g){return"checkbox"===g.type},file:function(g){return"file"===g.type},password:function(g){return"password"===g.type},submit:function(g){return"submit"===g.type},image:function(g){return"image"===g.type},reset:function(g){return"reset"===g.type},button:function(g){return"button"===g.type||g.nodeName.toLowerCase()==="button"},input:function(g){return/input|select|textarea|button/i.test(g.nodeName)}}, +setFilters:{first:function(g,h){return h===0},last:function(g,h,l,m){return h===m.length-1},even:function(g,h){return h%2===0},odd:function(g,h){return h%2===1},lt:function(g,h,l){return hl[3]-0},nth:function(g,h,l){return l[3]-0===h},eq:function(g,h,l){return l[3]-0===h}},filter:{PSEUDO:function(g,h,l,m){var q=h[1],p=n.filters[q];if(p)return p(g,l,h,m);else if(q==="contains")return(g.textContent||g.innerText||a([g])||"").indexOf(h[3])>=0;else if(q==="not"){h= +h[3];l=0;for(m=h.length;l=0}},ID:function(g,h){return g.nodeType===1&&g.getAttribute("id")===h},TAG:function(g,h){return h==="*"&&g.nodeType===1||g.nodeName.toLowerCase()===h},CLASS:function(g,h){return(" "+(g.className||g.getAttribute("class"))+" ").indexOf(h)>-1},ATTR:function(g,h){var l=h[1];g=n.attrHandle[l]?n.attrHandle[l](g):g[l]!=null?g[l]:g.getAttribute(l);l=g+"";var m=h[2];h=h[4];return g==null?m==="!=":m=== +"="?l===h:m==="*="?l.indexOf(h)>=0:m==="~="?(" "+l+" ").indexOf(h)>=0:!h?l&&g!==false:m==="!="?l!==h:m==="^="?l.indexOf(h)===0:m==="$="?l.substr(l.length-h.length)===h:m==="|="?l===h||l.substr(0,h.length+1)===h+"-":false},POS:function(g,h,l,m){var q=n.setFilters[h[2]];if(q)return q(g,l,h,m)}}},r=n.match.POS;for(var u in n.match){n.match[u]=new RegExp(n.match[u].source+/(?![^\[]*\])(?![^\(]*\))/.source);n.leftMatch[u]=new RegExp(/(^(?:.|\r|\n)*?)/.source+n.match[u].source.replace(/\\(\d+)/g,function(g, +h){return"\\"+(h-0+1)}))}var z=function(g,h){g=Array.prototype.slice.call(g,0);if(h){h.push.apply(h,g);return h}return g};try{Array.prototype.slice.call(s.documentElement.childNodes,0)}catch(C){z=function(g,h){h=h||[];if(j.call(g)==="[object Array]")Array.prototype.push.apply(h,g);else if(typeof g.length==="number")for(var l=0,m=g.length;l";var l=s.documentElement;l.insertBefore(g,l.firstChild);if(s.getElementById(h)){n.find.ID=function(m,q,p){if(typeof q.getElementById!=="undefined"&&!p)return(q=q.getElementById(m[1]))?q.id===m[1]||typeof q.getAttributeNode!=="undefined"&& +q.getAttributeNode("id").nodeValue===m[1]?[q]:w:[]};n.filter.ID=function(m,q){var p=typeof m.getAttributeNode!=="undefined"&&m.getAttributeNode("id");return m.nodeType===1&&p&&p.nodeValue===q}}l.removeChild(g);l=g=null})();(function(){var g=s.createElement("div");g.appendChild(s.createComment(""));if(g.getElementsByTagName("*").length>0)n.find.TAG=function(h,l){l=l.getElementsByTagName(h[1]);if(h[1]==="*"){h=[];for(var m=0;l[m];m++)l[m].nodeType===1&&h.push(l[m]);l=h}return l};g.innerHTML=""; +if(g.firstChild&&typeof g.firstChild.getAttribute!=="undefined"&&g.firstChild.getAttribute("href")!=="#")n.attrHandle.href=function(h){return h.getAttribute("href",2)};g=null})();s.querySelectorAll&&function(){var g=k,h=s.createElement("div");h.innerHTML="

";if(!(h.querySelectorAll&&h.querySelectorAll(".TEST").length===0)){k=function(m,q,p,v){q=q||s;if(!v&&q.nodeType===9&&!x(q))try{return z(q.querySelectorAll(m),p)}catch(t){}return g(m,q,p,v)};for(var l in g)k[l]=g[l];h=null}}(); +(function(){var g=s.createElement("div");g.innerHTML="
";if(!(!g.getElementsByClassName||g.getElementsByClassName("e").length===0)){g.lastChild.className="e";if(g.getElementsByClassName("e").length!==1){n.order.splice(1,0,"CLASS");n.find.CLASS=function(h,l,m){if(typeof l.getElementsByClassName!=="undefined"&&!m)return l.getElementsByClassName(h[1])};g=null}}})();var E=s.compareDocumentPosition?function(g,h){return!!(g.compareDocumentPosition(h)&16)}: +function(g,h){return g!==h&&(g.contains?g.contains(h):true)},x=function(g){return(g=(g?g.ownerDocument||g:0).documentElement)?g.nodeName!=="HTML":false},ga=function(g,h){var l=[],m="",q;for(h=h.nodeType?[h]:h;q=n.match.PSEUDO.exec(g);){m+=q[0];g=g.replace(n.match.PSEUDO,"")}g=n.relative[g]?g+"*":g;q=0;for(var p=h.length;q=0===d})};c.fn.extend({find:function(a){for(var b=this.pushStack("","find",a),d=0,f=0,e=this.length;f0)for(var j=d;j0},closest:function(a,b){if(c.isArray(a)){var d=[],f=this[0],e,j= +{},i;if(f&&a.length){e=0;for(var o=a.length;e-1:c(f).is(e)){d.push({selector:i,elem:f});delete j[i]}}f=f.parentNode}}return d}var k=c.expr.match.POS.test(a)?c(a,b||this.context):null;return this.map(function(n,r){for(;r&&r.ownerDocument&&r!==b;){if(k?k.index(r)>-1:c(r).is(a))return r;r=r.parentNode}return null})},index:function(a){if(!a||typeof a=== +"string")return c.inArray(this[0],a?c(a):this.parent().children());return c.inArray(a.jquery?a[0]:a,this)},add:function(a,b){a=typeof a==="string"?c(a,b||this.context):c.makeArray(a);b=c.merge(this.get(),a);return this.pushStack(qa(a[0])||qa(b[0])?b:c.unique(b))},andSelf:function(){return this.add(this.prevObject)}});c.each({parent:function(a){return(a=a.parentNode)&&a.nodeType!==11?a:null},parents:function(a){return c.dir(a,"parentNode")},parentsUntil:function(a,b,d){return c.dir(a,"parentNode", +d)},next:function(a){return c.nth(a,2,"nextSibling")},prev:function(a){return c.nth(a,2,"previousSibling")},nextAll:function(a){return c.dir(a,"nextSibling")},prevAll:function(a){return c.dir(a,"previousSibling")},nextUntil:function(a,b,d){return c.dir(a,"nextSibling",d)},prevUntil:function(a,b,d){return c.dir(a,"previousSibling",d)},siblings:function(a){return c.sibling(a.parentNode.firstChild,a)},children:function(a){return c.sibling(a.firstChild)},contents:function(a){return c.nodeName(a,"iframe")? +a.contentDocument||a.contentWindow.document:c.makeArray(a.childNodes)}},function(a,b){c.fn[a]=function(d,f){var e=c.map(this,b,d);eb.test(a)||(f=d);if(f&&typeof f==="string")e=c.filter(f,e);e=this.length>1?c.unique(e):e;if((this.length>1||gb.test(f))&&fb.test(a))e=e.reverse();return this.pushStack(e,a,R.call(arguments).join(","))}});c.extend({filter:function(a,b,d){if(d)a=":not("+a+")";return c.find.matches(a,b)},dir:function(a,b,d){var f=[];for(a=a[b];a&&a.nodeType!==9&&(d===w||a.nodeType!==1||!c(a).is(d));){a.nodeType=== +1&&f.push(a);a=a[b]}return f},nth:function(a,b,d){b=b||1;for(var f=0;a;a=a[d])if(a.nodeType===1&&++f===b)break;return a},sibling:function(a,b){for(var d=[];a;a=a.nextSibling)a.nodeType===1&&a!==b&&d.push(a);return d}});var Ja=/ jQuery\d+="(?:\d+|null)"/g,V=/^\s+/,Ka=/(<([\w:]+)[^>]*?)\/>/g,hb=/^(?:area|br|col|embed|hr|img|input|link|meta|param)$/i,La=/<([\w:]+)/,ib=/"},F={option:[1,""],legend:[1,"
","
"],thead:[1,"","
"],tr:[2,"","
"],td:[3,"","
"],col:[2,"","
"],area:[1,"",""],_default:[0,"",""]};F.optgroup=F.option;F.tbody=F.tfoot=F.colgroup=F.caption=F.thead;F.th=F.td;if(!c.support.htmlSerialize)F._default=[1,"div
","
"];c.fn.extend({text:function(a){if(c.isFunction(a))return this.each(function(b){var d= +c(this);d.text(a.call(this,b,d.text()))});if(typeof a!=="object"&&a!==w)return this.empty().append((this[0]&&this[0].ownerDocument||s).createTextNode(a));return c.text(this)},wrapAll:function(a){if(c.isFunction(a))return this.each(function(d){c(this).wrapAll(a.call(this,d))});if(this[0]){var b=c(a,this[0].ownerDocument).eq(0).clone(true);this[0].parentNode&&b.insertBefore(this[0]);b.map(function(){for(var d=this;d.firstChild&&d.firstChild.nodeType===1;)d=d.firstChild;return d}).append(this)}return this}, +wrapInner:function(a){if(c.isFunction(a))return this.each(function(b){c(this).wrapInner(a.call(this,b))});return this.each(function(){var b=c(this),d=b.contents();d.length?d.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){c(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){c.nodeName(this,"body")||c(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.appendChild(a)})}, +prepend:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,this)});else if(arguments.length){var a=c(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b, +this.nextSibling)});else if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,c(arguments[0]).toArray());return a}},remove:function(a,b){for(var d=0,f;(f=this[d])!=null;d++)if(!a||c.filter(a,[f]).length){if(!b&&f.nodeType===1){c.cleanData(f.getElementsByTagName("*"));c.cleanData([f])}f.parentNode&&f.parentNode.removeChild(f)}return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++)for(b.nodeType===1&&c.cleanData(b.getElementsByTagName("*"));b.firstChild;)b.removeChild(b.firstChild); +return this},clone:function(a){var b=this.map(function(){if(!c.support.noCloneEvent&&!c.isXMLDoc(this)){var d=this.outerHTML,f=this.ownerDocument;if(!d){d=f.createElement("div");d.appendChild(this.cloneNode(true));d=d.innerHTML}return c.clean([d.replace(Ja,"").replace(/=([^="'>\s]+\/)>/g,'="$1">').replace(V,"")],f)[0]}else return this.cloneNode(true)});if(a===true){ra(this,b);ra(this.find("*"),b.find("*"))}return b},html:function(a){if(a===w)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(Ja, +""):null;else if(typeof a==="string"&&!ta.test(a)&&(c.support.leadingWhitespace||!V.test(a))&&!F[(La.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Ka,Ma);try{for(var b=0,d=this.length;b0||e.cacheable||this.length>1?k.cloneNode(true):k)}o.length&&c.each(o,Qa)}return this}});c.fragments={};c.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){c.fn[a]=function(d){var f=[];d=c(d);var e=this.length===1&&this[0].parentNode;if(e&&e.nodeType===11&&e.childNodes.length===1&&d.length===1){d[b](this[0]); +return this}else{e=0;for(var j=d.length;e0?this.clone(true):this).get();c.fn[b].apply(c(d[e]),i);f=f.concat(i)}return this.pushStack(f,a,d.selector)}}});c.extend({clean:function(a,b,d,f){b=b||s;if(typeof b.createElement==="undefined")b=b.ownerDocument||b[0]&&b[0].ownerDocument||s;for(var e=[],j=0,i;(i=a[j])!=null;j++){if(typeof i==="number")i+="";if(i){if(typeof i==="string"&&!jb.test(i))i=b.createTextNode(i);else if(typeof i==="string"){i=i.replace(Ka,Ma);var o=(La.exec(i)||["", +""])[1].toLowerCase(),k=F[o]||F._default,n=k[0],r=b.createElement("div");for(r.innerHTML=k[1]+i+k[2];n--;)r=r.lastChild;if(!c.support.tbody){n=ib.test(i);o=o==="table"&&!n?r.firstChild&&r.firstChild.childNodes:k[1]===""&&!n?r.childNodes:[];for(k=o.length-1;k>=0;--k)c.nodeName(o[k],"tbody")&&!o[k].childNodes.length&&o[k].parentNode.removeChild(o[k])}!c.support.leadingWhitespace&&V.test(i)&&r.insertBefore(b.createTextNode(V.exec(i)[0]),r.firstChild);i=r.childNodes}if(i.nodeType)e.push(i);else e= +c.merge(e,i)}}if(d)for(j=0;e[j];j++)if(f&&c.nodeName(e[j],"script")&&(!e[j].type||e[j].type.toLowerCase()==="text/javascript"))f.push(e[j].parentNode?e[j].parentNode.removeChild(e[j]):e[j]);else{e[j].nodeType===1&&e.splice.apply(e,[j+1,0].concat(c.makeArray(e[j].getElementsByTagName("script"))));d.appendChild(e[j])}return e},cleanData:function(a){for(var b,d,f=c.cache,e=c.event.special,j=c.support.deleteExpando,i=0,o;(o=a[i])!=null;i++)if(d=o[c.expando]){b=f[d];if(b.events)for(var k in b.events)e[k]? +c.event.remove(o,k):Ca(o,k,b.handle);if(j)delete o[c.expando];else o.removeAttribute&&o.removeAttribute(c.expando);delete f[d]}}});var kb=/z-?index|font-?weight|opacity|zoom|line-?height/i,Na=/alpha\([^)]*\)/,Oa=/opacity=([^)]*)/,ha=/float/i,ia=/-([a-z])/ig,lb=/([A-Z])/g,mb=/^-?\d+(?:px)?$/i,nb=/^-?\d/,ob={position:"absolute",visibility:"hidden",display:"block"},pb=["Left","Right"],qb=["Top","Bottom"],rb=s.defaultView&&s.defaultView.getComputedStyle,Pa=c.support.cssFloat?"cssFloat":"styleFloat",ja= +function(a,b){return b.toUpperCase()};c.fn.css=function(a,b){return X(this,a,b,true,function(d,f,e){if(e===w)return c.curCSS(d,f);if(typeof e==="number"&&!kb.test(f))e+="px";c.style(d,f,e)})};c.extend({style:function(a,b,d){if(!a||a.nodeType===3||a.nodeType===8)return w;if((b==="width"||b==="height")&&parseFloat(d)<0)d=w;var f=a.style||a,e=d!==w;if(!c.support.opacity&&b==="opacity"){if(e){f.zoom=1;b=parseInt(d,10)+""==="NaN"?"":"alpha(opacity="+d*100+")";a=f.filter||c.curCSS(a,"filter")||"";f.filter= +Na.test(a)?a.replace(Na,b):b}return f.filter&&f.filter.indexOf("opacity=")>=0?parseFloat(Oa.exec(f.filter)[1])/100+"":""}if(ha.test(b))b=Pa;b=b.replace(ia,ja);if(e)f[b]=d;return f[b]},css:function(a,b,d,f){if(b==="width"||b==="height"){var e,j=b==="width"?pb:qb;function i(){e=b==="width"?a.offsetWidth:a.offsetHeight;f!=="border"&&c.each(j,function(){f||(e-=parseFloat(c.curCSS(a,"padding"+this,true))||0);if(f==="margin")e+=parseFloat(c.curCSS(a,"margin"+this,true))||0;else e-=parseFloat(c.curCSS(a, +"border"+this+"Width",true))||0})}a.offsetWidth!==0?i():c.swap(a,ob,i);return Math.max(0,Math.round(e))}return c.curCSS(a,b,d)},curCSS:function(a,b,d){var f,e=a.style;if(!c.support.opacity&&b==="opacity"&&a.currentStyle){f=Oa.test(a.currentStyle.filter||"")?parseFloat(RegExp.$1)/100+"":"";return f===""?"1":f}if(ha.test(b))b=Pa;if(!d&&e&&e[b])f=e[b];else if(rb){if(ha.test(b))b="float";b=b.replace(lb,"-$1").toLowerCase();e=a.ownerDocument.defaultView;if(!e)return null;if(a=e.getComputedStyle(a,null))f= +a.getPropertyValue(b);if(b==="opacity"&&f==="")f="1"}else if(a.currentStyle){d=b.replace(ia,ja);f=a.currentStyle[b]||a.currentStyle[d];if(!mb.test(f)&&nb.test(f)){b=e.left;var j=a.runtimeStyle.left;a.runtimeStyle.left=a.currentStyle.left;e.left=d==="fontSize"?"1em":f||0;f=e.pixelLeft+"px";e.left=b;a.runtimeStyle.left=j}}return f},swap:function(a,b,d){var f={};for(var e in b){f[e]=a.style[e];a.style[e]=b[e]}d.call(a);for(e in b)a.style[e]=f[e]}});if(c.expr&&c.expr.filters){c.expr.filters.hidden=function(a){var b= +a.offsetWidth,d=a.offsetHeight,f=a.nodeName.toLowerCase()==="tr";return b===0&&d===0&&!f?true:b>0&&d>0&&!f?false:c.curCSS(a,"display")==="none"};c.expr.filters.visible=function(a){return!c.expr.filters.hidden(a)}}var sb=J(),tb=//gi,ub=/select|textarea/i,vb=/color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week/i,N=/=\?(&|$)/,ka=/\?/,wb=/(\?|&)_=.*?(&|$)/,xb=/^(\w+:)?\/\/([^\/?#]+)/,yb=/%20/g,zb=c.fn.load;c.fn.extend({load:function(a,b,d){if(typeof a!== +"string")return zb.call(this,a);else if(!this.length)return this;var f=a.indexOf(" ");if(f>=0){var e=a.slice(f,a.length);a=a.slice(0,f)}f="GET";if(b)if(c.isFunction(b)){d=b;b=null}else if(typeof b==="object"){b=c.param(b,c.ajaxSettings.traditional);f="POST"}var j=this;c.ajax({url:a,type:f,dataType:"html",data:b,complete:function(i,o){if(o==="success"||o==="notmodified")j.html(e?c("
").append(i.responseText.replace(tb,"")).find(e):i.responseText);d&&j.each(d,[i.responseText,o,i])}});return this}, +serialize:function(){return c.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?c.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||ub.test(this.nodeName)||vb.test(this.type))}).map(function(a,b){a=c(this).val();return a==null?null:c.isArray(a)?c.map(a,function(d){return{name:b.name,value:d}}):{name:b.name,value:a}}).get()}});c.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "), +function(a,b){c.fn[b]=function(d){return this.bind(b,d)}});c.extend({get:function(a,b,d,f){if(c.isFunction(b)){f=f||d;d=b;b=null}return c.ajax({type:"GET",url:a,data:b,success:d,dataType:f})},getScript:function(a,b){return c.get(a,null,b,"script")},getJSON:function(a,b,d){return c.get(a,b,d,"json")},post:function(a,b,d,f){if(c.isFunction(b)){f=f||d;d=b;b={}}return c.ajax({type:"POST",url:a,data:b,success:d,dataType:f})},ajaxSetup:function(a){c.extend(c.ajaxSettings,a)},ajaxSettings:{url:location.href, +global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,xhr:A.XMLHttpRequest&&(A.location.protocol!=="file:"||!A.ActiveXObject)?function(){return new A.XMLHttpRequest}:function(){try{return new A.ActiveXObject("Microsoft.XMLHTTP")}catch(a){}},accepts:{xml:"application/xml, text/xml",html:"text/html",script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},lastModified:{},etag:{},ajax:function(a){function b(){e.success&& +e.success.call(k,o,i,x);e.global&&f("ajaxSuccess",[x,e])}function d(){e.complete&&e.complete.call(k,x,i);e.global&&f("ajaxComplete",[x,e]);e.global&&!--c.active&&c.event.trigger("ajaxStop")}function f(q,p){(e.context?c(e.context):c.event).trigger(q,p)}var e=c.extend(true,{},c.ajaxSettings,a),j,i,o,k=a&&a.context||e,n=e.type.toUpperCase();if(e.data&&e.processData&&typeof e.data!=="string")e.data=c.param(e.data,e.traditional);if(e.dataType==="jsonp"){if(n==="GET")N.test(e.url)||(e.url+=(ka.test(e.url)? +"&":"?")+(e.jsonp||"callback")+"=?");else if(!e.data||!N.test(e.data))e.data=(e.data?e.data+"&":"")+(e.jsonp||"callback")+"=?";e.dataType="json"}if(e.dataType==="json"&&(e.data&&N.test(e.data)||N.test(e.url))){j=e.jsonpCallback||"jsonp"+sb++;if(e.data)e.data=(e.data+"").replace(N,"="+j+"$1");e.url=e.url.replace(N,"="+j+"$1");e.dataType="script";A[j]=A[j]||function(q){o=q;b();d();A[j]=w;try{delete A[j]}catch(p){}z&&z.removeChild(C)}}if(e.dataType==="script"&&e.cache===null)e.cache=false;if(e.cache=== +false&&n==="GET"){var r=J(),u=e.url.replace(wb,"$1_="+r+"$2");e.url=u+(u===e.url?(ka.test(e.url)?"&":"?")+"_="+r:"")}if(e.data&&n==="GET")e.url+=(ka.test(e.url)?"&":"?")+e.data;e.global&&!c.active++&&c.event.trigger("ajaxStart");r=(r=xb.exec(e.url))&&(r[1]&&r[1]!==location.protocol||r[2]!==location.host);if(e.dataType==="script"&&n==="GET"&&r){var z=s.getElementsByTagName("head")[0]||s.documentElement,C=s.createElement("script");C.src=e.url;if(e.scriptCharset)C.charset=e.scriptCharset;if(!j){var B= +false;C.onload=C.onreadystatechange=function(){if(!B&&(!this.readyState||this.readyState==="loaded"||this.readyState==="complete")){B=true;b();d();C.onload=C.onreadystatechange=null;z&&C.parentNode&&z.removeChild(C)}}}z.insertBefore(C,z.firstChild);return w}var E=false,x=e.xhr();if(x){e.username?x.open(n,e.url,e.async,e.username,e.password):x.open(n,e.url,e.async);try{if(e.data||a&&a.contentType)x.setRequestHeader("Content-Type",e.contentType);if(e.ifModified){c.lastModified[e.url]&&x.setRequestHeader("If-Modified-Since", +c.lastModified[e.url]);c.etag[e.url]&&x.setRequestHeader("If-None-Match",c.etag[e.url])}r||x.setRequestHeader("X-Requested-With","XMLHttpRequest");x.setRequestHeader("Accept",e.dataType&&e.accepts[e.dataType]?e.accepts[e.dataType]+", */*":e.accepts._default)}catch(ga){}if(e.beforeSend&&e.beforeSend.call(k,x,e)===false){e.global&&!--c.active&&c.event.trigger("ajaxStop");x.abort();return false}e.global&&f("ajaxSend",[x,e]);var g=x.onreadystatechange=function(q){if(!x||x.readyState===0||q==="abort"){E|| +d();E=true;if(x)x.onreadystatechange=c.noop}else if(!E&&x&&(x.readyState===4||q==="timeout")){E=true;x.onreadystatechange=c.noop;i=q==="timeout"?"timeout":!c.httpSuccess(x)?"error":e.ifModified&&c.httpNotModified(x,e.url)?"notmodified":"success";var p;if(i==="success")try{o=c.httpData(x,e.dataType,e)}catch(v){i="parsererror";p=v}if(i==="success"||i==="notmodified")j||b();else c.handleError(e,x,i,p);d();q==="timeout"&&x.abort();if(e.async)x=null}};try{var h=x.abort;x.abort=function(){x&&h.call(x); +g("abort")}}catch(l){}e.async&&e.timeout>0&&setTimeout(function(){x&&!E&&g("timeout")},e.timeout);try{x.send(n==="POST"||n==="PUT"||n==="DELETE"?e.data:null)}catch(m){c.handleError(e,x,null,m);d()}e.async||g();return x}},handleError:function(a,b,d,f){if(a.error)a.error.call(a.context||a,b,d,f);if(a.global)(a.context?c(a.context):c.event).trigger("ajaxError",[b,a,f])},active:0,httpSuccess:function(a){try{return!a.status&&location.protocol==="file:"||a.status>=200&&a.status<300||a.status===304||a.status=== +1223||a.status===0}catch(b){}return false},httpNotModified:function(a,b){var d=a.getResponseHeader("Last-Modified"),f=a.getResponseHeader("Etag");if(d)c.lastModified[b]=d;if(f)c.etag[b]=f;return a.status===304||a.status===0},httpData:function(a,b,d){var f=a.getResponseHeader("content-type")||"",e=b==="xml"||!b&&f.indexOf("xml")>=0;a=e?a.responseXML:a.responseText;e&&a.documentElement.nodeName==="parsererror"&&c.error("parsererror");if(d&&d.dataFilter)a=d.dataFilter(a,b);if(typeof a==="string")if(b=== +"json"||!b&&f.indexOf("json")>=0)a=c.parseJSON(a);else if(b==="script"||!b&&f.indexOf("javascript")>=0)c.globalEval(a);return a},param:function(a,b){function d(i,o){if(c.isArray(o))c.each(o,function(k,n){b||/\[\]$/.test(i)?f(i,n):d(i+"["+(typeof n==="object"||c.isArray(n)?k:"")+"]",n)});else!b&&o!=null&&typeof o==="object"?c.each(o,function(k,n){d(i+"["+k+"]",n)}):f(i,o)}function f(i,o){o=c.isFunction(o)?o():o;e[e.length]=encodeURIComponent(i)+"="+encodeURIComponent(o)}var e=[];if(b===w)b=c.ajaxSettings.traditional; +if(c.isArray(a)||a.jquery)c.each(a,function(){f(this.name,this.value)});else for(var j in a)d(j,a[j]);return e.join("&").replace(yb,"+")}});var la={},Ab=/toggle|show|hide/,Bb=/^([+-]=)?([\d+-.]+)(.*)$/,W,va=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];c.fn.extend({show:function(a,b){if(a||a===0)return this.animate(K("show",3),a,b);else{a=0;for(b=this.length;a").appendTo("body");f=e.css("display");if(f==="none")f="block";e.remove();la[d]=f}c.data(this[a],"olddisplay",f)}}a=0;for(b=this.length;a=0;f--)if(d[f].elem===this){b&&d[f](true);d.splice(f,1)}});b||this.dequeue();return this}});c.each({slideDown:K("show",1),slideUp:K("hide",1),slideToggle:K("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"}},function(a,b){c.fn[a]=function(d,f){return this.animate(b,d,f)}});c.extend({speed:function(a,b,d){var f=a&&typeof a==="object"?a:{complete:d||!d&&b||c.isFunction(a)&&a,duration:a,easing:d&&b||b&&!c.isFunction(b)&&b};f.duration=c.fx.off?0:typeof f.duration=== +"number"?f.duration:c.fx.speeds[f.duration]||c.fx.speeds._default;f.old=f.complete;f.complete=function(){f.queue!==false&&c(this).dequeue();c.isFunction(f.old)&&f.old.call(this)};return f},easing:{linear:function(a,b,d,f){return d+f*a},swing:function(a,b,d,f){return(-Math.cos(a*Math.PI)/2+0.5)*f+d}},timers:[],fx:function(a,b,d){this.options=b;this.elem=a;this.prop=d;if(!b.orig)b.orig={}}});c.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this);(c.fx.step[this.prop]|| +c.fx.step._default)(this);if((this.prop==="height"||this.prop==="width")&&this.elem.style)this.elem.style.display="block"},cur:function(a){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];return(a=parseFloat(c.css(this.elem,this.prop,a)))&&a>-10000?a:parseFloat(c.curCSS(this.elem,this.prop))||0},custom:function(a,b,d){function f(j){return e.step(j)}this.startTime=J();this.start=a;this.end=b;this.unit=d||this.unit||"px";this.now=this.start; +this.pos=this.state=0;var e=this;f.elem=this.elem;if(f()&&c.timers.push(f)&&!W)W=setInterval(c.fx.tick,13)},show:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.show=true;this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur());c(this.elem).show()},hide:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.hide=true;this.custom(this.cur(),0)},step:function(a){var b=J(),d=true;if(a||b>=this.options.duration+this.startTime){this.now= +this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;for(var f in this.options.curAnim)if(this.options.curAnim[f]!==true)d=false;if(d){if(this.options.display!=null){this.elem.style.overflow=this.options.overflow;a=c.data(this.elem,"olddisplay");this.elem.style.display=a?a:this.options.display;if(c.css(this.elem,"display")==="none")this.elem.style.display="block"}this.options.hide&&c(this.elem).hide();if(this.options.hide||this.options.show)for(var e in this.options.curAnim)c.style(this.elem, +e,this.options.orig[e]);this.options.complete.call(this.elem)}return false}else{e=b-this.startTime;this.state=e/this.options.duration;a=this.options.easing||(c.easing.swing?"swing":"linear");this.pos=c.easing[this.options.specialEasing&&this.options.specialEasing[this.prop]||a](this.state,e,0,1,this.options.duration);this.now=this.start+(this.end-this.start)*this.pos;this.update()}return true}};c.extend(c.fx,{tick:function(){for(var a=c.timers,b=0;b
"; +a.insertBefore(b,a.firstChild);d=b.firstChild;f=d.firstChild;e=d.nextSibling.firstChild.firstChild;this.doesNotAddBorder=f.offsetTop!==5;this.doesAddBorderForTableAndCells=e.offsetTop===5;f.style.position="fixed";f.style.top="20px";this.supportsFixedPosition=f.offsetTop===20||f.offsetTop===15;f.style.position=f.style.top="";d.style.overflow="hidden";d.style.position="relative";this.subtractsBorderForOverflowNotVisible=f.offsetTop===-5;this.doesNotIncludeMarginInBodyOffset=a.offsetTop!==j;a.removeChild(b); +c.offset.initialize=c.noop},bodyOffset:function(a){var b=a.offsetTop,d=a.offsetLeft;c.offset.initialize();if(c.offset.doesNotIncludeMarginInBodyOffset){b+=parseFloat(c.curCSS(a,"marginTop",true))||0;d+=parseFloat(c.curCSS(a,"marginLeft",true))||0}return{top:b,left:d}},setOffset:function(a,b,d){if(/static/.test(c.curCSS(a,"position")))a.style.position="relative";var f=c(a),e=f.offset(),j=parseInt(c.curCSS(a,"top",true),10)||0,i=parseInt(c.curCSS(a,"left",true),10)||0;if(c.isFunction(b))b=b.call(a, +d,e);d={top:b.top-e.top+j,left:b.left-e.left+i};"using"in b?b.using.call(a,d):f.css(d)}};c.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),d=this.offset(),f=/^body|html$/i.test(b[0].nodeName)?{top:0,left:0}:b.offset();d.top-=parseFloat(c.curCSS(a,"marginTop",true))||0;d.left-=parseFloat(c.curCSS(a,"marginLeft",true))||0;f.top+=parseFloat(c.curCSS(b[0],"borderTopWidth",true))||0;f.left+=parseFloat(c.curCSS(b[0],"borderLeftWidth",true))||0;return{top:d.top- +f.top,left:d.left-f.left}},offsetParent:function(){return this.map(function(){for(var a=this.offsetParent||s.body;a&&!/^body|html$/i.test(a.nodeName)&&c.css(a,"position")==="static";)a=a.offsetParent;return a})}});c.each(["Left","Top"],function(a,b){var d="scroll"+b;c.fn[d]=function(f){var e=this[0],j;if(!e)return null;if(f!==w)return this.each(function(){if(j=wa(this))j.scrollTo(!a?f:c(j).scrollLeft(),a?f:c(j).scrollTop());else this[d]=f});else return(j=wa(e))?"pageXOffset"in j?j[a?"pageYOffset": +"pageXOffset"]:c.support.boxModel&&j.document.documentElement[d]||j.document.body[d]:e[d]}});c.each(["Height","Width"],function(a,b){var d=b.toLowerCase();c.fn["inner"+b]=function(){return this[0]?c.css(this[0],d,false,"padding"):null};c.fn["outer"+b]=function(f){return this[0]?c.css(this[0],d,false,f?"margin":"border"):null};c.fn[d]=function(f){var e=this[0];if(!e)return f==null?null:this;if(c.isFunction(f))return this.each(function(j){var i=c(this);i[d](f.call(this,j,i[d]()))});return"scrollTo"in +e&&e.document?e.document.compatMode==="CSS1Compat"&&e.document.documentElement["client"+b]||e.document.body["client"+b]:e.nodeType===9?Math.max(e.documentElement["client"+b],e.body["scroll"+b],e.documentElement["scroll"+b],e.body["offset"+b],e.documentElement["offset"+b]):f===w?c.css(e,d):this.css(d,typeof f==="string"?f:f+"px")}});A.jQuery=A.$=c})(window); diff --git a/webui/view/javascript/jquery-1.7.1.min.js b/webui/view/javascript/jquery-1.7.1.min.js new file mode 100644 index 00000000..198b3ff0 --- /dev/null +++ b/webui/view/javascript/jquery-1.7.1.min.js @@ -0,0 +1,4 @@ +/*! jQuery v1.7.1 jquery.com | jquery.org/license */ +(function(a,b){function cy(a){return f.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cv(a){if(!ck[a]){var b=c.body,d=f("<"+a+">").appendTo(b),e=d.css("display");d.remove();if(e==="none"||e===""){cl||(cl=c.createElement("iframe"),cl.frameBorder=cl.width=cl.height=0),b.appendChild(cl);if(!cm||!cl.createElement)cm=(cl.contentWindow||cl.contentDocument).document,cm.write((c.compatMode==="CSS1Compat"?"":"")+""),cm.close();d=cm.createElement(a),cm.body.appendChild(d),e=f.css(d,"display"),b.removeChild(cl)}ck[a]=e}return ck[a]}function cu(a,b){var c={};f.each(cq.concat.apply([],cq.slice(0,b)),function(){c[this]=a});return c}function ct(){cr=b}function cs(){setTimeout(ct,0);return cr=f.now()}function cj(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function ci(){try{return new a.XMLHttpRequest}catch(b){}}function cc(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var d=a.dataTypes,e={},g,h,i=d.length,j,k=d[0],l,m,n,o,p;for(g=1;g0){if(c!=="border")for(;g=0===c})}function S(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function K(){return!0}function J(){return!1}function n(a,b,c){var d=b+"defer",e=b+"queue",g=b+"mark",h=f._data(a,d);h&&(c==="queue"||!f._data(a,e))&&(c==="mark"||!f._data(a,g))&&setTimeout(function(){!f._data(a,e)&&!f._data(a,g)&&(f.removeData(a,d,!0),h.fire())},0)}function m(a){for(var b in a){if(b==="data"&&f.isEmptyObject(a[b]))continue;if(b!=="toJSON")return!1}return!0}function l(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(k,"-$1").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:f.isNumeric(d)?parseFloat(d):j.test(d)?f.parseJSON(d):d}catch(g){}f.data(a,c,d)}else d=b}return d}function h(a){var b=g[a]={},c,d;a=a.split(/\s+/);for(c=0,d=a.length;c)[^>]*$|#([\w\-]*)$)/,j=/\S/,k=/^\s+/,l=/\s+$/,m=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,n=/^[\],:{}\s]*$/,o=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,p=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,q=/(?:^|:|,)(?:\s*\[)+/g,r=/(webkit)[ \/]([\w.]+)/,s=/(opera)(?:.*version)?[ \/]([\w.]+)/,t=/(msie) ([\w.]+)/,u=/(mozilla)(?:.*? rv:([\w.]+))?/,v=/-([a-z]|[0-9])/ig,w=/^-ms-/,x=function(a,b){return(b+"").toUpperCase()},y=d.userAgent,z,A,B,C=Object.prototype.toString,D=Object.prototype.hasOwnProperty,E=Array.prototype.push,F=Array.prototype.slice,G=String.prototype.trim,H=Array.prototype.indexOf,I={};e.fn=e.prototype={constructor:e,init:function(a,d,f){var g,h,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!d&&c.body){this.context=c,this[0]=c.body,this.selector=a,this.length=1;return this}if(typeof a=="string"){a.charAt(0)!=="<"||a.charAt(a.length-1)!==">"||a.length<3?g=i.exec(a):g=[null,a,null];if(g&&(g[1]||!d)){if(g[1]){d=d instanceof e?d[0]:d,k=d?d.ownerDocument||d:c,j=m.exec(a),j?e.isPlainObject(d)?(a=[c.createElement(j[1])],e.fn.attr.call(a,d,!0)):a=[k.createElement(j[1])]:(j=e.buildFragment([g[1]],[k]),a=(j.cacheable?e.clone(j.fragment):j.fragment).childNodes);return e.merge(this,a)}h=c.getElementById(g[2]);if(h&&h.parentNode){if(h.id!==g[2])return f.find(a);this.length=1,this[0]=h}this.context=c,this.selector=a;return this}return!d||d.jquery?(d||f).find(a):this.constructor(d).find(a)}if(e.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return e.makeArray(a,this)},selector:"",jquery:"1.7.1",length:0,size:function(){return this.length},toArray:function(){return F.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=this.constructor();e.isArray(a)?E.apply(d,a):e.merge(d,a),d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")");return d},each:function(a,b){return e.each(this,a,b)},ready:function(a){e.bindReady(),A.add(a);return this},eq:function(a){a=+a;return a===-1?this.slice(a):this.slice(a,a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(F.apply(this,arguments),"slice",F.call(arguments).join(","))},map:function(a){return this.pushStack(e.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:E,sort:[].sort,splice:[].splice},e.fn.init.prototype=e.fn,e.extend=e.fn.extend=function(){var a,c,d,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i=="boolean"&&(l=i,i=arguments[1]||{},j=2),typeof i!="object"&&!e.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j0)return;A.fireWith(c,[e]),e.fn.trigger&&e(c).trigger("ready").off("ready")}},bindReady:function(){if(!A){A=e.Callbacks("once memory");if(c.readyState==="complete")return setTimeout(e.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",B,!1),a.addEventListener("load",e.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",B),a.attachEvent("onload",e.ready);var b=!1;try{b=a.frameElement==null}catch(d){}c.documentElement.doScroll&&b&&J()}}},isFunction:function(a){return e.type(a)==="function"},isArray:Array.isArray||function(a){return e.type(a)==="array"},isWindow:function(a){return a&&typeof a=="object"&&"setInterval"in a},isNumeric:function(a){return!isNaN(parseFloat(a))&&isFinite(a)},type:function(a){return a==null?String(a):I[C.call(a)]||"object"},isPlainObject:function(a){if(!a||e.type(a)!=="object"||a.nodeType||e.isWindow(a))return!1;try{if(a.constructor&&!D.call(a,"constructor")&&!D.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}var d;for(d in a);return d===b||D.call(a,d)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw new Error(a)},parseJSON:function(b){if(typeof b!="string"||!b)return null;b=e.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(n.test(b.replace(o,"@").replace(p,"]").replace(q,"")))return(new Function("return "+b))();e.error("Invalid JSON: "+b)},parseXML:function(c){var d,f;try{a.DOMParser?(f=new DOMParser,d=f.parseFromString(c,"text/xml")):(d=new ActiveXObject("Microsoft.XMLDOM"),d.async="false",d.loadXML(c))}catch(g){d=b}(!d||!d.documentElement||d.getElementsByTagName("parsererror").length)&&e.error("Invalid XML: "+c);return d},noop:function(){},globalEval:function(b){b&&j.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(w,"ms-").replace(v,x)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var f,g=0,h=a.length,i=h===b||e.isFunction(a);if(d){if(i){for(f in a)if(c.apply(a[f],d)===!1)break}else for(;g0&&a[0]&&a[j-1]||j===0||e.isArray(a));if(k)for(;i1?i.call(arguments,0):b,j.notifyWith(k,e)}}function l(a){return function(c){b[a]=arguments.length>1?i.call(arguments,0):c,--g||j.resolveWith(j,b)}}var b=i.call(arguments,0),c=0,d=b.length,e=Array(d),g=d,h=d,j=d<=1&&a&&f.isFunction(a.promise)?a:f.Deferred(),k=j.promise();if(d>1){for(;c
a",d=q.getElementsByTagName("*"),e=q.getElementsByTagName("a")[0];if(!d||!d.length||!e)return{};g=c.createElement("select"),h=g.appendChild(c.createElement("option")),i=q.getElementsByTagName("input")[0],b={leadingWhitespace:q.firstChild.nodeType===3,tbody:!q.getElementsByTagName("tbody").length,htmlSerialize:!!q.getElementsByTagName("link").length,style:/top/.test(e.getAttribute("style")),hrefNormalized:e.getAttribute("href")==="/a",opacity:/^0.55/.test(e.style.opacity),cssFloat:!!e.style.cssFloat,checkOn:i.value==="on",optSelected:h.selected,getSetAttribute:q.className!=="t",enctype:!!c.createElement("form").enctype,html5Clone:c.createElement("nav").cloneNode(!0).outerHTML!=="<:nav>",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0},i.checked=!0,b.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,b.optDisabled=!h.disabled;try{delete q.test}catch(s){b.deleteExpando=!1}!q.addEventListener&&q.attachEvent&&q.fireEvent&&(q.attachEvent("onclick",function(){b.noCloneEvent=!1}),q.cloneNode(!0).fireEvent("onclick")),i=c.createElement("input"),i.value="t",i.setAttribute("type","radio"),b.radioValue=i.value==="t",i.setAttribute("checked","checked"),q.appendChild(i),k=c.createDocumentFragment(),k.appendChild(q.lastChild),b.checkClone=k.cloneNode(!0).cloneNode(!0).lastChild.checked,b.appendChecked=i.checked,k.removeChild(i),k.appendChild(q),q.innerHTML="",a.getComputedStyle&&(j=c.createElement("div"),j.style.width="0",j.style.marginRight="0",q.style.width="2px",q.appendChild(j),b.reliableMarginRight=(parseInt((a.getComputedStyle(j,null)||{marginRight:0}).marginRight,10)||0)===0);if(q.attachEvent)for(o in{submit:1,change:1,focusin:1})n="on"+o,p=n in q,p||(q.setAttribute(n,"return;"),p=typeof q[n]=="function"),b[o+"Bubbles"]=p;k.removeChild(q),k=g=h=j=q=i=null,f(function(){var a,d,e,g,h,i,j,k,m,n,o,r=c.getElementsByTagName("body")[0];!r||(j=1,k="position:absolute;top:0;left:0;width:1px;height:1px;margin:0;",m="visibility:hidden;border:0;",n="style='"+k+"border:5px solid #000;padding:0;'",o="
"+""+"
",a=c.createElement("div"),a.style.cssText=m+"width:0;height:0;position:static;top:0;margin-top:"+j+"px",r.insertBefore(a,r.firstChild),q=c.createElement("div"),a.appendChild(q),q.innerHTML="
t
",l=q.getElementsByTagName("td"),p=l[0].offsetHeight===0,l[0].style.display="",l[1].style.display="none",b.reliableHiddenOffsets=p&&l[0].offsetHeight===0,q.innerHTML="",q.style.width=q.style.paddingLeft="1px",f.boxModel=b.boxModel=q.offsetWidth===2,typeof q.style.zoom!="undefined"&&(q.style.display="inline",q.style.zoom=1,b.inlineBlockNeedsLayout=q.offsetWidth===2,q.style.display="",q.innerHTML="
",b.shrinkWrapBlocks=q.offsetWidth!==2),q.style.cssText=k+m,q.innerHTML=o,d=q.firstChild,e=d.firstChild,h=d.nextSibling.firstChild.firstChild,i={doesNotAddBorder:e.offsetTop!==5,doesAddBorderForTableAndCells:h.offsetTop===5},e.style.position="fixed",e.style.top="20px",i.fixedPosition=e.offsetTop===20||e.offsetTop===15,e.style.position=e.style.top="",d.style.overflow="hidden",d.style.position="relative",i.subtractsBorderForOverflowNotVisible=e.offsetTop===-5,i.doesNotIncludeMarginInBodyOffset=r.offsetTop!==j,r.removeChild(a),q=a=null,f.extend(b,i))});return b}();var j=/^(?:\{.*\}|\[.*\])$/,k=/([A-Z])/g;f.extend({cache:{},uuid:0,expando:"jQuery"+(f.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){a=a.nodeType?f.cache[a[f.expando]]:a[f.expando];return!!a&&!m(a)},data:function(a,c,d,e){if(!!f.acceptData(a)){var g,h,i,j=f.expando,k=typeof c=="string",l=a.nodeType,m=l?f.cache:a,n=l?a[j]:a[j]&&j,o=c==="events";if((!n||!m[n]||!o&&!e&&!m[n].data)&&k&&d===b)return;n||(l?a[j]=n=++f.uuid:n=j),m[n]||(m[n]={},l||(m[n].toJSON=f.noop));if(typeof c=="object"||typeof c=="function")e?m[n]=f.extend(m[n],c):m[n].data=f.extend(m[n].data,c);g=h=m[n],e||(h.data||(h.data={}),h=h.data),d!==b&&(h[f.camelCase(c)]=d);if(o&&!h[c])return g.events;k?(i=h[c],i==null&&(i=h[f.camelCase(c)])):i=h;return i}},removeData:function(a,b,c){if(!!f.acceptData(a)){var d,e,g,h=f.expando,i=a.nodeType,j=i?f.cache:a,k=i?a[h]:h;if(!j[k])return;if(b){d=c?j[k]:j[k].data;if(d){f.isArray(b)||(b in d?b=[b]:(b=f.camelCase(b),b in d?b=[b]:b=b.split(" ")));for(e=0,g=b.length;e-1)return!0;return!1},val:function(a){var c,d,e,g=this[0];{if(!!arguments.length){e=f.isFunction(a);return this.each(function(d){var g=f(this),h;if(this.nodeType===1){e?h=a.call(this,d,g.val()):h=a,h==null?h="":typeof h=="number"?h+="":f.isArray(h)&&(h=f.map(h,function(a){return a==null?"":a+""})),c=f.valHooks[this.nodeName.toLowerCase()]||f.valHooks[this.type];if(!c||!("set"in c)||c.set(this,h,"value")===b)this.value=h}})}if(g){c=f.valHooks[g.nodeName.toLowerCase()]||f.valHooks[g.type];if(c&&"get"in c&&(d=c.get(g,"value"))!==b)return d;d=g.value;return typeof d=="string"?d.replace(q,""):d==null?"":d}}}}),f.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c,d,e,g=a.selectedIndex,h=[],i=a.options,j=a.type==="select-one";if(g<0)return null;c=j?g:0,d=j?g+1:i.length;for(;c=0}),c.length||(a.selectedIndex=-1);return c}}},attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attr:function(a,c,d,e){var g,h,i,j=a.nodeType;if(!!a&&j!==3&&j!==8&&j!==2){if(e&&c in f.attrFn)return f(a)[c](d);if(typeof a.getAttribute=="undefined")return f.prop(a,c,d);i=j!==1||!f.isXMLDoc(a),i&&(c=c.toLowerCase(),h=f.attrHooks[c]||(u.test(c)?x:w));if(d!==b){if(d===null){f.removeAttr(a,c);return}if(h&&"set"in h&&i&&(g=h.set(a,d,c))!==b)return g;a.setAttribute(c,""+d);return d}if(h&&"get"in h&&i&&(g=h.get(a,c))!==null)return g;g=a.getAttribute(c);return g===null?b:g}},removeAttr:function(a,b){var c,d,e,g,h=0;if(b&&a.nodeType===1){d=b.toLowerCase().split(p),g=d.length;for(;h=0}})});var z=/^(?:textarea|input|select)$/i,A=/^([^\.]*)?(?:\.(.+))?$/,B=/\bhover(\.\S+)?\b/,C=/^key/,D=/^(?:mouse|contextmenu)|click/,E=/^(?:focusinfocus|focusoutblur)$/,F=/^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/,G=function(a){var b=F.exec(a);b&&(b[1]=(b[1]||"").toLowerCase(),b[3]=b[3]&&new RegExp("(?:^|\\s)"+b[3]+"(?:\\s|$)"));return b},H=function(a,b){var c=a.attributes||{};return(!b[1]||a.nodeName.toLowerCase()===b[1])&&(!b[2]||(c.id||{}).value===b[2])&&(!b[3]||b[3].test((c["class"]||{}).value))},I=function(a){return f.event.special.hover?a:a.replace(B,"mouseenter$1 mouseleave$1")}; +f.event={add:function(a,c,d,e,g){var h,i,j,k,l,m,n,o,p,q,r,s;if(!(a.nodeType===3||a.nodeType===8||!c||!d||!(h=f._data(a)))){d.handler&&(p=d,d=p.handler),d.guid||(d.guid=f.guid++),j=h.events,j||(h.events=j={}),i=h.handle,i||(h.handle=i=function(a){return typeof f!="undefined"&&(!a||f.event.triggered!==a.type)?f.event.dispatch.apply(i.elem,arguments):b},i.elem=a),c=f.trim(I(c)).split(" ");for(k=0;k=0&&(h=h.slice(0,-1),k=!0),h.indexOf(".")>=0&&(i=h.split("."),h=i.shift(),i.sort());if((!e||f.event.customEvent[h])&&!f.event.global[h])return;c=typeof c=="object"?c[f.expando]?c:new f.Event(h,c):new f.Event(h),c.type=h,c.isTrigger=!0,c.exclusive=k,c.namespace=i.join("."),c.namespace_re=c.namespace?new RegExp("(^|\\.)"+i.join("\\.(?:.*\\.)?")+"(\\.|$)"):null,o=h.indexOf(":")<0?"on"+h:"";if(!e){j=f.cache;for(l in j)j[l].events&&j[l].events[h]&&f.event.trigger(c,d,j[l].handle.elem,!0);return}c.result=b,c.target||(c.target=e),d=d!=null?f.makeArray(d):[],d.unshift(c),p=f.event.special[h]||{};if(p.trigger&&p.trigger.apply(e,d)===!1)return;r=[[e,p.bindType||h]];if(!g&&!p.noBubble&&!f.isWindow(e)){s=p.delegateType||h,m=E.test(s+h)?e:e.parentNode,n=null;for(;m;m=m.parentNode)r.push([m,s]),n=m;n&&n===e.ownerDocument&&r.push([n.defaultView||n.parentWindow||a,s])}for(l=0;le&&i.push({elem:this,matches:d.slice(e)});for(j=0;j0?this.on(b,null,a,c):this.trigger(b)},f.attrFn&&(f.attrFn[b]=!0),C.test(b)&&(f.event.fixHooks[b]=f.event.keyHooks),D.test(b)&&(f.event.fixHooks[b]=f.event.mouseHooks)}),function(){function x(a,b,c,e,f,g){for(var h=0,i=e.length;h0){k=j;break}}j=j[a]}e[h]=k}}}function w(a,b,c,e,f,g){for(var h=0,i=e.length;h+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,d="sizcache"+(Math.random()+"").replace(".",""),e=0,g=Object.prototype.toString,h=!1,i=!0,j=/\\/g,k=/\r\n/g,l=/\W/;[0,0].sort(function(){i=!1;return 0});var m=function(b,d,e,f){e=e||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!="string")return e;var i,j,k,l,n,q,r,t,u=!0,v=m.isXML(d),w=[],x=b;do{a.exec(""),i=a.exec(x);if(i){x=i[3],w.push(i[1]);if(i[2]){l=i[3];break}}}while(i);if(w.length>1&&p.exec(b))if(w.length===2&&o.relative[w[0]])j=y(w[0]+w[1],d,f);else{j=o.relative[w[0]]?[d]:m(w.shift(),d);while(w.length)b=w.shift(),o.relative[b]&&(b+=w.shift()),j=y(b,j,f)}else{!f&&w.length>1&&d.nodeType===9&&!v&&o.match.ID.test(w[0])&&!o.match.ID.test(w[w.length-1])&&(n=m.find(w.shift(),d,v),d=n.expr?m.filter(n.expr,n.set)[0]:n.set[0]);if(d){n=f?{expr:w.pop(),set:s(f)}:m.find(w.pop(),w.length===1&&(w[0]==="~"||w[0]==="+")&&d.parentNode?d.parentNode:d,v),j=n.expr?m.filter(n.expr,n.set):n.set,w.length>0?k=s(j):u=!1;while(w.length)q=w.pop(),r=q,o.relative[q]?r=w.pop():q="",r==null&&(r=d),o.relative[q](k,r,v)}else k=w=[]}k||(k=j),k||m.error(q||b);if(g.call(k)==="[object Array]")if(!u)e.push.apply(e,k);else if(d&&d.nodeType===1)for(t=0;k[t]!=null;t++)k[t]&&(k[t]===!0||k[t].nodeType===1&&m.contains(d,k[t]))&&e.push(j[t]);else for(t=0;k[t]!=null;t++)k[t]&&k[t].nodeType===1&&e.push(j[t]);else s(k,e);l&&(m(l,h,e,f),m.uniqueSort(e));return e};m.uniqueSort=function(a){if(u){h=i,a.sort(u);if(h)for(var b=1;b0},m.find=function(a,b,c){var d,e,f,g,h,i;if(!a)return[];for(e=0,f=o.order.length;e":function(a,b){var c,d=typeof b=="string",e=0,f=a.length;if(d&&!l.test(b)){b=b.toLowerCase();for(;e=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(j,"")},TAG:function(a,b){return a[1].replace(j,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||m.error(a[0]),a[2]=a[2].replace(/^\+|\s*/g,"");var b=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2]==="even"&&"2n"||a[2]==="odd"&&"2n+1"||!/\D/.test(a[2])&&"0n+"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&m.error(a[0]);a[0]=e++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(j,"");!f&&o.attrMap[g]&&(a[1]=o.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(j,""),a[2]==="~="&&(a[4]=" "+a[4]+" ");return a},PSEUDO:function(b,c,d,e,f){if(b[1]==="not")if((a.exec(b[3])||"").length>1||/^\w/.test(b[3]))b[3]=m(b[3],null,null,c);else{var g=m.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(o.match.POS.test(b[0])||o.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!=="hidden"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!m(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){var b=a.getAttribute("type"),c=a.type;return a.nodeName.toLowerCase()==="input"&&"text"===c&&(b===c||b===null)},radio:function(a){return a.nodeName.toLowerCase()==="input"&&"radio"===a.type},checkbox:function(a){return a.nodeName.toLowerCase()==="input"&&"checkbox"===a.type},file:function(a){return a.nodeName.toLowerCase()==="input"&&"file"===a.type},password:function(a){return a.nodeName.toLowerCase()==="input"&&"password"===a.type},submit:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"submit"===a.type},image:function(a){return a.nodeName.toLowerCase()==="input"&&"image"===a.type},reset:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"reset"===a.type},button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&"button"===a.type||b==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)},focus:function(a){return a===a.ownerDocument.activeElement}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return bc[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=o.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||n([a])||"").indexOf(b[3])>=0;if(e==="not"){var g=b[3];for(var h=0,i=g.length;h=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||!!a.nodeName&&a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(" "+(a.className||a.getAttribute("class"))+" ").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=m.attr?m.attr(a,c):o.attrHandle[c]?o.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":!f&&m.attr?d!=null:f==="="?e===g:f==="*="?e.indexOf(g)>=0:f==="~="?(" "+e+" ").indexOf(g)>=0:g?f==="!="?e!==g:f==="^="?e.indexOf(g)===0:f==="$="?e.substr(e.length-g.length)===g:f==="|="?e===g||e.substr(0,g.length+1)===g+"-":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=o.setFilters[e];if(f)return f(a,c,b,d)}}},p=o.match.POS,q=function(a,b){return"\\"+(b-0+1)};for(var r in o.match)o.match[r]=new RegExp(o.match[r].source+/(?![^\[]*\])(?![^\(]*\))/.source),o.leftMatch[r]=new RegExp(/(^(?:.|\r|\n)*?)/.source+o.match[r].source.replace(/\\(\d+)/g,q));var s=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(t){s=function(a,b){var c=0,d=b||[];if(g.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length=="number")for(var e=a.length;c",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(o.find.ID=function(a,c,d){if(typeof c.getElementById!="undefined"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!="undefined"&&e.getAttributeNode("id").nodeValue===a[1]?[e]:b:[]}},o.filter.ID=function(a,b){var c=typeof a.getAttributeNode!="undefined"&&a.getAttributeNode("id");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement("div");a.appendChild(c.createComment("")),a.getElementsByTagName("*").length>0&&(o.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]==="*"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML="",a.firstChild&&typeof a.firstChild.getAttribute!="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(o.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=m,b=c.createElement("div"),d="__sizzle__";b.innerHTML="

";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){m=function(b,e,f,g){e=e||c;if(!g&&!m.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return s(e.getElementsByTagName(b),f);if(h[2]&&o.find.CLASS&&e.getElementsByClassName)return s(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return s([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return s([],f);if(i.id===h[3])return s([i],f)}try{return s(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var k=e,l=e.getAttribute("id"),n=l||d,p=e.parentNode,q=/^\s*[+~]/.test(b);l?n=n.replace(/'/g,"\\$&"):e.setAttribute("id",n),q&&p&&(e=e.parentNode);try{if(!q||p)return s(e.querySelectorAll("[id='"+n+"'] "+b),f)}catch(r){}finally{l||k.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)m[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.call(c.createElement("div"),"div"),e=!1;try{b.call(c.documentElement,"[test!='']:sizzle")}catch(f){e=!0}m.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!m.isXML(a))try{if(e||!o.match.PSEUDO.test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.nodeType!==11)return f}}catch(g){}return m(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement("div");a.innerHTML="
";if(!!a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;o.order.splice(1,0,"CLASS"),o.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?m.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?m.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:m.contains=function(){return!1},m.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var y=function(a,b,c){var d,e=[],f="",g=b.nodeType?[b]:b;while(d=o.match.PSEUDO.exec(a))f+=d[0],a=a.replace(o.match.PSEUDO,"");a=o.relative[a]?a+"*":a;for(var h=0,i=g.length;h0)for(h=g;h=0:f.filter(a,this).length>0:this.filter(a).length>0)},closest:function(a,b){var c=[],d,e,g=this[0];if(f.isArray(a)){var h=1;while(g&&g.ownerDocument&&g!==b){for(d=0;d-1:f.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b||g.nodeType===11)break}}c=c.length>1?f.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a)return this[0]&&this[0].parentNode?this.prevAll().length:-1;if(typeof a=="string")return f.inArray(this[0],f(a));return f.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a=="string"?f(a,b):f.makeArray(a&&a.nodeType?[a]:a),d=f.merge(this.get(),c);return this.pushStack(S(c[0])||S(d[0])?d:f.unique(d))},andSelf:function(){return this.add(this.prevObject)}}),f.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return f.dir(a,"parentNode")},parentsUntil:function(a,b,c){return f.dir(a,"parentNode",c)},next:function(a){return f.nth(a,2,"nextSibling")},prev:function(a){return f.nth(a,2,"previousSibling")},nextAll:function(a){return f.dir(a,"nextSibling")},prevAll:function(a){return f.dir(a,"previousSibling")},nextUntil:function(a,b,c){return f.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return f.dir(a,"previousSibling",c)},siblings:function(a){return f.sibling(a.parentNode.firstChild,a)},children:function(a){return f.sibling(a.firstChild)},contents:function(a){return f.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:f.makeArray(a.childNodes)}},function(a,b){f.fn[a]=function(c,d){var e=f.map(this,b,c);L.test(a)||(d=c),d&&typeof d=="string"&&(e=f.filter(d,e)),e=this.length>1&&!R[a]?f.unique(e):e,(this.length>1||N.test(d))&&M.test(a)&&(e=e.reverse());return this.pushStack(e,a,P.call(arguments).join(","))}}),f.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?f.find.matchesSelector(b[0],a)?[b[0]]:[]:f.find.matches(a,b)},dir:function(a,c,d){var e=[],g=a[c];while(g&&g.nodeType!==9&&(d===b||g.nodeType!==1||!f(g).is(d)))g.nodeType===1&&e.push(g),g=g[c];return e},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var V="abbr|article|aside|audio|canvas|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",W=/ jQuery\d+="(?:\d+|null)"/g,X=/^\s+/,Y=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,Z=/<([\w:]+)/,$=/",""],legend:[1,"
","
"],thead:[1,"","
"],tr:[2,"","
"],td:[3,"","
"],col:[2,"","
"],area:[1,"",""],_default:[0,"",""]},bh=U(c);bg.optgroup=bg.option,bg.tbody=bg.tfoot=bg.colgroup=bg.caption=bg.thead,bg.th=bg.td,f.support.htmlSerialize||(bg._default=[1,"div
","
"]),f.fn.extend({text:function(a){if(f.isFunction(a))return this.each(function(b){var c=f(this);c.text(a.call(this,b,c.text()))});if(typeof a!="object"&&a!==b)return this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a));return f.text(this)},wrapAll:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapAll(a.call(this,b))});if(this[0]){var b=f(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapInner(a.call(this,b))});return this.each(function(){var b=f(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=f.isFunction(a);return this.each(function(c){f(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){f.nodeName(this,"body")||f(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=f.clean(arguments);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,f.clean(arguments));return a}},remove:function(a,b){for(var c=0,d;(d=this[c])!=null;c++)if(!a||f.filter(a,[d]).length)!b&&d.nodeType===1&&(f.cleanData(d.getElementsByTagName("*")),f.cleanData([d])),d.parentNode&&d.parentNode.removeChild(d);return this},empty:function() +{for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(this,a,b)})},html:function(a){if(a===b)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(W,""):null;if(typeof a=="string"&&!ba.test(a)&&(f.support.leadingWhitespace||!X.test(a))&&!bg[(Z.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Y,"<$1>");try{for(var c=0,d=this.length;c1&&l0?this.clone(!0):this).get();f(e[h])[b](j),d=d.concat(j)}return this.pushStack(d,a,e.selector)}}),f.extend({clone:function(a,b,c){var d,e,g,h=f.support.html5Clone||!bc.test("<"+a.nodeName)?a.cloneNode(!0):bo(a);if((!f.support.noCloneEvent||!f.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bk(a,h),d=bl(a),e=bl(h);for(g=0;d[g];++g)e[g]&&bk(d[g],e[g])}if(b){bj(a,h);if(c){d=bl(a),e=bl(h);for(g=0;d[g];++g)bj(d[g],e[g])}}d=e=null;return h},clean:function(a,b,d,e){var g;b=b||c,typeof b.createElement=="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);var h=[],i;for(var j=0,k;(k=a[j])!=null;j++){typeof k=="number"&&(k+="");if(!k)continue;if(typeof k=="string")if(!_.test(k))k=b.createTextNode(k);else{k=k.replace(Y,"<$1>");var l=(Z.exec(k)||["",""])[1].toLowerCase(),m=bg[l]||bg._default,n=m[0],o=b.createElement("div");b===c?bh.appendChild(o):U(b).appendChild(o),o.innerHTML=m[1]+k+m[2];while(n--)o=o.lastChild;if(!f.support.tbody){var p=$.test(k),q=l==="table"&&!p?o.firstChild&&o.firstChild.childNodes:m[1]===""&&!p?o.childNodes:[];for(i=q.length-1;i>=0;--i)f.nodeName(q[i],"tbody")&&!q[i].childNodes.length&&q[i].parentNode.removeChild(q[i])}!f.support.leadingWhitespace&&X.test(k)&&o.insertBefore(b.createTextNode(X.exec(k)[0]),o.firstChild),k=o.childNodes}var r;if(!f.support.appendChecked)if(k[0]&&typeof (r=k.length)=="number")for(i=0;i=0)return b+"px"}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b){return br.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=f.isNumeric(b)?"alpha(opacity="+b*100+")":"",g=d&&d.filter||c.filter||"";c.zoom=1;if(b>=1&&f.trim(g.replace(bq,""))===""){c.removeAttribute("filter");if(d&&!d.filter)return}c.filter=bq.test(g)?g.replace(bq,e):g+" "+e}}),f(function(){f.support.reliableMarginRight||(f.cssHooks.marginRight={get:function(a,b){var c;f.swap(a,{display:"inline-block"},function(){b?c=bz(a,"margin-right","marginRight"):c=a.style.marginRight});return c}})}),c.defaultView&&c.defaultView.getComputedStyle&&(bA=function(a,b){var c,d,e;b=b.replace(bs,"-$1").toLowerCase(),(d=a.ownerDocument.defaultView)&&(e=d.getComputedStyle(a,null))&&(c=e.getPropertyValue(b),c===""&&!f.contains(a.ownerDocument.documentElement,a)&&(c=f.style(a,b)));return c}),c.documentElement.currentStyle&&(bB=function(a,b){var c,d,e,f=a.currentStyle&&a.currentStyle[b],g=a.style;f===null&&g&&(e=g[b])&&(f=e),!bt.test(f)&&bu.test(f)&&(c=g.left,d=a.runtimeStyle&&a.runtimeStyle.left,d&&(a.runtimeStyle.left=a.currentStyle.left),g.left=b==="fontSize"?"1em":f||0,f=g.pixelLeft+"px",g.left=c,d&&(a.runtimeStyle.left=d));return f===""?"auto":f}),bz=bA||bB,f.expr&&f.expr.filters&&(f.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!f.support.reliableHiddenOffsets&&(a.style&&a.style.display||f.css(a,"display"))==="none"},f.expr.filters.visible=function(a){return!f.expr.filters.hidden(a)});var bD=/%20/g,bE=/\[\]$/,bF=/\r?\n/g,bG=/#.*$/,bH=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bI=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bJ=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,bK=/^(?:GET|HEAD)$/,bL=/^\/\//,bM=/\?/,bN=/)<[^<]*)*<\/script>/gi,bO=/^(?:select|textarea)/i,bP=/\s+/,bQ=/([?&])_=[^&]*/,bR=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bS=f.fn.load,bT={},bU={},bV,bW,bX=["*/"]+["*"];try{bV=e.href}catch(bY){bV=c.createElement("a"),bV.href="",bV=bV.href}bW=bR.exec(bV.toLowerCase())||[],f.fn.extend({load:function(a,c,d){if(typeof a!="string"&&bS)return bS.apply(this,arguments);if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var g=a.slice(e,a.length);a=a.slice(0,e)}var h="GET";c&&(f.isFunction(c)?(d=c,c=b):typeof c=="object"&&(c=f.param(c,f.ajaxSettings.traditional),h="POST"));var i=this;f.ajax({url:a,type:h,dataType:"html",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?f("
").append(c.replace(bN,"")).find(g):c)),d&&i.each(d,[c,b,a])}});return this},serialize:function(){return f.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?f.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bO.test(this.nodeName)||bI.test(this.type))}).map(function(a,b){var c=f(this).val();return c==null?null:f.isArray(c)?f.map(c,function(a,c){return{name:b.name,value:a.replace(bF,"\r\n")}}):{name:b.name,value:c.replace(bF,"\r\n")}}).get()}}),f.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){f.fn[b]=function(a){return this.on(b,a)}}),f.each(["get","post"],function(a,c){f[c]=function(a,d,e,g){f.isFunction(d)&&(g=g||e,e=d,d=b);return f.ajax({type:c,url:a,data:d,success:e,dataType:g})}}),f.extend({getScript:function(a,c){return f.get(a,b,c,"script")},getJSON:function(a,b,c){return f.get(a,b,c,"json")},ajaxSetup:function(a,b){b?b_(a,f.ajaxSettings):(b=a,a=f.ajaxSettings),b_(a,b);return a},ajaxSettings:{url:bV,isLocal:bJ.test(bW[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":bX},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":f.parseJSON,"text xml":f.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:bZ(bT),ajaxTransport:bZ(bU),ajax:function(a,c){function w(a,c,l,m){if(s!==2){s=2,q&&clearTimeout(q),p=b,n=m||"",v.readyState=a>0?4:0;var o,r,u,w=c,x=l?cb(d,v,l):b,y,z;if(a>=200&&a<300||a===304){if(d.ifModified){if(y=v.getResponseHeader("Last-Modified"))f.lastModified[k]=y;if(z=v.getResponseHeader("Etag"))f.etag[k]=z}if(a===304)w="notmodified",o=!0;else try{r=cc(d,x),w="success",o=!0}catch(A){w="parsererror",u=A}}else{u=w;if(!w||a)w="error",a<0&&(a=0)}v.status=a,v.statusText=""+(c||w),o?h.resolveWith(e,[r,w,v]):h.rejectWith(e,[v,w,u]),v.statusCode(j),j=b,t&&g.trigger("ajax"+(o?"Success":"Error"),[v,d,o?r:u]),i.fireWith(e,[v,w]),t&&(g.trigger("ajaxComplete",[v,d]),--f.active||f.event.trigger("ajaxStop"))}}typeof a=="object"&&(c=a,a=b),c=c||{};var d=f.ajaxSetup({},c),e=d.context||d,g=e!==d&&(e.nodeType||e instanceof f)?f(e):f.event,h=f.Deferred(),i=f.Callbacks("once memory"),j=d.statusCode||{},k,l={},m={},n,o,p,q,r,s=0,t,u,v={readyState:0,setRequestHeader:function(a,b){if(!s){var c=a.toLowerCase();a=m[c]=m[c]||a,l[a]=b}return this},getAllResponseHeaders:function(){return s===2?n:null},getResponseHeader:function(a){var c;if(s===2){if(!o){o={};while(c=bH.exec(n))o[c[1].toLowerCase()]=c[2]}c=o[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){s||(d.mimeType=a);return this},abort:function(a){a=a||"abort",p&&p.abort(a),w(0,a);return this}};h.promise(v),v.success=v.done,v.error=v.fail,v.complete=i.add,v.statusCode=function(a){if(a){var b;if(s<2)for(b in a)j[b]=[j[b],a[b]];else b=a[v.status],v.then(b,b)}return this},d.url=((a||d.url)+"").replace(bG,"").replace(bL,bW[1]+"//"),d.dataTypes=f.trim(d.dataType||"*").toLowerCase().split(bP),d.crossDomain==null&&(r=bR.exec(d.url.toLowerCase()),d.crossDomain=!(!r||r[1]==bW[1]&&r[2]==bW[2]&&(r[3]||(r[1]==="http:"?80:443))==(bW[3]||(bW[1]==="http:"?80:443)))),d.data&&d.processData&&typeof d.data!="string"&&(d.data=f.param(d.data,d.traditional)),b$(bT,d,c,v);if(s===2)return!1;t=d.global,d.type=d.type.toUpperCase(),d.hasContent=!bK.test(d.type),t&&f.active++===0&&f.event.trigger("ajaxStart");if(!d.hasContent){d.data&&(d.url+=(bM.test(d.url)?"&":"?")+d.data,delete d.data),k=d.url;if(d.cache===!1){var x=f.now(),y=d.url.replace(bQ,"$1_="+x);d.url=y+(y===d.url?(bM.test(d.url)?"&":"?")+"_="+x:"")}}(d.data&&d.hasContent&&d.contentType!==!1||c.contentType)&&v.setRequestHeader("Content-Type",d.contentType),d.ifModified&&(k=k||d.url,f.lastModified[k]&&v.setRequestHeader("If-Modified-Since",f.lastModified[k]),f.etag[k]&&v.setRequestHeader("If-None-Match",f.etag[k])),v.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+(d.dataTypes[0]!=="*"?", "+bX+"; q=0.01":""):d.accepts["*"]);for(u in d.headers)v.setRequestHeader(u,d.headers[u]);if(d.beforeSend&&(d.beforeSend.call(e,v,d)===!1||s===2)){v.abort();return!1}for(u in{success:1,error:1,complete:1})v[u](d[u]);p=b$(bU,d,c,v);if(!p)w(-1,"No Transport");else{v.readyState=1,t&&g.trigger("ajaxSend",[v,d]),d.async&&d.timeout>0&&(q=setTimeout(function(){v.abort("timeout")},d.timeout));try{s=1,p.send(l,w)}catch(z){if(s<2)w(-1,z);else throw z}}return v},param:function(a,c){var d=[],e=function(a,b){b=f.isFunction(b)?b():b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=f.ajaxSettings.traditional);if(f.isArray(a)||a.jquery&&!f.isPlainObject(a))f.each(a,function(){e(this.name,this.value)});else for(var g in a)ca(g,a[g],c,e);return d.join("&").replace(bD,"+")}}),f.extend({active:0,lastModified:{},etag:{}});var cd=f.now(),ce=/(\=)\?(&|$)|\?\?/i;f.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return f.expando+"_"+cd++}}),f.ajaxPrefilter("json jsonp",function(b,c,d){var e=b.contentType==="application/x-www-form-urlencoded"&&typeof b.data=="string";if(b.dataTypes[0]==="jsonp"||b.jsonp!==!1&&(ce.test(b.url)||e&&ce.test(b.data))){var g,h=b.jsonpCallback=f.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2";b.jsonp!==!1&&(j=j.replace(ce,l),b.url===j&&(e&&(k=k.replace(ce,l)),b.data===k&&(j+=(/\?/.test(j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},d.always(function(){a[h]=i,g&&f.isFunction(i)&&a[h](g[0])}),b.converters["script json"]=function(){g||f.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),f.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){f.globalEval(a);return a}}}),f.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),f.ajaxTransport("script",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName("head")[0]||c.documentElement;return{send:function(f,g){d=c.createElement("script"),d.async="async",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(c||!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,"success")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var cf=a.ActiveXObject?function(){for(var a in ch)ch[a](0,1)}:!1,cg=0,ch;f.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&ci()||cj()}:ci,function(a){f.extend(f.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(f.ajaxSettings.xhr()),f.support.ajax&&f.ajaxTransport(function(c){if(!c.crossDomain||f.support.cors){var d;return{send:function(e,g){var h=c.xhr(),i,j;c.username?h.open(c.type,c.url,c.async,c.username,c.password):h.open(c.type,c.url,c.async);if(c.xhrFields)for(j in c.xhrFields)h[j]=c.xhrFields[j];c.mimeType&&h.overrideMimeType&&h.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(j in e)h.setRequestHeader(j,e[j])}catch(k){}h.send(c.hasContent&&c.data||null),d=function(a,e){var j,k,l,m,n;try{if(d&&(e||h.readyState===4)){d=b,i&&(h.onreadystatechange=f.noop,cf&&delete ch[i]);if(e)h.readyState!==4&&h.abort();else{j=h.status,l=h.getAllResponseHeaders(),m={},n=h.responseXML,n&&n.documentElement&&(m.xml=n),m.text=h.responseText;try{k=h.statusText}catch(o){k=""}!j&&c.isLocal&&!c.crossDomain?j=m.text?200:404:j===1223&&(j=204)}}}catch(p){e||g(-1,p)}m&&g(j,k,m,l)},!c.async||h.readyState===4?d():(i=++cg,cf&&(ch||(ch={},f(a).unload(cf)),ch[i]=d),h.onreadystatechange=d)},abort:function(){d&&d(0,1)}}}});var ck={},cl,cm,cn=/^(?:toggle|show|hide)$/,co=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,cp,cq=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],cr;f.fn.extend({show:function(a,b,c){var d,e;if(a||a===0)return this.animate(cu("show",3),a,b,c);for(var g=0,h=this.length;g=i.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),i.animatedProperties[this.prop]=!0;for(b in i.animatedProperties)i.animatedProperties[b]!==!0&&(g=!1);if(g){i.overflow!=null&&!f.support.shrinkWrapBlocks&&f.each(["","X","Y"],function(a,b){h.style["overflow"+b]=i.overflow[a]}),i.hide&&f(h).hide();if(i.hide||i.show)for(b in i.animatedProperties)f.style(h,b,i.orig[b]),f.removeData(h,"fxshow"+b,!0),f.removeData(h,"toggle"+b,!0);d=i.complete,d&&(i.complete=!1,d.call(h))}return!1}i.duration==Infinity?this.now=e:(c=e-this.startTime,this.state=c/i.duration,this.pos=f.easing[i.animatedProperties[this.prop]](this.state,c,0,1,i.duration),this.now=this.start+(this.end-this.start)*this.pos),this.update();return!0}},f.extend(f.fx,{tick:function(){var a,b=f.timers,c=0;for(;c-1,k={},l={},m,n;j?(l=e.position(),m=l.top,n=l.left):(m=parseFloat(h)||0,n=parseFloat(i)||0),f.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),"using"in b?b.using.call(a,k):e.css(k)}},f.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),d=cx.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(f.css(a,"marginTop"))||0,c.left-=parseFloat(f.css(a,"marginLeft"))||0,d.top+=parseFloat(f.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(f.css(b[0],"borderLeftWidth"))||0;return{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&!cx.test(a.nodeName)&&f.css(a,"position")==="static")a=a.offsetParent;return a})}}),f.each(["Left","Top"],function(a,c){var d="scroll"+c;f.fn[d]=function(c){var e,g;if(c===b){e=this[0];if(!e)return null;g=cy(e);return g?"pageXOffset"in g?g[a?"pageYOffset":"pageXOffset"]:f.support.boxModel&&g.document.documentElement[d]||g.document.body[d]:e[d]}return this.each(function(){g=cy(this),g?g.scrollTo(a?f(g).scrollLeft():c,a?c:f(g).scrollTop()):this[d]=c})}}),f.each(["Height","Width"],function(a,c){var d=c.toLowerCase();f.fn["inner"+c]=function(){var a=this[0];return a?a.style?parseFloat(f.css(a,d,"padding")):this[d]():null},f.fn["outer"+c]=function(a){var b=this[0];return b?b.style?parseFloat(f.css(b,d,a?"margin":"border")):this[d]():null},f.fn[d]=function(a){var e=this[0];if(!e)return a==null?null:this;if(f.isFunction(a))return this.each(function(b){var c=f(this);c[d](a.call(this,b,c[d]()))});if(f.isWindow(e)){var g=e.document.documentElement["client"+c],h=e.document.body;return e.document.compatMode==="CSS1Compat"&&g||h&&h["client"+c]||g}if(e.nodeType===9)return Math.max(e.documentElement["client"+c],e.body["scroll"+c],e.documentElement["scroll"+c],e.body["offset"+c],e.documentElement["offset"+c]);if(a===b){var i=f.css(e,d),j=parseFloat(i);return f.isNumeric(j)?j:i}return this.css(d,typeof a=="string"?a:a+"px")}}),a.jQuery=a.$=f,typeof define=="function"&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return f})})(window); \ No newline at end of file diff --git a/webui/view/javascript/jquery-ui-1.8.13.custom.min.js b/webui/view/javascript/jquery-ui-1.8.13.custom.min.js new file mode 100644 index 00000000..c5bf1d24 --- /dev/null +++ b/webui/view/javascript/jquery-ui-1.8.13.custom.min.js @@ -0,0 +1,784 @@ +/*! + * jQuery UI 1.8.13 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI + */ +(function(c,j){function k(a,b){var d=a.nodeName.toLowerCase();if("area"===d){b=a.parentNode;d=b.name;if(!a.href||!d||b.nodeName.toLowerCase()!=="map")return false;a=c("img[usemap=#"+d+"]")[0];return!!a&&l(a)}return(/input|select|textarea|button|object/.test(d)?!a.disabled:"a"==d?a.href||b:b)&&l(a)}function l(a){return!c(a).parents().andSelf().filter(function(){return c.curCSS(this,"visibility")==="hidden"||c.expr.filters.hidden(this)}).length}c.ui=c.ui||{};if(!c.ui.version){c.extend(c.ui,{version:"1.8.13", +keyCode:{ALT:18,BACKSPACE:8,CAPS_LOCK:20,COMMA:188,COMMAND:91,COMMAND_LEFT:91,COMMAND_RIGHT:93,CONTROL:17,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,INSERT:45,LEFT:37,MENU:93,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106,NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SHIFT:16,SPACE:32,TAB:9,UP:38,WINDOWS:91}});c.fn.extend({_focus:c.fn.focus,focus:function(a,b){return typeof a==="number"?this.each(function(){var d=this;setTimeout(function(){c(d).focus(); +b&&b.call(d)},a)}):this._focus.apply(this,arguments)},scrollParent:function(){var a;a=c.browser.msie&&/(static|relative)/.test(this.css("position"))||/absolute/.test(this.css("position"))?this.parents().filter(function(){return/(relative|absolute|fixed)/.test(c.curCSS(this,"position",1))&&/(auto|scroll)/.test(c.curCSS(this,"overflow",1)+c.curCSS(this,"overflow-y",1)+c.curCSS(this,"overflow-x",1))}).eq(0):this.parents().filter(function(){return/(auto|scroll)/.test(c.curCSS(this,"overflow",1)+c.curCSS(this, +"overflow-y",1)+c.curCSS(this,"overflow-x",1))}).eq(0);return/fixed/.test(this.css("position"))||!a.length?c(document):a},zIndex:function(a){if(a!==j)return this.css("zIndex",a);if(this.length){a=c(this[0]);for(var b;a.length&&a[0]!==document;){b=a.css("position");if(b==="absolute"||b==="relative"||b==="fixed"){b=parseInt(a.css("zIndex"),10);if(!isNaN(b)&&b!==0)return b}a=a.parent()}}return 0},disableSelection:function(){return this.bind((c.support.selectstart?"selectstart":"mousedown")+".ui-disableSelection", +function(a){a.preventDefault()})},enableSelection:function(){return this.unbind(".ui-disableSelection")}});c.each(["Width","Height"],function(a,b){function d(f,g,m,n){c.each(e,function(){g-=parseFloat(c.curCSS(f,"padding"+this,true))||0;if(m)g-=parseFloat(c.curCSS(f,"border"+this+"Width",true))||0;if(n)g-=parseFloat(c.curCSS(f,"margin"+this,true))||0});return g}var e=b==="Width"?["Left","Right"]:["Top","Bottom"],h=b.toLowerCase(),i={innerWidth:c.fn.innerWidth,innerHeight:c.fn.innerHeight,outerWidth:c.fn.outerWidth, +outerHeight:c.fn.outerHeight};c.fn["inner"+b]=function(f){if(f===j)return i["inner"+b].call(this);return this.each(function(){c(this).css(h,d(this,f)+"px")})};c.fn["outer"+b]=function(f,g){if(typeof f!=="number")return i["outer"+b].call(this,f);return this.each(function(){c(this).css(h,d(this,f,true,g)+"px")})}});c.extend(c.expr[":"],{data:function(a,b,d){return!!c.data(a,d[3])},focusable:function(a){return k(a,!isNaN(c.attr(a,"tabindex")))},tabbable:function(a){var b=c.attr(a,"tabindex"),d=isNaN(b); +return(d||b>=0)&&k(a,!d)}});c(function(){var a=document.body,b=a.appendChild(b=document.createElement("div"));c.extend(b.style,{minHeight:"100px",height:"auto",padding:0,borderWidth:0});c.support.minHeight=b.offsetHeight===100;c.support.selectstart="onselectstart"in b;a.removeChild(b).style.display="none"});c.extend(c.ui,{plugin:{add:function(a,b,d){a=c.ui[a].prototype;for(var e in d){a.plugins[e]=a.plugins[e]||[];a.plugins[e].push([b,d[e]])}},call:function(a,b,d){if((b=a.plugins[b])&&a.element[0].parentNode)for(var e= +0;e0)return true;a[b]=1;d=a[b]>0;a[b]=0;return d},isOverAxis:function(a,b,d){return a>b&&a=9)&&!a.button)return this._mouseUp(a);if(this._mouseStarted){this._mouseDrag(a);return a.preventDefault()}if(this._mouseDistanceMet(a)&&this._mouseDelayMet(a))(this._mouseStarted=this._mouseStart(this._mouseDownEvent,a)!==false)?this._mouseDrag(a):this._mouseUp(a);return!this._mouseStarted},_mouseUp:function(a){b(document).unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate);if(this._mouseStarted){this._mouseStarted= +false;a.target==this._mouseDownEvent.target&&b.data(a.target,this.widgetName+".preventClickEvent",true);this._mouseStop(a)}return false},_mouseDistanceMet:function(a){return Math.max(Math.abs(this._mouseDownEvent.pageX-a.pageX),Math.abs(this._mouseDownEvent.pageY-a.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return true}})})(jQuery); +;/* + * jQuery UI Position 1.8.13 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Position + */ +(function(c){c.ui=c.ui||{};var n=/left|center|right/,o=/top|center|bottom/,t=c.fn.position,u=c.fn.offset;c.fn.position=function(b){if(!b||!b.of)return t.apply(this,arguments);b=c.extend({},b);var a=c(b.of),d=a[0],g=(b.collision||"flip").split(" "),e=b.offset?b.offset.split(" "):[0,0],h,k,j;if(d.nodeType===9){h=a.width();k=a.height();j={top:0,left:0}}else if(d.setTimeout){h=a.width();k=a.height();j={top:a.scrollTop(),left:a.scrollLeft()}}else if(d.preventDefault){b.at="left top";h=k=0;j={top:b.of.pageY, +left:b.of.pageX}}else{h=a.outerWidth();k=a.outerHeight();j=a.offset()}c.each(["my","at"],function(){var f=(b[this]||"").split(" ");if(f.length===1)f=n.test(f[0])?f.concat(["center"]):o.test(f[0])?["center"].concat(f):["center","center"];f[0]=n.test(f[0])?f[0]:"center";f[1]=o.test(f[1])?f[1]:"center";b[this]=f});if(g.length===1)g[1]=g[0];e[0]=parseInt(e[0],10)||0;if(e.length===1)e[1]=e[0];e[1]=parseInt(e[1],10)||0;if(b.at[0]==="right")j.left+=h;else if(b.at[0]==="center")j.left+=h/2;if(b.at[1]==="bottom")j.top+= +k;else if(b.at[1]==="center")j.top+=k/2;j.left+=e[0];j.top+=e[1];return this.each(function(){var f=c(this),l=f.outerWidth(),m=f.outerHeight(),p=parseInt(c.curCSS(this,"marginLeft",true))||0,q=parseInt(c.curCSS(this,"marginTop",true))||0,v=l+p+(parseInt(c.curCSS(this,"marginRight",true))||0),w=m+q+(parseInt(c.curCSS(this,"marginBottom",true))||0),i=c.extend({},j),r;if(b.my[0]==="right")i.left-=l;else if(b.my[0]==="center")i.left-=l/2;if(b.my[1]==="bottom")i.top-=m;else if(b.my[1]==="center")i.top-= +m/2;i.left=Math.round(i.left);i.top=Math.round(i.top);r={left:i.left-p,top:i.top-q};c.each(["left","top"],function(s,x){c.ui.position[g[s]]&&c.ui.position[g[s]][x](i,{targetWidth:h,targetHeight:k,elemWidth:l,elemHeight:m,collisionPosition:r,collisionWidth:v,collisionHeight:w,offset:e,my:b.my,at:b.at})});c.fn.bgiframe&&f.bgiframe();f.offset(c.extend(i,{using:b.using}))})};c.ui.position={fit:{left:function(b,a){var d=c(window);d=a.collisionPosition.left+a.collisionWidth-d.width()-d.scrollLeft();b.left= +d>0?b.left-d:Math.max(b.left-a.collisionPosition.left,b.left)},top:function(b,a){var d=c(window);d=a.collisionPosition.top+a.collisionHeight-d.height()-d.scrollTop();b.top=d>0?b.top-d:Math.max(b.top-a.collisionPosition.top,b.top)}},flip:{left:function(b,a){if(a.at[0]!=="center"){var d=c(window);d=a.collisionPosition.left+a.collisionWidth-d.width()-d.scrollLeft();var g=a.my[0]==="left"?-a.elemWidth:a.my[0]==="right"?a.elemWidth:0,e=a.at[0]==="left"?a.targetWidth:-a.targetWidth,h=-2*a.offset[0];b.left+= +a.collisionPosition.left<0?g+e+h:d>0?g+e+h:0}},top:function(b,a){if(a.at[1]!=="center"){var d=c(window);d=a.collisionPosition.top+a.collisionHeight-d.height()-d.scrollTop();var g=a.my[1]==="top"?-a.elemHeight:a.my[1]==="bottom"?a.elemHeight:0,e=a.at[1]==="top"?a.targetHeight:-a.targetHeight,h=-2*a.offset[1];b.top+=a.collisionPosition.top<0?g+e+h:d>0?g+e+h:0}}}};if(!c.offset.setOffset){c.offset.setOffset=function(b,a){if(/static/.test(c.curCSS(b,"position")))b.style.position="relative";var d=c(b), +g=d.offset(),e=parseInt(c.curCSS(b,"top",true),10)||0,h=parseInt(c.curCSS(b,"left",true),10)||0;g={top:a.top-g.top+e,left:a.left-g.left+h};"using"in a?a.using.call(b,g):d.css(g)};c.fn.offset=function(b){var a=this[0];if(!a||!a.ownerDocument)return null;if(b)return this.each(function(){c.offset.setOffset(this,b)});return u.call(this)}}})(jQuery); +;/* + * jQuery UI Draggable 1.8.13 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Draggables + * + * Depends: + * jquery.ui.core.js + * jquery.ui.mouse.js + * jquery.ui.widget.js + */ +(function(d){d.widget("ui.draggable",d.ui.mouse,{widgetEventPrefix:"drag",options:{addClasses:true,appendTo:"parent",axis:false,connectToSortable:false,containment:false,cursor:"auto",cursorAt:false,grid:false,handle:false,helper:"original",iframeFix:false,opacity:false,refreshPositions:false,revert:false,revertDuration:500,scope:"default",scroll:true,scrollSensitivity:20,scrollSpeed:20,snap:false,snapMode:"both",snapTolerance:20,stack:false,zIndex:false},_create:function(){if(this.options.helper== +"original"&&!/^(?:r|a|f)/.test(this.element.css("position")))this.element[0].style.position="relative";this.options.addClasses&&this.element.addClass("ui-draggable");this.options.disabled&&this.element.addClass("ui-draggable-disabled");this._mouseInit()},destroy:function(){if(this.element.data("draggable")){this.element.removeData("draggable").unbind(".draggable").removeClass("ui-draggable ui-draggable-dragging ui-draggable-disabled");this._mouseDestroy();return this}},_mouseCapture:function(a){var b= +this.options;if(this.helper||b.disabled||d(a.target).is(".ui-resizable-handle"))return false;this.handle=this._getHandle(a);if(!this.handle)return false;d(b.iframeFix===true?"iframe":b.iframeFix).each(function(){d('
').css({width:this.offsetWidth+"px",height:this.offsetHeight+"px",position:"absolute",opacity:"0.001",zIndex:1E3}).css(d(this).offset()).appendTo("body")});return true},_mouseStart:function(a){var b=this.options;this.helper= +this._createHelper(a);this._cacheHelperProportions();if(d.ui.ddmanager)d.ui.ddmanager.current=this;this._cacheMargins();this.cssPosition=this.helper.css("position");this.scrollParent=this.helper.scrollParent();this.offset=this.positionAbs=this.element.offset();this.offset={top:this.offset.top-this.margins.top,left:this.offset.left-this.margins.left};d.extend(this.offset,{click:{left:a.pageX-this.offset.left,top:a.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()}); +this.originalPosition=this.position=this._generatePosition(a);this.originalPageX=a.pageX;this.originalPageY=a.pageY;b.cursorAt&&this._adjustOffsetFromHelper(b.cursorAt);b.containment&&this._setContainment();if(this._trigger("start",a)===false){this._clear();return false}this._cacheHelperProportions();d.ui.ddmanager&&!b.dropBehaviour&&d.ui.ddmanager.prepareOffsets(this,a);this.helper.addClass("ui-draggable-dragging");this._mouseDrag(a,true);return true},_mouseDrag:function(a,b){this.position=this._generatePosition(a); +this.positionAbs=this._convertPositionTo("absolute");if(!b){b=this._uiHash();if(this._trigger("drag",a,b)===false){this._mouseUp({});return false}this.position=b.position}if(!this.options.axis||this.options.axis!="y")this.helper[0].style.left=this.position.left+"px";if(!this.options.axis||this.options.axis!="x")this.helper[0].style.top=this.position.top+"px";d.ui.ddmanager&&d.ui.ddmanager.drag(this,a);return false},_mouseStop:function(a){var b=false;if(d.ui.ddmanager&&!this.options.dropBehaviour)b= +d.ui.ddmanager.drop(this,a);if(this.dropped){b=this.dropped;this.dropped=false}if((!this.element[0]||!this.element[0].parentNode)&&this.options.helper=="original")return false;if(this.options.revert=="invalid"&&!b||this.options.revert=="valid"&&b||this.options.revert===true||d.isFunction(this.options.revert)&&this.options.revert.call(this.element,b)){var c=this;d(this.helper).animate(this.originalPosition,parseInt(this.options.revertDuration,10),function(){c._trigger("stop",a)!==false&&c._clear()})}else this._trigger("stop", +a)!==false&&this._clear();return false},_mouseUp:function(a){this.options.iframeFix===true&&d("div.ui-draggable-iframeFix").each(function(){this.parentNode.removeChild(this)});return d.ui.mouse.prototype._mouseUp.call(this,a)},cancel:function(){this.helper.is(".ui-draggable-dragging")?this._mouseUp({}):this._clear();return this},_getHandle:function(a){var b=!this.options.handle||!d(this.options.handle,this.element).length?true:false;d(this.options.handle,this.element).find("*").andSelf().each(function(){if(this== +a.target)b=true});return b},_createHelper:function(a){var b=this.options;a=d.isFunction(b.helper)?d(b.helper.apply(this.element[0],[a])):b.helper=="clone"?this.element.clone().removeAttr("id"):this.element;a.parents("body").length||a.appendTo(b.appendTo=="parent"?this.element[0].parentNode:b.appendTo);a[0]!=this.element[0]&&!/(fixed|absolute)/.test(a.css("position"))&&a.css("position","absolute");return a},_adjustOffsetFromHelper:function(a){if(typeof a=="string")a=a.split(" ");if(d.isArray(a))a= +{left:+a[0],top:+a[1]||0};if("left"in a)this.offset.click.left=a.left+this.margins.left;if("right"in a)this.offset.click.left=this.helperProportions.width-a.right+this.margins.left;if("top"in a)this.offset.click.top=a.top+this.margins.top;if("bottom"in a)this.offset.click.top=this.helperProportions.height-a.bottom+this.margins.top},_getParentOffset:function(){this.offsetParent=this.helper.offsetParent();var a=this.offsetParent.offset();if(this.cssPosition=="absolute"&&this.scrollParent[0]!=document&& +d.ui.contains(this.scrollParent[0],this.offsetParent[0])){a.left+=this.scrollParent.scrollLeft();a.top+=this.scrollParent.scrollTop()}if(this.offsetParent[0]==document.body||this.offsetParent[0].tagName&&this.offsetParent[0].tagName.toLowerCase()=="html"&&d.browser.msie)a={top:0,left:0};return{top:a.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:a.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if(this.cssPosition=="relative"){var a= +this.element.position();return{top:a.top-(parseInt(this.helper.css("top"),10)||0)+this.scrollParent.scrollTop(),left:a.left-(parseInt(this.helper.css("left"),10)||0)+this.scrollParent.scrollLeft()}}else return{top:0,left:0}},_cacheMargins:function(){this.margins={left:parseInt(this.element.css("marginLeft"),10)||0,top:parseInt(this.element.css("marginTop"),10)||0,right:parseInt(this.element.css("marginRight"),10)||0,bottom:parseInt(this.element.css("marginBottom"),10)||0}},_cacheHelperProportions:function(){this.helperProportions= +{width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var a=this.options;if(a.containment=="parent")a.containment=this.helper[0].parentNode;if(a.containment=="document"||a.containment=="window")this.containment=[(a.containment=="document"?0:d(window).scrollLeft())-this.offset.relative.left-this.offset.parent.left,(a.containment=="document"?0:d(window).scrollTop())-this.offset.relative.top-this.offset.parent.top,(a.containment=="document"?0:d(window).scrollLeft())+ +d(a.containment=="document"?document:window).width()-this.helperProportions.width-this.margins.left,(a.containment=="document"?0:d(window).scrollTop())+(d(a.containment=="document"?document:window).height()||document.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top];if(!/^(document|window|parent)$/.test(a.containment)&&a.containment.constructor!=Array){a=d(a.containment);var b=a[0];if(b){a.offset();var c=d(b).css("overflow")!="hidden";this.containment=[(parseInt(d(b).css("borderLeftWidth"), +10)||0)+(parseInt(d(b).css("paddingLeft"),10)||0),(parseInt(d(b).css("borderTopWidth"),10)||0)+(parseInt(d(b).css("paddingTop"),10)||0),(c?Math.max(b.scrollWidth,b.offsetWidth):b.offsetWidth)-(parseInt(d(b).css("borderLeftWidth"),10)||0)-(parseInt(d(b).css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left-this.margins.right,(c?Math.max(b.scrollHeight,b.offsetHeight):b.offsetHeight)-(parseInt(d(b).css("borderTopWidth"),10)||0)-(parseInt(d(b).css("paddingBottom"),10)||0)-this.helperProportions.height- +this.margins.top-this.margins.bottom];this.relative_container=a}}else if(a.containment.constructor==Array)this.containment=a.containment},_convertPositionTo:function(a,b){if(!b)b=this.position;a=a=="absolute"?1:-1;var c=this.cssPosition=="absolute"&&!(this.scrollParent[0]!=document&&d.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,f=/(html|body)/i.test(c[0].tagName);return{top:b.top+this.offset.relative.top*a+this.offset.parent.top*a-(d.browser.safari&& +d.browser.version<526&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollTop():f?0:c.scrollTop())*a),left:b.left+this.offset.relative.left*a+this.offset.parent.left*a-(d.browser.safari&&d.browser.version<526&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():f?0:c.scrollLeft())*a)}},_generatePosition:function(a){var b=this.options,c=this.cssPosition=="absolute"&&!(this.scrollParent[0]!=document&&d.ui.contains(this.scrollParent[0], +this.offsetParent[0]))?this.offsetParent:this.scrollParent,f=/(html|body)/i.test(c[0].tagName),e=a.pageX,h=a.pageY;if(this.originalPosition){var g;if(this.containment){if(this.relative_container){g=this.relative_container.offset();g=[this.containment[0]+g.left,this.containment[1]+g.top,this.containment[2]+g.left,this.containment[3]+g.top]}else g=this.containment;if(a.pageX-this.offset.click.leftg[2])e=g[2]+this.offset.click.left;if(a.pageY-this.offset.click.top>g[3])h=g[3]+this.offset.click.top}if(b.grid){h=this.originalPageY+Math.round((h-this.originalPageY)/b.grid[1])*b.grid[1];h=g?!(h-this.offset.click.topg[3])?h:!(h-this.offset.click.topg[2])?e:!(e-this.offset.click.left< +g[0])?e-b.grid[0]:e+b.grid[0]:e}}return{top:h-this.offset.click.top-this.offset.relative.top-this.offset.parent.top+(d.browser.safari&&d.browser.version<526&&this.cssPosition=="fixed"?0:this.cssPosition=="fixed"?-this.scrollParent.scrollTop():f?0:c.scrollTop()),left:e-this.offset.click.left-this.offset.relative.left-this.offset.parent.left+(d.browser.safari&&d.browser.version<526&&this.cssPosition=="fixed"?0:this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():f?0:c.scrollLeft())}},_clear:function(){this.helper.removeClass("ui-draggable-dragging"); +this.helper[0]!=this.element[0]&&!this.cancelHelperRemoval&&this.helper.remove();this.helper=null;this.cancelHelperRemoval=false},_trigger:function(a,b,c){c=c||this._uiHash();d.ui.plugin.call(this,a,[b,c]);if(a=="drag")this.positionAbs=this._convertPositionTo("absolute");return d.Widget.prototype._trigger.call(this,a,b,c)},plugins:{},_uiHash:function(){return{helper:this.helper,position:this.position,originalPosition:this.originalPosition,offset:this.positionAbs}}});d.extend(d.ui.draggable,{version:"1.8.13"}); +d.ui.plugin.add("draggable","connectToSortable",{start:function(a,b){var c=d(this).data("draggable"),f=c.options,e=d.extend({},b,{item:c.element});c.sortables=[];d(f.connectToSortable).each(function(){var h=d.data(this,"sortable");if(h&&!h.options.disabled){c.sortables.push({instance:h,shouldRevert:h.options.revert});h.refreshPositions();h._trigger("activate",a,e)}})},stop:function(a,b){var c=d(this).data("draggable"),f=d.extend({},b,{item:c.element});d.each(c.sortables,function(){if(this.instance.isOver){this.instance.isOver= +0;c.cancelHelperRemoval=true;this.instance.cancelHelperRemoval=false;if(this.shouldRevert)this.instance.options.revert=true;this.instance._mouseStop(a);this.instance.options.helper=this.instance.options._helper;c.options.helper=="original"&&this.instance.currentItem.css({top:"auto",left:"auto"})}else{this.instance.cancelHelperRemoval=false;this.instance._trigger("deactivate",a,f)}})},drag:function(a,b){var c=d(this).data("draggable"),f=this;d.each(c.sortables,function(){this.instance.positionAbs= +c.positionAbs;this.instance.helperProportions=c.helperProportions;this.instance.offset.click=c.offset.click;if(this.instance._intersectsWith(this.instance.containerCache)){if(!this.instance.isOver){this.instance.isOver=1;this.instance.currentItem=d(f).clone().removeAttr("id").appendTo(this.instance.element).data("sortable-item",true);this.instance.options._helper=this.instance.options.helper;this.instance.options.helper=function(){return b.helper[0]};a.target=this.instance.currentItem[0];this.instance._mouseCapture(a, +true);this.instance._mouseStart(a,true,true);this.instance.offset.click.top=c.offset.click.top;this.instance.offset.click.left=c.offset.click.left;this.instance.offset.parent.left-=c.offset.parent.left-this.instance.offset.parent.left;this.instance.offset.parent.top-=c.offset.parent.top-this.instance.offset.parent.top;c._trigger("toSortable",a);c.dropped=this.instance.element;c.currentItem=c.element;this.instance.fromOutside=c}this.instance.currentItem&&this.instance._mouseDrag(a)}else if(this.instance.isOver){this.instance.isOver= +0;this.instance.cancelHelperRemoval=true;this.instance.options.revert=false;this.instance._trigger("out",a,this.instance._uiHash(this.instance));this.instance._mouseStop(a,true);this.instance.options.helper=this.instance.options._helper;this.instance.currentItem.remove();this.instance.placeholder&&this.instance.placeholder.remove();c._trigger("fromSortable",a);c.dropped=false}})}});d.ui.plugin.add("draggable","cursor",{start:function(){var a=d("body"),b=d(this).data("draggable").options;if(a.css("cursor"))b._cursor= +a.css("cursor");a.css("cursor",b.cursor)},stop:function(){var a=d(this).data("draggable").options;a._cursor&&d("body").css("cursor",a._cursor)}});d.ui.plugin.add("draggable","opacity",{start:function(a,b){a=d(b.helper);b=d(this).data("draggable").options;if(a.css("opacity"))b._opacity=a.css("opacity");a.css("opacity",b.opacity)},stop:function(a,b){a=d(this).data("draggable").options;a._opacity&&d(b.helper).css("opacity",a._opacity)}});d.ui.plugin.add("draggable","scroll",{start:function(){var a=d(this).data("draggable"); +if(a.scrollParent[0]!=document&&a.scrollParent[0].tagName!="HTML")a.overflowOffset=a.scrollParent.offset()},drag:function(a){var b=d(this).data("draggable"),c=b.options,f=false;if(b.scrollParent[0]!=document&&b.scrollParent[0].tagName!="HTML"){if(!c.axis||c.axis!="x")if(b.overflowOffset.top+b.scrollParent[0].offsetHeight-a.pageY=0;i--){var j=c.snapElements[i].left,l=j+c.snapElements[i].width,k=c.snapElements[i].top,m=k+c.snapElements[i].height;if(j-e=j&&f<=l||h>=j&&h<=l||fl)&&(e>= +i&&e<=k||g>=i&&g<=k||ek);default:return false}};d.ui.ddmanager={current:null,droppables:{"default":[]},prepareOffsets:function(a,b){var c=d.ui.ddmanager.droppables[a.options.scope]||[],e=b?b.type:null,g=(a.currentItem||a.element).find(":data(droppable)").andSelf(),f=0;a:for(;f
').css({position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(), +top:this.element.css("top"),left:this.element.css("left")}));this.element=this.element.parent().data("resizable",this.element.data("resizable"));this.elementIsWrapper=true;this.element.css({marginLeft:this.originalElement.css("marginLeft"),marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom")});this.originalElement.css({marginLeft:0,marginTop:0,marginRight:0,marginBottom:0});this.originalResizeStyle= +this.originalElement.css("resize");this.originalElement.css("resize","none");this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"}));this.originalElement.css({margin:this.originalElement.css("margin")});this._proportionallyResize()}this.handles=a.handles||(!e(".ui-resizable-handle",this.element).length?"e,s,se":{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne", +nw:".ui-resizable-nw"});if(this.handles.constructor==String){if(this.handles=="all")this.handles="n,e,s,w,se,sw,ne,nw";var c=this.handles.split(",");this.handles={};for(var d=0;d');/sw|se|ne|nw/.test(f)&&g.css({zIndex:++a.zIndex});"se"==f&&g.addClass("ui-icon ui-icon-gripsmall-diagonal-se");this.handles[f]=".ui-resizable-"+f;this.element.append(g)}}this._renderAxis=function(h){h=h||this.element;for(var i in this.handles){if(this.handles[i].constructor== +String)this.handles[i]=e(this.handles[i],this.element).show();if(this.elementIsWrapper&&this.originalElement[0].nodeName.match(/textarea|input|select|button/i)){var j=e(this.handles[i],this.element),k=0;k=/sw|ne|nw|se|n|s/.test(i)?j.outerHeight():j.outerWidth();j=["padding",/ne|nw|n/.test(i)?"Top":/se|sw|s/.test(i)?"Bottom":/^e$/.test(i)?"Right":"Left"].join("");h.css(j,k);this._proportionallyResize()}e(this.handles[i])}};this._renderAxis(this.element);this._handles=e(".ui-resizable-handle",this.element).disableSelection(); +this._handles.mouseover(function(){if(!b.resizing){if(this.className)var h=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i);b.axis=h&&h[1]?h[1]:"se"}});if(a.autoHide){this._handles.hide();e(this.element).addClass("ui-resizable-autohide").hover(function(){if(!a.disabled){e(this).removeClass("ui-resizable-autohide");b._handles.show()}},function(){if(!a.disabled)if(!b.resizing){e(this).addClass("ui-resizable-autohide");b._handles.hide()}})}this._mouseInit()},destroy:function(){this._mouseDestroy(); +var b=function(c){e(c).removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing").removeData("resizable").unbind(".resizable").find(".ui-resizable-handle").remove()};if(this.elementIsWrapper){b(this.element);var a=this.element;a.after(this.originalElement.css({position:a.css("position"),width:a.outerWidth(),height:a.outerHeight(),top:a.css("top"),left:a.css("left")})).remove()}this.originalElement.css("resize",this.originalResizeStyle);b(this.originalElement);return this},_mouseCapture:function(b){var a= +false;for(var c in this.handles)if(e(this.handles[c])[0]==b.target)a=true;return!this.options.disabled&&a},_mouseStart:function(b){var a=this.options,c=this.element.position(),d=this.element;this.resizing=true;this.documentScroll={top:e(document).scrollTop(),left:e(document).scrollLeft()};if(d.is(".ui-draggable")||/absolute/.test(d.css("position")))d.css({position:"absolute",top:c.top,left:c.left});e.browser.opera&&/relative/.test(d.css("position"))&&d.css({position:"relative",top:"auto",left:"auto"}); +this._renderProxy();c=m(this.helper.css("left"));var f=m(this.helper.css("top"));if(a.containment){c+=e(a.containment).scrollLeft()||0;f+=e(a.containment).scrollTop()||0}this.offset=this.helper.offset();this.position={left:c,top:f};this.size=this._helper?{width:d.outerWidth(),height:d.outerHeight()}:{width:d.width(),height:d.height()};this.originalSize=this._helper?{width:d.outerWidth(),height:d.outerHeight()}:{width:d.width(),height:d.height()};this.originalPosition={left:c,top:f};this.sizeDiff= +{width:d.outerWidth()-d.width(),height:d.outerHeight()-d.height()};this.originalMousePosition={left:b.pageX,top:b.pageY};this.aspectRatio=typeof a.aspectRatio=="number"?a.aspectRatio:this.originalSize.width/this.originalSize.height||1;a=e(".ui-resizable-"+this.axis).css("cursor");e("body").css("cursor",a=="auto"?this.axis+"-resize":a);d.addClass("ui-resizable-resizing");this._propagate("start",b);return true},_mouseDrag:function(b){var a=this.helper,c=this.originalMousePosition,d=this._change[this.axis]; +if(!d)return false;c=d.apply(this,[b,b.pageX-c.left||0,b.pageY-c.top||0]);if(this._aspectRatio||b.shiftKey)c=this._updateRatio(c,b);c=this._respectSize(c,b);this._propagate("resize",b);a.css({top:this.position.top+"px",left:this.position.left+"px",width:this.size.width+"px",height:this.size.height+"px"});!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize();this._updateCache(c);this._trigger("resize",b,this.ui());return false},_mouseStop:function(b){this.resizing= +false;var a=this.options,c=this;if(this._helper){var d=this._proportionallyResizeElements,f=d.length&&/textarea/i.test(d[0].nodeName);d=f&&e.ui.hasScroll(d[0],"left")?0:c.sizeDiff.height;f=f?0:c.sizeDiff.width;f={width:c.helper.width()-f,height:c.helper.height()-d};d=parseInt(c.element.css("left"),10)+(c.position.left-c.originalPosition.left)||null;var g=parseInt(c.element.css("top"),10)+(c.position.top-c.originalPosition.top)||null;a.animate||this.element.css(e.extend(f,{top:g,left:d}));c.helper.height(c.size.height); +c.helper.width(c.size.width);this._helper&&!a.animate&&this._proportionallyResize()}e("body").css("cursor","auto");this.element.removeClass("ui-resizable-resizing");this._propagate("stop",b);this._helper&&this.helper.remove();return false},_updateCache:function(b){this.offset=this.helper.offset();if(l(b.left))this.position.left=b.left;if(l(b.top))this.position.top=b.top;if(l(b.height))this.size.height=b.height;if(l(b.width))this.size.width=b.width},_updateRatio:function(b){var a=this.position,c=this.size, +d=this.axis;if(b.height)b.width=c.height*this.aspectRatio;else if(b.width)b.height=c.width/this.aspectRatio;if(d=="sw"){b.left=a.left+(c.width-b.width);b.top=null}if(d=="nw"){b.top=a.top+(c.height-b.height);b.left=a.left+(c.width-b.width)}return b},_respectSize:function(b){var a=this.options,c=this.axis,d=l(b.width)&&a.maxWidth&&a.maxWidthb.width,h=l(b.height)&&a.minHeight&&a.minHeight>b.height;if(g)b.width= +a.minWidth;if(h)b.height=a.minHeight;if(d)b.width=a.maxWidth;if(f)b.height=a.maxHeight;var i=this.originalPosition.left+this.originalSize.width,j=this.position.top+this.size.height,k=/sw|nw|w/.test(c);c=/nw|ne|n/.test(c);if(g&&k)b.left=i-a.minWidth;if(d&&k)b.left=i-a.maxWidth;if(h&&c)b.top=j-a.minHeight;if(f&&c)b.top=j-a.maxHeight;if((a=!b.width&&!b.height)&&!b.left&&b.top)b.top=null;else if(a&&!b.top&&b.left)b.left=null;return b},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var b= +this.helper||this.element,a=0;a');var a=e.browser.msie&&e.browser.version<7,c=a?1:0;a=a?2:-1;this.helper.addClass(this._helper).css({width:this.element.outerWidth()+a,height:this.element.outerHeight()+a,position:"absolute",left:this.elementOffset.left- +c+"px",top:this.elementOffset.top-c+"px",zIndex:++b.zIndex});this.helper.appendTo("body").disableSelection()}else this.helper=this.element},_change:{e:function(b,a){return{width:this.originalSize.width+a}},w:function(b,a){return{left:this.originalPosition.left+a,width:this.originalSize.width-a}},n:function(b,a,c){return{top:this.originalPosition.top+c,height:this.originalSize.height-c}},s:function(b,a,c){return{height:this.originalSize.height+c}},se:function(b,a,c){return e.extend(this._change.s.apply(this, +arguments),this._change.e.apply(this,[b,a,c]))},sw:function(b,a,c){return e.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[b,a,c]))},ne:function(b,a,c){return e.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[b,a,c]))},nw:function(b,a,c){return e.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[b,a,c]))}},_propagate:function(b,a){e.ui.plugin.call(this,b,[a,this.ui()]);b!="resize"&&this._trigger(b,a,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement, +element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}});e.extend(e.ui.resizable,{version:"1.8.13"});e.ui.plugin.add("resizable","alsoResize",{start:function(){var b=e(this).data("resizable").options,a=function(c){e(c).each(function(){var d=e(this);d.data("resizable-alsoresize",{width:parseInt(d.width(),10),height:parseInt(d.height(),10),left:parseInt(d.css("left"),10),top:parseInt(d.css("top"),10),position:d.css("position")})})}; +if(typeof b.alsoResize=="object"&&!b.alsoResize.parentNode)if(b.alsoResize.length){b.alsoResize=b.alsoResize[0];a(b.alsoResize)}else e.each(b.alsoResize,function(c){a(c)});else a(b.alsoResize)},resize:function(b,a){var c=e(this).data("resizable");b=c.options;var d=c.originalSize,f=c.originalPosition,g={height:c.size.height-d.height||0,width:c.size.width-d.width||0,top:c.position.top-f.top||0,left:c.position.left-f.left||0},h=function(i,j){e(i).each(function(){var k=e(this),q=e(this).data("resizable-alsoresize"), +p={},r=j&&j.length?j:k.parents(a.originalElement[0]).length?["width","height"]:["width","height","top","left"];e.each(r,function(n,o){if((n=(q[o]||0)+(g[o]||0))&&n>=0)p[o]=n||null});if(e.browser.opera&&/relative/.test(k.css("position"))){c._revertToRelativePosition=true;k.css({position:"absolute",top:"auto",left:"auto"})}k.css(p)})};typeof b.alsoResize=="object"&&!b.alsoResize.nodeType?e.each(b.alsoResize,function(i,j){h(i,j)}):h(b.alsoResize)},stop:function(){var b=e(this).data("resizable"),a=b.options, +c=function(d){e(d).each(function(){var f=e(this);f.css({position:f.data("resizable-alsoresize").position})})};if(b._revertToRelativePosition){b._revertToRelativePosition=false;typeof a.alsoResize=="object"&&!a.alsoResize.nodeType?e.each(a.alsoResize,function(d){c(d)}):c(a.alsoResize)}e(this).removeData("resizable-alsoresize")}});e.ui.plugin.add("resizable","animate",{stop:function(b){var a=e(this).data("resizable"),c=a.options,d=a._proportionallyResizeElements,f=d.length&&/textarea/i.test(d[0].nodeName), +g=f&&e.ui.hasScroll(d[0],"left")?0:a.sizeDiff.height;f={width:a.size.width-(f?0:a.sizeDiff.width),height:a.size.height-g};g=parseInt(a.element.css("left"),10)+(a.position.left-a.originalPosition.left)||null;var h=parseInt(a.element.css("top"),10)+(a.position.top-a.originalPosition.top)||null;a.element.animate(e.extend(f,h&&g?{top:h,left:g}:{}),{duration:c.animateDuration,easing:c.animateEasing,step:function(){var i={width:parseInt(a.element.css("width"),10),height:parseInt(a.element.css("height"), +10),top:parseInt(a.element.css("top"),10),left:parseInt(a.element.css("left"),10)};d&&d.length&&e(d[0]).css({width:i.width,height:i.height});a._updateCache(i);a._propagate("resize",b)}})}});e.ui.plugin.add("resizable","containment",{start:function(){var b=e(this).data("resizable"),a=b.element,c=b.options.containment;if(a=c instanceof e?c.get(0):/parent/.test(c)?a.parent().get(0):c){b.containerElement=e(a);if(/document/.test(c)||c==document){b.containerOffset={left:0,top:0};b.containerPosition={left:0, +top:0};b.parentData={element:e(document),left:0,top:0,width:e(document).width(),height:e(document).height()||document.body.parentNode.scrollHeight}}else{var d=e(a),f=[];e(["Top","Right","Left","Bottom"]).each(function(i,j){f[i]=m(d.css("padding"+j))});b.containerOffset=d.offset();b.containerPosition=d.position();b.containerSize={height:d.innerHeight()-f[3],width:d.innerWidth()-f[1]};c=b.containerOffset;var g=b.containerSize.height,h=b.containerSize.width;h=e.ui.hasScroll(a,"left")?a.scrollWidth:h; +g=e.ui.hasScroll(a)?a.scrollHeight:g;b.parentData={element:a,left:c.left,top:c.top,width:h,height:g}}}},resize:function(b){var a=e(this).data("resizable"),c=a.options,d=a.containerOffset,f=a.position;b=a._aspectRatio||b.shiftKey;var g={top:0,left:0},h=a.containerElement;if(h[0]!=document&&/static/.test(h.css("position")))g=d;if(f.left<(a._helper?d.left:0)){a.size.width+=a._helper?a.position.left-d.left:a.position.left-g.left;if(b)a.size.height=a.size.width/c.aspectRatio;a.position.left=c.helper?d.left: +0}if(f.top<(a._helper?d.top:0)){a.size.height+=a._helper?a.position.top-d.top:a.position.top;if(b)a.size.width=a.size.height*c.aspectRatio;a.position.top=a._helper?d.top:0}a.offset.left=a.parentData.left+a.position.left;a.offset.top=a.parentData.top+a.position.top;c=Math.abs((a._helper?a.offset.left-g.left:a.offset.left-g.left)+a.sizeDiff.width);d=Math.abs((a._helper?a.offset.top-g.top:a.offset.top-d.top)+a.sizeDiff.height);f=a.containerElement.get(0)==a.element.parent().get(0);g=/relative|absolute/.test(a.containerElement.css("position")); +if(f&&g)c-=a.parentData.left;if(c+a.size.width>=a.parentData.width){a.size.width=a.parentData.width-c;if(b)a.size.height=a.size.width/a.aspectRatio}if(d+a.size.height>=a.parentData.height){a.size.height=a.parentData.height-d;if(b)a.size.width=a.size.height*a.aspectRatio}},stop:function(){var b=e(this).data("resizable"),a=b.options,c=b.containerOffset,d=b.containerPosition,f=b.containerElement,g=e(b.helper),h=g.offset(),i=g.outerWidth()-b.sizeDiff.width;g=g.outerHeight()-b.sizeDiff.height;b._helper&& +!a.animate&&/relative/.test(f.css("position"))&&e(this).css({left:h.left-d.left-c.left,width:i,height:g});b._helper&&!a.animate&&/static/.test(f.css("position"))&&e(this).css({left:h.left-d.left-c.left,width:i,height:g})}});e.ui.plugin.add("resizable","ghost",{start:function(){var b=e(this).data("resizable"),a=b.options,c=b.size;b.ghost=b.originalElement.clone();b.ghost.css({opacity:0.25,display:"block",position:"relative",height:c.height,width:c.width,margin:0,left:0,top:0}).addClass("ui-resizable-ghost").addClass(typeof a.ghost== +"string"?a.ghost:"");b.ghost.appendTo(b.helper)},resize:function(){var b=e(this).data("resizable");b.ghost&&b.ghost.css({position:"relative",height:b.size.height,width:b.size.width})},stop:function(){var b=e(this).data("resizable");b.ghost&&b.helper&&b.helper.get(0).removeChild(b.ghost.get(0))}});e.ui.plugin.add("resizable","grid",{resize:function(){var b=e(this).data("resizable"),a=b.options,c=b.size,d=b.originalSize,f=b.originalPosition,g=b.axis;a.grid=typeof a.grid=="number"?[a.grid,a.grid]:a.grid; +var h=Math.round((c.width-d.width)/(a.grid[0]||1))*(a.grid[0]||1);a=Math.round((c.height-d.height)/(a.grid[1]||1))*(a.grid[1]||1);if(/^(se|s|e)$/.test(g)){b.size.width=d.width+h;b.size.height=d.height+a}else if(/^(ne)$/.test(g)){b.size.width=d.width+h;b.size.height=d.height+a;b.position.top=f.top-a}else{if(/^(sw)$/.test(g)){b.size.width=d.width+h;b.size.height=d.height+a}else{b.size.width=d.width+h;b.size.height=d.height+a;b.position.top=f.top-a}b.position.left=f.left-h}}});var m=function(b){return parseInt(b, +10)||0},l=function(b){return!isNaN(parseInt(b,10))}})(jQuery); +;/* + * jQuery UI Selectable 1.8.13 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Selectables + * + * Depends: + * jquery.ui.core.js + * jquery.ui.mouse.js + * jquery.ui.widget.js + */ +(function(e){e.widget("ui.selectable",e.ui.mouse,{options:{appendTo:"body",autoRefresh:true,distance:0,filter:"*",tolerance:"touch"},_create:function(){var c=this;this.element.addClass("ui-selectable");this.dragged=false;var f;this.refresh=function(){f=e(c.options.filter,c.element[0]);f.each(function(){var d=e(this),b=d.offset();e.data(this,"selectable-item",{element:this,$element:d,left:b.left,top:b.top,right:b.left+d.outerWidth(),bottom:b.top+d.outerHeight(),startselected:false,selected:d.hasClass("ui-selected"), +selecting:d.hasClass("ui-selecting"),unselecting:d.hasClass("ui-unselecting")})})};this.refresh();this.selectees=f.addClass("ui-selectee");this._mouseInit();this.helper=e("
")},destroy:function(){this.selectees.removeClass("ui-selectee").removeData("selectable-item");this.element.removeClass("ui-selectable ui-selectable-disabled").removeData("selectable").unbind(".selectable");this._mouseDestroy();return this},_mouseStart:function(c){var f=this;this.opos=[c.pageX, +c.pageY];if(!this.options.disabled){var d=this.options;this.selectees=e(d.filter,this.element[0]);this._trigger("start",c);e(d.appendTo).append(this.helper);this.helper.css({left:c.clientX,top:c.clientY,width:0,height:0});d.autoRefresh&&this.refresh();this.selectees.filter(".ui-selected").each(function(){var b=e.data(this,"selectable-item");b.startselected=true;if(!c.metaKey){b.$element.removeClass("ui-selected");b.selected=false;b.$element.addClass("ui-unselecting");b.unselecting=true;f._trigger("unselecting", +c,{unselecting:b.element})}});e(c.target).parents().andSelf().each(function(){var b=e.data(this,"selectable-item");if(b){var g=!c.metaKey||!b.$element.hasClass("ui-selected");b.$element.removeClass(g?"ui-unselecting":"ui-selected").addClass(g?"ui-selecting":"ui-unselecting");b.unselecting=!g;b.selecting=g;(b.selected=g)?f._trigger("selecting",c,{selecting:b.element}):f._trigger("unselecting",c,{unselecting:b.element});return false}})}},_mouseDrag:function(c){var f=this;this.dragged=true;if(!this.options.disabled){var d= +this.options,b=this.opos[0],g=this.opos[1],h=c.pageX,i=c.pageY;if(b>h){var j=h;h=b;b=j}if(g>i){j=i;i=g;g=j}this.helper.css({left:b,top:g,width:h-b,height:i-g});this.selectees.each(function(){var a=e.data(this,"selectable-item");if(!(!a||a.element==f.element[0])){var k=false;if(d.tolerance=="touch")k=!(a.left>h||a.righti||a.bottomb&&a.rightg&&a.bottom *",opacity:false,placeholder:false,revert:false,scroll:true,scrollSensitivity:20,scrollSpeed:20,scope:"default",tolerance:"intersect",zIndex:1E3},_create:function(){var a=this.options;this.containerCache={};this.element.addClass("ui-sortable"); +this.refresh();this.floating=this.items.length?a.axis==="x"||/left|right/.test(this.items[0].item.css("float"))||/inline|table-cell/.test(this.items[0].item.css("display")):false;this.offset=this.element.offset();this._mouseInit()},destroy:function(){this.element.removeClass("ui-sortable ui-sortable-disabled").removeData("sortable").unbind(".sortable");this._mouseDestroy();for(var a=this.items.length-1;a>=0;a--)this.items[a].item.removeData("sortable-item");return this},_setOption:function(a,b){if(a=== +"disabled"){this.options[a]=b;this.widget()[b?"addClass":"removeClass"]("ui-sortable-disabled")}else d.Widget.prototype._setOption.apply(this,arguments)},_mouseCapture:function(a,b){if(this.reverting)return false;if(this.options.disabled||this.options.type=="static")return false;this._refreshItems(a);var c=null,e=this;d(a.target).parents().each(function(){if(d.data(this,"sortable-item")==e){c=d(this);return false}});if(d.data(a.target,"sortable-item")==e)c=d(a.target);if(!c)return false;if(this.options.handle&& +!b){var f=false;d(this.options.handle,c).find("*").andSelf().each(function(){if(this==a.target)f=true});if(!f)return false}this.currentItem=c;this._removeCurrentsFromItems();return true},_mouseStart:function(a,b,c){b=this.options;var e=this;this.currentContainer=this;this.refreshPositions();this.helper=this._createHelper(a);this._cacheHelperProportions();this._cacheMargins();this.scrollParent=this.helper.scrollParent();this.offset=this.currentItem.offset();this.offset={top:this.offset.top-this.margins.top, +left:this.offset.left-this.margins.left};this.helper.css("position","absolute");this.cssPosition=this.helper.css("position");d.extend(this.offset,{click:{left:a.pageX-this.offset.left,top:a.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()});this.originalPosition=this._generatePosition(a);this.originalPageX=a.pageX;this.originalPageY=a.pageY;b.cursorAt&&this._adjustOffsetFromHelper(b.cursorAt);this.domPosition={prev:this.currentItem.prev()[0],parent:this.currentItem.parent()[0]}; +this.helper[0]!=this.currentItem[0]&&this.currentItem.hide();this._createPlaceholder();b.containment&&this._setContainment();if(b.cursor){if(d("body").css("cursor"))this._storedCursor=d("body").css("cursor");d("body").css("cursor",b.cursor)}if(b.opacity){if(this.helper.css("opacity"))this._storedOpacity=this.helper.css("opacity");this.helper.css("opacity",b.opacity)}if(b.zIndex){if(this.helper.css("zIndex"))this._storedZIndex=this.helper.css("zIndex");this.helper.css("zIndex",b.zIndex)}if(this.scrollParent[0]!= +document&&this.scrollParent[0].tagName!="HTML")this.overflowOffset=this.scrollParent.offset();this._trigger("start",a,this._uiHash());this._preserveHelperProportions||this._cacheHelperProportions();if(!c)for(c=this.containers.length-1;c>=0;c--)this.containers[c]._trigger("activate",a,e._uiHash(this));if(d.ui.ddmanager)d.ui.ddmanager.current=this;d.ui.ddmanager&&!b.dropBehaviour&&d.ui.ddmanager.prepareOffsets(this,a);this.dragging=true;this.helper.addClass("ui-sortable-helper");this._mouseDrag(a); +return true},_mouseDrag:function(a){this.position=this._generatePosition(a);this.positionAbs=this._convertPositionTo("absolute");if(!this.lastPositionAbs)this.lastPositionAbs=this.positionAbs;if(this.options.scroll){var b=this.options,c=false;if(this.scrollParent[0]!=document&&this.scrollParent[0].tagName!="HTML"){if(this.overflowOffset.top+this.scrollParent[0].offsetHeight-a.pageY=0;b--){c=this.items[b];var e=c.item[0],f=this._intersectsWithPointer(c);if(f)if(e!=this.currentItem[0]&&this.placeholder[f==1?"next":"prev"]()[0]!=e&&!d.ui.contains(this.placeholder[0],e)&&(this.options.type=="semi-dynamic"?!d.ui.contains(this.element[0], +e):true)){this.direction=f==1?"down":"up";if(this.options.tolerance=="pointer"||this._intersectsWithSides(c))this._rearrange(a,c);else break;this._trigger("change",a,this._uiHash());break}}this._contactContainers(a);d.ui.ddmanager&&d.ui.ddmanager.drag(this,a);this._trigger("sort",a,this._uiHash());this.lastPositionAbs=this.positionAbs;return false},_mouseStop:function(a,b){if(a){d.ui.ddmanager&&!this.options.dropBehaviour&&d.ui.ddmanager.drop(this,a);if(this.options.revert){var c=this;b=c.placeholder.offset(); +c.reverting=true;d(this.helper).animate({left:b.left-this.offset.parent.left-c.margins.left+(this.offsetParent[0]==document.body?0:this.offsetParent[0].scrollLeft),top:b.top-this.offset.parent.top-c.margins.top+(this.offsetParent[0]==document.body?0:this.offsetParent[0].scrollTop)},parseInt(this.options.revert,10)||500,function(){c._clear(a)})}else this._clear(a,b);return false}},cancel:function(){var a=this;if(this.dragging){this._mouseUp({target:null});this.options.helper=="original"?this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper"): +this.currentItem.show();for(var b=this.containers.length-1;b>=0;b--){this.containers[b]._trigger("deactivate",null,a._uiHash(this));if(this.containers[b].containerCache.over){this.containers[b]._trigger("out",null,a._uiHash(this));this.containers[b].containerCache.over=0}}}if(this.placeholder){this.placeholder[0].parentNode&&this.placeholder[0].parentNode.removeChild(this.placeholder[0]);this.options.helper!="original"&&this.helper&&this.helper[0].parentNode&&this.helper.remove();d.extend(this,{helper:null, +dragging:false,reverting:false,_noFinalSort:null});this.domPosition.prev?d(this.domPosition.prev).after(this.currentItem):d(this.domPosition.parent).prepend(this.currentItem)}return this},serialize:function(a){var b=this._getItemsAsjQuery(a&&a.connected),c=[];a=a||{};d(b).each(function(){var e=(d(a.item||this).attr(a.attribute||"id")||"").match(a.expression||/(.+)[-=_](.+)/);if(e)c.push((a.key||e[1]+"[]")+"="+(a.key&&a.expression?e[1]:e[2]))});!c.length&&a.key&&c.push(a.key+"=");return c.join("&")}, +toArray:function(a){var b=this._getItemsAsjQuery(a&&a.connected),c=[];a=a||{};b.each(function(){c.push(d(a.item||this).attr(a.attribute||"id")||"")});return c},_intersectsWith:function(a){var b=this.positionAbs.left,c=b+this.helperProportions.width,e=this.positionAbs.top,f=e+this.helperProportions.height,g=a.left,h=g+a.width,i=a.top,k=i+a.height,j=this.offset.click.top,l=this.offset.click.left;j=e+j>i&&e+jg&&b+la[this.floating?"width":"height"]?j:g0?"down":"up")},_getDragHorizontalDirection:function(){var a=this.positionAbs.left-this.lastPositionAbs.left;return a!=0&&(a>0?"right":"left")},refresh:function(a){this._refreshItems(a);this.refreshPositions();return this},_connectWith:function(){var a=this.options;return a.connectWith.constructor==String?[a.connectWith]:a.connectWith},_getItemsAsjQuery:function(a){var b=[],c=[],e=this._connectWith(); +if(e&&a)for(a=e.length-1;a>=0;a--)for(var f=d(e[a]),g=f.length-1;g>=0;g--){var h=d.data(f[g],"sortable");if(h&&h!=this&&!h.options.disabled)c.push([d.isFunction(h.options.items)?h.options.items.call(h.element):d(h.options.items,h.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),h])}c.push([d.isFunction(this.options.items)?this.options.items.call(this.element,null,{options:this.options,item:this.currentItem}):d(this.options.items,this.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"), +this]);for(a=c.length-1;a>=0;a--)c[a][0].each(function(){b.push(this)});return d(b)},_removeCurrentsFromItems:function(){for(var a=this.currentItem.find(":data(sortable-item)"),b=0;b=0;f--)for(var g=d(e[f]),h=g.length-1;h>=0;h--){var i=d.data(g[h],"sortable");if(i&&i!=this&&!i.options.disabled){c.push([d.isFunction(i.options.items)?i.options.items.call(i.element[0],a,{item:this.currentItem}):d(i.options.items,i.element),i]);this.containers.push(i)}}for(f=c.length-1;f>=0;f--){a=c[f][1];e=c[f][0];h=0;for(g=e.length;h=0;b--){var c=this.items[b];if(!(c.instance!=this.currentContainer&&this.currentContainer&&c.item[0]!=this.currentItem[0])){var e=this.options.toleranceElement?d(this.options.toleranceElement,c.item):c.item;if(!a){c.width=e.outerWidth();c.height=e.outerHeight()}e=e.offset();c.left=e.left;c.top=e.top}}if(this.options.custom&&this.options.custom.refreshContainers)this.options.custom.refreshContainers.call(this);else for(b= +this.containers.length-1;b>=0;b--){e=this.containers[b].element.offset();this.containers[b].containerCache.left=e.left;this.containers[b].containerCache.top=e.top;this.containers[b].containerCache.width=this.containers[b].element.outerWidth();this.containers[b].containerCache.height=this.containers[b].element.outerHeight()}return this},_createPlaceholder:function(a){var b=a||this,c=b.options;if(!c.placeholder||c.placeholder.constructor==String){var e=c.placeholder;c.placeholder={element:function(){var f= +d(document.createElement(b.currentItem[0].nodeName)).addClass(e||b.currentItem[0].className+" ui-sortable-placeholder").removeClass("ui-sortable-helper")[0];if(!e)f.style.visibility="hidden";return f},update:function(f,g){if(!(e&&!c.forcePlaceholderSize)){g.height()||g.height(b.currentItem.innerHeight()-parseInt(b.currentItem.css("paddingTop")||0,10)-parseInt(b.currentItem.css("paddingBottom")||0,10));g.width()||g.width(b.currentItem.innerWidth()-parseInt(b.currentItem.css("paddingLeft")||0,10)-parseInt(b.currentItem.css("paddingRight")|| +0,10))}}}}b.placeholder=d(c.placeholder.element.call(b.element,b.currentItem));b.currentItem.after(b.placeholder);c.placeholder.update(b,b.placeholder)},_contactContainers:function(a){for(var b=null,c=null,e=this.containers.length-1;e>=0;e--)if(!d.ui.contains(this.currentItem[0],this.containers[e].element[0]))if(this._intersectsWith(this.containers[e].containerCache)){if(!(b&&d.ui.contains(this.containers[e].element[0],b.element[0]))){b=this.containers[e];c=e}}else if(this.containers[e].containerCache.over){this.containers[e]._trigger("out", +a,this._uiHash(this));this.containers[e].containerCache.over=0}if(b)if(this.containers.length===1){this.containers[c]._trigger("over",a,this._uiHash(this));this.containers[c].containerCache.over=1}else if(this.currentContainer!=this.containers[c]){b=1E4;e=null;for(var f=this.positionAbs[this.containers[c].floating?"left":"top"],g=this.items.length-1;g>=0;g--)if(d.ui.contains(this.containers[c].element[0],this.items[g].item[0])){var h=this.items[g][this.containers[c].floating?"left":"top"];if(Math.abs(h- +f)this.containment[2])f=this.containment[2]+this.offset.click.left;if(a.pageY-this.offset.click.top>this.containment[3])g=this.containment[3]+this.offset.click.top}if(b.grid){g=this.originalPageY+Math.round((g- +this.originalPageY)/b.grid[1])*b.grid[1];g=this.containment?!(g-this.offset.click.topthis.containment[3])?g:!(g-this.offset.click.topthis.containment[2])?f:!(f-this.offset.click.left=0;e--)if(d.ui.contains(this.containers[e].element[0],this.currentItem[0])&&!b){c.push(function(f){return function(g){f._trigger("receive",g,this._uiHash(this))}}.call(this,this.containers[e]));c.push(function(f){return function(g){f._trigger("update",g,this._uiHash(this))}}.call(this,this.containers[e]))}}for(e=this.containers.length-1;e>=0;e--){b||c.push(function(f){return function(g){f._trigger("deactivate",g,this._uiHash(this))}}.call(this, +this.containers[e]));if(this.containers[e].containerCache.over){c.push(function(f){return function(g){f._trigger("out",g,this._uiHash(this))}}.call(this,this.containers[e]));this.containers[e].containerCache.over=0}}this._storedCursor&&d("body").css("cursor",this._storedCursor);this._storedOpacity&&this.helper.css("opacity",this._storedOpacity);if(this._storedZIndex)this.helper.css("zIndex",this._storedZIndex=="auto"?"":this._storedZIndex);this.dragging=false;if(this.cancelHelperRemoval){if(!b){this._trigger("beforeStop", +a,this._uiHash());for(e=0;e li > :first-child,> :not(li):even",icons:{header:"ui-icon-triangle-1-e",headerSelected:"ui-icon-triangle-1-s"},navigation:false,navigationFilter:function(){return this.href.toLowerCase()===location.href.toLowerCase()}},_create:function(){var a=this,b=a.options;a.running=0;a.element.addClass("ui-accordion ui-widget ui-helper-reset").children("li").addClass("ui-accordion-li-fix"); +a.headers=a.element.find(b.header).addClass("ui-accordion-header ui-helper-reset ui-state-default ui-corner-all").bind("mouseenter.accordion",function(){b.disabled||c(this).addClass("ui-state-hover")}).bind("mouseleave.accordion",function(){b.disabled||c(this).removeClass("ui-state-hover")}).bind("focus.accordion",function(){b.disabled||c(this).addClass("ui-state-focus")}).bind("blur.accordion",function(){b.disabled||c(this).removeClass("ui-state-focus")});a.headers.next().addClass("ui-accordion-content ui-helper-reset ui-widget-content ui-corner-bottom"); +if(b.navigation){var d=a.element.find("a").filter(b.navigationFilter).eq(0);if(d.length){var h=d.closest(".ui-accordion-header");a.active=h.length?h:d.closest(".ui-accordion-content").prev()}}a.active=a._findActive(a.active||b.active).addClass("ui-state-default ui-state-active").toggleClass("ui-corner-all").toggleClass("ui-corner-top");a.active.next().addClass("ui-accordion-content-active");a._createIcons();a.resize();a.element.attr("role","tablist");a.headers.attr("role","tab").bind("keydown.accordion", +function(f){return a._keydown(f)}).next().attr("role","tabpanel");a.headers.not(a.active||"").attr({"aria-expanded":"false","aria-selected":"false",tabIndex:-1}).next().hide();a.active.length?a.active.attr({"aria-expanded":"true","aria-selected":"true",tabIndex:0}):a.headers.eq(0).attr("tabIndex",0);c.browser.safari||a.headers.find("a").attr("tabIndex",-1);b.event&&a.headers.bind(b.event.split(" ").join(".accordion ")+".accordion",function(f){a._clickHandler.call(a,f,this);f.preventDefault()})},_createIcons:function(){var a= +this.options;if(a.icons){c("").addClass("ui-icon "+a.icons.header).prependTo(this.headers);this.active.children(".ui-icon").toggleClass(a.icons.header).toggleClass(a.icons.headerSelected);this.element.addClass("ui-accordion-icons")}},_destroyIcons:function(){this.headers.children(".ui-icon").remove();this.element.removeClass("ui-accordion-icons")},destroy:function(){var a=this.options;this.element.removeClass("ui-accordion ui-widget ui-helper-reset").removeAttr("role");this.headers.unbind(".accordion").removeClass("ui-accordion-header ui-accordion-disabled ui-helper-reset ui-state-default ui-corner-all ui-state-active ui-state-disabled ui-corner-top").removeAttr("role").removeAttr("aria-expanded").removeAttr("aria-selected").removeAttr("tabIndex"); +this.headers.find("a").removeAttr("tabIndex");this._destroyIcons();var b=this.headers.next().css("display","").removeAttr("role").removeClass("ui-helper-reset ui-widget-content ui-corner-bottom ui-accordion-content ui-accordion-content-active ui-accordion-disabled ui-state-disabled");if(a.autoHeight||a.fillHeight)b.css("height","");return c.Widget.prototype.destroy.call(this)},_setOption:function(a,b){c.Widget.prototype._setOption.apply(this,arguments);a=="active"&&this.activate(b);if(a=="icons"){this._destroyIcons(); +b&&this._createIcons()}if(a=="disabled")this.headers.add(this.headers.next())[b?"addClass":"removeClass"]("ui-accordion-disabled ui-state-disabled")},_keydown:function(a){if(!(this.options.disabled||a.altKey||a.ctrlKey)){var b=c.ui.keyCode,d=this.headers.length,h=this.headers.index(a.target),f=false;switch(a.keyCode){case b.RIGHT:case b.DOWN:f=this.headers[(h+1)%d];break;case b.LEFT:case b.UP:f=this.headers[(h-1+d)%d];break;case b.SPACE:case b.ENTER:this._clickHandler({target:a.target},a.target); +a.preventDefault()}if(f){c(a.target).attr("tabIndex",-1);c(f).attr("tabIndex",0);f.focus();return false}return true}},resize:function(){var a=this.options,b;if(a.fillSpace){if(c.browser.msie){var d=this.element.parent().css("overflow");this.element.parent().css("overflow","hidden")}b=this.element.parent().height();c.browser.msie&&this.element.parent().css("overflow",d);this.headers.each(function(){b-=c(this).outerHeight(true)});this.headers.next().each(function(){c(this).height(Math.max(0,b-c(this).innerHeight()+ +c(this).height()))}).css("overflow","auto")}else if(a.autoHeight){b=0;this.headers.next().each(function(){b=Math.max(b,c(this).height("").height())}).height(b)}return this},activate:function(a){this.options.active=a;a=this._findActive(a)[0];this._clickHandler({target:a},a);return this},_findActive:function(a){return a?typeof a==="number"?this.headers.filter(":eq("+a+")"):this.headers.not(this.headers.not(a)):a===false?c([]):this.headers.filter(":eq(0)")},_clickHandler:function(a,b){var d=this.options; +if(!d.disabled)if(a.target){a=c(a.currentTarget||b);b=a[0]===this.active[0];d.active=d.collapsible&&b?false:this.headers.index(a);if(!(this.running||!d.collapsible&&b)){var h=this.active;j=a.next();g=this.active.next();e={options:d,newHeader:b&&d.collapsible?c([]):a,oldHeader:this.active,newContent:b&&d.collapsible?c([]):j,oldContent:g};var f=this.headers.index(this.active[0])>this.headers.index(a[0]);this.active=b?c([]):a;this._toggle(j,g,e,b,f);h.removeClass("ui-state-active ui-corner-top").addClass("ui-state-default ui-corner-all").children(".ui-icon").removeClass(d.icons.headerSelected).addClass(d.icons.header); +if(!b){a.removeClass("ui-state-default ui-corner-all").addClass("ui-state-active ui-corner-top").children(".ui-icon").removeClass(d.icons.header).addClass(d.icons.headerSelected);a.next().addClass("ui-accordion-content-active")}}}else if(d.collapsible){this.active.removeClass("ui-state-active ui-corner-top").addClass("ui-state-default ui-corner-all").children(".ui-icon").removeClass(d.icons.headerSelected).addClass(d.icons.header);this.active.next().addClass("ui-accordion-content-active");var g=this.active.next(), +e={options:d,newHeader:c([]),oldHeader:d.active,newContent:c([]),oldContent:g},j=this.active=c([]);this._toggle(j,g,e)}},_toggle:function(a,b,d,h,f){var g=this,e=g.options;g.toShow=a;g.toHide=b;g.data=d;var j=function(){if(g)return g._completed.apply(g,arguments)};g._trigger("changestart",null,g.data);g.running=b.size()===0?a.size():b.size();if(e.animated){d={};d=e.collapsible&&h?{toShow:c([]),toHide:b,complete:j,down:f,autoHeight:e.autoHeight||e.fillSpace}:{toShow:a,toHide:b,complete:j,down:f,autoHeight:e.autoHeight|| +e.fillSpace};if(!e.proxied)e.proxied=e.animated;if(!e.proxiedDuration)e.proxiedDuration=e.duration;e.animated=c.isFunction(e.proxied)?e.proxied(d):e.proxied;e.duration=c.isFunction(e.proxiedDuration)?e.proxiedDuration(d):e.proxiedDuration;h=c.ui.accordion.animations;var i=e.duration,k=e.animated;if(k&&!h[k]&&!c.easing[k])k="slide";h[k]||(h[k]=function(l){this.slide(l,{easing:k,duration:i||700})});h[k](d)}else{if(e.collapsible&&h)a.toggle();else{b.hide();a.show()}j(true)}b.prev().attr({"aria-expanded":"false", +"aria-selected":"false",tabIndex:-1}).blur();a.prev().attr({"aria-expanded":"true","aria-selected":"true",tabIndex:0}).focus()},_completed:function(a){this.running=a?0:--this.running;if(!this.running){this.options.clearStyle&&this.toShow.add(this.toHide).css({height:"",overflow:""});this.toHide.removeClass("ui-accordion-content-active");if(this.toHide.length)this.toHide.parent()[0].className=this.toHide.parent()[0].className;this._trigger("change",null,this.data)}}});c.extend(c.ui.accordion,{version:"1.8.13", +animations:{slide:function(a,b){a=c.extend({easing:"swing",duration:300},a,b);if(a.toHide.size())if(a.toShow.size()){var d=a.toShow.css("overflow"),h=0,f={},g={},e;b=a.toShow;e=b[0].style.width;b.width(parseInt(b.parent().width(),10)-parseInt(b.css("paddingLeft"),10)-parseInt(b.css("paddingRight"),10)-(parseInt(b.css("borderLeftWidth"),10)||0)-(parseInt(b.css("borderRightWidth"),10)||0));c.each(["height","paddingTop","paddingBottom"],function(j,i){g[i]="hide";j=(""+c.css(a.toShow[0],i)).match(/^([\d+-.]+)(.*)$/); +f[i]={value:j[1],unit:j[2]||"px"}});a.toShow.css({height:0,overflow:"hidden"}).show();a.toHide.filter(":hidden").each(a.complete).end().filter(":visible").animate(g,{step:function(j,i){if(i.prop=="height")h=i.end-i.start===0?0:(i.now-i.start)/(i.end-i.start);a.toShow[0].style[i.prop]=h*f[i.prop].value+f[i.prop].unit},duration:a.duration,easing:a.easing,complete:function(){a.autoHeight||a.toShow.css("height","");a.toShow.css({width:e,overflow:d});a.complete()}})}else a.toHide.animate({height:"hide", +paddingTop:"hide",paddingBottom:"hide"},a);else a.toShow.animate({height:"show",paddingTop:"show",paddingBottom:"show"},a)},bounceslide:function(a){this.slide(a,{easing:a.down?"easeOutBounce":"swing",duration:a.down?1E3:200})}}})})(jQuery); +;/* + * jQuery UI Autocomplete 1.8.13 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Autocomplete + * + * Depends: + * jquery.ui.core.js + * jquery.ui.widget.js + * jquery.ui.position.js + */ +(function(d){var e=0;d.widget("ui.autocomplete",{options:{appendTo:"body",autoFocus:false,delay:300,minLength:1,position:{my:"left top",at:"left bottom",collision:"none"},source:null},pending:0,_create:function(){var a=this,b=this.element[0].ownerDocument,g;this.element.addClass("ui-autocomplete-input").attr("autocomplete","off").attr({role:"textbox","aria-autocomplete":"list","aria-haspopup":"true"}).bind("keydown.autocomplete",function(c){if(!(a.options.disabled||a.element.attr("readonly"))){g= +false;var f=d.ui.keyCode;switch(c.keyCode){case f.PAGE_UP:a._move("previousPage",c);break;case f.PAGE_DOWN:a._move("nextPage",c);break;case f.UP:a._move("previous",c);c.preventDefault();break;case f.DOWN:a._move("next",c);c.preventDefault();break;case f.ENTER:case f.NUMPAD_ENTER:if(a.menu.active){g=true;c.preventDefault()}case f.TAB:if(!a.menu.active)return;a.menu.select(c);break;case f.ESCAPE:a.element.val(a.term);a.close(c);break;default:clearTimeout(a.searching);a.searching=setTimeout(function(){if(a.term!= +a.element.val()){a.selectedItem=null;a.search(null,c)}},a.options.delay);break}}}).bind("keypress.autocomplete",function(c){if(g){g=false;c.preventDefault()}}).bind("focus.autocomplete",function(){if(!a.options.disabled){a.selectedItem=null;a.previous=a.element.val()}}).bind("blur.autocomplete",function(c){if(!a.options.disabled){clearTimeout(a.searching);a.closing=setTimeout(function(){a.close(c);a._change(c)},150)}});this._initSource();this.response=function(){return a._response.apply(a,arguments)}; +this.menu=d("
    ").addClass("ui-autocomplete").appendTo(d(this.options.appendTo||"body",b)[0]).mousedown(function(c){var f=a.menu.element[0];d(c.target).closest(".ui-menu-item").length||setTimeout(function(){d(document).one("mousedown",function(h){h.target!==a.element[0]&&h.target!==f&&!d.ui.contains(f,h.target)&&a.close()})},1);setTimeout(function(){clearTimeout(a.closing)},13)}).menu({focus:function(c,f){f=f.item.data("item.autocomplete");false!==a._trigger("focus",c,{item:f})&&/^key/.test(c.originalEvent.type)&& +a.element.val(f.value)},selected:function(c,f){var h=f.item.data("item.autocomplete"),i=a.previous;if(a.element[0]!==b.activeElement){a.element.focus();a.previous=i;setTimeout(function(){a.previous=i;a.selectedItem=h},1)}false!==a._trigger("select",c,{item:h})&&a.element.val(h.value);a.term=a.element.val();a.close(c);a.selectedItem=h},blur:function(){a.menu.element.is(":visible")&&a.element.val()!==a.term&&a.element.val(a.term)}}).zIndex(this.element.zIndex()+1).css({top:0,left:0}).hide().data("menu"); +d.fn.bgiframe&&this.menu.element.bgiframe()},destroy:function(){this.element.removeClass("ui-autocomplete-input").removeAttr("autocomplete").removeAttr("role").removeAttr("aria-autocomplete").removeAttr("aria-haspopup");this.menu.element.remove();d.Widget.prototype.destroy.call(this)},_setOption:function(a,b){d.Widget.prototype._setOption.apply(this,arguments);a==="source"&&this._initSource();if(a==="appendTo")this.menu.element.appendTo(d(b||"body",this.element[0].ownerDocument)[0]);a==="disabled"&& +b&&this.xhr&&this.xhr.abort()},_initSource:function(){var a=this,b,g;if(d.isArray(this.options.source)){b=this.options.source;this.source=function(c,f){f(d.ui.autocomplete.filter(b,c.term))}}else if(typeof this.options.source==="string"){g=this.options.source;this.source=function(c,f){a.xhr&&a.xhr.abort();a.xhr=d.ajax({url:g,data:c,dataType:"json",autocompleteRequest:++e,success:function(h){this.autocompleteRequest===e&&f(h)},error:function(){this.autocompleteRequest===e&&f([])}})}}else this.source= +this.options.source},search:function(a,b){a=a!=null?a:this.element.val();this.term=this.element.val();if(a.length").data("item.autocomplete",b).append(d("").text(b.label)).appendTo(a)},_move:function(a,b){if(this.menu.element.is(":visible"))if(this.menu.first()&&/^previous/.test(a)||this.menu.last()&&/^next/.test(a)){this.element.val(this.term);this.menu.deactivate()}else this.menu[a](b);else this.search(null,b)},widget:function(){return this.menu.element}});d.extend(d.ui.autocomplete,{escapeRegex:function(a){return a.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, +"\\$&")},filter:function(a,b){var g=new RegExp(d.ui.autocomplete.escapeRegex(b),"i");return d.grep(a,function(c){return g.test(c.label||c.value||c)})}})})(jQuery); +(function(d){d.widget("ui.menu",{_create:function(){var e=this;this.element.addClass("ui-menu ui-widget ui-widget-content ui-corner-all").attr({role:"listbox","aria-activedescendant":"ui-active-menuitem"}).click(function(a){if(d(a.target).closest(".ui-menu-item a").length){a.preventDefault();e.select(a)}});this.refresh()},refresh:function(){var e=this;this.element.children("li:not(.ui-menu-item):has(a)").addClass("ui-menu-item").attr("role","menuitem").children("a").addClass("ui-corner-all").attr("tabindex", +-1).mouseenter(function(a){e.activate(a,d(this).parent())}).mouseleave(function(){e.deactivate()})},activate:function(e,a){this.deactivate();if(this.hasScroll()){var b=a.offset().top-this.element.offset().top,g=this.element.scrollTop(),c=this.element.height();if(b<0)this.element.scrollTop(g+b);else b>=c&&this.element.scrollTop(g+b-c+a.height())}this.active=a.eq(0).children("a").addClass("ui-state-hover").attr("id","ui-active-menuitem").end();this._trigger("focus",e,{item:a})},deactivate:function(){if(this.active){this.active.children("a").removeClass("ui-state-hover").removeAttr("id"); +this._trigger("blur");this.active=null}},next:function(e){this.move("next",".ui-menu-item:first",e)},previous:function(e){this.move("prev",".ui-menu-item:last",e)},first:function(){return this.active&&!this.active.prevAll(".ui-menu-item").length},last:function(){return this.active&&!this.active.nextAll(".ui-menu-item").length},move:function(e,a,b){if(this.active){e=this.active[e+"All"](".ui-menu-item").eq(0);e.length?this.activate(b,e):this.activate(b,this.element.children(a))}else this.activate(b, +this.element.children(a))},nextPage:function(e){if(this.hasScroll())if(!this.active||this.last())this.activate(e,this.element.children(".ui-menu-item:first"));else{var a=this.active.offset().top,b=this.element.height(),g=this.element.children(".ui-menu-item").filter(function(){var c=d(this).offset().top-a-b+d(this).height();return c<10&&c>-10});g.length||(g=this.element.children(".ui-menu-item:last"));this.activate(e,g)}else this.activate(e,this.element.children(".ui-menu-item").filter(!this.active|| +this.last()?":first":":last"))},previousPage:function(e){if(this.hasScroll())if(!this.active||this.first())this.activate(e,this.element.children(".ui-menu-item:last"));else{var a=this.active.offset().top,b=this.element.height();result=this.element.children(".ui-menu-item").filter(function(){var g=d(this).offset().top-a+b-d(this).height();return g<10&&g>-10});result.length||(result=this.element.children(".ui-menu-item:first"));this.activate(e,result)}else this.activate(e,this.element.children(".ui-menu-item").filter(!this.active|| +this.first()?":last":":first"))},hasScroll:function(){return this.element.height()").addClass("ui-button-text").html(this.options.label).appendTo(b.empty()).text(),d=this.options.icons,f=d.primary&&d.secondary,e=[];if(d.primary||d.secondary){if(this.options.text)e.push("ui-button-text-icon"+(f?"s":d.primary?"-primary":"-secondary"));d.primary&&b.prepend("");d.secondary&&b.append("");if(!this.options.text){e.push(f?"ui-button-icons-only": +"ui-button-icon-only");this.hasTitle||b.attr("title",c)}}else e.push("ui-button-text-only");b.addClass(e.join(" "))}}});a.widget("ui.buttonset",{options:{items:":button, :submit, :reset, :checkbox, :radio, a, :data(button)"},_create:function(){this.element.addClass("ui-buttonset")},_init:function(){this.refresh()},_setOption:function(b,c){b==="disabled"&&this.buttons.button("option",b,c);a.Widget.prototype._setOption.apply(this,arguments)},refresh:function(){this.buttons=this.element.find(this.options.items).filter(":ui-button").button("refresh").end().not(":ui-button").button().end().map(function(){return a(this).button("widget")[0]}).removeClass("ui-corner-all ui-corner-left ui-corner-right").filter(":first").addClass("ui-corner-left").end().filter(":last").addClass("ui-corner-right").end().end()}, +destroy:function(){this.element.removeClass("ui-buttonset");this.buttons.map(function(){return a(this).button("widget")[0]}).removeClass("ui-corner-left ui-corner-right").end().button("destroy");a.Widget.prototype.destroy.call(this)}})})(jQuery); +;/* + * jQuery UI Dialog 1.8.13 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Dialog + * + * Depends: + * jquery.ui.core.js + * jquery.ui.widget.js + * jquery.ui.button.js + * jquery.ui.draggable.js + * jquery.ui.mouse.js + * jquery.ui.position.js + * jquery.ui.resizable.js + */ +(function(c,l){var m={buttons:true,height:true,maxHeight:true,maxWidth:true,minHeight:true,minWidth:true,width:true},n={maxHeight:true,maxWidth:true,minHeight:true,minWidth:true},o=c.attrFn||{val:true,css:true,html:true,text:true,data:true,width:true,height:true,offset:true,click:true};c.widget("ui.dialog",{options:{autoOpen:true,buttons:{},closeOnEscape:true,closeText:"close",dialogClass:"",draggable:true,hide:null,height:"auto",maxHeight:false,maxWidth:false,minHeight:150,minWidth:150,modal:false, +position:{my:"center",at:"center",collision:"fit",using:function(a){var b=c(this).css(a).offset().top;b<0&&c(this).css("top",a.top-b)}},resizable:true,show:null,stack:true,title:"",width:300,zIndex:1E3},_create:function(){this.originalTitle=this.element.attr("title");if(typeof this.originalTitle!=="string")this.originalTitle="";this.options.title=this.options.title||this.originalTitle;var a=this,b=a.options,d=b.title||" ",e=c.ui.dialog.getTitleId(a.element),g=(a.uiDialog=c("
    ")).appendTo(document.body).hide().addClass("ui-dialog ui-widget ui-widget-content ui-corner-all "+ +b.dialogClass).css({zIndex:b.zIndex}).attr("tabIndex",-1).css("outline",0).keydown(function(i){if(b.closeOnEscape&&i.keyCode&&i.keyCode===c.ui.keyCode.ESCAPE){a.close(i);i.preventDefault()}}).attr({role:"dialog","aria-labelledby":e}).mousedown(function(i){a.moveToTop(false,i)});a.element.show().removeAttr("title").addClass("ui-dialog-content ui-widget-content").appendTo(g);var f=(a.uiDialogTitlebar=c("
    ")).addClass("ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix").prependTo(g), +h=c('').addClass("ui-dialog-titlebar-close ui-corner-all").attr("role","button").hover(function(){h.addClass("ui-state-hover")},function(){h.removeClass("ui-state-hover")}).focus(function(){h.addClass("ui-state-focus")}).blur(function(){h.removeClass("ui-state-focus")}).click(function(i){a.close(i);return false}).appendTo(f);(a.uiDialogTitlebarCloseText=c("")).addClass("ui-icon ui-icon-closethick").text(b.closeText).appendTo(h);c("").addClass("ui-dialog-title").attr("id", +e).html(d).prependTo(f);if(c.isFunction(b.beforeclose)&&!c.isFunction(b.beforeClose))b.beforeClose=b.beforeclose;f.find("*").add(f).disableSelection();b.draggable&&c.fn.draggable&&a._makeDraggable();b.resizable&&c.fn.resizable&&a._makeResizable();a._createButtons(b.buttons);a._isOpen=false;c.fn.bgiframe&&g.bgiframe()},_init:function(){this.options.autoOpen&&this.open()},destroy:function(){var a=this;a.overlay&&a.overlay.destroy();a.uiDialog.hide();a.element.unbind(".dialog").removeData("dialog").removeClass("ui-dialog-content ui-widget-content").hide().appendTo("body"); +a.uiDialog.remove();a.originalTitle&&a.element.attr("title",a.originalTitle);return a},widget:function(){return this.uiDialog},close:function(a){var b=this,d,e;if(false!==b._trigger("beforeClose",a)){b.overlay&&b.overlay.destroy();b.uiDialog.unbind("keypress.ui-dialog");b._isOpen=false;if(b.options.hide)b.uiDialog.hide(b.options.hide,function(){b._trigger("close",a)});else{b.uiDialog.hide();b._trigger("close",a)}c.ui.dialog.overlay.resize();if(b.options.modal){d=0;c(".ui-dialog").each(function(){if(this!== +b.uiDialog[0]){e=c(this).css("z-index");isNaN(e)||(d=Math.max(d,e))}});c.ui.dialog.maxZ=d}return b}},isOpen:function(){return this._isOpen},moveToTop:function(a,b){var d=this,e=d.options;if(e.modal&&!a||!e.stack&&!e.modal)return d._trigger("focus",b);if(e.zIndex>c.ui.dialog.maxZ)c.ui.dialog.maxZ=e.zIndex;if(d.overlay){c.ui.dialog.maxZ+=1;d.overlay.$el.css("z-index",c.ui.dialog.overlay.maxZ=c.ui.dialog.maxZ)}a={scrollTop:d.element.attr("scrollTop"),scrollLeft:d.element.attr("scrollLeft")};c.ui.dialog.maxZ+= +1;d.uiDialog.css("z-index",c.ui.dialog.maxZ);d.element.attr(a);d._trigger("focus",b);return d},open:function(){if(!this._isOpen){var a=this,b=a.options,d=a.uiDialog;a.overlay=b.modal?new c.ui.dialog.overlay(a):null;a._size();a._position(b.position);d.show(b.show);a.moveToTop(true);b.modal&&d.bind("keypress.ui-dialog",function(e){if(e.keyCode===c.ui.keyCode.TAB){var g=c(":tabbable",this),f=g.filter(":first");g=g.filter(":last");if(e.target===g[0]&&!e.shiftKey){f.focus(1);return false}else if(e.target=== +f[0]&&e.shiftKey){g.focus(1);return false}}});c(a.element.find(":tabbable").get().concat(d.find(".ui-dialog-buttonpane :tabbable").get().concat(d.get()))).eq(0).focus();a._isOpen=true;a._trigger("open");return a}},_createButtons:function(a){var b=this,d=false,e=c("
    ").addClass("ui-dialog-buttonpane ui-widget-content ui-helper-clearfix"),g=c("
    ").addClass("ui-dialog-buttonset").appendTo(e);b.uiDialog.find(".ui-dialog-buttonpane").remove();typeof a==="object"&&a!==null&&c.each(a, +function(){return!(d=true)});if(d){c.each(a,function(f,h){h=c.isFunction(h)?{click:h,text:f}:h;var i=c('').click(function(){h.click.apply(b.element[0],arguments)}).appendTo(g);c.each(h,function(j,k){if(j!=="click")j in o?i[j](k):i.attr(j,k)});c.fn.button&&i.button()});e.appendTo(b.uiDialog)}},_makeDraggable:function(){function a(f){return{position:f.position,offset:f.offset}}var b=this,d=b.options,e=c(document),g;b.uiDialog.draggable({cancel:".ui-dialog-content, .ui-dialog-titlebar-close", +handle:".ui-dialog-titlebar",containment:"document",start:function(f,h){g=d.height==="auto"?"auto":c(this).height();c(this).height(c(this).height()).addClass("ui-dialog-dragging");b._trigger("dragStart",f,a(h))},drag:function(f,h){b._trigger("drag",f,a(h))},stop:function(f,h){d.position=[h.position.left-e.scrollLeft(),h.position.top-e.scrollTop()];c(this).removeClass("ui-dialog-dragging").height(g);b._trigger("dragStop",f,a(h));c.ui.dialog.overlay.resize()}})},_makeResizable:function(a){function b(f){return{originalPosition:f.originalPosition, +originalSize:f.originalSize,position:f.position,size:f.size}}a=a===l?this.options.resizable:a;var d=this,e=d.options,g=d.uiDialog.css("position");a=typeof a==="string"?a:"n,e,s,w,se,sw,ne,nw";d.uiDialog.resizable({cancel:".ui-dialog-content",containment:"document",alsoResize:d.element,maxWidth:e.maxWidth,maxHeight:e.maxHeight,minWidth:e.minWidth,minHeight:d._minHeight(),handles:a,start:function(f,h){c(this).addClass("ui-dialog-resizing");d._trigger("resizeStart",f,b(h))},resize:function(f,h){d._trigger("resize", +f,b(h))},stop:function(f,h){c(this).removeClass("ui-dialog-resizing");e.height=c(this).height();e.width=c(this).width();d._trigger("resizeStop",f,b(h));c.ui.dialog.overlay.resize()}}).css("position",g).find(".ui-resizable-se").addClass("ui-icon ui-icon-grip-diagonal-se")},_minHeight:function(){var a=this.options;return a.height==="auto"?a.minHeight:Math.min(a.minHeight,a.height)},_position:function(a){var b=[],d=[0,0],e;if(a){if(typeof a==="string"||typeof a==="object"&&"0"in a){b=a.split?a.split(" "): +[a[0],a[1]];if(b.length===1)b[1]=b[0];c.each(["left","top"],function(g,f){if(+b[g]===b[g]){d[g]=b[g];b[g]=f}});a={my:b.join(" "),at:b.join(" "),offset:d.join(" ")}}a=c.extend({},c.ui.dialog.prototype.options.position,a)}else a=c.ui.dialog.prototype.options.position;(e=this.uiDialog.is(":visible"))||this.uiDialog.show();this.uiDialog.css({top:0,left:0}).position(c.extend({of:window},a));e||this.uiDialog.hide()},_setOptions:function(a){var b=this,d={},e=false;c.each(a,function(g,f){b._setOption(g,f); +if(g in m)e=true;if(g in n)d[g]=f});e&&this._size();this.uiDialog.is(":data(resizable)")&&this.uiDialog.resizable("option",d)},_setOption:function(a,b){var d=this,e=d.uiDialog;switch(a){case "beforeclose":a="beforeClose";break;case "buttons":d._createButtons(b);break;case "closeText":d.uiDialogTitlebarCloseText.text(""+b);break;case "dialogClass":e.removeClass(d.options.dialogClass).addClass("ui-dialog ui-widget ui-widget-content ui-corner-all "+b);break;case "disabled":b?e.addClass("ui-dialog-disabled"): +e.removeClass("ui-dialog-disabled");break;case "draggable":var g=e.is(":data(draggable)");g&&!b&&e.draggable("destroy");!g&&b&&d._makeDraggable();break;case "position":d._position(b);break;case "resizable":(g=e.is(":data(resizable)"))&&!b&&e.resizable("destroy");g&&typeof b==="string"&&e.resizable("option","handles",b);!g&&b!==false&&d._makeResizable(b);break;case "title":c(".ui-dialog-title",d.uiDialogTitlebar).html(""+(b||" "));break}c.Widget.prototype._setOption.apply(d,arguments)},_size:function(){var a= +this.options,b,d,e=this.uiDialog.is(":visible");this.element.show().css({width:"auto",minHeight:0,height:0});if(a.minWidth>a.width)a.width=a.minWidth;b=this.uiDialog.css({height:"auto",width:a.width}).height();d=Math.max(0,a.minHeight-b);if(a.height==="auto")if(c.support.minHeight)this.element.css({minHeight:d,height:"auto"});else{this.uiDialog.show();a=this.element.css("height","auto").height();e||this.uiDialog.hide();this.element.height(Math.max(a,d))}else this.element.height(Math.max(a.height- +b,0));this.uiDialog.is(":data(resizable)")&&this.uiDialog.resizable("option","minHeight",this._minHeight())}});c.extend(c.ui.dialog,{version:"1.8.13",uuid:0,maxZ:0,getTitleId:function(a){a=a.attr("id");if(!a){this.uuid+=1;a=this.uuid}return"ui-dialog-title-"+a},overlay:function(a){this.$el=c.ui.dialog.overlay.create(a)}});c.extend(c.ui.dialog.overlay,{instances:[],oldInstances:[],maxZ:0,events:c.map("focus,mousedown,mouseup,keydown,keypress,click".split(","),function(a){return a+".dialog-overlay"}).join(" "), +create:function(a){if(this.instances.length===0){setTimeout(function(){c.ui.dialog.overlay.instances.length&&c(document).bind(c.ui.dialog.overlay.events,function(d){if(c(d.target).zIndex()").addClass("ui-widget-overlay")).appendTo(document.body).css({width:this.width(), +height:this.height()});c.fn.bgiframe&&b.bgiframe();this.instances.push(b);return b},destroy:function(a){var b=c.inArray(a,this.instances);b!=-1&&this.oldInstances.push(this.instances.splice(b,1)[0]);this.instances.length===0&&c([document,window]).unbind(".dialog-overlay");a.remove();var d=0;c.each(this.instances,function(){d=Math.max(d,this.css("z-index"))});this.maxZ=d},height:function(){var a,b;if(c.browser.msie&&c.browser.version<7){a=Math.max(document.documentElement.scrollHeight,document.body.scrollHeight); +b=Math.max(document.documentElement.offsetHeight,document.body.offsetHeight);return a").appendTo(this.element).addClass("ui-slider-range ui-widget-header"+(a.range==="min"||a.range==="max"?" ui-slider-range-"+a.range:""))}for(var j=c.length;j"); +this.handles=c.add(d(e.join("")).appendTo(b.element));this.handle=this.handles.eq(0);this.handles.add(this.range).filter("a").click(function(g){g.preventDefault()}).hover(function(){a.disabled||d(this).addClass("ui-state-hover")},function(){d(this).removeClass("ui-state-hover")}).focus(function(){if(a.disabled)d(this).blur();else{d(".ui-slider .ui-state-focus").removeClass("ui-state-focus");d(this).addClass("ui-state-focus")}}).blur(function(){d(this).removeClass("ui-state-focus")});this.handles.each(function(g){d(this).data("index.ui-slider-handle", +g)});this.handles.keydown(function(g){var k=true,l=d(this).data("index.ui-slider-handle"),i,h,m;if(!b.options.disabled){switch(g.keyCode){case d.ui.keyCode.HOME:case d.ui.keyCode.END:case d.ui.keyCode.PAGE_UP:case d.ui.keyCode.PAGE_DOWN:case d.ui.keyCode.UP:case d.ui.keyCode.RIGHT:case d.ui.keyCode.DOWN:case d.ui.keyCode.LEFT:k=false;if(!b._keySliding){b._keySliding=true;d(this).addClass("ui-state-active");i=b._start(g,l);if(i===false)return}break}m=b.options.step;i=b.options.values&&b.options.values.length? +(h=b.values(l)):(h=b.value());switch(g.keyCode){case d.ui.keyCode.HOME:h=b._valueMin();break;case d.ui.keyCode.END:h=b._valueMax();break;case d.ui.keyCode.PAGE_UP:h=b._trimAlignValue(i+(b._valueMax()-b._valueMin())/5);break;case d.ui.keyCode.PAGE_DOWN:h=b._trimAlignValue(i-(b._valueMax()-b._valueMin())/5);break;case d.ui.keyCode.UP:case d.ui.keyCode.RIGHT:if(i===b._valueMax())return;h=b._trimAlignValue(i+m);break;case d.ui.keyCode.DOWN:case d.ui.keyCode.LEFT:if(i===b._valueMin())return;h=b._trimAlignValue(i- +m);break}b._slide(g,l,h);return k}}).keyup(function(g){var k=d(this).data("index.ui-slider-handle");if(b._keySliding){b._keySliding=false;b._stop(g,k);b._change(g,k);d(this).removeClass("ui-state-active")}});this._refreshValue();this._animateOff=false},destroy:function(){this.handles.remove();this.range.remove();this.element.removeClass("ui-slider ui-slider-horizontal ui-slider-vertical ui-slider-disabled ui-widget ui-widget-content ui-corner-all").removeData("slider").unbind(".slider");this._mouseDestroy(); +return this},_mouseCapture:function(b){var a=this.options,c,f,e,j,g;if(a.disabled)return false;this.elementSize={width:this.element.outerWidth(),height:this.element.outerHeight()};this.elementOffset=this.element.offset();c=this._normValueFromMouse({x:b.pageX,y:b.pageY});f=this._valueMax()-this._valueMin()+1;j=this;this.handles.each(function(k){var l=Math.abs(c-j.values(k));if(f>l){f=l;e=d(this);g=k}});if(a.range===true&&this.values(1)===a.min){g+=1;e=d(this.handles[g])}if(this._start(b,g)===false)return false; +this._mouseSliding=true;j._handleIndex=g;e.addClass("ui-state-active").focus();a=e.offset();this._clickOffset=!d(b.target).parents().andSelf().is(".ui-slider-handle")?{left:0,top:0}:{left:b.pageX-a.left-e.width()/2,top:b.pageY-a.top-e.height()/2-(parseInt(e.css("borderTopWidth"),10)||0)-(parseInt(e.css("borderBottomWidth"),10)||0)+(parseInt(e.css("marginTop"),10)||0)};this.handles.hasClass("ui-state-hover")||this._slide(b,g,c);return this._animateOff=true},_mouseStart:function(){return true},_mouseDrag:function(b){var a= +this._normValueFromMouse({x:b.pageX,y:b.pageY});this._slide(b,this._handleIndex,a);return false},_mouseStop:function(b){this.handles.removeClass("ui-state-active");this._mouseSliding=false;this._stop(b,this._handleIndex);this._change(b,this._handleIndex);this._clickOffset=this._handleIndex=null;return this._animateOff=false},_detectOrientation:function(){this.orientation=this.options.orientation==="vertical"?"vertical":"horizontal"},_normValueFromMouse:function(b){var a;if(this.orientation==="horizontal"){a= +this.elementSize.width;b=b.x-this.elementOffset.left-(this._clickOffset?this._clickOffset.left:0)}else{a=this.elementSize.height;b=b.y-this.elementOffset.top-(this._clickOffset?this._clickOffset.top:0)}a=b/a;if(a>1)a=1;if(a<0)a=0;if(this.orientation==="vertical")a=1-a;b=this._valueMax()-this._valueMin();return this._trimAlignValue(this._valueMin()+a*b)},_start:function(b,a){var c={handle:this.handles[a],value:this.value()};if(this.options.values&&this.options.values.length){c.value=this.values(a); +c.values=this.values()}return this._trigger("start",b,c)},_slide:function(b,a,c){var f;if(this.options.values&&this.options.values.length){f=this.values(a?0:1);if(this.options.values.length===2&&this.options.range===true&&(a===0&&c>f||a===1&&c1){this.options.values[b]=this._trimAlignValue(a);this._refreshValue();this._change(null,b)}else if(arguments.length)if(d.isArray(arguments[0])){c=this.options.values;f=arguments[0];for(e=0;e=this._valueMax())return this._valueMax();var a=this.options.step>0?this.options.step:1,c=(b-this._valueMin())%a;alignValue=b-c;if(Math.abs(c)*2>=a)alignValue+=c>0?a:-a;return parseFloat(alignValue.toFixed(5))},_valueMin:function(){return this.options.min},_valueMax:function(){return this.options.max}, +_refreshValue:function(){var b=this.options.range,a=this.options,c=this,f=!this._animateOff?a.animate:false,e,j={},g,k,l,i;if(this.options.values&&this.options.values.length)this.handles.each(function(h){e=(c.values(h)-c._valueMin())/(c._valueMax()-c._valueMin())*100;j[c.orientation==="horizontal"?"left":"bottom"]=e+"%";d(this).stop(1,1)[f?"animate":"css"](j,a.animate);if(c.options.range===true)if(c.orientation==="horizontal"){if(h===0)c.range.stop(1,1)[f?"animate":"css"]({left:e+"%"},a.animate); +if(h===1)c.range[f?"animate":"css"]({width:e-g+"%"},{queue:false,duration:a.animate})}else{if(h===0)c.range.stop(1,1)[f?"animate":"css"]({bottom:e+"%"},a.animate);if(h===1)c.range[f?"animate":"css"]({height:e-g+"%"},{queue:false,duration:a.animate})}g=e});else{k=this.value();l=this._valueMin();i=this._valueMax();e=i!==l?(k-l)/(i-l)*100:0;j[c.orientation==="horizontal"?"left":"bottom"]=e+"%";this.handle.stop(1,1)[f?"animate":"css"](j,a.animate);if(b==="min"&&this.orientation==="horizontal")this.range.stop(1, +1)[f?"animate":"css"]({width:e+"%"},a.animate);if(b==="max"&&this.orientation==="horizontal")this.range[f?"animate":"css"]({width:100-e+"%"},{queue:false,duration:a.animate});if(b==="min"&&this.orientation==="vertical")this.range.stop(1,1)[f?"animate":"css"]({height:e+"%"},a.animate);if(b==="max"&&this.orientation==="vertical")this.range[f?"animate":"css"]({height:100-e+"%"},{queue:false,duration:a.animate})}}});d.extend(d.ui.slider,{version:"1.8.13"})})(jQuery); +;/* + * jQuery UI Tabs 1.8.13 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Tabs + * + * Depends: + * jquery.ui.core.js + * jquery.ui.widget.js + */ +(function(d,p){function u(){return++v}function w(){return++x}var v=0,x=0;d.widget("ui.tabs",{options:{add:null,ajaxOptions:null,cache:false,cookie:null,collapsible:false,disable:null,disabled:[],enable:null,event:"click",fx:null,idPrefix:"ui-tabs-",load:null,panelTemplate:"
    ",remove:null,select:null,show:null,spinner:"Loading…",tabTemplate:"
  • #{label}
  • "},_create:function(){this._tabify(true)},_setOption:function(b,e){if(b=="selected")this.options.collapsible&& +e==this.options.selected||this.select(e);else{this.options[b]=e;this._tabify()}},_tabId:function(b){return b.title&&b.title.replace(/\s/g,"_").replace(/[^\w\u00c0-\uFFFF-]/g,"")||this.options.idPrefix+u()},_sanitizeSelector:function(b){return b.replace(/:/g,"\\:")},_cookie:function(){var b=this.cookie||(this.cookie=this.options.cookie.name||"ui-tabs-"+w());return d.cookie.apply(null,[b].concat(d.makeArray(arguments)))},_ui:function(b,e){return{tab:b,panel:e,index:this.anchors.index(b)}},_cleanup:function(){this.lis.filter(".ui-state-processing").removeClass("ui-state-processing").find("span:data(label.tabs)").each(function(){var b= +d(this);b.html(b.data("label.tabs")).removeData("label.tabs")})},_tabify:function(b){function e(g,f){g.css("display","");!d.support.opacity&&f.opacity&&g[0].style.removeAttribute("filter")}var a=this,c=this.options,h=/^#.+/;this.list=this.element.find("ol,ul").eq(0);this.lis=d(" > li:has(a[href])",this.list);this.anchors=this.lis.map(function(){return d("a",this)[0]});this.panels=d([]);this.anchors.each(function(g,f){var i=d(f).attr("href"),l=i.split("#")[0],q;if(l&&(l===location.toString().split("#")[0]|| +(q=d("base")[0])&&l===q.href)){i=f.hash;f.href=i}if(h.test(i))a.panels=a.panels.add(a.element.find(a._sanitizeSelector(i)));else if(i&&i!=="#"){d.data(f,"href.tabs",i);d.data(f,"load.tabs",i.replace(/#.*$/,""));i=a._tabId(f);f.href="#"+i;f=a.element.find("#"+i);if(!f.length){f=d(c.panelTemplate).attr("id",i).addClass("ui-tabs-panel ui-widget-content ui-corner-bottom").insertAfter(a.panels[g-1]||a.list);f.data("destroy.tabs",true)}a.panels=a.panels.add(f)}else c.disabled.push(g)});if(b){this.element.addClass("ui-tabs ui-widget ui-widget-content ui-corner-all"); +this.list.addClass("ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all");this.lis.addClass("ui-state-default ui-corner-top");this.panels.addClass("ui-tabs-panel ui-widget-content ui-corner-bottom");if(c.selected===p){location.hash&&this.anchors.each(function(g,f){if(f.hash==location.hash){c.selected=g;return false}});if(typeof c.selected!=="number"&&c.cookie)c.selected=parseInt(a._cookie(),10);if(typeof c.selected!=="number"&&this.lis.filter(".ui-tabs-selected").length)c.selected= +this.lis.index(this.lis.filter(".ui-tabs-selected"));c.selected=c.selected||(this.lis.length?0:-1)}else if(c.selected===null)c.selected=-1;c.selected=c.selected>=0&&this.anchors[c.selected]||c.selected<0?c.selected:0;c.disabled=d.unique(c.disabled.concat(d.map(this.lis.filter(".ui-state-disabled"),function(g){return a.lis.index(g)}))).sort();d.inArray(c.selected,c.disabled)!=-1&&c.disabled.splice(d.inArray(c.selected,c.disabled),1);this.panels.addClass("ui-tabs-hide");this.lis.removeClass("ui-tabs-selected ui-state-active"); +if(c.selected>=0&&this.anchors.length){a.element.find(a._sanitizeSelector(a.anchors[c.selected].hash)).removeClass("ui-tabs-hide");this.lis.eq(c.selected).addClass("ui-tabs-selected ui-state-active");a.element.queue("tabs",function(){a._trigger("show",null,a._ui(a.anchors[c.selected],a.element.find(a._sanitizeSelector(a.anchors[c.selected].hash))[0]))});this.load(c.selected)}d(window).bind("unload",function(){a.lis.add(a.anchors).unbind(".tabs");a.lis=a.anchors=a.panels=null})}else c.selected=this.lis.index(this.lis.filter(".ui-tabs-selected")); +this.element[c.collapsible?"addClass":"removeClass"]("ui-tabs-collapsible");c.cookie&&this._cookie(c.selected,c.cookie);b=0;for(var j;j=this.lis[b];b++)d(j)[d.inArray(b,c.disabled)!=-1&&!d(j).hasClass("ui-tabs-selected")?"addClass":"removeClass"]("ui-state-disabled");c.cache===false&&this.anchors.removeData("cache.tabs");this.lis.add(this.anchors).unbind(".tabs");if(c.event!=="mouseover"){var k=function(g,f){f.is(":not(.ui-state-disabled)")&&f.addClass("ui-state-"+g)},n=function(g,f){f.removeClass("ui-state-"+ +g)};this.lis.bind("mouseover.tabs",function(){k("hover",d(this))});this.lis.bind("mouseout.tabs",function(){n("hover",d(this))});this.anchors.bind("focus.tabs",function(){k("focus",d(this).closest("li"))});this.anchors.bind("blur.tabs",function(){n("focus",d(this).closest("li"))})}var m,o;if(c.fx)if(d.isArray(c.fx)){m=c.fx[0];o=c.fx[1]}else m=o=c.fx;var r=o?function(g,f){d(g).closest("li").addClass("ui-tabs-selected ui-state-active");f.hide().removeClass("ui-tabs-hide").animate(o,o.duration||"normal", +function(){e(f,o);a._trigger("show",null,a._ui(g,f[0]))})}:function(g,f){d(g).closest("li").addClass("ui-tabs-selected ui-state-active");f.removeClass("ui-tabs-hide");a._trigger("show",null,a._ui(g,f[0]))},s=m?function(g,f){f.animate(m,m.duration||"normal",function(){a.lis.removeClass("ui-tabs-selected ui-state-active");f.addClass("ui-tabs-hide");e(f,m);a.element.dequeue("tabs")})}:function(g,f){a.lis.removeClass("ui-tabs-selected ui-state-active");f.addClass("ui-tabs-hide");a.element.dequeue("tabs")}; +this.anchors.bind(c.event+".tabs",function(){var g=this,f=d(g).closest("li"),i=a.panels.filter(":not(.ui-tabs-hide)"),l=a.element.find(a._sanitizeSelector(g.hash));if(f.hasClass("ui-tabs-selected")&&!c.collapsible||f.hasClass("ui-state-disabled")||f.hasClass("ui-state-processing")||a.panels.filter(":animated").length||a._trigger("select",null,a._ui(this,l[0]))===false){this.blur();return false}c.selected=a.anchors.index(this);a.abort();if(c.collapsible)if(f.hasClass("ui-tabs-selected")){c.selected= +-1;c.cookie&&a._cookie(c.selected,c.cookie);a.element.queue("tabs",function(){s(g,i)}).dequeue("tabs");this.blur();return false}else if(!i.length){c.cookie&&a._cookie(c.selected,c.cookie);a.element.queue("tabs",function(){r(g,l)});a.load(a.anchors.index(this));this.blur();return false}c.cookie&&a._cookie(c.selected,c.cookie);if(l.length){i.length&&a.element.queue("tabs",function(){s(g,i)});a.element.queue("tabs",function(){r(g,l)});a.load(a.anchors.index(this))}else throw"jQuery UI Tabs: Mismatching fragment identifier."; +d.browser.msie&&this.blur()});this.anchors.bind("click.tabs",function(){return false})},_getIndex:function(b){if(typeof b=="string")b=this.anchors.index(this.anchors.filter("[href$="+b+"]"));return b},destroy:function(){var b=this.options;this.abort();this.element.unbind(".tabs").removeClass("ui-tabs ui-widget ui-widget-content ui-corner-all ui-tabs-collapsible").removeData("tabs");this.list.removeClass("ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all");this.anchors.each(function(){var e= +d.data(this,"href.tabs");if(e)this.href=e;var a=d(this).unbind(".tabs");d.each(["href","load","cache"],function(c,h){a.removeData(h+".tabs")})});this.lis.unbind(".tabs").add(this.panels).each(function(){d.data(this,"destroy.tabs")?d(this).remove():d(this).removeClass("ui-state-default ui-corner-top ui-tabs-selected ui-state-active ui-state-hover ui-state-focus ui-state-disabled ui-tabs-panel ui-widget-content ui-corner-bottom ui-tabs-hide")});b.cookie&&this._cookie(null,b.cookie);return this},add:function(b, +e,a){if(a===p)a=this.anchors.length;var c=this,h=this.options;e=d(h.tabTemplate.replace(/#\{href\}/g,b).replace(/#\{label\}/g,e));b=!b.indexOf("#")?b.replace("#",""):this._tabId(d("a",e)[0]);e.addClass("ui-state-default ui-corner-top").data("destroy.tabs",true);var j=c.element.find("#"+b);j.length||(j=d(h.panelTemplate).attr("id",b).data("destroy.tabs",true));j.addClass("ui-tabs-panel ui-widget-content ui-corner-bottom ui-tabs-hide");if(a>=this.lis.length){e.appendTo(this.list);j.appendTo(this.list[0].parentNode)}else{e.insertBefore(this.lis[a]); +j.insertBefore(this.panels[a])}h.disabled=d.map(h.disabled,function(k){return k>=a?++k:k});this._tabify();if(this.anchors.length==1){h.selected=0;e.addClass("ui-tabs-selected ui-state-active");j.removeClass("ui-tabs-hide");this.element.queue("tabs",function(){c._trigger("show",null,c._ui(c.anchors[0],c.panels[0]))});this.load(0)}this._trigger("add",null,this._ui(this.anchors[a],this.panels[a]));return this},remove:function(b){b=this._getIndex(b);var e=this.options,a=this.lis.eq(b).remove(),c=this.panels.eq(b).remove(); +if(a.hasClass("ui-tabs-selected")&&this.anchors.length>1)this.select(b+(b+1=b?--h:h});this._tabify();this._trigger("remove",null,this._ui(a.find("a")[0],c[0]));return this},enable:function(b){b=this._getIndex(b);var e=this.options;if(d.inArray(b,e.disabled)!=-1){this.lis.eq(b).removeClass("ui-state-disabled");e.disabled=d.grep(e.disabled,function(a){return a!=b});this._trigger("enable",null, +this._ui(this.anchors[b],this.panels[b]));return this}},disable:function(b){b=this._getIndex(b);var e=this.options;if(b!=e.selected){this.lis.eq(b).addClass("ui-state-disabled");e.disabled.push(b);e.disabled.sort();this._trigger("disable",null,this._ui(this.anchors[b],this.panels[b]))}return this},select:function(b){b=this._getIndex(b);if(b==-1)if(this.options.collapsible&&this.options.selected!=-1)b=this.options.selected;else return this;this.anchors.eq(b).trigger(this.options.event+".tabs");return this}, +load:function(b){b=this._getIndex(b);var e=this,a=this.options,c=this.anchors.eq(b)[0],h=d.data(c,"load.tabs");this.abort();if(!h||this.element.queue("tabs").length!==0&&d.data(c,"cache.tabs"))this.element.dequeue("tabs");else{this.lis.eq(b).addClass("ui-state-processing");if(a.spinner){var j=d("span",c);j.data("label.tabs",j.html()).html(a.spinner)}this.xhr=d.ajax(d.extend({},a.ajaxOptions,{url:h,success:function(k,n){e.element.find(e._sanitizeSelector(c.hash)).html(k);e._cleanup();a.cache&&d.data(c, +"cache.tabs",true);e._trigger("load",null,e._ui(e.anchors[b],e.panels[b]));try{a.ajaxOptions.success(k,n)}catch(m){}},error:function(k,n){e._cleanup();e._trigger("load",null,e._ui(e.anchors[b],e.panels[b]));try{a.ajaxOptions.error(k,n,b,c)}catch(m){}}}));e.element.dequeue("tabs");return this}},abort:function(){this.element.queue([]);this.panels.stop(false,true);this.element.queue("tabs",this.element.queue("tabs").splice(-2,2));if(this.xhr){this.xhr.abort();delete this.xhr}this._cleanup();return this}, +url:function(b,e){this.anchors.eq(b).removeData("cache.tabs").data("load.tabs",e);return this},length:function(){return this.anchors.length}});d.extend(d.ui.tabs,{version:"1.8.13"});d.extend(d.ui.tabs.prototype,{rotation:null,rotate:function(b,e){var a=this,c=this.options,h=a._rotate||(a._rotate=function(j){clearTimeout(a.rotation);a.rotation=setTimeout(function(){var k=c.selected;a.select(++k'))}function N(a){return a.delegate("button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a", +"mouseout",function(){d(this).removeClass("ui-state-hover");this.className.indexOf("ui-datepicker-prev")!=-1&&d(this).removeClass("ui-datepicker-prev-hover");this.className.indexOf("ui-datepicker-next")!=-1&&d(this).removeClass("ui-datepicker-next-hover")}).delegate("button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a","mouseover",function(){if(!d.datepicker._isDisabledDatepicker(J.inline?a.parent()[0]:J.input[0])){d(this).parents(".ui-datepicker-calendar").find("a").removeClass("ui-state-hover"); +d(this).addClass("ui-state-hover");this.className.indexOf("ui-datepicker-prev")!=-1&&d(this).addClass("ui-datepicker-prev-hover");this.className.indexOf("ui-datepicker-next")!=-1&&d(this).addClass("ui-datepicker-next-hover")}})}function H(a,b){d.extend(a,b);for(var c in b)if(b[c]==null||b[c]==B)a[c]=b[c];return a}d.extend(d.ui,{datepicker:{version:"1.8.13"}});var z=(new Date).getTime(),J;d.extend(M.prototype,{markerClassName:"hasDatepicker",log:function(){this.debug&&console.log.apply("",arguments)}, +_widgetDatepicker:function(){return this.dpDiv},setDefaults:function(a){H(this._defaults,a||{});return this},_attachDatepicker:function(a,b){var c=null;for(var e in this._defaults){var f=a.getAttribute("date:"+e);if(f){c=c||{};try{c[e]=eval(f)}catch(h){c[e]=f}}}e=a.nodeName.toLowerCase();f=e=="div"||e=="span";if(!a.id){this.uuid+=1;a.id="dp"+this.uuid}var i=this._newInst(d(a),f);i.settings=d.extend({},b||{},c||{});if(e=="input")this._connectDatepicker(a,i);else f&&this._inlineDatepicker(a,i)},_newInst:function(a, +b){return{id:a[0].id.replace(/([^A-Za-z0-9_-])/g,"\\\\$1"),input:a,selectedDay:0,selectedMonth:0,selectedYear:0,drawMonth:0,drawYear:0,inline:b,dpDiv:!b?this.dpDiv:N(d('
    '))}},_connectDatepicker:function(a,b){var c=d(a);b.append=d([]);b.trigger=d([]);if(!c.hasClass(this.markerClassName)){this._attachments(c,b);c.addClass(this.markerClassName).keydown(this._doKeyDown).keypress(this._doKeyPress).keyup(this._doKeyUp).bind("setData.datepicker", +function(e,f,h){b.settings[f]=h}).bind("getData.datepicker",function(e,f){return this._get(b,f)});this._autoSize(b);d.data(a,"datepicker",b)}},_attachments:function(a,b){var c=this._get(b,"appendText"),e=this._get(b,"isRTL");b.append&&b.append.remove();if(c){b.append=d(''+c+"");a[e?"before":"after"](b.append)}a.unbind("focus",this._showDatepicker);b.trigger&&b.trigger.remove();c=this._get(b,"showOn");if(c=="focus"||c=="both")a.focus(this._showDatepicker); +if(c=="button"||c=="both"){c=this._get(b,"buttonText");var f=this._get(b,"buttonImage");b.trigger=d(this._get(b,"buttonImageOnly")?d("").addClass(this._triggerClass).attr({src:f,alt:c,title:c}):d('').addClass(this._triggerClass).html(f==""?c:d("").attr({src:f,alt:c,title:c})));a[e?"before":"after"](b.trigger);b.trigger.click(function(){d.datepicker._datepickerShowing&&d.datepicker._lastInput==a[0]?d.datepicker._hideDatepicker():d.datepicker._showDatepicker(a[0]); +return false})}},_autoSize:function(a){if(this._get(a,"autoSize")&&!a.inline){var b=new Date(2009,11,20),c=this._get(a,"dateFormat");if(c.match(/[DM]/)){var e=function(f){for(var h=0,i=0,g=0;gh){h=f[g].length;i=g}return i};b.setMonth(e(this._get(a,c.match(/MM/)?"monthNames":"monthNamesShort")));b.setDate(e(this._get(a,c.match(/DD/)?"dayNames":"dayNamesShort"))+20-b.getDay())}a.input.attr("size",this._formatDate(a,b).length)}},_inlineDatepicker:function(a,b){var c=d(a); +if(!c.hasClass(this.markerClassName)){c.addClass(this.markerClassName).append(b.dpDiv).bind("setData.datepicker",function(e,f,h){b.settings[f]=h}).bind("getData.datepicker",function(e,f){return this._get(b,f)});d.data(a,"datepicker",b);this._setDate(b,this._getDefaultDate(b),true);this._updateDatepicker(b);this._updateAlternate(b);b.dpDiv.show()}},_dialogDatepicker:function(a,b,c,e,f){a=this._dialogInst;if(!a){this.uuid+=1;this._dialogInput=d(''); +this._dialogInput.keydown(this._doKeyDown);d("body").append(this._dialogInput);a=this._dialogInst=this._newInst(this._dialogInput,false);a.settings={};d.data(this._dialogInput[0],"datepicker",a)}H(a.settings,e||{});b=b&&b.constructor==Date?this._formatDate(a,b):b;this._dialogInput.val(b);this._pos=f?f.length?f:[f.pageX,f.pageY]:null;if(!this._pos)this._pos=[document.documentElement.clientWidth/2-100+(document.documentElement.scrollLeft||document.body.scrollLeft),document.documentElement.clientHeight/ +2-150+(document.documentElement.scrollTop||document.body.scrollTop)];this._dialogInput.css("left",this._pos[0]+20+"px").css("top",this._pos[1]+"px");a.settings.onSelect=c;this._inDialog=true;this.dpDiv.addClass(this._dialogClass);this._showDatepicker(this._dialogInput[0]);d.blockUI&&d.blockUI(this.dpDiv);d.data(this._dialogInput[0],"datepicker",a);return this},_destroyDatepicker:function(a){var b=d(a),c=d.data(a,"datepicker");if(b.hasClass(this.markerClassName)){var e=a.nodeName.toLowerCase();d.removeData(a, +"datepicker");if(e=="input"){c.append.remove();c.trigger.remove();b.removeClass(this.markerClassName).unbind("focus",this._showDatepicker).unbind("keydown",this._doKeyDown).unbind("keypress",this._doKeyPress).unbind("keyup",this._doKeyUp)}else if(e=="div"||e=="span")b.removeClass(this.markerClassName).empty()}},_enableDatepicker:function(a){var b=d(a),c=d.data(a,"datepicker");if(b.hasClass(this.markerClassName)){var e=a.nodeName.toLowerCase();if(e=="input"){a.disabled=false;c.trigger.filter("button").each(function(){this.disabled= +false}).end().filter("img").css({opacity:"1.0",cursor:""})}else if(e=="div"||e=="span"){b=b.children("."+this._inlineClass);b.children().removeClass("ui-state-disabled");b.find("select.ui-datepicker-month, select.ui-datepicker-year").removeAttr("disabled")}this._disabledInputs=d.map(this._disabledInputs,function(f){return f==a?null:f})}},_disableDatepicker:function(a){var b=d(a),c=d.data(a,"datepicker");if(b.hasClass(this.markerClassName)){var e=a.nodeName.toLowerCase();if(e=="input"){a.disabled= +true;c.trigger.filter("button").each(function(){this.disabled=true}).end().filter("img").css({opacity:"0.5",cursor:"default"})}else if(e=="div"||e=="span"){b=b.children("."+this._inlineClass);b.children().addClass("ui-state-disabled");b.find("select.ui-datepicker-month, select.ui-datepicker-year").attr("disabled","disabled")}this._disabledInputs=d.map(this._disabledInputs,function(f){return f==a?null:f});this._disabledInputs[this._disabledInputs.length]=a}},_isDisabledDatepicker:function(a){if(!a)return false; +for(var b=0;b-1}},_doKeyUp:function(a){a=d.datepicker._getInst(a.target);if(a.input.val()!=a.lastVal)try{if(d.datepicker.parseDate(d.datepicker._get(a,"dateFormat"),a.input?a.input.val():null,d.datepicker._getFormatConfig(a))){d.datepicker._setDateFromField(a); +d.datepicker._updateAlternate(a);d.datepicker._updateDatepicker(a)}}catch(b){d.datepicker.log(b)}return true},_showDatepicker:function(a){a=a.target||a;if(a.nodeName.toLowerCase()!="input")a=d("input",a.parentNode)[0];if(!(d.datepicker._isDisabledDatepicker(a)||d.datepicker._lastInput==a)){var b=d.datepicker._getInst(a);d.datepicker._curInst&&d.datepicker._curInst!=b&&d.datepicker._curInst.dpDiv.stop(true,true);var c=d.datepicker._get(b,"beforeShow");H(b.settings,c?c.apply(a,[a,b]):{});b.lastVal= +null;d.datepicker._lastInput=a;d.datepicker._setDateFromField(b);if(d.datepicker._inDialog)a.value="";if(!d.datepicker._pos){d.datepicker._pos=d.datepicker._findPos(a);d.datepicker._pos[1]+=a.offsetHeight}var e=false;d(a).parents().each(function(){e|=d(this).css("position")=="fixed";return!e});if(e&&d.browser.opera){d.datepicker._pos[0]-=document.documentElement.scrollLeft;d.datepicker._pos[1]-=document.documentElement.scrollTop}c={left:d.datepicker._pos[0],top:d.datepicker._pos[1]};d.datepicker._pos= +null;b.dpDiv.empty();b.dpDiv.css({position:"absolute",display:"block",top:"-1000px"});d.datepicker._updateDatepicker(b);c=d.datepicker._checkOffset(b,c,e);b.dpDiv.css({position:d.datepicker._inDialog&&d.blockUI?"static":e?"fixed":"absolute",display:"none",left:c.left+"px",top:c.top+"px"});if(!b.inline){c=d.datepicker._get(b,"showAnim");var f=d.datepicker._get(b,"duration"),h=function(){var i=b.dpDiv.find("iframe.ui-datepicker-cover");if(i.length){var g=d.datepicker._getBorders(b.dpDiv);i.css({left:-g[0], +top:-g[1],width:b.dpDiv.outerWidth(),height:b.dpDiv.outerHeight()})}};b.dpDiv.zIndex(d(a).zIndex()+1);d.datepicker._datepickerShowing=true;d.effects&&d.effects[c]?b.dpDiv.show(c,d.datepicker._get(b,"showOptions"),f,h):b.dpDiv[c||"show"](c?f:null,h);if(!c||!f)h();b.input.is(":visible")&&!b.input.is(":disabled")&&b.input.focus();d.datepicker._curInst=b}}},_updateDatepicker:function(a){var b=d.datepicker._getBorders(a.dpDiv);J=a;a.dpDiv.empty().append(this._generateHTML(a));var c=a.dpDiv.find("iframe.ui-datepicker-cover"); +c.length&&c.css({left:-b[0],top:-b[1],width:a.dpDiv.outerWidth(),height:a.dpDiv.outerHeight()});a.dpDiv.find("."+this._dayOverClass+" a").mouseover();b=this._getNumberOfMonths(a);c=b[1];a.dpDiv.removeClass("ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4").width("");c>1&&a.dpDiv.addClass("ui-datepicker-multi-"+c).css("width",17*c+"em");a.dpDiv[(b[0]!=1||b[1]!=1?"add":"remove")+"Class"]("ui-datepicker-multi");a.dpDiv[(this._get(a,"isRTL")?"add":"remove")+"Class"]("ui-datepicker-rtl"); +a==d.datepicker._curInst&&d.datepicker._datepickerShowing&&a.input&&a.input.is(":visible")&&!a.input.is(":disabled")&&a.input[0]!=document.activeElement&&a.input.focus();if(a.yearshtml){var e=a.yearshtml;setTimeout(function(){e===a.yearshtml&&a.yearshtml&&a.dpDiv.find("select.ui-datepicker-year:first").replaceWith(a.yearshtml);e=a.yearshtml=null},0)}},_getBorders:function(a){var b=function(c){return{thin:1,medium:2,thick:3}[c]||c};return[parseFloat(b(a.css("border-left-width"))),parseFloat(b(a.css("border-top-width")))]}, +_checkOffset:function(a,b,c){var e=a.dpDiv.outerWidth(),f=a.dpDiv.outerHeight(),h=a.input?a.input.outerWidth():0,i=a.input?a.input.outerHeight():0,g=document.documentElement.clientWidth+d(document).scrollLeft(),j=document.documentElement.clientHeight+d(document).scrollTop();b.left-=this._get(a,"isRTL")?e-h:0;b.left-=c&&b.left==a.input.offset().left?d(document).scrollLeft():0;b.top-=c&&b.top==a.input.offset().top+i?d(document).scrollTop():0;b.left-=Math.min(b.left,b.left+e>g&&g>e?Math.abs(b.left+e- +g):0);b.top-=Math.min(b.top,b.top+f>j&&j>f?Math.abs(f+i):0);return b},_findPos:function(a){for(var b=this._get(this._getInst(a),"isRTL");a&&(a.type=="hidden"||a.nodeType!=1||d.expr.filters.hidden(a));)a=a[b?"previousSibling":"nextSibling"];a=d(a).offset();return[a.left,a.top]},_hideDatepicker:function(a){var b=this._curInst;if(!(!b||a&&b!=d.data(a,"datepicker")))if(this._datepickerShowing){a=this._get(b,"showAnim");var c=this._get(b,"duration"),e=function(){d.datepicker._tidyDialog(b);this._curInst= +null};d.effects&&d.effects[a]?b.dpDiv.hide(a,d.datepicker._get(b,"showOptions"),c,e):b.dpDiv[a=="slideDown"?"slideUp":a=="fadeIn"?"fadeOut":"hide"](a?c:null,e);a||e();if(a=this._get(b,"onClose"))a.apply(b.input?b.input[0]:null,[b.input?b.input.val():"",b]);this._datepickerShowing=false;this._lastInput=null;if(this._inDialog){this._dialogInput.css({position:"absolute",left:"0",top:"-100px"});if(d.blockUI){d.unblockUI();d("body").append(this.dpDiv)}}this._inDialog=false}},_tidyDialog:function(a){a.dpDiv.removeClass(this._dialogClass).unbind(".ui-datepicker-calendar")}, +_checkExternalClick:function(a){if(d.datepicker._curInst){a=d(a.target);a[0].id!=d.datepicker._mainDivId&&a.parents("#"+d.datepicker._mainDivId).length==0&&!a.hasClass(d.datepicker.markerClassName)&&!a.hasClass(d.datepicker._triggerClass)&&d.datepicker._datepickerShowing&&!(d.datepicker._inDialog&&d.blockUI)&&d.datepicker._hideDatepicker()}},_adjustDate:function(a,b,c){a=d(a);var e=this._getInst(a[0]);if(!this._isDisabledDatepicker(a[0])){this._adjustInstDate(e,b+(c=="M"?this._get(e,"showCurrentAtPos"): +0),c);this._updateDatepicker(e)}},_gotoToday:function(a){a=d(a);var b=this._getInst(a[0]);if(this._get(b,"gotoCurrent")&&b.currentDay){b.selectedDay=b.currentDay;b.drawMonth=b.selectedMonth=b.currentMonth;b.drawYear=b.selectedYear=b.currentYear}else{var c=new Date;b.selectedDay=c.getDate();b.drawMonth=b.selectedMonth=c.getMonth();b.drawYear=b.selectedYear=c.getFullYear()}this._notifyChange(b);this._adjustDate(a)},_selectMonthYear:function(a,b,c){a=d(a);var e=this._getInst(a[0]);e._selectingMonthYear= +false;e["selected"+(c=="M"?"Month":"Year")]=e["draw"+(c=="M"?"Month":"Year")]=parseInt(b.options[b.selectedIndex].value,10);this._notifyChange(e);this._adjustDate(a)},_clickMonthYear:function(a){var b=this._getInst(d(a)[0]);b.input&&b._selectingMonthYear&&setTimeout(function(){b.input.focus()},0);b._selectingMonthYear=!b._selectingMonthYear},_selectDay:function(a,b,c,e){var f=d(a);if(!(d(e).hasClass(this._unselectableClass)||this._isDisabledDatepicker(f[0]))){f=this._getInst(f[0]);f.selectedDay=f.currentDay= +d("a",e).html();f.selectedMonth=f.currentMonth=b;f.selectedYear=f.currentYear=c;this._selectDate(a,this._formatDate(f,f.currentDay,f.currentMonth,f.currentYear))}},_clearDate:function(a){a=d(a);this._getInst(a[0]);this._selectDate(a,"")},_selectDate:function(a,b){a=this._getInst(d(a)[0]);b=b!=null?b:this._formatDate(a);a.input&&a.input.val(b);this._updateAlternate(a);var c=this._get(a,"onSelect");if(c)c.apply(a.input?a.input[0]:null,[b,a]);else a.input&&a.input.trigger("change");if(a.inline)this._updateDatepicker(a); +else{this._hideDatepicker();this._lastInput=a.input[0];typeof a.input[0]!="object"&&a.input.focus();this._lastInput=null}},_updateAlternate:function(a){var b=this._get(a,"altField");if(b){var c=this._get(a,"altFormat")||this._get(a,"dateFormat"),e=this._getDate(a),f=this.formatDate(c,e,this._getFormatConfig(a));d(b).each(function(){d(this).val(f)})}},noWeekends:function(a){a=a.getDay();return[a>0&&a<6,""]},iso8601Week:function(a){a=new Date(a.getTime());a.setDate(a.getDate()+4-(a.getDay()||7));var b= +a.getTime();a.setMonth(0);a.setDate(1);return Math.floor(Math.round((b-a)/864E5)/7)+1},parseDate:function(a,b,c){if(a==null||b==null)throw"Invalid arguments";b=typeof b=="object"?b.toString():b+"";if(b=="")return null;var e=(c?c.shortYearCutoff:null)||this._defaults.shortYearCutoff;e=typeof e!="string"?e:(new Date).getFullYear()%100+parseInt(e,10);for(var f=(c?c.dayNamesShort:null)||this._defaults.dayNamesShort,h=(c?c.dayNames:null)||this._defaults.dayNames,i=(c?c.monthNamesShort:null)||this._defaults.monthNamesShort, +g=(c?c.monthNames:null)||this._defaults.monthNames,j=c=-1,l=-1,u=-1,k=false,o=function(p){(p=A+1-1){j=1;l=u;do{e=this._getDaysInMonth(c,j-1);if(l<=e)break;j++;l-=e}while(1)}v=this._daylightSavingAdjust(new Date(c,j-1,l));if(v.getFullYear()!= +c||v.getMonth()+1!=j||v.getDate()!=l)throw"Invalid date";return v},ATOM:"yy-mm-dd",COOKIE:"D, dd M yy",ISO_8601:"yy-mm-dd",RFC_822:"D, d M y",RFC_850:"DD, dd-M-y",RFC_1036:"D, d M y",RFC_1123:"D, d M yy",RFC_2822:"D, d M yy",RSS:"D, d M y",TICKS:"!",TIMESTAMP:"@",W3C:"yy-mm-dd",_ticksTo1970:(718685+Math.floor(492.5)-Math.floor(19.7)+Math.floor(4.925))*24*60*60*1E7,formatDate:function(a,b,c){if(!b)return"";var e=(c?c.dayNamesShort:null)||this._defaults.dayNamesShort,f=(c?c.dayNames:null)||this._defaults.dayNames, +h=(c?c.monthNamesShort:null)||this._defaults.monthNamesShort;c=(c?c.monthNames:null)||this._defaults.monthNames;var i=function(o){(o=k+112?a.getHours()+2:0);return a},_setDate:function(a,b,c){var e=!b,f=a.selectedMonth,h=a.selectedYear;b=this._restrictMinMax(a,this._determineDate(a,b,new Date));a.selectedDay=a.currentDay=b.getDate();a.drawMonth=a.selectedMonth=a.currentMonth=b.getMonth();a.drawYear=a.selectedYear=a.currentYear=b.getFullYear();if((f!=a.selectedMonth||h!=a.selectedYear)&&!c)this._notifyChange(a);this._adjustInstDate(a);if(a.input)a.input.val(e?"":this._formatDate(a))},_getDate:function(a){return!a.currentYear|| +a.input&&a.input.val()==""?null:this._daylightSavingAdjust(new Date(a.currentYear,a.currentMonth,a.currentDay))},_generateHTML:function(a){var b=new Date;b=this._daylightSavingAdjust(new Date(b.getFullYear(),b.getMonth(),b.getDate()));var c=this._get(a,"isRTL"),e=this._get(a,"showButtonPanel"),f=this._get(a,"hideIfNoPrevNext"),h=this._get(a,"navigationAsDateFormat"),i=this._getNumberOfMonths(a),g=this._get(a,"showCurrentAtPos"),j=this._get(a,"stepMonths"),l=i[0]!=1||i[1]!=1,u=this._daylightSavingAdjust(!a.currentDay? +new Date(9999,9,9):new Date(a.currentYear,a.currentMonth,a.currentDay)),k=this._getMinMaxDate(a,"min"),o=this._getMinMaxDate(a,"max");g=a.drawMonth-g;var m=a.drawYear;if(g<0){g+=12;m--}if(o){var n=this._daylightSavingAdjust(new Date(o.getFullYear(),o.getMonth()-i[0]*i[1]+1,o.getDate()));for(n=k&&nn;){g--;if(g<0){g=11;m--}}}a.drawMonth=g;a.drawYear=m;n=this._get(a,"prevText");n=!h?n:this.formatDate(n,this._daylightSavingAdjust(new Date(m,g-j,1)),this._getFormatConfig(a)); +n=this._canAdjustMonth(a,-1,m,g)?''+n+"":f?"":''+n+"";var r=this._get(a,"nextText");r=!h?r:this.formatDate(r,this._daylightSavingAdjust(new Date(m, +g+j,1)),this._getFormatConfig(a));f=this._canAdjustMonth(a,+1,m,g)?''+r+"":f?"":''+r+"";j=this._get(a,"currentText");r=this._get(a,"gotoCurrent")&& +a.currentDay?u:b;j=!h?j:this.formatDate(j,r,this._getFormatConfig(a));h=!a.inline?'":"";e=e?'
    '+(c?h:"")+(this._isInRange(a,r)?'":"")+(c?"":h)+"
    ":"";h=parseInt(this._get(a,"firstDay"),10);h=isNaN(h)?0:h;j=this._get(a,"showWeek");r=this._get(a,"dayNames");this._get(a,"dayNamesShort");var s=this._get(a,"dayNamesMin"),A=this._get(a,"monthNames"),v=this._get(a,"monthNamesShort"),p=this._get(a,"beforeShowDay"),C=this._get(a,"showOtherMonths"),K=this._get(a,"selectOtherMonths");this._get(a,"calculateWeek");for(var E=this._getDefaultDate(a),w="",x=0;x1)switch(G){case 0:y+=" ui-datepicker-group-first";t=" ui-corner-"+(c?"right":"left");break;case i[1]-1:y+=" ui-datepicker-group-last";t=" ui-corner-"+(c?"left":"right");break;default:y+=" ui-datepicker-group-middle";t="";break}y+='">'}y+='
    '+(/all|left/.test(t)&&x==0?c? +f:n:"")+(/all|right/.test(t)&&x==0?c?n:f:"")+this._generateMonthYearHeader(a,g,m,k,o,x>0||G>0,A,v)+'
    ';var D=j?'":"";for(t=0;t<7;t++){var q=(t+h)%7;D+="=5?' class="ui-datepicker-week-end"':"")+'>'+s[q]+""}y+=D+"";D=this._getDaysInMonth(m,g);if(m==a.selectedYear&&g==a.selectedMonth)a.selectedDay=Math.min(a.selectedDay, +D);t=(this._getFirstDayOfMonth(m,g)-h+7)%7;D=l?6:Math.ceil((t+D)/7);q=this._daylightSavingAdjust(new Date(m,g,1-t));for(var Q=0;Q";var R=!j?"":'";for(t=0;t<7;t++){var I=p?p.apply(a.input?a.input[0]:null,[q]):[true,""],F=q.getMonth()!=g,L=F&&!K||!I[0]||k&&qo;R+='";q.setDate(q.getDate()+1);q=this._daylightSavingAdjust(q)}y+=R+""}g++;if(g>11){g=0;m++}y+="
    '+this._get(a,"weekHeader")+"
    '+this._get(a,"calculateWeek")(q)+""+(F&&!C?" ":L?''+q.getDate()+ +"":''+q.getDate()+"")+"
    "+(l?""+(i[0]>0&&G==i[1]-1?'
    ':""):"");O+=y}w+=O}w+=e+(d.browser.msie&&parseInt(d.browser.version,10)<7&&!a.inline?'': +"");a._keyEvent=false;return w},_generateMonthYearHeader:function(a,b,c,e,f,h,i,g){var j=this._get(a,"changeMonth"),l=this._get(a,"changeYear"),u=this._get(a,"showMonthAfterYear"),k='
    ',o="";if(h||!j)o+=''+i[b]+"";else{i=e&&e.getFullYear()==c;var m=f&&f.getFullYear()==c;o+='"}u||(k+=o+(h||!(j&&l)?" ":""));if(!a.yearshtml){a.yearshtml="";if(h||!l)k+=''+c+"";else{g=this._get(a,"yearRange").split(":");var r=(new Date).getFullYear();i=function(s){s=s.match(/c[+-].*/)?c+parseInt(s.substring(1),10):s.match(/[+-].*/)?r+parseInt(s,10):parseInt(s,10);return isNaN(s)? +r:s};b=i(g[0]);g=Math.max(b,i(g[1]||""));b=e?Math.max(b,e.getFullYear()):b;g=f?Math.min(g,f.getFullYear()):g;for(a.yearshtml+='";k+=a.yearshtml;a.yearshtml=null}}k+=this._get(a,"yearSuffix");if(u)k+= +(h||!(j&&l)?" ":"")+o;k+="
    ";return k},_adjustInstDate:function(a,b,c){var e=a.drawYear+(c=="Y"?b:0),f=a.drawMonth+(c=="M"?b:0);b=Math.min(a.selectedDay,this._getDaysInMonth(e,f))+(c=="D"?b:0);e=this._restrictMinMax(a,this._daylightSavingAdjust(new Date(e,f,b)));a.selectedDay=e.getDate();a.drawMonth=a.selectedMonth=e.getMonth();a.drawYear=a.selectedYear=e.getFullYear();if(c=="M"||c=="Y")this._notifyChange(a)},_restrictMinMax:function(a,b){var c=this._getMinMaxDate(a,"min");a=this._getMinMaxDate(a, +"max");b=c&&ba?a:b},_notifyChange:function(a){var b=this._get(a,"onChangeMonthYear");if(b)b.apply(a.input?a.input[0]:null,[a.selectedYear,a.selectedMonth+1,a])},_getNumberOfMonths:function(a){a=this._get(a,"numberOfMonths");return a==null?[1,1]:typeof a=="number"?[1,a]:a},_getMinMaxDate:function(a,b){return this._determineDate(a,this._get(a,b+"Date"),null)},_getDaysInMonth:function(a,b){return 32-this._daylightSavingAdjust(new Date(a,b,32)).getDate()},_getFirstDayOfMonth:function(a, +b){return(new Date(a,b,1)).getDay()},_canAdjustMonth:function(a,b,c,e){var f=this._getNumberOfMonths(a);c=this._daylightSavingAdjust(new Date(c,e+(b<0?b:f[0]*f[1]),1));b<0&&c.setDate(this._getDaysInMonth(c.getFullYear(),c.getMonth()));return this._isInRange(a,c)},_isInRange:function(a,b){var c=this._getMinMaxDate(a,"min");a=this._getMinMaxDate(a,"max");return(!c||b.getTime()>=c.getTime())&&(!a||b.getTime()<=a.getTime())},_getFormatConfig:function(a){var b=this._get(a,"shortYearCutoff");b=typeof b!= +"string"?b:(new Date).getFullYear()%100+parseInt(b,10);return{shortYearCutoff:b,dayNamesShort:this._get(a,"dayNamesShort"),dayNames:this._get(a,"dayNames"),monthNamesShort:this._get(a,"monthNamesShort"),monthNames:this._get(a,"monthNames")}},_formatDate:function(a,b,c,e){if(!b){a.currentDay=a.selectedDay;a.currentMonth=a.selectedMonth;a.currentYear=a.selectedYear}b=b?typeof b=="object"?b:this._daylightSavingAdjust(new Date(e,c,b)):this._daylightSavingAdjust(new Date(a.currentYear,a.currentMonth,a.currentDay)); +return this.formatDate(this._get(a,"dateFormat"),b,this._getFormatConfig(a))}});d.fn.datepicker=function(a){if(!this.length)return this;if(!d.datepicker.initialized){d(document).mousedown(d.datepicker._checkExternalClick).find("body").append(d.datepicker.dpDiv);d.datepicker.initialized=true}var b=Array.prototype.slice.call(arguments,1);if(typeof a=="string"&&(a=="isDisabled"||a=="getDate"||a=="widget"))return d.datepicker["_"+a+"Datepicker"].apply(d.datepicker,[this[0]].concat(b));if(a=="option"&& +arguments.length==2&&typeof arguments[1]=="string")return d.datepicker["_"+a+"Datepicker"].apply(d.datepicker,[this[0]].concat(b));return this.each(function(){typeof a=="string"?d.datepicker["_"+a+"Datepicker"].apply(d.datepicker,[this].concat(b)):d.datepicker._attachDatepicker(this,a)})};d.datepicker=new M;d.datepicker.initialized=false;d.datepicker.uuid=(new Date).getTime();d.datepicker.version="1.8.13";window["DP_jQuery_"+z]=d})(jQuery); +;/* + * jQuery UI Progressbar 1.8.13 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Progressbar + * + * Depends: + * jquery.ui.core.js + * jquery.ui.widget.js + */ +(function(b,d){b.widget("ui.progressbar",{options:{value:0,max:100},min:0,_create:function(){this.element.addClass("ui-progressbar ui-widget ui-widget-content ui-corner-all").attr({role:"progressbar","aria-valuemin":this.min,"aria-valuemax":this.options.max,"aria-valuenow":this._value()});this.valueDiv=b("
    ").appendTo(this.element);this.oldValue=this._value();this._refreshValue()},destroy:function(){this.element.removeClass("ui-progressbar ui-widget ui-widget-content ui-corner-all").removeAttr("role").removeAttr("aria-valuemin").removeAttr("aria-valuemax").removeAttr("aria-valuenow"); +this.valueDiv.remove();b.Widget.prototype.destroy.apply(this,arguments)},value:function(a){if(a===d)return this._value();this._setOption("value",a);return this},_setOption:function(a,c){if(a==="value"){this.options.value=c;this._refreshValue();this._value()===this.options.max&&this._trigger("complete")}b.Widget.prototype._setOption.apply(this,arguments)},_value:function(){var a=this.options.value;if(typeof a!=="number")a=0;return Math.min(this.options.max,Math.max(this.min,a))},_percentage:function(){return 100* +this._value()/this.options.max},_refreshValue:function(){var a=this.value(),c=this._percentage();if(this.oldValue!==a){this.oldValue=a;this._trigger("change")}this.valueDiv.toggle(a>this.min).toggleClass("ui-corner-right",a===this.options.max).width(c.toFixed(0)+"%");this.element.attr("aria-valuenow",a)}});b.extend(b.ui.progressbar,{version:"1.8.13"})})(jQuery); +;/* + * jQuery UI Effects 1.8.13 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Effects/ + */ +jQuery.effects||function(f,j){function m(c){var a;if(c&&c.constructor==Array&&c.length==3)return c;if(a=/rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(c))return[parseInt(a[1],10),parseInt(a[2],10),parseInt(a[3],10)];if(a=/rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(c))return[parseFloat(a[1])*2.55,parseFloat(a[2])*2.55,parseFloat(a[3])*2.55];if(a=/#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(c))return[parseInt(a[1], +16),parseInt(a[2],16),parseInt(a[3],16)];if(a=/#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(c))return[parseInt(a[1]+a[1],16),parseInt(a[2]+a[2],16),parseInt(a[3]+a[3],16)];if(/rgba\(0, 0, 0, 0\)/.exec(c))return n.transparent;return n[f.trim(c).toLowerCase()]}function s(c,a){var b;do{b=f.curCSS(c,a);if(b!=""&&b!="transparent"||f.nodeName(c,"body"))break;a="backgroundColor"}while(c=c.parentNode);return m(b)}function o(){var c=document.defaultView?document.defaultView.getComputedStyle(this,null):this.currentStyle, +a={},b,d;if(c&&c.length&&c[0]&&c[c[0]])for(var e=c.length;e--;){b=c[e];if(typeof c[b]=="string"){d=b.replace(/\-(\w)/g,function(g,h){return h.toUpperCase()});a[d]=c[b]}}else for(b in c)if(typeof c[b]==="string")a[b]=c[b];return a}function p(c){var a,b;for(a in c){b=c[a];if(b==null||f.isFunction(b)||a in t||/scrollbar/.test(a)||!/color/i.test(a)&&isNaN(parseFloat(b)))delete c[a]}return c}function u(c,a){var b={_:0},d;for(d in a)if(c[d]!=a[d])b[d]=a[d];return b}function k(c,a,b,d){if(typeof c=="object"){d= +a;b=null;a=c;c=a.effect}if(f.isFunction(a)){d=a;b=null;a={}}if(typeof a=="number"||f.fx.speeds[a]){d=b;b=a;a={}}if(f.isFunction(b)){d=b;b=null}a=a||{};b=b||a.duration;b=f.fx.off?0:typeof b=="number"?b:b in f.fx.speeds?f.fx.speeds[b]:f.fx.speeds._default;d=d||a.complete;return[c,a,b,d]}function l(c){if(!c||typeof c==="number"||f.fx.speeds[c])return true;if(typeof c==="string"&&!f.effects[c])return true;return false}f.effects={};f.each(["backgroundColor","borderBottomColor","borderLeftColor","borderRightColor", +"borderTopColor","borderColor","color","outlineColor"],function(c,a){f.fx.step[a]=function(b){if(!b.colorInit){b.start=s(b.elem,a);b.end=m(b.end);b.colorInit=true}b.elem.style[a]="rgb("+Math.max(Math.min(parseInt(b.pos*(b.end[0]-b.start[0])+b.start[0],10),255),0)+","+Math.max(Math.min(parseInt(b.pos*(b.end[1]-b.start[1])+b.start[1],10),255),0)+","+Math.max(Math.min(parseInt(b.pos*(b.end[2]-b.start[2])+b.start[2],10),255),0)+")"}});var n={aqua:[0,255,255],azure:[240,255,255],beige:[245,245,220],black:[0, +0,0],blue:[0,0,255],brown:[165,42,42],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgrey:[169,169,169],darkgreen:[0,100,0],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkviolet:[148,0,211],fuchsia:[255,0,255],gold:[255,215,0],green:[0,128,0],indigo:[75,0,130],khaki:[240,230,140],lightblue:[173,216,230],lightcyan:[224,255,255],lightgreen:[144,238,144],lightgrey:[211, +211,211],lightpink:[255,182,193],lightyellow:[255,255,224],lime:[0,255,0],magenta:[255,0,255],maroon:[128,0,0],navy:[0,0,128],olive:[128,128,0],orange:[255,165,0],pink:[255,192,203],purple:[128,0,128],violet:[128,0,128],red:[255,0,0],silver:[192,192,192],white:[255,255,255],yellow:[255,255,0],transparent:[255,255,255]},q=["add","remove","toggle"],t={border:1,borderBottom:1,borderColor:1,borderLeft:1,borderRight:1,borderTop:1,borderWidth:1,margin:1,padding:1};f.effects.animateClass=function(c,a,b, +d){if(f.isFunction(b)){d=b;b=null}return this.queue(function(){var e=f(this),g=e.attr("style")||" ",h=p(o.call(this)),r,v=e.attr("class");f.each(q,function(w,i){c[i]&&e[i+"Class"](c[i])});r=p(o.call(this));e.attr("class",v);e.animate(u(h,r),{queue:false,duration:a,easding:b,complete:function(){f.each(q,function(w,i){c[i]&&e[i+"Class"](c[i])});if(typeof e.attr("style")=="object"){e.attr("style").cssText="";e.attr("style").cssText=g}else e.attr("style",g);d&&d.apply(this,arguments);f.dequeue(this)}})})}; +f.fn.extend({_addClass:f.fn.addClass,addClass:function(c,a,b,d){return a?f.effects.animateClass.apply(this,[{add:c},a,b,d]):this._addClass(c)},_removeClass:f.fn.removeClass,removeClass:function(c,a,b,d){return a?f.effects.animateClass.apply(this,[{remove:c},a,b,d]):this._removeClass(c)},_toggleClass:f.fn.toggleClass,toggleClass:function(c,a,b,d,e){return typeof a=="boolean"||a===j?b?f.effects.animateClass.apply(this,[a?{add:c}:{remove:c},b,d,e]):this._toggleClass(c,a):f.effects.animateClass.apply(this, +[{toggle:c},a,b,d])},switchClass:function(c,a,b,d,e){return f.effects.animateClass.apply(this,[{add:a,remove:c},b,d,e])}});f.extend(f.effects,{version:"1.8.13",save:function(c,a){for(var b=0;b").addClass("ui-effects-wrapper").css({fontSize:"100%",background:"transparent",border:"none",margin:0,padding:0}); +c.wrap(b);b=c.parent();if(c.css("position")=="static"){b.css({position:"relative"});c.css({position:"relative"})}else{f.extend(a,{position:c.css("position"),zIndex:c.css("z-index")});f.each(["top","left","bottom","right"],function(d,e){a[e]=c.css(e);if(isNaN(parseInt(a[e],10)))a[e]="auto"});c.css({position:"relative",top:0,left:0,right:"auto",bottom:"auto"})}return b.css(a).show()},removeWrapper:function(c){if(c.parent().is(".ui-effects-wrapper"))return c.parent().replaceWith(c);return c},setTransition:function(c, +a,b,d){d=d||{};f.each(a,function(e,g){unit=c.cssUnit(g);if(unit[0]>0)d[g]=unit[0]*b+unit[1]});return d}});f.fn.extend({effect:function(c){var a=k.apply(this,arguments),b={options:a[1],duration:a[2],callback:a[3]};a=b.options.mode;var d=f.effects[c];if(f.fx.off||!d)return a?this[a](b.duration,b.callback):this.each(function(){b.callback&&b.callback.call(this)});return d.call(this,b)},_show:f.fn.show,show:function(c){if(l(c))return this._show.apply(this,arguments);else{var a=k.apply(this,arguments); +a[1].mode="show";return this.effect.apply(this,a)}},_hide:f.fn.hide,hide:function(c){if(l(c))return this._hide.apply(this,arguments);else{var a=k.apply(this,arguments);a[1].mode="hide";return this.effect.apply(this,a)}},__toggle:f.fn.toggle,toggle:function(c){if(l(c)||typeof c==="boolean"||f.isFunction(c))return this.__toggle.apply(this,arguments);else{var a=k.apply(this,arguments);a[1].mode="toggle";return this.effect.apply(this,a)}},cssUnit:function(c){var a=this.css(c),b=[];f.each(["em","px","%", +"pt"],function(d,e){if(a.indexOf(e)>0)b=[parseFloat(a),e]});return b}});f.easing.jswing=f.easing.swing;f.extend(f.easing,{def:"easeOutQuad",swing:function(c,a,b,d,e){return f.easing[f.easing.def](c,a,b,d,e)},easeInQuad:function(c,a,b,d,e){return d*(a/=e)*a+b},easeOutQuad:function(c,a,b,d,e){return-d*(a/=e)*(a-2)+b},easeInOutQuad:function(c,a,b,d,e){if((a/=e/2)<1)return d/2*a*a+b;return-d/2*(--a*(a-2)-1)+b},easeInCubic:function(c,a,b,d,e){return d*(a/=e)*a*a+b},easeOutCubic:function(c,a,b,d,e){return d* +((a=a/e-1)*a*a+1)+b},easeInOutCubic:function(c,a,b,d,e){if((a/=e/2)<1)return d/2*a*a*a+b;return d/2*((a-=2)*a*a+2)+b},easeInQuart:function(c,a,b,d,e){return d*(a/=e)*a*a*a+b},easeOutQuart:function(c,a,b,d,e){return-d*((a=a/e-1)*a*a*a-1)+b},easeInOutQuart:function(c,a,b,d,e){if((a/=e/2)<1)return d/2*a*a*a*a+b;return-d/2*((a-=2)*a*a*a-2)+b},easeInQuint:function(c,a,b,d,e){return d*(a/=e)*a*a*a*a+b},easeOutQuint:function(c,a,b,d,e){return d*((a=a/e-1)*a*a*a*a+1)+b},easeInOutQuint:function(c,a,b,d,e){if((a/= +e/2)<1)return d/2*a*a*a*a*a+b;return d/2*((a-=2)*a*a*a*a+2)+b},easeInSine:function(c,a,b,d,e){return-d*Math.cos(a/e*(Math.PI/2))+d+b},easeOutSine:function(c,a,b,d,e){return d*Math.sin(a/e*(Math.PI/2))+b},easeInOutSine:function(c,a,b,d,e){return-d/2*(Math.cos(Math.PI*a/e)-1)+b},easeInExpo:function(c,a,b,d,e){return a==0?b:d*Math.pow(2,10*(a/e-1))+b},easeOutExpo:function(c,a,b,d,e){return a==e?b+d:d*(-Math.pow(2,-10*a/e)+1)+b},easeInOutExpo:function(c,a,b,d,e){if(a==0)return b;if(a==e)return b+d;if((a/= +e/2)<1)return d/2*Math.pow(2,10*(a-1))+b;return d/2*(-Math.pow(2,-10*--a)+2)+b},easeInCirc:function(c,a,b,d,e){return-d*(Math.sqrt(1-(a/=e)*a)-1)+b},easeOutCirc:function(c,a,b,d,e){return d*Math.sqrt(1-(a=a/e-1)*a)+b},easeInOutCirc:function(c,a,b,d,e){if((a/=e/2)<1)return-d/2*(Math.sqrt(1-a*a)-1)+b;return d/2*(Math.sqrt(1-(a-=2)*a)+1)+b},easeInElastic:function(c,a,b,d,e){c=1.70158;var g=0,h=d;if(a==0)return b;if((a/=e)==1)return b+d;g||(g=e*0.3);if(h").css({position:"absolute",visibility:"visible",left:-f*(h/d),top:-e*(i/c)}).parent().addClass("ui-effects-explode").css({position:"absolute",overflow:"hidden",width:h/d,height:i/c,left:g.left+f*(h/d)+(a.options.mode=="show"?(f-Math.floor(d/2))*(h/d):0),top:g.top+e*(i/c)+(a.options.mode=="show"?(e-Math.floor(c/2))*(i/c):0),opacity:a.options.mode=="show"?0:1}).animate({left:g.left+f*(h/d)+(a.options.mode=="show"?0:(f-Math.floor(d/2))*(h/d)),top:g.top+ +e*(i/c)+(a.options.mode=="show"?0:(e-Math.floor(c/2))*(i/c)),opacity:a.options.mode=="show"?1:0},a.duration||500);setTimeout(function(){a.options.mode=="show"?b.css({visibility:"visible"}):b.css({visibility:"visible"}).hide();a.callback&&a.callback.apply(b[0]);b.dequeue();j("div.ui-effects-explode").remove()},a.duration||500)})}})(jQuery); +;/* + * jQuery UI Effects Fade 1.8.13 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Effects/Fade + * + * Depends: + * jquery.effects.core.js + */ +(function(b){b.effects.fade=function(a){return this.queue(function(){var c=b(this),d=b.effects.setMode(c,a.options.mode||"hide");c.animate({opacity:d},{queue:false,duration:a.duration,easing:a.options.easing,complete:function(){a.callback&&a.callback.apply(this,arguments);c.dequeue()}})})}})(jQuery); +;/* + * jQuery UI Effects Fold 1.8.13 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Effects/Fold + * + * Depends: + * jquery.effects.core.js + */ +(function(c){c.effects.fold=function(a){return this.queue(function(){var b=c(this),j=["position","top","bottom","left","right"],d=c.effects.setMode(b,a.options.mode||"hide"),g=a.options.size||15,h=!!a.options.horizFirst,k=a.duration?a.duration/2:c.fx.speeds._default/2;c.effects.save(b,j);b.show();var e=c.effects.createWrapper(b).css({overflow:"hidden"}),f=d=="show"!=h,l=f?["width","height"]:["height","width"];f=f?[e.width(),e.height()]:[e.height(),e.width()];var i=/([0-9]+)%/.exec(g);if(i)g=parseInt(i[1], +10)/100*f[d=="hide"?0:1];if(d=="show")e.css(h?{height:0,width:g}:{height:g,width:0});h={};i={};h[l[0]]=d=="show"?f[0]:g;i[l[1]]=d=="show"?f[1]:0;e.animate(h,k,a.options.easing).animate(i,k,a.options.easing,function(){d=="hide"&&b.hide();c.effects.restore(b,j);c.effects.removeWrapper(b);a.callback&&a.callback.apply(b[0],arguments);b.dequeue()})})}})(jQuery); +;/* + * jQuery UI Effects Highlight 1.8.13 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Effects/Highlight + * + * Depends: + * jquery.effects.core.js + */ +(function(b){b.effects.highlight=function(c){return this.queue(function(){var a=b(this),e=["backgroundImage","backgroundColor","opacity"],d=b.effects.setMode(a,c.options.mode||"show"),f={backgroundColor:a.css("backgroundColor")};if(d=="hide")f.opacity=0;b.effects.save(a,e);a.show().css({backgroundImage:"none",backgroundColor:c.options.color||"#ffff99"}).animate(f,{queue:false,duration:c.duration,easing:c.options.easing,complete:function(){d=="hide"&&a.hide();b.effects.restore(a,e);d=="show"&&!b.support.opacity&& +this.style.removeAttribute("filter");c.callback&&c.callback.apply(this,arguments);a.dequeue()}})})}})(jQuery); +;/* + * jQuery UI Effects Pulsate 1.8.13 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Effects/Pulsate + * + * Depends: + * jquery.effects.core.js + */ +(function(d){d.effects.pulsate=function(a){return this.queue(function(){var b=d(this),c=d.effects.setMode(b,a.options.mode||"show");times=(a.options.times||5)*2-1;duration=a.duration?a.duration/2:d.fx.speeds._default/2;isVisible=b.is(":visible");animateTo=0;if(!isVisible){b.css("opacity",0).show();animateTo=1}if(c=="hide"&&isVisible||c=="show"&&!isVisible)times--;for(c=0;c').appendTo(document.body).addClass(a.options.className).css({top:d.top,left:d.left,height:b.innerHeight(),width:b.innerWidth(),position:"absolute"}).animate(c,a.duration,a.options.easing,function(){f.remove();a.callback&&a.callback.apply(b[0],arguments); +b.dequeue()})})}})(jQuery); +; \ No newline at end of file diff --git a/webui/view/javascript/jquery-ui-i18n.js b/webui/view/javascript/jquery-ui-i18n.js new file mode 100644 index 00000000..eaaa5761 --- /dev/null +++ b/webui/view/javascript/jquery-ui-i18n.js @@ -0,0 +1,1379 @@ +/* Afrikaans initialisation for the jQuery UI date picker plugin. */ +/* Written by Renier Pretorius. */ +jQuery(function($){ + $.datepicker.regional['af'] = { + closeText: 'Selekteer', + prevText: 'Vorige', + nextText: 'Volgende', + currentText: 'Vandag', + monthNames: ['Januarie','Februarie','Maart','April','Mei','Junie', + 'Julie','Augustus','September','Oktober','November','Desember'], + monthNamesShort: ['Jan', 'Feb', 'Mrt', 'Apr', 'Mei', 'Jun', + 'Jul', 'Aug', 'Sep', 'Okt', 'Nov', 'Des'], + dayNames: ['Sondag', 'Maandag', 'Dinsdag', 'Woensdag', 'Donderdag', 'Vrydag', 'Saterdag'], + dayNamesShort: ['Son', 'Maa', 'Din', 'Woe', 'Don', 'Vry', 'Sat'], + dayNamesMin: ['So','Ma','Di','Wo','Do','Vr','Sa'], + weekHeader: 'Wk', + dateFormat: 'dd/mm/yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['af']); +}); +/* Algerian Arabic Translation for jQuery UI date picker plugin. (can be used for Tunisia)*/ +/* Mohamed Cherif BOUCHELAGHEM -- cherifbouchelaghem@yahoo.fr */ + +jQuery(function($){ + $.datepicker.regional['ar-DZ'] = { + closeText: 'إغلاق', + prevText: '<السابق', + nextText: 'التالي>', + currentText: 'اليوم', + monthNames: ['جانÙÙŠ', 'ÙÙŠÙري', 'مارس', 'Ø£Ùريل', 'ماي', 'جوان', + 'جويلية', 'أوت', 'سبتمبر','أكتوبر', 'نوÙمبر', 'ديسمبر'], + monthNamesShort: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'], + dayNames: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'], + dayNamesShort: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'], + dayNamesMin: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'], + weekHeader: 'أسبوع', + dateFormat: 'dd/mm/yy', + firstDay: 6, + isRTL: true, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['ar-DZ']); +}); +/* Arabic Translation for jQuery UI date picker plugin. */ +/* Khaled Alhourani -- me@khaledalhourani.com */ +/* NOTE: monthNames are the original months names and they are the Arabic names, not the new months name Ùبراير - يناير and there isn't any Arabic roots for these months */ +jQuery(function($){ + $.datepicker.regional['ar'] = { + closeText: 'إغلاق', + prevText: '<السابق', + nextText: 'التالي>', + currentText: 'اليوم', + monthNames: ['كانون الثاني', 'شباط', 'آذار', 'نيسان', 'مايو', 'حزيران', + 'تموز', 'آب', 'أيلول', 'تشرين الأول', 'تشرين الثاني', 'كانون الأول'], + monthNamesShort: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'], + dayNames: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'], + dayNamesShort: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'], + dayNamesMin: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'], + weekHeader: 'أسبوع', + dateFormat: 'dd/mm/yy', + firstDay: 6, + isRTL: true, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['ar']); +});/* Azerbaijani (UTF-8) initialisation for the jQuery UI date picker plugin. */ +/* Written by Jamil Najafov (necefov33@gmail.com). */ +jQuery(function($) { + $.datepicker.regional['az'] = { + closeText: 'BaÄŸla', + prevText: '<Geri', + nextText: 'Ä°rÉ™li>', + currentText: 'Bugün', + monthNames: ['Yanvar','Fevral','Mart','Aprel','May','Ä°yun', + 'Ä°yul','Avqust','Sentyabr','Oktyabr','Noyabr','Dekabr'], + monthNamesShort: ['Yan','Fev','Mar','Apr','May','Ä°yun', + 'Ä°yul','Avq','Sen','Okt','Noy','Dek'], + dayNames: ['Bazar','Bazar ertÉ™si','ÇərÅŸÉ™nbÉ™ axÅŸamı','ÇərÅŸÉ™nbÉ™','CümÉ™ axÅŸamı','CümÉ™','ŞənbÉ™'], + dayNamesShort: ['B','Be','Ça','Ç','Ca','C','Åž'], + dayNamesMin: ['B','B','Ç','С','Ç','C','Åž'], + weekHeader: 'Hf', + dateFormat: 'dd.mm.yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['az']); +});/* Bulgarian initialisation for the jQuery UI date picker plugin. */ +/* Written by Stoyan Kyosev (http://svest.org). */ +jQuery(function($){ + $.datepicker.regional['bg'] = { + closeText: 'затвори', + prevText: '<назад', + nextText: 'напред>', + nextBigText: '>>', + currentText: 'днеÑ', + monthNames: ['Януари','Февруари','Март','Ðприл','Май','Юни', + 'Юли','ÐвгуÑÑ‚','Септември','Октомври','Ðоември','Декември'], + monthNamesShort: ['Яну','Фев','Мар','Ðпр','Май','Юни', + 'Юли','Ðвг','Сеп','Окт','Ðов','Дек'], + dayNames: ['ÐеделÑ','Понеделник','Вторник','СрÑда','Четвъртък','Петък','Събота'], + dayNamesShort: ['Ðед','Пон','Вто','СрÑ','Чет','Пет','Съб'], + dayNamesMin: ['Ðе','По','Ð’Ñ‚','Ср','Че','Пе','Съ'], + weekHeader: 'Wk', + dateFormat: 'dd.mm.yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['bg']); +}); +/* Bosnian i18n for the jQuery UI date picker plugin. */ +/* Written by Kenan Konjo. */ +jQuery(function($){ + $.datepicker.regional['bs'] = { + closeText: 'Zatvori', + prevText: '<', + nextText: '>', + currentText: 'Danas', + monthNames: ['Januar','Februar','Mart','April','Maj','Juni', + 'Juli','August','Septembar','Oktobar','Novembar','Decembar'], + monthNamesShort: ['Jan','Feb','Mar','Apr','Maj','Jun', + 'Jul','Aug','Sep','Okt','Nov','Dec'], + dayNames: ['Nedelja','Ponedeljak','Utorak','Srijeda','ÄŒetvrtak','Petak','Subota'], + dayNamesShort: ['Ned','Pon','Uto','Sri','ÄŒet','Pet','Sub'], + dayNamesMin: ['Ne','Po','Ut','Sr','ÄŒe','Pe','Su'], + weekHeader: 'Wk', + dateFormat: 'dd.mm.yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['bs']); +});/* Inicialització en català per a l'extenció 'calendar' per jQuery. */ +/* Writers: (joan.leon@gmail.com). */ +jQuery(function($){ + $.datepicker.regional['ca'] = { + closeText: 'Tancar', + prevText: '<Ant', + nextText: 'Seg>', + currentText: 'Avui', + monthNames: ['Gener','Febrer','Març','Abril','Maig','Juny', + 'Juliol','Agost','Setembre','Octubre','Novembre','Desembre'], + monthNamesShort: ['Gen','Feb','Mar','Abr','Mai','Jun', + 'Jul','Ago','Set','Oct','Nov','Des'], + dayNames: ['Diumenge','Dilluns','Dimarts','Dimecres','Dijous','Divendres','Dissabte'], + dayNamesShort: ['Dug','Dln','Dmt','Dmc','Djs','Dvn','Dsb'], + dayNamesMin: ['Dg','Dl','Dt','Dc','Dj','Dv','Ds'], + weekHeader: 'Sm', + dateFormat: 'dd/mm/yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['ca']); +});/* Czech initialisation for the jQuery UI date picker plugin. */ +/* Written by Tomas Muller (tomas@tomas-muller.net). */ +jQuery(function($){ + $.datepicker.regional['cs'] = { + closeText: 'Zavřít', + prevText: '<Dříve', + nextText: 'PozdÄ›ji>', + currentText: 'Nyní', + monthNames: ['leden','únor','bÅ™ezen','duben','kvÄ›ten','Äerven', + 'Äervenec','srpen','září','říjen','listopad','prosinec'], + monthNamesShort: ['led','úno','bÅ™e','dub','kvÄ›','Äer', + 'Ävc','srp','zář','říj','lis','pro'], + dayNames: ['nedÄ›le', 'pondÄ›lí', 'úterý', 'stÅ™eda', 'Ätvrtek', 'pátek', 'sobota'], + dayNamesShort: ['ne', 'po', 'út', 'st', 'Ät', 'pá', 'so'], + dayNamesMin: ['ne','po','út','st','Ät','pá','so'], + weekHeader: 'Týd', + dateFormat: 'dd.mm.yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['cs']); +}); +/* Danish initialisation for the jQuery UI date picker plugin. */ +/* Written by Jan Christensen ( deletestuff@gmail.com). */ +jQuery(function($){ + $.datepicker.regional['da'] = { + closeText: 'Luk', + prevText: '<Forrige', + nextText: 'Næste>', + currentText: 'Idag', + monthNames: ['Januar','Februar','Marts','April','Maj','Juni', + 'Juli','August','September','Oktober','November','December'], + monthNamesShort: ['Jan','Feb','Mar','Apr','Maj','Jun', + 'Jul','Aug','Sep','Okt','Nov','Dec'], + dayNames: ['Søndag','Mandag','Tirsdag','Onsdag','Torsdag','Fredag','Lørdag'], + dayNamesShort: ['Søn','Man','Tir','Ons','Tor','Fre','Lør'], + dayNamesMin: ['Sø','Ma','Ti','On','To','Fr','Lø'], + weekHeader: 'Uge', + dateFormat: 'dd-mm-yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['da']); +}); +/* German initialisation for the jQuery UI date picker plugin. */ +/* Written by Milian Wolff (mail@milianw.de). */ +jQuery(function($){ + $.datepicker.regional['de'] = { + closeText: 'schließen', + prevText: '<zurück', + nextText: 'Vor>', + currentText: 'heute', + 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'], + dayNamesMin: ['So','Mo','Di','Mi','Do','Fr','Sa'], + weekHeader: 'Wo', + dateFormat: 'dd.mm.yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['de']); +}); +/* Greek (el) initialisation for the jQuery UI date picker plugin. */ +/* Written by Alex Cicovic (http://www.alexcicovic.com) */ +jQuery(function($){ + $.datepicker.regional['el'] = { + closeText: 'Κλείσιμο', + prevText: 'ΠÏοηγοÏμενος', + nextText: 'Επόμενος', + currentText: 'ΤÏέχων Μήνας', + monthNames: ['ΙανουάÏιος','ΦεβÏουάÏιος','ΜάÏτιος','ΑπÏίλιος','Μάιος','ΙοÏνιος', + 'ΙοÏλιος','ΑÏγουστος','ΣεπτέμβÏιος','ΟκτώβÏιος','ÎοέμβÏιος','ΔεκέμβÏιος'], + monthNamesShort: ['Ιαν','Φεβ','ΜαÏ','ΑπÏ','Μαι','Ιουν', + 'Ιουλ','Αυγ','Σεπ','Οκτ','Îοε','Δεκ'], + dayNames: ['ΚυÏιακή','ΔευτέÏα','ΤÏίτη','ΤετάÏτη','Πέμπτη','ΠαÏασκευή','Σάββατο'], + dayNamesShort: ['ΚυÏ','Δευ','ΤÏι','Τετ','Πεμ','ΠαÏ','Σαβ'], + dayNamesMin: ['Κυ','Δε','ΤÏ','Τε','Πε','Πα','Σα'], + weekHeader: 'Εβδ', + dateFormat: 'dd/mm/yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['el']); +});/* English/Australia initialisation for the jQuery UI date picker plugin. */ +/* Based on the en-GB initialisation. */ +jQuery(function($){ + $.datepicker.regional['en-AU'] = { + closeText: 'Done', + prevText: 'Prev', + nextText: 'Next', + currentText: 'Today', + monthNames: ['January','February','March','April','May','June', + 'July','August','September','October','November','December'], + monthNamesShort: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', + 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'], + dayNames: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'], + dayNamesShort: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'], + dayNamesMin: ['Su','Mo','Tu','We','Th','Fr','Sa'], + weekHeader: 'Wk', + dateFormat: 'dd/mm/yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['en-AU']); +}); +/* English/UK initialisation for the jQuery UI date picker plugin. */ +/* Written by Stuart. */ +jQuery(function($){ + $.datepicker.regional['en-GB'] = { + closeText: 'Done', + prevText: 'Prev', + nextText: 'Next', + currentText: 'Today', + monthNames: ['January','February','March','April','May','June', + 'July','August','September','October','November','December'], + monthNamesShort: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', + 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'], + dayNames: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'], + dayNamesShort: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'], + dayNamesMin: ['Su','Mo','Tu','We','Th','Fr','Sa'], + weekHeader: 'Wk', + dateFormat: 'dd/mm/yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['en-GB']); +}); +/* English/New Zealand initialisation for the jQuery UI date picker plugin. */ +/* Based on the en-GB initialisation. */ +jQuery(function($){ + $.datepicker.regional['en-NZ'] = { + closeText: 'Done', + prevText: 'Prev', + nextText: 'Next', + currentText: 'Today', + monthNames: ['January','February','March','April','May','June', + 'July','August','September','October','November','December'], + monthNamesShort: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', + 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'], + dayNames: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'], + dayNamesShort: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'], + dayNamesMin: ['Su','Mo','Tu','We','Th','Fr','Sa'], + weekHeader: 'Wk', + dateFormat: 'dd/mm/yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['en-NZ']); +}); +/* Esperanto initialisation for the jQuery UI date picker plugin. */ +/* Written by Olivier M. (olivierweb@ifrance.com). */ +jQuery(function($){ + $.datepicker.regional['eo'] = { + closeText: 'Fermi', + prevText: '<Anta', + nextText: 'Sekv>', + currentText: 'Nuna', + monthNames: ['Januaro','Februaro','Marto','Aprilo','Majo','Junio', + 'Julio','AÅ­gusto','Septembro','Oktobro','Novembro','Decembro'], + monthNamesShort: ['Jan','Feb','Mar','Apr','Maj','Jun', + 'Jul','AÅ­g','Sep','Okt','Nov','Dec'], + dayNames: ['Dimanĉo','Lundo','Mardo','Merkredo','Ä´aÅ­do','Vendredo','Sabato'], + dayNamesShort: ['Dim','Lun','Mar','Mer','Ä´aÅ­','Ven','Sab'], + dayNamesMin: ['Di','Lu','Ma','Me','Ä´a','Ve','Sa'], + weekHeader: 'Sb', + dateFormat: 'dd/mm/yy', + firstDay: 0, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['eo']); +}); +/* Inicialización en español para la extensión 'UI date picker' para jQuery. */ +/* Traducido por Vester (xvester@gmail.com). */ +jQuery(function($){ + $.datepicker.regional['es'] = { + closeText: 'Cerrar', + prevText: '<Ant', + nextText: 'Sig>', + currentText: 'Hoy', + 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ércoles','Jueves','Viernes','Sábado'], + dayNamesShort: ['Dom','Lun','Mar','Mié','Juv','Vie','Sáb'], + dayNamesMin: ['Do','Lu','Ma','Mi','Ju','Vi','Sá'], + weekHeader: 'Sm', + dateFormat: 'dd/mm/yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['es']); +});/* Estonian initialisation for the jQuery UI date picker plugin. */ +/* Written by Mart Sõmermaa (mrts.pydev at gmail com). */ +jQuery(function($){ + $.datepicker.regional['et'] = { + closeText: 'Sulge', + prevText: 'Eelnev', + nextText: 'Järgnev', + currentText: 'Täna', + monthNames: ['Jaanuar','Veebruar','Märts','Aprill','Mai','Juuni', + 'Juuli','August','September','Oktoober','November','Detsember'], + monthNamesShort: ['Jaan', 'Veebr', 'Märts', 'Apr', 'Mai', 'Juuni', + 'Juuli', 'Aug', 'Sept', 'Okt', 'Nov', 'Dets'], + dayNames: ['Pühapäev', 'Esmaspäev', 'Teisipäev', 'Kolmapäev', 'Neljapäev', 'Reede', 'Laupäev'], + dayNamesShort: ['Pühap', 'Esmasp', 'Teisip', 'Kolmap', 'Neljap', 'Reede', 'Laup'], + dayNamesMin: ['P','E','T','K','N','R','L'], + weekHeader: 'Sm', + dateFormat: 'dd.mm.yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['et']); +}); /* Euskarako oinarria 'UI date picker' jquery-ko extentsioarentzat */ +/* Karrikas-ek itzulia (karrikas@karrikas.com) */ +jQuery(function($){ + $.datepicker.regional['eu'] = { + closeText: 'Egina', + prevText: '<Aur', + nextText: 'Hur>', + currentText: 'Gaur', + monthNames: ['Urtarrila','Otsaila','Martxoa','Apirila','Maiatza','Ekaina', + 'Uztaila','Abuztua','Iraila','Urria','Azaroa','Abendua'], + monthNamesShort: ['Urt','Ots','Mar','Api','Mai','Eka', + 'Uzt','Abu','Ira','Urr','Aza','Abe'], + dayNames: ['Igandea','Astelehena','Asteartea','Asteazkena','Osteguna','Ostirala','Larunbata'], + dayNamesShort: ['Iga','Ast','Ast','Ast','Ost','Ost','Lar'], + dayNamesMin: ['Ig','As','As','As','Os','Os','La'], + weekHeader: 'Wk', + dateFormat: 'yy/mm/dd', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['eu']); +});/* Persian (Farsi) Translation for the jQuery UI date picker plugin. */ +/* Javad Mowlanezhad -- jmowla@gmail.com */ +/* Jalali calendar should supported soon! (Its implemented but I have to test it) */ +jQuery(function($) { + $.datepicker.regional['fa'] = { + closeText: 'بستن', + prevText: '<قبلي', + nextText: 'بعدي>', + currentText: 'امروز', + monthNames: ['Ùروردين','ارديبهشت','خرداد','تير','مرداد','شهريور', + 'مهر','آبان','آذر','دي','بهمن','اسÙند'], + monthNamesShort: ['1','2','3','4','5','6','7','8','9','10','11','12'], + dayNames: ['يکشنبه','دوشنبه','سه‌شنبه','چهارشنبه','پنجشنبه','جمعه','شنبه'], + dayNamesShort: ['ÙŠ','د','س','Ú†','Ù¾','ج', 'Ø´'], + dayNamesMin: ['ÙŠ','د','س','Ú†','Ù¾','ج', 'Ø´'], + weekHeader: 'Ù‡Ù', + dateFormat: 'yy/mm/dd', + firstDay: 6, + isRTL: true, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['fa']); +});/* Finnish initialisation for the jQuery UI date picker plugin. */ +/* Written by Harri Kilpi� (harrikilpio@gmail.com). */ +jQuery(function($){ + $.datepicker.regional['fi'] = { + closeText: 'Sulje', + prevText: '«Edellinen', + nextText: 'Seuraava»', + currentText: 'Tänään', + monthNames: ['Tammikuu','Helmikuu','Maaliskuu','Huhtikuu','Toukokuu','Kesäkuu', + 'Heinäkuu','Elokuu','Syyskuu','Lokakuu','Marraskuu','Joulukuu'], + monthNamesShort: ['Tammi','Helmi','Maalis','Huhti','Touko','Kesä', + 'Heinä','Elo','Syys','Loka','Marras','Joulu'], + dayNamesShort: ['Su','Ma','Ti','Ke','To','Pe','Su'], + dayNames: ['Sunnuntai','Maanantai','Tiistai','Keskiviikko','Torstai','Perjantai','Lauantai'], + dayNamesMin: ['Su','Ma','Ti','Ke','To','Pe','La'], + weekHeader: 'Vk', + dateFormat: 'dd.mm.yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['fi']); +}); +/* Faroese initialisation for the jQuery UI date picker plugin */ +/* Written by Sverri Mohr Olsen, sverrimo@gmail.com */ +jQuery(function($){ + $.datepicker.regional['fo'] = { + closeText: 'Lat aftur', + prevText: '<Fyrra', + nextText: 'Næsta>', + currentText: 'à dag', + monthNames: ['Januar','Februar','Mars','Apríl','Mei','Juni', + 'Juli','August','September','Oktober','November','Desember'], + monthNamesShort: ['Jan','Feb','Mar','Apr','Mei','Jun', + 'Jul','Aug','Sep','Okt','Nov','Des'], + dayNames: ['Sunnudagur','Mánadagur','Týsdagur','Mikudagur','Hósdagur','Fríggjadagur','Leyardagur'], + dayNamesShort: ['Sun','Mán','Týs','Mik','Hós','Frí','Ley'], + dayNamesMin: ['Su','Má','Tý','Mi','Hó','Fr','Le'], + weekHeader: 'Vk', + dateFormat: 'dd-mm-yy', + firstDay: 0, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['fo']); +}); +/* Swiss-French initialisation for the jQuery UI date picker plugin. */ +/* Written Martin Voelkle (martin.voelkle@e-tc.ch). */ +jQuery(function($){ + $.datepicker.regional['fr-CH'] = { + closeText: 'Fermer', + prevText: '<Préc', + nextText: 'Suiv>', + currentText: 'Courant', + 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'], + dayNamesMin: ['Di','Lu','Ma','Me','Je','Ve','Sa'], + weekHeader: 'Sm', + dateFormat: 'dd.mm.yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['fr-CH']); +});/* French initialisation for the jQuery UI date picker plugin. */ +/* Written by Keith Wood (kbwood{at}iinet.com.au), + Stéphane Nahmani (sholby@sholby.net), + Stéphane Raimbault */ +jQuery(function($){ + $.datepicker.regional['fr'] = { + closeText: 'Fermer', + prevText: 'Précédent', + nextText: 'Suivant', + currentText: 'Aujourd\'hui', + monthNames: ['Janvier','Février','Mars','Avril','Mai','Juin', + 'Juillet','Août','Septembre','Octobre','Novembre','Décembre'], + monthNamesShort: ['Janv.','Févr.','Mars','Avril','Mai','Juin', + 'Juil.','Août','Sept.','Oct.','Nov.','Déc.'], + dayNames: ['Dimanche','Lundi','Mardi','Mercredi','Jeudi','Vendredi','Samedi'], + dayNamesShort: ['Dim.','Lun.','Mar.','Mer.','Jeu.','Ven.','Sam.'], + dayNamesMin: ['D','L','M','M','J','V','S'], + weekHeader: 'Sem.', + dateFormat: 'dd/mm/yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['fr']); +}); +/* Galician localization for 'UI date picker' jQuery extension. */ +/* Translated by Jorge Barreiro . */ +jQuery(function($){ + $.datepicker.regional['gl'] = { + closeText: 'Pechar', + prevText: '<Ant', + nextText: 'Seg>', + currentText: 'Hoxe', + monthNames: ['Xaneiro','Febreiro','Marzo','Abril','Maio','Xuño', + 'Xullo','Agosto','Setembro','Outubro','Novembro','Decembro'], + monthNamesShort: ['Xan','Feb','Mar','Abr','Mai','Xuñ', + 'Xul','Ago','Set','Out','Nov','Dec'], + dayNames: ['Domingo','Luns','Martes','Mércores','Xoves','Venres','Sábado'], + dayNamesShort: ['Dom','Lun','Mar','Mér','Xov','Ven','Sáb'], + dayNamesMin: ['Do','Lu','Ma','Mé','Xo','Ve','Sá'], + weekHeader: 'Sm', + dateFormat: 'dd/mm/yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['gl']); +});/* Hebrew initialisation for the UI Datepicker extension. */ +/* Written by Amir Hardon (ahardon at gmail dot com). */ +jQuery(function($){ + $.datepicker.regional['he'] = { + closeText: 'סגור', + prevText: '<הקוד×', + nextText: 'הב×>', + currentText: 'היו×', + monthNames: ['ינו×ר','פברו×ר','מרץ','×פריל','מ××™','יוני', + 'יולי','×וגוסט','ספטמבר','×וקטובר','נובמבר','דצמבר'], + monthNamesShort: ['1','2','3','4','5','6', + '7','8','9','10','11','12'], + dayNames: ['ר×שון','שני','שלישי','רביעי','חמישי','שישי','שבת'], + dayNamesShort: ['×\'','ב\'','×’\'','ד\'','×”\'','ו\'','שבת'], + dayNamesMin: ['×\'','ב\'','×’\'','ד\'','×”\'','ו\'','שבת'], + weekHeader: 'Wk', + dateFormat: 'dd/mm/yy', + firstDay: 0, + isRTL: true, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['he']); +}); +/* Croatian i18n for the jQuery UI date picker plugin. */ +/* Written by Vjekoslav Nesek. */ +jQuery(function($){ + $.datepicker.regional['hr'] = { + closeText: 'Zatvori', + prevText: '<', + nextText: '>', + currentText: 'Danas', + monthNames: ['SijeÄanj','VeljaÄa','Ožujak','Travanj','Svibanj','Lipanj', + 'Srpanj','Kolovoz','Rujan','Listopad','Studeni','Prosinac'], + monthNamesShort: ['Sij','Velj','Ožu','Tra','Svi','Lip', + 'Srp','Kol','Ruj','Lis','Stu','Pro'], + dayNames: ['Nedjelja','Ponedjeljak','Utorak','Srijeda','ÄŒetvrtak','Petak','Subota'], + dayNamesShort: ['Ned','Pon','Uto','Sri','ÄŒet','Pet','Sub'], + dayNamesMin: ['Ne','Po','Ut','Sr','ÄŒe','Pe','Su'], + weekHeader: 'Tje', + dateFormat: 'dd.mm.yy.', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['hr']); +});/* Hungarian initialisation for the jQuery UI date picker plugin. */ +/* Written by Istvan Karaszi (jquery@spam.raszi.hu). */ +jQuery(function($){ + $.datepicker.regional['hu'] = { + closeText: 'bezárás', + prevText: '« vissza', + nextText: 'elÅ‘re »', + currentText: 'ma', + monthNames: ['Január', 'Február', 'Március', 'Ãprilis', 'Május', 'Június', + 'Július', 'Augusztus', 'Szeptember', 'Október', 'November', 'December'], + monthNamesShort: ['Jan', 'Feb', 'Már', 'Ãpr', 'Máj', 'Jún', + 'Júl', 'Aug', 'Szep', 'Okt', 'Nov', 'Dec'], + dayNames: ['Vasárnap', 'Hétfö', 'Kedd', 'Szerda', 'Csütörtök', 'Péntek', 'Szombat'], + dayNamesShort: ['Vas', 'Hét', 'Ked', 'Sze', 'Csü', 'Pén', 'Szo'], + dayNamesMin: ['V', 'H', 'K', 'Sze', 'Cs', 'P', 'Szo'], + weekHeader: 'Hé', + dateFormat: 'yy-mm-dd', + firstDay: 1, + isRTL: false, + showMonthAfterYear: true, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['hu']); +}); +/* Armenian(UTF-8) initialisation for the jQuery UI date picker plugin. */ +/* Written by Levon Zakaryan (levon.zakaryan@gmail.com)*/ +jQuery(function($){ + $.datepicker.regional['hy'] = { + closeText: 'Õ“Õ¡Õ¯Õ¥Õ¬', + prevText: '<Õ†Õ¡Õ­.', + nextText: 'Õ€Õ¡Õ».>', + currentText: 'Ô±ÕµÕ½Ö…Ö€', + monthNames: ['Õ€Õ¸Ö‚Õ¶Õ¾Õ¡Ö€','Õ“Õ¥Õ¿Ö€Õ¾Õ¡Ö€','Õ„Õ¡Ö€Õ¿','Ô±ÕºÖ€Õ«Õ¬','Õ„Õ¡ÕµÕ«Õ½','Õ€Õ¸Ö‚Õ¶Õ«Õ½', + 'Õ€Õ¸Ö‚Õ¬Õ«Õ½','Õ•Õ£Õ¸Õ½Õ¿Õ¸Õ½','ÕÕ¥ÕºÕ¿Õ¥Õ´Õ¢Õ¥Ö€','Õ€Õ¸Õ¯Õ¿Õ¥Õ´Õ¢Õ¥Ö€','Õ†Õ¸ÕµÕ¥Õ´Õ¢Õ¥Ö€','Ô´Õ¥Õ¯Õ¿Õ¥Õ´Õ¢Õ¥Ö€'], + monthNamesShort: ['Õ€Õ¸Ö‚Õ¶Õ¾','Õ“Õ¥Õ¿Ö€','Õ„Õ¡Ö€Õ¿','Ô±ÕºÖ€','Õ„Õ¡ÕµÕ«Õ½','Õ€Õ¸Ö‚Õ¶Õ«Õ½', + 'Õ€Õ¸Ö‚Õ¬','Õ•Õ£Õ½','ÕÕ¥Õº','Õ€Õ¸Õ¯','Õ†Õ¸Õµ','Ô´Õ¥Õ¯'], + dayNames: ['Õ¯Õ«Ö€Õ¡Õ¯Õ«','Õ¥Õ¯Õ¸Ö‚Õ·Õ¡Õ¢Õ©Õ«','Õ¥Ö€Õ¥Ö„Õ·Õ¡Õ¢Õ©Õ«','Õ¹Õ¸Ö€Õ¥Ö„Õ·Õ¡Õ¢Õ©Õ«','Õ°Õ«Õ¶Õ£Õ·Õ¡Õ¢Õ©Õ«','Õ¸Ö‚Ö€Õ¢Õ¡Õ©','Õ·Õ¡Õ¢Õ¡Õ©'], + dayNamesShort: ['Õ¯Õ«Ö€','Õ¥Ö€Õ¯','Õ¥Ö€Ö„','Õ¹Ö€Ö„','Õ°Õ¶Õ£','Õ¸Ö‚Ö€Õ¢','Õ·Õ¢Õ©'], + dayNamesMin: ['Õ¯Õ«Ö€','Õ¥Ö€Õ¯','Õ¥Ö€Ö„','Õ¹Ö€Ö„','Õ°Õ¶Õ£','Õ¸Ö‚Ö€Õ¢','Õ·Õ¢Õ©'], + weekHeader: 'Õ‡Ô²Õ', + dateFormat: 'dd.mm.yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['hy']); +});/* Indonesian initialisation for the jQuery UI date picker plugin. */ +/* Written by Deden Fathurahman (dedenf@gmail.com). */ +jQuery(function($){ + $.datepicker.regional['id'] = { + closeText: 'Tutup', + prevText: '<mundur', + nextText: 'maju>', + currentText: 'hari ini', + monthNames: ['Januari','Februari','Maret','April','Mei','Juni', + 'Juli','Agustus','September','Oktober','Nopember','Desember'], + monthNamesShort: ['Jan','Feb','Mar','Apr','Mei','Jun', + 'Jul','Agus','Sep','Okt','Nop','Des'], + dayNames: ['Minggu','Senin','Selasa','Rabu','Kamis','Jumat','Sabtu'], + dayNamesShort: ['Min','Sen','Sel','Rab','kam','Jum','Sab'], + dayNamesMin: ['Mg','Sn','Sl','Rb','Km','jm','Sb'], + weekHeader: 'Mg', + dateFormat: 'dd/mm/yy', + firstDay: 0, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['id']); +});/* Icelandic initialisation for the jQuery UI date picker plugin. */ +/* Written by Haukur H. Thorsson (haukur@eskill.is). */ +jQuery(function($){ + $.datepicker.regional['is'] = { + closeText: 'Loka', + prevText: '< Fyrri', + nextText: 'Næsti >', + currentText: 'Í dag', + monthNames: ['Janúar','Febrúar','Mars','Apríl','Maí','Júní', + 'Júlí','Ágúst','September','Október','Nóvember','Desember'], + monthNamesShort: ['Jan','Feb','Mar','Apr','Maí','Jún', + 'Júl','Ágú','Sep','Okt','Nóv','Des'], + dayNames: ['Sunnudagur','Mánudagur','Þriðjudagur','Miðvikudagur','Fimmtudagur','Föstudagur','Laugardagur'], + dayNamesShort: ['Sun','Mán','Þri','Mið','Fim','Fös','Lau'], + dayNamesMin: ['Su','Má','Þr','Mi','Fi','Fö','La'], + weekHeader: 'Vika', + dateFormat: 'dd/mm/yy', + firstDay: 0, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['is']); +});/* Italian initialisation for the jQuery UI date picker plugin. */ +/* Written by Antonello Pasella (antonello.pasella@gmail.com). */ +jQuery(function($){ + $.datepicker.regional['it'] = { + closeText: 'Chiudi', + prevText: '<Prec', + nextText: 'Succ>', + currentText: 'Oggi', + monthNames: ['Gennaio','Febbraio','Marzo','Aprile','Maggio','Giugno', + 'Luglio','Agosto','Settembre','Ottobre','Novembre','Dicembre'], + monthNamesShort: ['Gen','Feb','Mar','Apr','Mag','Giu', + 'Lug','Ago','Set','Ott','Nov','Dic'], + dayNames: ['Domenica','Lunedì','Martedì','Mercoledì','Giovedì','Venerdì','Sabato'], + dayNamesShort: ['Dom','Lun','Mar','Mer','Gio','Ven','Sab'], + dayNamesMin: ['Do','Lu','Ma','Me','Gi','Ve','Sa'], + weekHeader: 'Sm', + dateFormat: 'dd/mm/yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['it']); +}); +/* Japanese initialisation for the jQuery UI date picker plugin. */ +/* Written by Kentaro SATO (kentaro@ranvis.com). */ +jQuery(function($){ + $.datepicker.regional['ja'] = { + closeText: 'é–‰ã˜ã‚‹', + prevText: '<å‰', + nextText: '次>', + currentText: '今日', + monthNames: ['1月','2月','3月','4月','5月','6月', + '7月','8月','9月','10月','11月','12月'], + monthNamesShort: ['1月','2月','3月','4月','5月','6月', + '7月','8月','9月','10月','11月','12月'], + dayNames: ['日曜日','月曜日','ç«æ›œæ—¥','水曜日','木曜日','金曜日','土曜日'], + dayNamesShort: ['æ—¥','月','ç«','æ°´','木','金','土'], + dayNamesMin: ['æ—¥','月','ç«','æ°´','木','金','土'], + weekHeader: '週', + dateFormat: 'yy/mm/dd', + firstDay: 0, + isRTL: false, + showMonthAfterYear: true, + yearSuffix: 'å¹´'}; + $.datepicker.setDefaults($.datepicker.regional['ja']); +});/* Korean initialisation for the jQuery calendar extension. */ +/* Written by DaeKwon Kang (ncrash.dk@gmail.com). */ +jQuery(function($){ + $.datepicker.regional['ko'] = { + closeText: '닫기', + prevText: 'ì´ì „달', + nextText: '다ìŒë‹¬', + currentText: '오늘', + monthNames: ['1ì›”(JAN)','2ì›”(FEB)','3ì›”(MAR)','4ì›”(APR)','5ì›”(MAY)','6ì›”(JUN)', + '7ì›”(JUL)','8ì›”(AUG)','9ì›”(SEP)','10ì›”(OCT)','11ì›”(NOV)','12ì›”(DEC)'], + monthNamesShort: ['1ì›”(JAN)','2ì›”(FEB)','3ì›”(MAR)','4ì›”(APR)','5ì›”(MAY)','6ì›”(JUN)', + '7ì›”(JUL)','8ì›”(AUG)','9ì›”(SEP)','10ì›”(OCT)','11ì›”(NOV)','12ì›”(DEC)'], + dayNames: ['ì¼','ì›”','í™”','수','목','금','토'], + dayNamesShort: ['ì¼','ì›”','í™”','수','목','금','토'], + dayNamesMin: ['ì¼','ì›”','í™”','수','목','금','토'], + weekHeader: 'Wk', + dateFormat: 'yy-mm-dd', + firstDay: 0, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: 'ë…„'}; + $.datepicker.setDefaults($.datepicker.regional['ko']); +});/* Kazakh (UTF-8) initialisation for the jQuery UI date picker plugin. */ +/* Written by Dmitriy Karasyov (dmitriy.karasyov@gmail.com). */ +jQuery(function($){ + $.datepicker.regional['kz'] = { + closeText: 'Жабу', + prevText: '<Ðлдыңғы', + nextText: 'КелеÑÑ–>', + currentText: 'Бүгін', + monthNames: ['Қаңтар','Ðқпан','Ðаурыз','Сәуір','Мамыр','МауÑым', + 'Шілде','Тамыз','Қыркүйек','Қазан','Қараша','ЖелтоқÑан'], + monthNamesShort: ['Қаң','Ðқп','Ðау','Сәу','Мам','Мау', + 'Шіл','Там','Қыр','Қаз','Қар','Жел'], + dayNames: ['ЖекÑенбі','ДүйÑенбі','СейÑенбі','СәрÑенбі','БейÑенбі','Жұма','Сенбі'], + dayNamesShort: ['жкÑ','дÑн','ÑÑн','ÑÑ€Ñ','бÑн','жма','Ñнб'], + dayNamesMin: ['Жк','ДÑ','СÑ','Ср','БÑ','Жм','Сн'], + weekHeader: 'Ðе', + dateFormat: 'dd.mm.yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['kz']); +}); +/* Lithuanian (UTF-8) initialisation for the jQuery UI date picker plugin. */ +/* @author Arturas Paleicikas */ +jQuery(function($){ + $.datepicker.regional['lt'] = { + closeText: 'Uždaryti', + prevText: '<Atgal', + nextText: 'Pirmyn>', + currentText: 'Å iandien', + monthNames: ['Sausis','Vasaris','Kovas','Balandis','Gegužė','Birželis', + 'Liepa','RugpjÅ«tis','RugsÄ—jis','Spalis','Lapkritis','Gruodis'], + monthNamesShort: ['Sau','Vas','Kov','Bal','Geg','Bir', + 'Lie','Rugp','Rugs','Spa','Lap','Gru'], + dayNames: ['sekmadienis','pirmadienis','antradienis','treÄiadienis','ketvirtadienis','penktadienis','Å¡eÅ¡tadienis'], + dayNamesShort: ['sek','pir','ant','tre','ket','pen','Å¡eÅ¡'], + dayNamesMin: ['Se','Pr','An','Tr','Ke','Pe','Å e'], + weekHeader: 'Wk', + dateFormat: 'yy-mm-dd', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['lt']); +});/* Latvian (UTF-8) initialisation for the jQuery UI date picker plugin. */ +/* @author Arturas Paleicikas */ +jQuery(function($){ + $.datepicker.regional['lv'] = { + closeText: 'AizvÄ“rt', + prevText: 'Iepr', + nextText: 'NÄka', + currentText: 'Å odien', + monthNames: ['JanvÄris','FebruÄris','Marts','AprÄ«lis','Maijs','JÅ«nijs', + 'JÅ«lijs','Augusts','Septembris','Oktobris','Novembris','Decembris'], + monthNamesShort: ['Jan','Feb','Mar','Apr','Mai','JÅ«n', + 'JÅ«l','Aug','Sep','Okt','Nov','Dec'], + dayNames: ['svÄ“tdiena','pirmdiena','otrdiena','treÅ¡diena','ceturtdiena','piektdiena','sestdiena'], + dayNamesShort: ['svt','prm','otr','tre','ctr','pkt','sst'], + dayNamesMin: ['Sv','Pr','Ot','Tr','Ct','Pk','Ss'], + weekHeader: 'Nav', + dateFormat: 'dd-mm-yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['lv']); +});/* Malayalam (UTF-8) initialisation for the jQuery UI date picker plugin. */ +/* Written by Saji Nediyanchath (saji89@gmail.com). */ +jQuery(function($){ + $.datepicker.regional['ml'] = { + closeText: 'ശരി', + prevText: 'à´®àµà´¨àµà´¨à´¤àµà´¤àµ†', + nextText: 'à´…à´Ÿàµà´¤àµà´¤à´¤àµ ', + currentText: 'ഇനàµà´¨àµ', + monthNames: ['ജനàµà´µà´°à´¿','ഫെബàµà´°àµà´µà´°à´¿','മാരàµâ€à´šàµà´šàµ','à´à´ªàµà´°à´¿à´²àµâ€','മേയàµ','ജൂണàµâ€', + 'ജൂലൈ','ആഗസàµà´±àµà´±àµ','സെപàµà´±àµà´±à´‚ബരàµâ€','à´’à´•àµà´Ÿàµ‹à´¬à´°àµâ€','നവംബരàµâ€','ഡിസംബരàµâ€'], + monthNamesShort: ['ജനàµ', 'ഫെബàµ', 'മാരàµâ€', 'à´à´ªàµà´°à´¿', 'മേയàµ', 'ജൂണàµâ€', + 'ജൂലാ', 'ആഗ', 'സെപàµ', 'à´’à´•àµà´Ÿàµ‹', 'നവം', 'à´¡à´¿à´¸'], + dayNames: ['ഞായരàµâ€', 'തിങàµà´•à´³àµâ€', 'ചൊവàµà´µ', 'à´¬àµà´§à´¨àµâ€', 'à´µàµà´¯à´¾à´´à´‚', 'വെളàµà´³à´¿', 'ശനി'], + dayNamesShort: ['ഞായ', 'തിങàµà´•', 'ചൊവàµà´µ', 'à´¬àµà´§', 'à´µàµà´¯à´¾à´´à´‚', 'വെളàµà´³à´¿', 'ശനി'], + dayNamesMin: ['à´žà´¾','തി','ചൊ','à´¬àµ','à´µàµà´¯à´¾','വെ','à´¶'], + weekHeader: 'à´†', + dateFormat: 'dd/mm/yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['ml']); +}); +/* Malaysian initialisation for the jQuery UI date picker plugin. */ +/* Written by Mohd Nawawi Mohamad Jamili (nawawi@ronggeng.net). */ +jQuery(function($){ + $.datepicker.regional['ms'] = { + closeText: 'Tutup', + prevText: '<Sebelum', + nextText: 'Selepas>', + currentText: 'hari ini', + monthNames: ['Januari','Februari','Mac','April','Mei','Jun', + 'Julai','Ogos','September','Oktober','November','Disember'], + monthNamesShort: ['Jan','Feb','Mac','Apr','Mei','Jun', + 'Jul','Ogo','Sep','Okt','Nov','Dis'], + dayNames: ['Ahad','Isnin','Selasa','Rabu','Khamis','Jumaat','Sabtu'], + dayNamesShort: ['Aha','Isn','Sel','Rab','kha','Jum','Sab'], + dayNamesMin: ['Ah','Is','Se','Ra','Kh','Ju','Sa'], + weekHeader: 'Mg', + dateFormat: 'dd/mm/yy', + firstDay: 0, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['ms']); +});/* Dutch (UTF-8) initialisation for the jQuery UI date picker plugin. */ +/* Written by Mathias Bynens */ +jQuery(function($){ + $.datepicker.regional.nl = { + closeText: 'Sluiten', + prevText: 'â†', + nextText: '→', + currentText: 'Vandaag', + monthNames: ['januari', 'februari', 'maart', 'april', 'mei', 'juni', + 'juli', 'augustus', 'september', 'oktober', 'november', 'december'], + monthNamesShort: ['jan', 'feb', 'maa', 'apr', 'mei', 'jun', + 'jul', 'aug', 'sep', 'okt', 'nov', 'dec'], + dayNames: ['zondag', 'maandag', 'dinsdag', 'woensdag', 'donderdag', 'vrijdag', 'zaterdag'], + dayNamesShort: ['zon', 'maa', 'din', 'woe', 'don', 'vri', 'zat'], + dayNamesMin: ['zo', 'ma', 'di', 'wo', 'do', 'vr', 'za'], + weekHeader: 'Wk', + dateFormat: 'dd-mm-yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional.nl); +});/* Norwegian initialisation for the jQuery UI date picker plugin. */ +/* Written by Naimdjon Takhirov (naimdjon@gmail.com). */ + +jQuery(function($){ + $.datepicker.regional['no'] = { + closeText: 'Lukk', + prevText: '«Forrige', + nextText: 'Neste»', + currentText: 'I dag', + monthNames: ['januar','februar','mars','april','mai','juni','juli','august','september','oktober','november','desember'], + monthNamesShort: ['jan','feb','mar','apr','mai','jun','jul','aug','sep','okt','nov','des'], + dayNamesShort: ['søn','man','tir','ons','tor','fre','lør'], + dayNames: ['søndag','mandag','tirsdag','onsdag','torsdag','fredag','lørdag'], + dayNamesMin: ['sø','ma','ti','on','to','fr','lø'], + weekHeader: 'Uke', + dateFormat: 'dd.mm.yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: '' + }; + $.datepicker.setDefaults($.datepicker.regional['no']); +}); +/* Polish initialisation for the jQuery UI date picker plugin. */ +/* Written by Jacek Wysocki (jacek.wysocki@gmail.com). */ +jQuery(function($){ + $.datepicker.regional['pl'] = { + closeText: 'Zamknij', + prevText: '<Poprzedni', + nextText: 'NastÄ™pny>', + currentText: 'DziÅ›', + monthNames: ['StyczeÅ„','Luty','Marzec','KwiecieÅ„','Maj','Czerwiec', + 'Lipiec','SierpieÅ„','WrzesieÅ„','Październik','Listopad','GrudzieÅ„'], + monthNamesShort: ['Sty','Lu','Mar','Kw','Maj','Cze', + 'Lip','Sie','Wrz','Pa','Lis','Gru'], + dayNames: ['Niedziela','PoniedziaÅ‚ek','Wtorek','Åšroda','Czwartek','PiÄ…tek','Sobota'], + dayNamesShort: ['Nie','Pn','Wt','Åšr','Czw','Pt','So'], + dayNamesMin: ['N','Pn','Wt','Åšr','Cz','Pt','So'], + weekHeader: 'Tydz', + dateFormat: 'dd.mm.yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['pl']); +}); +/* Brazilian initialisation for the jQuery UI date picker plugin. */ +/* Written by Leonildo Costa Silva (leocsilva@gmail.com). */ +jQuery(function($){ + $.datepicker.regional['pt-BR'] = { + closeText: 'Fechar', + prevText: '<Anterior', + nextText: 'Próximo>', + currentText: 'Hoje', + monthNames: ['Janeiro','Fevereiro','Març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ça-feira','Quarta-feira','Quinta-feira','Sexta-feira','Sábado'], + dayNamesShort: ['Dom','Seg','Ter','Qua','Qui','Sex','Sáb'], + dayNamesMin: ['Dom','Seg','Ter','Qua','Qui','Sex','Sáb'], + weekHeader: 'Sm', + dateFormat: 'dd/mm/yy', + firstDay: 0, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['pt-BR']); +});/* Portuguese initialisation for the jQuery UI date picker plugin. */ +jQuery(function($){ + $.datepicker.regional['pt'] = { + closeText: 'Fechar', + prevText: '<Anterior', + nextText: 'Seguinte', + currentText: 'Hoje', + monthNames: ['Janeiro','Fevereiro','Març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ça-feira','Quarta-feira','Quinta-feira','Sexta-feira','Sábado'], + dayNamesShort: ['Dom','Seg','Ter','Qua','Qui','Sex','Sáb'], + dayNamesMin: ['Dom','Seg','Ter','Qua','Qui','Sex','Sáb'], + weekHeader: 'Sem', + dateFormat: 'dd/mm/yy', + firstDay: 0, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['pt']); +});/* Romansh initialisation for the jQuery UI date picker plugin. */ +/* Written by Yvonne Gienal (yvonne.gienal@educa.ch). */ +jQuery(function($){ + $.datepicker.regional['rm'] = { + closeText: 'Serrar', + prevText: '<Suandant', + nextText: 'Precedent>', + currentText: 'Actual', + monthNames: ['Schaner','Favrer','Mars','Avrigl','Matg','Zercladur', 'Fanadur','Avust','Settember','October','November','December'], + monthNamesShort: ['Scha','Fev','Mar','Avr','Matg','Zer', 'Fan','Avu','Sett','Oct','Nov','Dec'], + dayNames: ['Dumengia','Glindesdi','Mardi','Mesemna','Gievgia','Venderdi','Sonda'], + dayNamesShort: ['Dum','Gli','Mar','Mes','Gie','Ven','Som'], + dayNamesMin: ['Du','Gl','Ma','Me','Gi','Ve','So'], + weekHeader: 'emna', + dateFormat: 'dd/mm/yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['rm']); +}); +/* Romanian initialisation for the jQuery UI date picker plugin. + * + * Written by Edmond L. (ll_edmond@walla.com) + * and Ionut G. Stan (ionut.g.stan@gmail.com) + */ +jQuery(function($){ + $.datepicker.regional['ro'] = { + closeText: 'ÃŽnchide', + prevText: '« Luna precedentă', + nextText: 'Luna următoare »', + currentText: 'Azi', + monthNames: ['Ianuarie','Februarie','Martie','Aprilie','Mai','Iunie', + 'Iulie','August','Septembrie','Octombrie','Noiembrie','Decembrie'], + monthNamesShort: ['Ian', 'Feb', 'Mar', 'Apr', 'Mai', 'Iun', + 'Iul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'], + dayNames: ['Duminică', 'Luni', 'MarÅ£i', 'Miercuri', 'Joi', 'Vineri', 'Sâmbătă'], + dayNamesShort: ['Dum', 'Lun', 'Mar', 'Mie', 'Joi', 'Vin', 'Sâm'], + dayNamesMin: ['Du','Lu','Ma','Mi','Jo','Vi','Sâ'], + weekHeader: 'Săpt', + dateFormat: 'dd.mm.yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['ro']); +}); +/* Russian (UTF-8) initialisation for the jQuery UI date picker plugin. */ +/* Written by Andrew Stromnov (stromnov@gmail.com). */ +jQuery(function($){ + $.datepicker.regional['ru'] = { + closeText: 'Закрыть', + prevText: '<Пред', + nextText: 'След>', + currentText: 'СегоднÑ', + monthNames: ['Январь','Февраль','Март','Ðпрель','Май','Июнь', + 'Июль','ÐвгуÑÑ‚','СентÑбрь','ОктÑбрь','ÐоÑбрь','Декабрь'], + monthNamesShort: ['Янв','Фев','Мар','Ðпр','Май','Июн', + 'Июл','Ðвг','Сен','Окт','ÐоÑ','Дек'], + dayNames: ['воÑкреÑенье','понедельник','вторник','Ñреда','четверг','пÑтница','Ñуббота'], + dayNamesShort: ['вÑк','пнд','втр','Ñрд','чтв','птн','Ñбт'], + dayNamesMin: ['Ð’Ñ','Пн','Ð’Ñ‚','Ср','Чт','Пт','Сб'], + weekHeader: 'Ðед', + dateFormat: 'dd.mm.yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['ru']); +});/* Slovak initialisation for the jQuery UI date picker plugin. */ +/* Written by Vojtech Rinik (vojto@hmm.sk). */ +jQuery(function($){ + $.datepicker.regional['sk'] = { + closeText: 'ZavrieÅ¥', + prevText: '<Predchádzajúci', + nextText: 'Nasledujúci>', + currentText: 'Dnes', + monthNames: ['Január','Február','Marec','Apríl','Máj','Jún', + 'Júl','August','September','Október','November','December'], + monthNamesShort: ['Jan','Feb','Mar','Apr','Máj','Jún', + 'Júl','Aug','Sep','Okt','Nov','Dec'], + dayNames: ['Nedeľa','Pondelok','Utorok','Streda','Å tvrtok','Piatok','Sobota'], + dayNamesShort: ['Ned','Pon','Uto','Str','Å tv','Pia','Sob'], + dayNamesMin: ['Ne','Po','Ut','St','Å t','Pia','So'], + weekHeader: 'Ty', + dateFormat: 'dd.mm.yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['sk']); +}); +/* Slovenian initialisation for the jQuery UI date picker plugin. */ +/* Written by Jaka Jancar (jaka@kubje.org). */ +/* c = č, s = š z = ž C = Č S = Š Z = Ž */ +jQuery(function($){ + $.datepicker.regional['sl'] = { + closeText: 'Zapri', + prevText: '<Prejšnji', + nextText: 'Naslednji>', + currentText: 'Trenutni', + monthNames: ['Januar','Februar','Marec','April','Maj','Junij', + 'Julij','Avgust','September','Oktober','November','December'], + monthNamesShort: ['Jan','Feb','Mar','Apr','Maj','Jun', + 'Jul','Avg','Sep','Okt','Nov','Dec'], + dayNames: ['Nedelja','Ponedeljek','Torek','Sreda','Četrtek','Petek','Sobota'], + dayNamesShort: ['Ned','Pon','Tor','Sre','Čet','Pet','Sob'], + dayNamesMin: ['Ne','Po','To','Sr','Če','Pe','So'], + weekHeader: 'Teden', + dateFormat: 'dd.mm.yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['sl']); +}); +/* Albanian initialisation for the jQuery UI date picker plugin. */ +/* Written by Flakron Bytyqi (flakron@gmail.com). */ +jQuery(function($){ + $.datepicker.regional['sq'] = { + closeText: 'mbylle', + prevText: '<mbrapa', + nextText: 'Përpara>', + currentText: 'sot', + monthNames: ['Janar','Shkurt','Mars','Prill','Maj','Qershor', + 'Korrik','Gusht','Shtator','Tetor','Nëntor','Dhjetor'], + monthNamesShort: ['Jan','Shk','Mar','Pri','Maj','Qer', + 'Kor','Gus','Sht','Tet','Nën','Dhj'], + dayNames: ['E Diel','E Hënë','E Martë','E Mërkurë','E Enjte','E Premte','E Shtune'], + dayNamesShort: ['Di','Hë','Ma','Më','En','Pr','Sh'], + dayNamesMin: ['Di','Hë','Ma','Më','En','Pr','Sh'], + weekHeader: 'Ja', + dateFormat: 'dd.mm.yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['sq']); +}); +/* Serbian i18n for the jQuery UI date picker plugin. */ +/* Written by Dejan Dimić. */ +jQuery(function($){ + $.datepicker.regional['sr-SR'] = { + closeText: 'Zatvori', + prevText: '<', + nextText: '>', + currentText: 'Danas', + monthNames: ['Januar','Februar','Mart','April','Maj','Jun', + 'Jul','Avgust','Septembar','Oktobar','Novembar','Decembar'], + monthNamesShort: ['Jan','Feb','Mar','Apr','Maj','Jun', + 'Jul','Avg','Sep','Okt','Nov','Dec'], + dayNames: ['Nedelja','Ponedeljak','Utorak','Sreda','ÄŒetvrtak','Petak','Subota'], + dayNamesShort: ['Ned','Pon','Uto','Sre','ÄŒet','Pet','Sub'], + dayNamesMin: ['Ne','Po','Ut','Sr','ÄŒe','Pe','Su'], + weekHeader: 'Sed', + dateFormat: 'dd/mm/yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['sr-SR']); +}); +/* Serbian i18n for the jQuery UI date picker plugin. */ +/* Written by Dejan Dimić. */ +jQuery(function($){ + $.datepicker.regional['sr'] = { + closeText: 'Затвори', + prevText: '<', + nextText: '>', + currentText: 'ДанаÑ', + monthNames: ['Јануар','Фебруар','Март','Ðприл','Мај','Јун', + 'Јул','ÐвгуÑÑ‚','Септембар','Октобар','Ðовембар','Децембар'], + monthNamesShort: ['Јан','Феб','Мар','Ðпр','Мај','Јун', + 'Јул','Ðвг','Сеп','Окт','Ðов','Дец'], + dayNames: ['Ðедеља','Понедељак','Уторак','Среда','Четвртак','Петак','Субота'], + dayNamesShort: ['Ðед','Пон','Уто','Сре','Чет','Пет','Суб'], + dayNamesMin: ['Ðе','По','Ут','Ср','Че','Пе','Су'], + weekHeader: 'Сед', + dateFormat: 'dd/mm/yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['sr']); +}); +/* Swedish initialisation for the jQuery UI date picker plugin. */ +/* Written by Anders Ekdahl ( anders@nomadiz.se). */ +jQuery(function($){ + $.datepicker.regional['sv'] = { + closeText: 'Stäng', + prevText: '«Förra', + nextText: 'Nästa»', + currentText: 'Idag', + 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'], + dayNamesShort: ['Sön','MÃ¥n','Tis','Ons','Tor','Fre','Lör'], + dayNames: ['Söndag','MÃ¥ndag','Tisdag','Onsdag','Torsdag','Fredag','Lördag'], + dayNamesMin: ['Sö','MÃ¥','Ti','On','To','Fr','Lö'], + weekHeader: 'Ve', + dateFormat: 'yy-mm-dd', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['sv']); +}); +/* Tamil (UTF-8) initialisation for the jQuery UI date picker plugin. */ +/* Written by S A Sureshkumar (saskumar@live.com). */ +jQuery(function($){ + $.datepicker.regional['ta'] = { + closeText: 'மூடà¯', + prevText: 'à®®à¯à®©à¯à®©à¯ˆà®¯à®¤à¯', + nextText: 'அடà¯à®¤à¯à®¤à®¤à¯', + currentText: 'இனà¯à®±à¯', + monthNames: ['தை','மாசி','பஙà¯à®•à¯à®©à®¿','சிதà¯à®¤à®¿à®°à¯ˆ','வைகாசி','ஆனி', + 'ஆடி','ஆவணி','பà¯à®°à®Ÿà¯à®Ÿà®¾à®šà®¿','à®à®ªà¯à®ªà®šà®¿','காரà¯à®¤à¯à®¤à®¿à®•à¯ˆ','மாரà¯à®•à®´à®¿'], + monthNamesShort: ['தை','மாசி','பஙà¯','சிதà¯','வைகா','ஆனி', + 'ஆடி','ஆவ','பà¯à®°','à®à®ªà¯','காரà¯','மாரà¯'], + dayNames: ['ஞாயிறà¯à®±à¯à®•à¯à®•à®¿à®´à®®à¯ˆ','திஙà¯à®•à®Ÿà¯à®•à®¿à®´à®®à¯ˆ','செவà¯à®µà®¾à®¯à¯à®•à¯à®•à®¿à®´à®®à¯ˆ','பà¯à®¤à®©à¯à®•à®¿à®´à®®à¯ˆ','வியாழகà¯à®•à®¿à®´à®®à¯ˆ','வெளà¯à®³à®¿à®•à¯à®•à®¿à®´à®®à¯ˆ','சனிகà¯à®•à®¿à®´à®®à¯ˆ'], + dayNamesShort: ['ஞாயிறà¯','திஙà¯à®•à®³à¯','செவà¯à®µà®¾à®¯à¯','பà¯à®¤à®©à¯','வியாழனà¯','வெளà¯à®³à®¿','சனி'], + dayNamesMin: ['ஞா','தி','செ','பà¯','வி','வெ','ச'], + weekHeader: 'Ðе', + dateFormat: 'dd/mm/yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['ta']); +}); +/* Thai initialisation for the jQuery UI date picker plugin. */ +/* Written by pipo (pipo@sixhead.com). */ +jQuery(function($){ + $.datepicker.regional['th'] = { + closeText: 'ปิด', + prevText: '« à¸¢à¹‰à¸­à¸™', + nextText: 'ถัดไป »', + currentText: 'วันนี้', + monthNames: ['มà¸à¸£à¸²à¸„ม','à¸à¸¸à¸¡à¸ à¸²à¸žà¸±à¸™à¸˜à¹Œ','มีนาคม','เมษายน','พฤษภาคม','มิถุนายน', + 'à¸à¸£à¸à¸Žà¸²à¸„ม','สิงหาคม','à¸à¸±à¸™à¸¢à¸²à¸¢à¸™','ตุลาคม','พฤศจิà¸à¸²à¸¢à¸™','ธันวาคม'], + monthNamesShort: ['ม.ค.','à¸.พ.','มี.ค.','เม.ย.','พ.ค.','มิ.ย.', + 'à¸.ค.','ส.ค.','à¸.ย.','ต.ค.','พ.ย.','ธ.ค.'], + dayNames: ['อาทิตย์','จันทร์','อังคาร','พุธ','พฤหัสบดี','ศุà¸à¸£à¹Œ','เสาร์'], + dayNamesShort: ['อา.','จ.','อ.','พ.','พฤ.','ศ.','ส.'], + dayNamesMin: ['อา.','จ.','อ.','พ.','พฤ.','ศ.','ส.'], + weekHeader: 'Wk', + dateFormat: 'dd/mm/yy', + firstDay: 0, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['th']); +});/* Tajiki (UTF-8) initialisation for the jQuery UI date picker plugin. */ +/* Written by Abdurahmon Saidov (saidovab@gmail.com). */ +jQuery(function($){ + $.datepicker.regional['tj'] = { + closeText: 'Идома', + prevText: '<Қафо', + nextText: 'Пеш>', + currentText: 'Имрӯз', + monthNames: ['Январ','Феврал','Март','Ðпрел','Май','Июн', + 'Июл','ÐвгуÑÑ‚','СентÑбр','ОктÑбр','ÐоÑбр','Декабр'], + monthNamesShort: ['Янв','Фев','Мар','Ðпр','Май','Июн', + 'Июл','Ðвг','Сен','Окт','ÐоÑ','Дек'], + dayNames: ['Ñкшанбе','душанбе','Ñешанбе','чоршанбе','панҷшанбе','ҷумъа','шанбе'], + dayNamesShort: ['Ñкш','душ','Ñеш','чор','пан','ҷум','шан'], + dayNamesMin: ['Як','Дш','Сш','Чш','Пш','Ҷм','Шн'], + weekHeader: 'Хф', + dateFormat: 'dd.mm.yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['tj']); +});/* Turkish initialisation for the jQuery UI date picker plugin. */ +/* Written by Izzet Emre Erkan (kara@karalamalar.net). */ +jQuery(function($){ + $.datepicker.regional['tr'] = { + closeText: 'kapat', + prevText: '<geri', + nextText: 'ileri>', + currentText: 'bugün', + monthNames: ['Ocak','Åžubat','Mart','Nisan','Mayıs','Haziran', + 'Temmuz','AÄŸustos','Eylül','Ekim','Kasım','Aralık'], + monthNamesShort: ['Oca','Åžub','Mar','Nis','May','Haz', + 'Tem','AÄŸu','Eyl','Eki','Kas','Ara'], + dayNames: ['Pazar','Pazartesi','Salı','ÇarÅŸamba','PerÅŸembe','Cuma','Cumartesi'], + dayNamesShort: ['Pz','Pt','Sa','Ça','Pe','Cu','Ct'], + dayNamesMin: ['Pz','Pt','Sa','Ça','Pe','Cu','Ct'], + weekHeader: 'Hf', + dateFormat: 'dd.mm.yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['tr']); +});/* Ukrainian (UTF-8) initialisation for the jQuery UI date picker plugin. */ +/* Written by Maxim Drogobitskiy (maxdao@gmail.com). */ +jQuery(function($){ + $.datepicker.regional['uk'] = { + closeText: 'Закрити', + prevText: '<', + nextText: '>', + currentText: 'Сьогодні', + monthNames: ['Січень','Лютий','Березень','Квітень','Травень','Червень', + 'Липень','Серпень','ВереÑень','Жовтень','ЛиÑтопад','Грудень'], + monthNamesShort: ['Січ','Лют','Бер','Кві','Тра','Чер', + 'Лип','Сер','Вер','Жов','ЛиÑ','Гру'], + dayNames: ['неділÑ','понеділок','вівторок','Ñереда','четвер','п’ÑтницÑ','Ñубота'], + dayNamesShort: ['нед','пнд','вів','Ñрд','чтв','птн','Ñбт'], + dayNamesMin: ['Ðд','Пн','Ð’Ñ‚','Ср','Чт','Пт','Сб'], + weekHeader: 'Ðе', + dateFormat: 'dd/mm/yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['uk']); +});/* Vietnamese initialisation for the jQuery UI date picker plugin. */ +/* Translated by Le Thanh Huy (lthanhhuy@cit.ctu.edu.vn). */ +jQuery(function($){ + $.datepicker.regional['vi'] = { + closeText: 'Äóng', + prevText: '<TrÆ°á»›c', + nextText: 'Tiếp>', + currentText: 'Hôm nay', + monthNames: ['Tháng Má»™t', 'Tháng Hai', 'Tháng Ba', 'Tháng TÆ°', 'Tháng Năm', 'Tháng Sáu', + 'Tháng Bảy', 'Tháng Tám', 'Tháng Chín', 'Tháng MÆ°á»i', 'Tháng MÆ°á»i Má»™t', 'Tháng MÆ°á»i Hai'], + monthNamesShort: ['Tháng 1', 'Tháng 2', 'Tháng 3', 'Tháng 4', 'Tháng 5', 'Tháng 6', + 'Tháng 7', 'Tháng 8', 'Tháng 9', 'Tháng 10', 'Tháng 11', 'Tháng 12'], + dayNames: ['Chủ Nhật', 'Thứ Hai', 'Thứ Ba', 'Thứ TÆ°', 'Thứ Năm', 'Thứ Sáu', 'Thứ Bảy'], + dayNamesShort: ['CN', 'T2', 'T3', 'T4', 'T5', 'T6', 'T7'], + dayNamesMin: ['CN', 'T2', 'T3', 'T4', 'T5', 'T6', 'T7'], + weekHeader: 'Tu', + dateFormat: 'dd/mm/yy', + firstDay: 0, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['vi']); +}); +/* Chinese initialisation for the jQuery UI date picker plugin. */ +/* Written by Cloudream (cloudream@gmail.com). */ +jQuery(function($){ + $.datepicker.regional['zh-CN'] = { + closeText: '关闭', + prevText: '<上月', + nextText: '下月>', + currentText: '今天', + monthNames: ['一月','二月','三月','四月','五月','六月', + '七月','八月','ä¹æœˆ','å月','å一月','å二月'], + monthNamesShort: ['一','二','三','å››','五','å…­', + '七','å…«','ä¹','å','å一','å二'], + dayNames: ['星期日','星期一','星期二','星期三','星期四','星期五','星期六'], + dayNamesShort: ['周日','周一','周二','周三','周四','周五','周六'], + dayNamesMin: ['æ—¥','一','二','三','å››','五','å…­'], + weekHeader: '周', + dateFormat: 'yy-mm-dd', + firstDay: 1, + isRTL: false, + showMonthAfterYear: true, + yearSuffix: 'å¹´'}; + $.datepicker.setDefaults($.datepicker.regional['zh-CN']); +}); +/* Chinese initialisation for the jQuery UI date picker plugin. */ +/* Written by SCCY (samuelcychan@gmail.com). */ +jQuery(function($){ + $.datepicker.regional['zh-HK'] = { + closeText: '關閉', + prevText: '<上月', + nextText: '下月>', + currentText: '今天', + monthNames: ['一月','二月','三月','四月','五月','六月', + '七月','八月','ä¹æœˆ','å月','å一月','å二月'], + monthNamesShort: ['一','二','三','å››','五','å…­', + '七','å…«','ä¹','å','å一','å二'], + dayNames: ['星期日','星期一','星期二','星期三','星期四','星期五','星期六'], + dayNamesShort: ['周日','周一','周二','周三','周四','周五','周六'], + dayNamesMin: ['æ—¥','一','二','三','å››','五','å…­'], + weekHeader: '周', + dateFormat: 'dd-mm-yy', + firstDay: 0, + isRTL: false, + showMonthAfterYear: true, + yearSuffix: 'å¹´'}; + $.datepicker.setDefaults($.datepicker.regional['zh-HK']); +}); +/* Chinese initialisation for the jQuery UI date picker plugin. */ +/* Written by Ressol (ressol@gmail.com). */ +jQuery(function($){ + $.datepicker.regional['zh-TW'] = { + closeText: '關閉', + prevText: '<上月', + nextText: '下月>', + currentText: '今天', + monthNames: ['一月','二月','三月','四月','五月','六月', + '七月','八月','ä¹æœˆ','å月','å一月','å二月'], + monthNamesShort: ['一','二','三','å››','五','å…­', + '七','å…«','ä¹','å','å一','å二'], + dayNames: ['星期日','星期一','星期二','星期三','星期四','星期五','星期六'], + dayNamesShort: ['周日','周一','周二','周三','周四','周五','周六'], + dayNamesMin: ['æ—¥','一','二','三','å››','五','å…­'], + weekHeader: '周', + dateFormat: 'yy/mm/dd', + firstDay: 1, + isRTL: false, + showMonthAfterYear: true, + yearSuffix: 'å¹´'}; + $.datepicker.setDefaults($.datepicker.regional['zh-TW']); +}); diff --git a/webui/view/javascript/jquery.dropdownPlain.js b/webui/view/javascript/jquery.dropdownPlain.js new file mode 100644 index 00000000..d0000a6d --- /dev/null +++ b/webui/view/javascript/jquery.dropdownPlain.js @@ -0,0 +1,17 @@ +$(function(){ + + $("ul.dropdown li").hover(function(){ + + $(this).addClass("hover"); + $('ul:first',this).css('visibility', 'visible'); + + }, function(){ + + $(this).removeClass("hover"); + $('ul:first',this).css('visibility', 'hidden'); + + }); + +}); + + diff --git a/webui/view/javascript/piler.js b/webui/view/javascript/piler.js new file mode 100644 index 00000000..6b0e601a --- /dev/null +++ b/webui/view/javascript/piler.js @@ -0,0 +1,353 @@ + +var attachment_types = ["word", "excel", "powerpoint", "pdf", "compressed", "text", "odf", "vcard", "image", "audio", "video", "flash", "other"]; +var count = 0; + +function getXMLHttp() { + var XMLHttp = null; + + if(window.XMLHttpRequest) { + try { + XMLHttp = new XMLHttpRequest(); + } catch(e) { } + } + else if(window.ActiveXObject) { + try { + XMLHttp = new ActiveXObject("Msxml2.XMLHTTP"); + } catch (e) { + try { + XMLHttp = new ActiveXObject("Microsoft.XMLHTTP"); + } catch(e) { } + } + } + + return XMLHttp; +} + + +function loadHealth() { + + var http = getXMLHttp(); + + if(http == null) { alert("Error creating XMLHttpRequest"); return; } + + http.onreadystatechange = function() { + if(http.readyState == 4) { + if(http.status == 200) document.getElementById('A1').innerHTML = http.responseText; + else alert("Problem retrieving XML data:" + http.statusText); + } + } + + http.open("GET", health_worker_url, true); + http.send(null); + + document.body.style.cursor = 'default'; +} + + +function load_ajax_url(url) { + + var http = getXMLHttp(); + + if(http == null) { alert("Error creating XMLHttpRequest"); return; } + + http.onreadystatechange = function() { + if(http.readyState == 4) { + if(http.status == 200) document.getElementById('A1').innerHTML = http.responseText; + else alert("Problem retrieving XML data:" + http.statusText); + } + } + + http.open("GET", url, true); + http.send(null); + + document.body.style.cursor = 'default'; + +} + + +function load_search_results(url, params, page) { + + document.getElementById('AS').innerHTML = '
    spinner
    '; + + var http = getXMLHttp(); + + if(http == null) { alert("Error creating XMLHttpRequest"); return; } + + http.open("POST", url, true); + + params = params + "&page=" + page; + + http.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); + http.setRequestHeader("Content-length", params.length); + http.setRequestHeader("Connection", "close"); + + + http.onreadystatechange = function() { + if(http.readyState == 4) { + if(http.status == 200) { + document.getElementById('AS').innerHTML = http.responseText; + + $(".messagelink").colorbox({iframe:true, width:"80%", height:"80%" }); + + } + else { + alert("Problem retrieving XML data:" + http.statusText); + } + } + } + + http.send(params); +} + + +function send_ajax_post_request(url, params, id) { + var http = getXMLHttp(); + + if(http == null) { alert("Error creating XMLHttpRequest"); return; } + + http.open("POST", url, true); + + http.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); + http.setRequestHeader("Content-length", params.length); + http.setRequestHeader("Connection", "close"); + + + http.onreadystatechange = function() { + if(http.readyState == 4) { + if(http.status == 200) { + document.getElementById(id).innerHTML = http.responseText; + } + else { + alert("Problem retrieving XML data:" + http.statusText); + } + } + } + + http.send(params); +} + + +function assemble_search_term(n) { + var data = ''; + var attachment_type = ''; + var e; + + e = document.getElementById('searchtype'); + if(e && e.value) { data = data + "searchtype=" + e.value; } + + e = document.getElementById('_search'); + if(e && e.value) { data = data + "&search=" + e.value; } + + e = document.getElementById('from'); + if(e && e.value) { data = data + "&from=" + e.value; } + + e = document.getElementById('to'); + if(e && e.value) { data = data + "&to=" + e.value; } + + e = document.getElementById('subject'); + if(e && e.value) { data = data + "&subject=" + e.value; } + + + for(i=0; i<=n; i++) { + var a = 'key' + i; + var b = 'val' + i; + + e = document.getElementById(b); + + if(e && document.getElementById(b).value) { + if(data) data = data + "&f%5B%5D=" + document.getElementById(a).value + "&v%5B%5D=" + encodeURI(document.getElementById(b).value); + else data = "f%5B%5D=" + document.getElementById(a).value + "&v%5B%5D=" + encodeURI(document.getElementById(b).value); + + } + + } + + e = document.getElementById('date1'); + if(e && e.value) { data = data + "&date1=" + e.value; } + + e = document.getElementById('date2'); + if(e && e.value) { data = data + "&date2=" + e.value; } + + e = document.getElementById('direction'); + if(e && e.value) { data = data + "&direction=" + e.value; } + + e = document.getElementById('action'); + if(e && e.value) { data = data + "&action=" + e.value; } + + for(i=0; i0;i--) { removeme('myid' + i); } + + a = document.getElementById('date1'); a.value = ''; + a = document.getElementById('date2'); a.value = ''; + + for(i=0; i' + + '
    ' + + ' ' + + '
    ' + + '
    ' + + ' ' + + ' ' + + '
    ' + + ''; + + + var a = document.getElementById('myid'); + a.appendChild(newdiv); +} + + +function addauditblock(key, val, t_user, t_ipaddr, t_ref) { + var user_selected = ipaddr_selected = ref_selected = ''; + + if(key == 'user') { user_selected = ' selected="selected"'; } + if(key == 'ipaddr') { ipaddr_selected = ' selected="selected"'; } + if(key == 'ref') { ref_selected = ' selected="selected"'; } + + count++; + + var divid = 'myid' + count; + + var newdiv = document.createElement('div'); + + newdiv.setAttribute('id', divid); + + newdiv.innerHTML = '
    ' + + '
    ' + + ' ' + + '
    ' + + '
    ' + + ' ' + + ' ' + + '
    ' + + '
    '; + + + var a = document.getElementById('myid'); + a.appendChild(newdiv); +} + + +function removeme(id) { + var a = document.getElementById('myid'); + if(a.childNodes.length <= 3) return; + + var ele = document.getElementById(id); + if(ele) ele.parentNode.removeChild(ele); +} + + +$(document).ready(function() { + $.datepicker.setDefaults($.datepicker.regional[piler_ui_lang]); + $("#date1").datepicker( { dateFormat: 'yy-mm-dd' } ); + $("#date2").datepicker( { dateFormat: 'yy-mm-dd' } ); + + + $(".messagelink").colorbox({iframe:true, width:"80%", height:"80%" }); + $(".savedsearch").colorbox({iframe:true, width:"400px", height:"300px", top:"50px", left:"50%"}); + + }); + + diff --git a/webui/view/javascript/tip_balloon.js b/webui/view/javascript/tip_balloon.js new file mode 100644 index 00000000..b2cb069e --- /dev/null +++ b/webui/view/javascript/tip_balloon.js @@ -0,0 +1,221 @@ +/* +tip_balloon.js v. 1.81 + +The latest version is available at +http://www.walterzorn.com +or http://www.devira.com +or http://www.walterzorn.de + +Initial author: Walter Zorn +Last modified: 2.2.2009 + +Extension for the tooltip library wz_tooltip.js. +Implements balloon tooltips. +*/ + +// Make sure that the core file wz_tooltip.js is included first +if(typeof config == "undefined") + alert("Error:\nThe core tooltip script file 'wz_tooltip.js' must be included first, before the plugin files!"); + +// Here we define new global configuration variable(s) (as members of the +// predefined "config." class). +// From each of these config variables, wz_tooltip.js will automatically derive +// a command which can be passed to Tip() or TagToTip() in order to customize +// tooltips individually. These command names are just the config variable +// name(s) translated to uppercase, +// e.g. from config. Balloon a command BALLOON will automatically be +// created. + +//=================== GLOBAL TOOLTIP CONFIGURATION =========================// +config. Balloon = false // true or false - set to true if you want this to be the default behaviour +config. BalloonImgPath = "view/javascript/tip_balloon/" // Path to images (border, corners, stem), in quotes. Path must be relative to your HTML file. +// Sizes of balloon images +config. BalloonEdgeSize = 6 // Integer - sidelength of quadratic corner images +config. BalloonStemWidth = 15 // Integer +config. BalloonStemHeight = 19 // Integer +config. BalloonStemOffset = -7 // Integer - horizontal offset of left stem edge from mouse (recommended: -stemwidth/2 to center the stem above the mouse) +config. BalloonImgExt = "gif";// File name extension of default balloon images, e.g. "gif" or "png" +//======= END OF TOOLTIP CONFIG, DO NOT CHANGE ANYTHING BELOW ==============// + + +// Create a new tt_Extension object (make sure that the name of that object, +// here balloon, is unique amongst the extensions available for wz_tooltips.js): +var balloon = new tt_Extension(); + +// Implement extension eventhandlers on which our extension should react + +balloon.OnLoadConfig = function() +{ + if(tt_aV[BALLOON]) + { + // Turn off native style properties which are not appropriate + balloon.padding = Math.max(tt_aV[PADDING] - tt_aV[BALLOONEDGESIZE], 0); + balloon.width = tt_aV[WIDTH]; + //if(tt_bBoxOld) + // balloon.width += (balloon.padding << 1); + tt_aV[BORDERWIDTH] = 0; + tt_aV[WIDTH] = 0; + tt_aV[PADDING] = 0; + tt_aV[BGCOLOR] = ""; + tt_aV[BGIMG] = ""; + tt_aV[SHADOW] = false; + // Append slash to img path if missing + if(tt_aV[BALLOONIMGPATH].charAt(tt_aV[BALLOONIMGPATH].length - 1) != '/') + tt_aV[BALLOONIMGPATH] += "/"; + return true; + } + return false; +}; +balloon.OnCreateContentString = function() +{ + if(!tt_aV[BALLOON]) + return false; + + var aImg, sImgZ, sCssCrn, sVaT, sVaB, sCss0; + + // Cache balloon images in advance: + // Either use the pre-cached default images... + if(tt_aV[BALLOONIMGPATH] == config.BalloonImgPath) + aImg = balloon.aDefImg; + // ...or load images from different directory + else + aImg = Balloon_CacheImgs(tt_aV[BALLOONIMGPATH], tt_aV[BALLOONIMGEXT]); + sCss0 = 'padding:0;margin:0;border:0;line-height:0;overflow:hidden;'; + sCssCrn = ' style="position:relative;width:' + tt_aV[BALLOONEDGESIZE] + 'px;' + sCss0 + 'overflow:hidden;'; + sVaT = 'vertical-align:top;" valign="top"'; + sVaB = 'vertical-align:bottom;" valign="bottom"'; + sImgZ = '" style="' + sCss0 + '" />'; + + tt_sContent = '' + // Left-top corner + + '' + + '' + + '' + + '
    ' + + '
    ' + + '' + // Right-top corner + + '' + + '' + // Redundant image for bugous old Geckos which won't auto-expand TD height to 100% + + '' + tt_sContent + '' + // Right border + + '
    ' + // Right-bottom corner + + '' + + ' -balloon.width + iAdd) + bdy.style.width = (-balloon.width + iAdd) + "px"; + } +} +// This mechanism pre-caches the default images specified by +// congif.BalloonImgPath, so, whenever a balloon tip using these default images +// is created, no further server connection is necessary. +function Balloon_PreCacheDefImgs() +{ + // Append slash to img path if missing + if(config.BalloonImgPath.charAt(config.BalloonImgPath.length - 1) != '/') + config.BalloonImgPath += "/"; + // Preload default images into array + balloon.aDefImg = Balloon_CacheImgs(config.BalloonImgPath, config.BalloonImgExt); +} +Balloon_PreCacheDefImgs(); diff --git a/webui/view/javascript/tip_balloon/b.gif b/webui/view/javascript/tip_balloon/b.gif new file mode 100644 index 0000000000000000000000000000000000000000..ff0c04b25026303e67ec8673797925a00dcea3e5 GIT binary patch literal 46 rcmZ?wbhEHbWMp7tn8*ME|9_tW(+oNw3M9_J!OpEDVe+EDY8Fs-Fdb literal 0 HcmV?d00001 diff --git a/webui/view/javascript/tip_balloon/l.gif b/webui/view/javascript/tip_balloon/l.gif new file mode 100644 index 0000000000000000000000000000000000000000..14a68d93d294649fc6b2f8c5d87d302c1b3be1a9 GIT binary patch literal 46 rcmZ?wbhEHbWMg1tn8*ME|9_tW(+oNw3M9_J!Opfia{Qv)-0R|L*vT!mmurTO=1VCyTIHVYu fIV2nk7#JB?d6^_UCLC~Vfia{Qv)-0R|L*vT!mmurTO=1VCyTIHVak gIYcB96c`woSd?T88V)$M@ktu-C^$T7Xkf4g0MkMg7XSbN literal 0 HcmV?d00001 diff --git a/webui/view/javascript/tip_balloon/r.gif b/webui/view/javascript/tip_balloon/r.gif new file mode 100644 index 0000000000000000000000000000000000000000..be041ff92be8fe421efe9e77f672d9ca35505e52 GIT binary patch literal 46 rcmZ?wbhEHbWMg1tn8*ME|9_tW(+oNw3M9_J!Opfia{Qv)-0R|L*vT!mmurTO=1VCyTIHVca gIb;+R4jf=);NTIN5TM}9#3G^ABEhieXaj>a0O0HtRR910 literal 0 HcmV?d00001 diff --git a/webui/view/javascript/tip_balloon/rt.gif b/webui/view/javascript/tip_balloon/rt.gif new file mode 100644 index 0000000000000000000000000000000000000000..2752a0ccb5da339688777e9a888eda583e2662e5 GIT binary patch literal 85 zcmZ?wbhEHbWMg1sSj4~(6XjW3mArG?l>fia{Qv)-0R|L*vT!mmurTO=1VCyTIHVYu d1tcs2fP5Bq9s`SjhfXbg><%Rw3Jwko)&RUN67T>3 literal 0 HcmV?d00001 diff --git a/webui/view/javascript/tip_balloon/stemb.gif b/webui/view/javascript/tip_balloon/stemb.gif new file mode 100644 index 0000000000000000000000000000000000000000..92f2ad5153515817faffc2709325ca16a1bbd130 GIT binary patch literal 165 zcmZ?wbhEHb;YutRe;u8x}Y+v$AkV6l{3Nz{t)dkP$J#p@Es5jb(v{!2yOIb_SlD2nL1|%-ouG zHY+DCIzCy^T}+2lSk<{%J8_%Ik4?)?%v8(1r88smGe2hA)_+ShMUqb~a*9^V)iTNm PULG(z>ko&q0)sUG4*@pV literal 0 HcmV?d00001 diff --git a/webui/view/javascript/tip_balloon/stemt.gif b/webui/view/javascript/tip_balloon/stemt.gif new file mode 100644 index 0000000000000000000000000000000000000000..d259a4aec530a01e55e9ae13489d71b5673bc832 GIT binary patch literal 167 zcmZ?wbhEHb-NO{2VeC3I`e*IfS_+6ciR7W@g}GsOZ?RfU#MGRnO#rf$|Y1HkGt384n&EY?t;f ztC854a-x&ZbJvj-1r6R)d4;#_(cF~OFx%KaYYXR;WWPr1#&0$Xn>EfduypNG5qRL> RwbFvM;Yie`hK2?PYXGl-JXQbz literal 0 HcmV?d00001 diff --git a/webui/view/javascript/tip_balloon/t.gif b/webui/view/javascript/tip_balloon/t.gif new file mode 100644 index 0000000000000000000000000000000000000000..6fec86f81a20ed7a511b40c85d3fa2a918ed7d0e GIT binary patch literal 46 rcmZ?wbhEHbWMp7tn8*ME|9_tW(+oNw3M9_J!Op section, and invoke +Tip('Tooltip text') to show and UnTip() to hide the tooltip, from the desired +HTML eventhandlers. Example: +My home page +No container DIV required. +By default, width and height of tooltips are automatically adapted to content. +Is even capable of dynamically converting arbitrary HTML elements to tooltips +by calling TagToTip('ID_of_HTML_element_to_be_converted') instead of Tip(), +which means you can put important, search-engine-relevant stuff into tooltips. +Appearance & behaviour of tooltips can be individually configured +via commands passed to Tip() or TagToTip(). + +Tab Width: 4 +LICENSE: LGPL + +This library is free software; you can redistribute it and/or +modify it under the terms of the GNU Lesser General Public +License (LGPL) as published by the Free Software Foundation; either +version 2.1 of the License, or (at your option) any later version. + +This library is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +For more details on the GNU Lesser General Public License, +see http://www.gnu.org/copyleft/lesser.html +*/ + +var config = new Object(); + + +//=================== GLOBAL TOOLTIP CONFIGURATION =========================// +var tt_Debug = true // false or true - recommended: false once you release your page to the public +var tt_Enabled = true // Allows to (temporarily) suppress tooltips, e.g. by providing the user with a button that sets this global variable to false +var TagsToTip = true // false or true - if true, HTML elements to be converted to tooltips via TagToTip() are automatically hidden; + // if false, you should hide those HTML elements yourself + +// For each of the following config variables there exists a command, which is +// just the variablename in uppercase, to be passed to Tip() or TagToTip() to +// configure tooltips individually. Individual commands override global +// configuration. Order of commands is arbitrary. +// Example: onmouseover="Tip('Tooltip text', LEFT, true, BGCOLOR, '#FF9900', FADEIN, 400)" + +config. Above = false // false or true - tooltip above mousepointer +config. BgColor = '#E2E7FF' // Background colour (HTML colour value, in quotes) +config. BgImg = '' // Path to background image, none if empty string '' +config. BorderColor = '#003099' +config. BorderStyle = 'solid' // Any permitted CSS value, but I recommend 'solid', 'dotted' or 'dashed' +config. BorderWidth = 1 +config. CenterMouse = false // false or true - center the tip horizontally below (or above) the mousepointer +config. ClickClose = false // false or true - close tooltip if the user clicks somewhere +config. ClickSticky = false // false or true - make tooltip sticky if user left-clicks on the hovered element while the tooltip is active +config. CloseBtn = false // false or true - closebutton in titlebar +config. CloseBtnColors = ['#990000', '#FFFFFF', '#DD3333', '#FFFFFF'] // [Background, text, hovered background, hovered text] - use empty strings '' to inherit title colours +config. CloseBtnText = ' X ' // Close button text (may also be an image tag) +config. CopyContent = true // When converting a HTML element to a tooltip, copy only the element's content, rather than converting the element by its own +config. Delay = 400 // Time span in ms until tooltip shows up +config. Duration = 0 // Time span in ms after which the tooltip disappears; 0 for infinite duration, < 0 for delay in ms _after_ the onmouseout until the tooltip disappears +config. Exclusive = false // false or true - no other tooltip can appear until the current one has actively been closed +config. FadeIn = 100 // Fade-in duration in ms, e.g. 400; 0 for no animation +config. FadeOut = 100 +config. FadeInterval = 30 // Duration of each fade step in ms (recommended: 30) - shorter is smoother but causes more CPU-load +config. Fix = null // Fixated position, two modes. Mode 1: x- an y-coordinates in brackets, e.g. [210, 480]. Mode 2: Show tooltip at a position related to an HTML element: [ID of HTML element, x-offset, y-offset from HTML element], e.g. ['SomeID', 10, 30]. Value null (default) for no fixated positioning. +config. FollowMouse = true // false or true - tooltip follows the mouse +config. FontColor = '#000044' +config. FontFace = 'Verdana,Geneva,sans-serif' +config. FontSize = '8pt' // E.g. '9pt' or '12px' - unit is mandatory +config. FontWeight = 'normal' // 'normal' or 'bold'; +config. Height = 0 // Tooltip height; 0 for automatic adaption to tooltip content, < 0 (e.g. -100) for a maximum for automatic adaption +config. JumpHorz = false // false or true - jump horizontally to other side of mouse if tooltip would extend past clientarea boundary +config. JumpVert = true // false or true - jump vertically " +config. Left = false // false or true - tooltip on the left of the mouse +config. OffsetX = 14 // Horizontal offset of left-top corner from mousepointer +config. OffsetY = 8 // Vertical offset +config. Opacity = 100 // Integer between 0 and 100 - opacity of tooltip in percent +config. Padding = 3 // Spacing between border and content +config. Shadow = false // false or true +config. ShadowColor = '#C0C0C0' +config. ShadowWidth = 5 +config. Sticky = false // false or true - fixate tip, ie. don't follow the mouse and don't hide on mouseout +config. TextAlign = 'left' // 'left', 'right' or 'justify' +config. Title = '' // Default title text applied to all tips (no default title: empty string '') +config. TitleAlign = 'left' // 'left' or 'right' - text alignment inside the title bar +config. TitleBgColor = '' // If empty string '', BorderColor will be used +config. TitleFontColor = '#FFFFFF' // Color of title text - if '', BgColor (of tooltip body) will be used +config. TitleFontFace = '' // If '' use FontFace (boldified) +config. TitleFontSize = '' // If '' use FontSize +config. TitlePadding = 2 +config. Width = 0 // Tooltip width; 0 for automatic adaption to tooltip content; < -1 (e.g. -240) for a maximum width for that automatic adaption; + // -1: tooltip width confined to the width required for the titlebar +//======= END OF TOOLTIP CONFIG, DO NOT CHANGE ANYTHING BELOW ==============// + + + + +//===================== PUBLIC =============================================// +function Tip() +{ + tt_Tip(arguments, null); +} +function TagToTip() +{ + var t2t = tt_GetElt(arguments[0]); + if(t2t) + tt_Tip(arguments, t2t); +} +function UnTip() +{ + tt_OpReHref(); + if(tt_aV[DURATION] < 0 && (tt_iState & 0x2)) + tt_tDurt.Timer("tt_HideInit()", -tt_aV[DURATION], true); + else if(!(tt_aV[STICKY] && (tt_iState & 0x2))) + tt_HideInit(); +} + +//================== PUBLIC PLUGIN API =====================================// +// Extension eventhandlers currently supported: +// OnLoadConfig, OnCreateContentString, OnSubDivsCreated, OnShow, OnMoveBefore, +// OnMoveAfter, OnHideInit, OnHide, OnKill + +var tt_aElt = new Array(10), // Container DIV, outer title & body DIVs, inner title & body TDs, closebutton SPAN, shadow DIVs, and IFRAME to cover windowed elements in IE +tt_aV = new Array(), // Caches and enumerates config data for currently active tooltip +tt_sContent, // Inner tooltip text or HTML +tt_t2t, tt_t2tDad, // Tag converted to tip, and its DOM parent element +tt_musX, tt_musY, +tt_over, +tt_x, tt_y, tt_w, tt_h; // Position, width and height of currently displayed tooltip + +function tt_Extension() +{ + tt_ExtCmdEnum(); + tt_aExt[tt_aExt.length] = this; + return this; +} +function tt_SetTipPos(x, y) +{ + var css = tt_aElt[0].style; + + tt_x = x; + tt_y = y; + css.left = x + "px"; + css.top = y + "px"; + if(tt_ie56) + { + var ifrm = tt_aElt[tt_aElt.length - 1]; + if(ifrm) + { + ifrm.style.left = css.left; + ifrm.style.top = css.top; + } + } +} +function tt_HideInit() +{ + if(tt_iState) + { + tt_ExtCallFncs(0, "HideInit"); + tt_iState &= ~(0x4 | 0x8); + if(tt_flagOpa && tt_aV[FADEOUT]) + { + tt_tFade.EndTimer(); + if(tt_opa) + { + var n = Math.round(tt_aV[FADEOUT] / (tt_aV[FADEINTERVAL] * (tt_aV[OPACITY] / tt_opa))); + tt_Fade(tt_opa, tt_opa, 0, n); + return; + } + } + tt_tHide.Timer("tt_Hide();", 1, false); + } +} +function tt_Hide() +{ + if(tt_db && tt_iState) + { + tt_OpReHref(); + if(tt_iState & 0x2) + { + tt_aElt[0].style.visibility = "hidden"; + tt_ExtCallFncs(0, "Hide"); + } + tt_tShow.EndTimer(); + tt_tHide.EndTimer(); + tt_tDurt.EndTimer(); + tt_tFade.EndTimer(); + if(!tt_op && !tt_ie) + { + tt_tWaitMov.EndTimer(); + tt_bWait = false; + } + if(tt_aV[CLICKCLOSE] || tt_aV[CLICKSTICKY]) + tt_RemEvtFnc(document, "mouseup", tt_OnLClick); + tt_ExtCallFncs(0, "Kill"); + // In case of a TagToTip tip, hide converted DOM node and + // re-insert it into DOM + if(tt_t2t && !tt_aV[COPYCONTENT]) + tt_UnEl2Tip(); + tt_iState = 0; + tt_over = null; + tt_ResetMainDiv(); + if(tt_aElt[tt_aElt.length - 1]) + tt_aElt[tt_aElt.length - 1].style.display = "none"; + } +} +function tt_GetElt(id) +{ + return(document.getElementById ? document.getElementById(id) + : document.all ? document.all[id] + : null); +} +function tt_GetDivW(el) +{ + return(el ? (el.offsetWidth || el.style.pixelWidth || 0) : 0); +} +function tt_GetDivH(el) +{ + return(el ? (el.offsetHeight || el.style.pixelHeight || 0) : 0); +} +function tt_GetScrollX() +{ + return(window.pageXOffset || (tt_db ? (tt_db.scrollLeft || 0) : 0)); +} +function tt_GetScrollY() +{ + return(window.pageYOffset || (tt_db ? (tt_db.scrollTop || 0) : 0)); +} +function tt_GetClientW() +{ + return tt_GetWndCliSiz("Width"); +} +function tt_GetClientH() +{ + return tt_GetWndCliSiz("Height"); +} +function tt_GetEvtX(e) +{ + return (e ? ((typeof(e.pageX) != tt_u) ? e.pageX : (e.clientX + tt_GetScrollX())) : 0); +} +function tt_GetEvtY(e) +{ + return (e ? ((typeof(e.pageY) != tt_u) ? e.pageY : (e.clientY + tt_GetScrollY())) : 0); +} +function tt_AddEvtFnc(el, sEvt, PFnc) +{ + if(el) + { + if(el.addEventListener) + el.addEventListener(sEvt, PFnc, false); + else + el.attachEvent("on" + sEvt, PFnc); + } +} +function tt_RemEvtFnc(el, sEvt, PFnc) +{ + if(el) + { + if(el.removeEventListener) + el.removeEventListener(sEvt, PFnc, false); + else + el.detachEvent("on" + sEvt, PFnc); + } +} +function tt_GetDad(el) +{ + return(el.parentNode || el.parentElement || el.offsetParent); +} +function tt_MovDomNode(el, dadFrom, dadTo) +{ + if(dadFrom) + dadFrom.removeChild(el); + if(dadTo) + dadTo.appendChild(el); +} + +//====================== PRIVATE ===========================================// +var tt_aExt = new Array(), // Array of extension objects + +tt_db, tt_op, tt_ie, tt_ie56, tt_bBoxOld, // Browser flags +tt_body, +tt_ovr_, // HTML element the mouse is currently over +tt_flagOpa, // Opacity support: 1=IE, 2=Khtml, 3=KHTML, 4=Moz, 5=W3C +tt_maxPosX, tt_maxPosY, +tt_iState = 0, // Tooltip active |= 1, shown |= 2, move with mouse |= 4, exclusive |= 8 +tt_opa, // Currently applied opacity +tt_bJmpVert, tt_bJmpHorz,// Tip temporarily on other side of mouse +tt_elDeHref, // The tag from which we've removed the href attribute +// Timer +tt_tShow = new Number(0), tt_tHide = new Number(0), tt_tDurt = new Number(0), +tt_tFade = new Number(0), tt_tWaitMov = new Number(0), +tt_bWait = false, +tt_u = "undefined"; + + +function tt_Init() +{ + tt_MkCmdEnum(); + // Send old browsers instantly to hell + if(!tt_Browser() || !tt_MkMainDiv()) + return; + tt_IsW3cBox(); + tt_OpaSupport(); + tt_AddEvtFnc(document, "mousemove", tt_Move); + // In Debug mode we search for TagToTip() calls in order to notify + // the user if they've forgotten to set the TagsToTip config flag + if(TagsToTip || tt_Debug) + tt_SetOnloadFnc(); + // Ensure the tip be hidden when the page unloads + tt_AddEvtFnc(window, "unload", tt_Hide); +} +// Creates command names by translating config variable names to upper case +function tt_MkCmdEnum() +{ + var n = 0; + for(var i in config) + eval("window." + i.toString().toUpperCase() + " = " + n++); + tt_aV.length = n; +} +function tt_Browser() +{ + var n, nv, n6, w3c; + + n = navigator.userAgent.toLowerCase(), + nv = navigator.appVersion; + tt_op = (document.defaultView && typeof(eval("w" + "indow" + "." + "o" + "p" + "er" + "a")) != tt_u); + tt_ie = n.indexOf("msie") != -1 && document.all && !tt_op; + if(tt_ie) + { + var ieOld = (!document.compatMode || document.compatMode == "BackCompat"); + tt_db = !ieOld ? document.documentElement : (document.body || null); + if(tt_db) + tt_ie56 = parseFloat(nv.substring(nv.indexOf("MSIE") + 5)) >= 5.5 + && typeof document.body.style.maxHeight == tt_u; + } + else + { + tt_db = document.documentElement || document.body || + (document.getElementsByTagName ? document.getElementsByTagName("body")[0] + : null); + if(!tt_op) + { + n6 = document.defaultView && typeof document.defaultView.getComputedStyle != tt_u; + w3c = !n6 && document.getElementById; + } + } + tt_body = (document.getElementsByTagName ? document.getElementsByTagName("body")[0] + : (document.body || null)); + if(tt_ie || n6 || tt_op || w3c) + { + if(tt_body && tt_db) + { + if(document.attachEvent || document.addEventListener) + return true; + } + else + tt_Err("wz_tooltip.js must be included INSIDE the body section," + + " immediately after the opening tag.", false); + } + tt_db = null; + return false; +} +function tt_MkMainDiv() +{ + // Create the tooltip DIV + if(tt_body.insertAdjacentHTML) + tt_body.insertAdjacentHTML("afterBegin", tt_MkMainDivHtm()); + else if(typeof tt_body.innerHTML != tt_u && document.createElement && tt_body.appendChild) + tt_body.appendChild(tt_MkMainDivDom()); + if(window.tt_GetMainDivRefs /* FireFox Alzheimer */ && tt_GetMainDivRefs()) + return true; + tt_db = null; + return false; +} +function tt_MkMainDivHtm() +{ + return( + '
    ' + + (tt_ie56 ? ('') + : '') + ); +} +function tt_MkMainDivDom() +{ + var el = document.createElement("div"); + if(el) + el.id = "WzTtDiV"; + return el; +} +function tt_GetMainDivRefs() +{ + tt_aElt[0] = tt_GetElt("WzTtDiV"); + if(tt_ie56 && tt_aElt[0]) + { + tt_aElt[tt_aElt.length - 1] = tt_GetElt("WzTtIfRm"); + if(!tt_aElt[tt_aElt.length - 1]) + tt_aElt[0] = null; + } + if(tt_aElt[0]) + { + var css = tt_aElt[0].style; + + css.visibility = "hidden"; + css.position = "absolute"; + css.overflow = "hidden"; + return true; + } + return false; +} +function tt_ResetMainDiv() +{ + tt_SetTipPos(0, 0); + tt_aElt[0].innerHTML = ""; + tt_aElt[0].style.width = "0px"; + tt_h = 0; +} +function tt_IsW3cBox() +{ + var css = tt_aElt[0].style; + + css.padding = "10px"; + css.width = "40px"; + tt_bBoxOld = (tt_GetDivW(tt_aElt[0]) == 40); + css.padding = "0px"; + tt_ResetMainDiv(); +} +function tt_OpaSupport() +{ + var css = tt_body.style; + + tt_flagOpa = (typeof(css.KhtmlOpacity) != tt_u) ? 2 + : (typeof(css.KHTMLOpacity) != tt_u) ? 3 + : (typeof(css.MozOpacity) != tt_u) ? 4 + : (typeof(css.opacity) != tt_u) ? 5 + : (typeof(css.filter) != tt_u) ? 1 + : 0; +} +// Ported from http://dean.edwards.name/weblog/2006/06/again/ +// (Dean Edwards et al.) +function tt_SetOnloadFnc() +{ + tt_AddEvtFnc(document, "DOMContentLoaded", tt_HideSrcTags); + tt_AddEvtFnc(window, "load", tt_HideSrcTags); + if(tt_body.attachEvent) + tt_body.attachEvent("onreadystatechange", + function() { + if(tt_body.readyState == "complete") + tt_HideSrcTags(); + } ); + if(/WebKit|KHTML/i.test(navigator.userAgent)) + { + var t = setInterval(function() { + if(/loaded|complete/.test(document.readyState)) + { + clearInterval(t); + tt_HideSrcTags(); + } + }, 10); + } +} +function tt_HideSrcTags() +{ + if(!window.tt_HideSrcTags || window.tt_HideSrcTags.done) + return; + window.tt_HideSrcTags.done = true; + if(!tt_HideSrcTagsRecurs(tt_body)) + tt_Err("There are HTML elements to be converted to tooltips.\nIf you" + + " want these HTML elements to be automatically hidden, you" + + " must edit wz_tooltip.js, and set TagsToTip in the global" + + " tooltip configuration to true.", true); +} +function tt_HideSrcTagsRecurs(dad) +{ + var ovr, asT2t; + // Walk the DOM tree for tags that have an onmouseover or onclick attribute + // containing a TagToTip('...') call. + // (.childNodes first since .children is bugous in Safari) + var a = dad.childNodes || dad.children || null; + + for(var i = a ? a.length : 0; i;) + {--i; + if(!tt_HideSrcTagsRecurs(a[i])) + return false; + ovr = a[i].getAttribute ? (a[i].getAttribute("onmouseover") || a[i].getAttribute("onclick")) + : (typeof a[i].onmouseover == "function") ? (a[i].onmouseover || a[i].onclick) + : null; + if(ovr) + { + asT2t = ovr.toString().match(/TagToTip\s*\(\s*'[^'.]+'\s*[\),]/); + if(asT2t && asT2t.length) + { + if(!tt_HideSrcTag(asT2t[0])) + return false; + } + } + } + return true; +} +function tt_HideSrcTag(sT2t) +{ + var id, el; + + // The ID passed to the found TagToTip() call identifies an HTML element + // to be converted to a tooltip, so hide that element + id = sT2t.replace(/.+'([^'.]+)'.+/, "$1"); + el = tt_GetElt(id); + if(el) + { + if(tt_Debug && !TagsToTip) + return false; + else + el.style.display = "none"; + } + else + tt_Err("Invalid ID\n'" + id + "'\npassed to TagToTip()." + + " There exists no HTML element with that ID.", true); + return true; +} +function tt_Tip(arg, t2t) +{ + if(!tt_db || (tt_iState & 0x8)) + return; + if(tt_iState) + tt_Hide(); + if(!tt_Enabled) + return; + tt_t2t = t2t; + if(!tt_ReadCmds(arg)) + return; + tt_iState = 0x1 | 0x4; + tt_AdaptConfig1(); + tt_MkTipContent(arg); + tt_MkTipSubDivs(); + tt_FormatTip(); + tt_bJmpVert = false; + tt_bJmpHorz = false; + tt_maxPosX = tt_GetClientW() + tt_GetScrollX() - tt_w - 1; + tt_maxPosY = tt_GetClientH() + tt_GetScrollY() - tt_h - 1; + tt_AdaptConfig2(); + // Ensure the tip be shown and positioned before the first onmousemove + tt_OverInit(); + tt_ShowInit(); + tt_Move(); +} +function tt_ReadCmds(a) +{ + var i; + + // First load the global config values, to initialize also values + // for which no command is passed + i = 0; + for(var j in config) + tt_aV[i++] = config[j]; + // Then replace each cached config value for which a command is + // passed (ensure the # of command args plus value args be even) + if(a.length & 1) + { + for(i = a.length - 1; i > 0; i -= 2) + tt_aV[a[i - 1]] = a[i]; + return true; + } + tt_Err("Incorrect call of Tip() or TagToTip().\n" + + "Each command must be followed by a value.", true); + return false; +} +function tt_AdaptConfig1() +{ + tt_ExtCallFncs(0, "LoadConfig"); + // Inherit unspecified title formattings from body + if(!tt_aV[TITLEBGCOLOR].length) + tt_aV[TITLEBGCOLOR] = tt_aV[BORDERCOLOR]; + if(!tt_aV[TITLEFONTCOLOR].length) + tt_aV[TITLEFONTCOLOR] = tt_aV[BGCOLOR]; + if(!tt_aV[TITLEFONTFACE].length) + tt_aV[TITLEFONTFACE] = tt_aV[FONTFACE]; + if(!tt_aV[TITLEFONTSIZE].length) + tt_aV[TITLEFONTSIZE] = tt_aV[FONTSIZE]; + if(tt_aV[CLOSEBTN]) + { + // Use title colours for non-specified closebutton colours + if(!tt_aV[CLOSEBTNCOLORS]) + tt_aV[CLOSEBTNCOLORS] = new Array("", "", "", ""); + for(var i = 4; i;) + {--i; + if(!tt_aV[CLOSEBTNCOLORS][i].length) + tt_aV[CLOSEBTNCOLORS][i] = (i & 1) ? tt_aV[TITLEFONTCOLOR] : tt_aV[TITLEBGCOLOR]; + } + // Enforce titlebar be shown + if(!tt_aV[TITLE].length) + tt_aV[TITLE] = " "; + } + // Circumvents broken display of images and fade-in flicker in Geckos < 1.8 + if(tt_aV[OPACITY] == 100 && typeof tt_aElt[0].style.MozOpacity != tt_u && !Array.every) + tt_aV[OPACITY] = 99; + // Smartly shorten the delay for fade-in tooltips + if(tt_aV[FADEIN] && tt_flagOpa && tt_aV[DELAY] > 100) + tt_aV[DELAY] = Math.max(tt_aV[DELAY] - tt_aV[FADEIN], 100); +} +function tt_AdaptConfig2() +{ + if(tt_aV[CENTERMOUSE]) + { + tt_aV[OFFSETX] -= ((tt_w - (tt_aV[SHADOW] ? tt_aV[SHADOWWIDTH] : 0)) >> 1); + tt_aV[JUMPHORZ] = false; + } +} +// Expose content globally so extensions can modify it +function tt_MkTipContent(a) +{ + if(tt_t2t) + { + if(tt_aV[COPYCONTENT]) + tt_sContent = tt_t2t.innerHTML; + else + tt_sContent = ""; + } + else + tt_sContent = a[0]; + tt_ExtCallFncs(0, "CreateContentString"); +} +function tt_MkTipSubDivs() +{ + var sCss = 'position:relative;margin:0px;padding:0px;border-width:0px;left:0px;top:0px;line-height:normal;width:auto;', + sTbTrTd = ' cellspacing="0" cellpadding="0" border="0" style="' + sCss + '">
    ' + // Image redundancy for bugous old Geckos that won't auto-expand TD height to 100% + + '' + + '
    ' + + '' + + '
    ' + + '' + + tt_aV[TITLE] + + '' + + (tt_aV[CLOSEBTN] ? + ('') + : '') + + '
    ' + + '' + + tt_aV[CLOSEBTNTEXT] + + '
    ') + : '') + + '
    ' + + '' + + tt_sContent + + '
    ' + + (tt_aV[SHADOW] + ? ('
    ' + + '
    ') + : '') + ); + tt_GetSubDivRefs(); + // Convert DOM node to tip + if(tt_t2t && !tt_aV[COPYCONTENT]) + tt_El2Tip(); + tt_ExtCallFncs(0, "SubDivsCreated"); +} +function tt_GetSubDivRefs() +{ + var aId = new Array("WzTiTl", "WzTiTlTb", "WzTiTlI", "WzClOsE", "WzBoDy", "WzBoDyI", "WzTtShDwB", "WzTtShDwR"); + + for(var i = aId.length; i; --i) + tt_aElt[i] = tt_GetElt(aId[i - 1]); +} +function tt_FormatTip() +{ + var css, w, h, pad = tt_aV[PADDING], padT, wBrd = tt_aV[BORDERWIDTH], + iOffY, iOffSh, iAdd = (pad + wBrd) << 1; + + //--------- Title DIV ---------- + if(tt_aV[TITLE].length) + { + padT = tt_aV[TITLEPADDING]; + css = tt_aElt[1].style; + css.background = tt_aV[TITLEBGCOLOR]; + css.paddingTop = css.paddingBottom = padT + "px"; + css.paddingLeft = css.paddingRight = (padT + 2) + "px"; + css = tt_aElt[3].style; + css.color = tt_aV[TITLEFONTCOLOR]; + if(tt_aV[WIDTH] == -1) + css.whiteSpace = "nowrap"; + css.fontFamily = tt_aV[TITLEFONTFACE]; + css.fontSize = tt_aV[TITLEFONTSIZE]; + css.fontWeight = "bold"; + css.textAlign = tt_aV[TITLEALIGN]; + // Close button DIV + if(tt_aElt[4]) + { + css = tt_aElt[4].style; + css.background = tt_aV[CLOSEBTNCOLORS][0]; + css.color = tt_aV[CLOSEBTNCOLORS][1]; + css.fontFamily = tt_aV[TITLEFONTFACE]; + css.fontSize = tt_aV[TITLEFONTSIZE]; + css.fontWeight = "bold"; + } + if(tt_aV[WIDTH] > 0) + tt_w = tt_aV[WIDTH]; + else + { + tt_w = tt_GetDivW(tt_aElt[3]) + tt_GetDivW(tt_aElt[4]); + // Some spacing between title DIV and closebutton + if(tt_aElt[4]) + tt_w += pad; + // Restrict auto width to max width + if(tt_aV[WIDTH] < -1 && tt_w > -tt_aV[WIDTH]) + tt_w = -tt_aV[WIDTH]; + } + // Ensure the top border of the body DIV be covered by the title DIV + iOffY = -wBrd; + } + else + { + tt_w = 0; + iOffY = 0; + } + + //-------- Body DIV ------------ + css = tt_aElt[5].style; + css.top = iOffY + "px"; + if(wBrd) + { + css.borderColor = tt_aV[BORDERCOLOR]; + css.borderStyle = tt_aV[BORDERSTYLE]; + css.borderWidth = wBrd + "px"; + } + if(tt_aV[BGCOLOR].length) + css.background = tt_aV[BGCOLOR]; + if(tt_aV[BGIMG].length) + css.backgroundImage = "url(" + tt_aV[BGIMG] + ")"; + css.padding = pad + "px"; + css.textAlign = tt_aV[TEXTALIGN]; + if(tt_aV[HEIGHT]) + { + css.overflow = "auto"; + if(tt_aV[HEIGHT] > 0) + css.height = (tt_aV[HEIGHT] + iAdd) + "px"; + else + tt_h = iAdd - tt_aV[HEIGHT]; + } + // TD inside body DIV + css = tt_aElt[6].style; + css.color = tt_aV[FONTCOLOR]; + css.fontFamily = tt_aV[FONTFACE]; + css.fontSize = tt_aV[FONTSIZE]; + css.fontWeight = tt_aV[FONTWEIGHT]; + css.textAlign = tt_aV[TEXTALIGN]; + if(tt_aV[WIDTH] > 0) + w = tt_aV[WIDTH]; + // Width like title (if existent) + else if(tt_aV[WIDTH] == -1 && tt_w) + w = tt_w; + else + { + // Measure width of the body's inner TD, as some browsers would expand + // the container and outer body DIV to 100% + w = tt_GetDivW(tt_aElt[6]); + // Restrict auto width to max width + if(tt_aV[WIDTH] < -1 && w > -tt_aV[WIDTH]) + w = -tt_aV[WIDTH]; + } + if(w > tt_w) + tt_w = w; + tt_w += iAdd; + + //--------- Shadow DIVs ------------ + if(tt_aV[SHADOW]) + { + tt_w += tt_aV[SHADOWWIDTH]; + iOffSh = Math.floor((tt_aV[SHADOWWIDTH] * 4) / 3); + // Bottom shadow + css = tt_aElt[7].style; + css.top = iOffY + "px"; + css.left = iOffSh + "px"; + css.width = (tt_w - iOffSh - tt_aV[SHADOWWIDTH]) + "px"; + css.height = tt_aV[SHADOWWIDTH] + "px"; + css.background = tt_aV[SHADOWCOLOR]; + // Right shadow + css = tt_aElt[8].style; + css.top = iOffSh + "px"; + css.left = (tt_w - tt_aV[SHADOWWIDTH]) + "px"; + css.width = tt_aV[SHADOWWIDTH] + "px"; + css.background = tt_aV[SHADOWCOLOR]; + } + else + iOffSh = 0; + + //-------- Container DIV ------- + tt_SetTipOpa(tt_aV[FADEIN] ? 0 : tt_aV[OPACITY]); + tt_FixSize(iOffY, iOffSh); +} +// Fixate the size so it can't dynamically change while the tooltip is moving. +function tt_FixSize(iOffY, iOffSh) +{ + var wIn, wOut, h, add, pad = tt_aV[PADDING], wBrd = tt_aV[BORDERWIDTH], i; + + tt_aElt[0].style.width = tt_w + "px"; + tt_aElt[0].style.pixelWidth = tt_w; + wOut = tt_w - ((tt_aV[SHADOW]) ? tt_aV[SHADOWWIDTH] : 0); + // Body + wIn = wOut; + if(!tt_bBoxOld) + wIn -= (pad + wBrd) << 1; + tt_aElt[5].style.width = wIn + "px"; + // Title + if(tt_aElt[1]) + { + wIn = wOut - ((tt_aV[TITLEPADDING] + 2) << 1); + if(!tt_bBoxOld) + wOut = wIn; + tt_aElt[1].style.width = wOut + "px"; + tt_aElt[2].style.width = wIn + "px"; + } + // Max height specified + if(tt_h) + { + h = tt_GetDivH(tt_aElt[5]); + if(h > tt_h) + { + if(!tt_bBoxOld) + tt_h -= (pad + wBrd) << 1; + tt_aElt[5].style.height = tt_h + "px"; + } + } + tt_h = tt_GetDivH(tt_aElt[0]) + iOffY; + // Right shadow + if(tt_aElt[8]) + tt_aElt[8].style.height = (tt_h - iOffSh) + "px"; + i = tt_aElt.length - 1; + if(tt_aElt[i]) + { + tt_aElt[i].style.width = tt_w + "px"; + tt_aElt[i].style.height = tt_h + "px"; + } +} +function tt_DeAlt(el) +{ + var aKid; + + if(el) + { + if(el.alt) + el.alt = ""; + if(el.title) + el.title = ""; + aKid = el.childNodes || el.children || null; + if(aKid) + { + for(var i = aKid.length; i;) + tt_DeAlt(aKid[--i]); + } + } +} +// This hack removes the native tooltips over links in Opera +function tt_OpDeHref(el) +{ + if(!tt_op) + return; + if(tt_elDeHref) + tt_OpReHref(); + while(el) + { + if(el.hasAttribute && el.hasAttribute("href")) + { + el.t_href = el.getAttribute("href"); + el.t_stats = window.status; + el.removeAttribute("href"); + el.style.cursor = "hand"; + tt_AddEvtFnc(el, "mousedown", tt_OpReHref); + window.status = el.t_href; + tt_elDeHref = el; + break; + } + el = tt_GetDad(el); + } +} +function tt_OpReHref() +{ + if(tt_elDeHref) + { + tt_elDeHref.setAttribute("href", tt_elDeHref.t_href); + tt_RemEvtFnc(tt_elDeHref, "mousedown", tt_OpReHref); + window.status = tt_elDeHref.t_stats; + tt_elDeHref = null; + } +} +function tt_El2Tip() +{ + var css = tt_t2t.style; + + // Store previous positioning + tt_t2t.t_cp = css.position; + tt_t2t.t_cl = css.left; + tt_t2t.t_ct = css.top; + tt_t2t.t_cd = css.display; + // Store the tag's parent element so we can restore that DOM branch + // when the tooltip is being hidden + tt_t2tDad = tt_GetDad(tt_t2t); + tt_MovDomNode(tt_t2t, tt_t2tDad, tt_aElt[6]); + css.display = "block"; + css.position = "static"; + css.left = css.top = css.marginLeft = css.marginTop = "0px"; +} +function tt_UnEl2Tip() +{ + // Restore positioning and display + var css = tt_t2t.style; + + css.display = tt_t2t.t_cd; + tt_MovDomNode(tt_t2t, tt_GetDad(tt_t2t), tt_t2tDad); + css.position = tt_t2t.t_cp; + css.left = tt_t2t.t_cl; + css.top = tt_t2t.t_ct; + tt_t2tDad = null; +} +function tt_OverInit() +{ + if(window.event) + tt_over = window.event.target || window.event.srcElement; + else + tt_over = tt_ovr_; + tt_DeAlt(tt_over); + tt_OpDeHref(tt_over); +} +function tt_ShowInit() +{ + tt_tShow.Timer("tt_Show()", tt_aV[DELAY], true); + if(tt_aV[CLICKCLOSE] || tt_aV[CLICKSTICKY]) + tt_AddEvtFnc(document, "mouseup", tt_OnLClick); +} +function tt_Show() +{ + var css = tt_aElt[0].style; + + // Override the z-index of the topmost wz_dragdrop.js D&D item + css.zIndex = Math.max((window.dd && dd.z) ? (dd.z + 2) : 0, 1010); + if(tt_aV[STICKY] || !tt_aV[FOLLOWMOUSE]) + tt_iState &= ~0x4; + if(tt_aV[EXCLUSIVE]) + tt_iState |= 0x8; + if(tt_aV[DURATION] > 0) + tt_tDurt.Timer("tt_HideInit()", tt_aV[DURATION], true); + tt_ExtCallFncs(0, "Show") + css.visibility = "visible"; + tt_iState |= 0x2; + if(tt_aV[FADEIN]) + tt_Fade(0, 0, tt_aV[OPACITY], Math.round(tt_aV[FADEIN] / tt_aV[FADEINTERVAL])); + tt_ShowIfrm(); +} +function tt_ShowIfrm() +{ + if(tt_ie56) + { + var ifrm = tt_aElt[tt_aElt.length - 1]; + if(ifrm) + { + var css = ifrm.style; + css.zIndex = tt_aElt[0].style.zIndex - 1; + css.display = "block"; + } + } +} +function tt_Move(e) +{ + if(e) + tt_ovr_ = e.target || e.srcElement; + e = e || window.event; + if(e) + { + tt_musX = tt_GetEvtX(e); + tt_musY = tt_GetEvtY(e); + } + if(tt_iState & 0x4) + { + // Prevent jam of mousemove events + if(!tt_op && !tt_ie) + { + if(tt_bWait) + return; + tt_bWait = true; + tt_tWaitMov.Timer("tt_bWait = false;", 1, true); + } + if(tt_aV[FIX]) + { + tt_iState &= ~0x4; + tt_PosFix(); + } + else if(!tt_ExtCallFncs(e, "MoveBefore")) + tt_SetTipPos(tt_Pos(0), tt_Pos(1)); + tt_ExtCallFncs([tt_musX, tt_musY], "MoveAfter") + } +} +function tt_Pos(iDim) +{ + var iX, bJmpMod, cmdAlt, cmdOff, cx, iMax, iScrl, iMus, bJmp; + + // Map values according to dimension to calculate + if(iDim) + { + bJmpMod = tt_aV[JUMPVERT]; + cmdAlt = ABOVE; + cmdOff = OFFSETY; + cx = tt_h; + iMax = tt_maxPosY; + iScrl = tt_GetScrollY(); + iMus = tt_musY; + bJmp = tt_bJmpVert; + } + else + { + bJmpMod = tt_aV[JUMPHORZ]; + cmdAlt = LEFT; + cmdOff = OFFSETX; + cx = tt_w; + iMax = tt_maxPosX; + iScrl = tt_GetScrollX(); + iMus = tt_musX; + bJmp = tt_bJmpHorz; + } + if(bJmpMod) + { + if(tt_aV[cmdAlt] && (!bJmp || tt_CalcPosAlt(iDim) >= iScrl + 16)) + iX = tt_PosAlt(iDim); + else if(!tt_aV[cmdAlt] && bJmp && tt_CalcPosDef(iDim) > iMax - 16) + iX = tt_PosAlt(iDim); + else + iX = tt_PosDef(iDim); + } + else + { + iX = iMus; + if(tt_aV[cmdAlt]) + iX -= cx + tt_aV[cmdOff] - (tt_aV[SHADOW] ? tt_aV[SHADOWWIDTH] : 0); + else + iX += tt_aV[cmdOff]; + } + // Prevent tip from extending past clientarea boundary + if(iX > iMax) + iX = bJmpMod ? tt_PosAlt(iDim) : iMax; + // In case of insufficient space on both sides, ensure the left/upper part + // of the tip be visible + if(iX < iScrl) + iX = bJmpMod ? tt_PosDef(iDim) : iScrl; + return iX; +} +function tt_PosDef(iDim) +{ + if(iDim) + tt_bJmpVert = tt_aV[ABOVE]; + else + tt_bJmpHorz = tt_aV[LEFT]; + return tt_CalcPosDef(iDim); +} +function tt_PosAlt(iDim) +{ + if(iDim) + tt_bJmpVert = !tt_aV[ABOVE]; + else + tt_bJmpHorz = !tt_aV[LEFT]; + return tt_CalcPosAlt(iDim); +} +function tt_CalcPosDef(iDim) +{ + return iDim ? (tt_musY + tt_aV[OFFSETY]) : (tt_musX + tt_aV[OFFSETX]); +} +function tt_CalcPosAlt(iDim) +{ + var cmdOff = iDim ? OFFSETY : OFFSETX; + var dx = tt_aV[cmdOff] - (tt_aV[SHADOW] ? tt_aV[SHADOWWIDTH] : 0); + if(tt_aV[cmdOff] > 0 && dx <= 0) + dx = 1; + return((iDim ? (tt_musY - tt_h) : (tt_musX - tt_w)) - dx); +} +function tt_PosFix() +{ + var iX, iY; + + if(typeof(tt_aV[FIX][0]) == "number") + { + iX = tt_aV[FIX][0]; + iY = tt_aV[FIX][1]; + } + else + { + if(typeof(tt_aV[FIX][0]) == "string") + el = tt_GetElt(tt_aV[FIX][0]); + // First slot in array is direct reference to HTML element + else + el = tt_aV[FIX][0]; + iX = tt_aV[FIX][1]; + iY = tt_aV[FIX][2]; + // By default, vert pos is related to bottom edge of HTML element + if(!tt_aV[ABOVE] && el) + iY += tt_GetDivH(el); + for(; el; el = el.offsetParent) + { + iX += el.offsetLeft || 0; + iY += el.offsetTop || 0; + } + } + // For a fixed tip positioned above the mouse, use the bottom edge as anchor + // (recommended by Christophe Rebeschini, 31.1.2008) + if(tt_aV[ABOVE]) + iY -= tt_h; + tt_SetTipPos(iX, iY); +} +function tt_Fade(a, now, z, n) +{ + if(n) + { + now += Math.round((z - now) / n); + if((z > a) ? (now >= z) : (now <= z)) + now = z; + else + tt_tFade.Timer( + "tt_Fade(" + + a + "," + now + "," + z + "," + (n - 1) + + ")", + tt_aV[FADEINTERVAL], + true + ); + } + now ? tt_SetTipOpa(now) : tt_Hide(); +} +function tt_SetTipOpa(opa) +{ + // To circumvent the opacity nesting flaws of IE, we set the opacity + // for each sub-DIV separately, rather than for the container DIV. + tt_SetOpa(tt_aElt[5], opa); + if(tt_aElt[1]) + tt_SetOpa(tt_aElt[1], opa); + if(tt_aV[SHADOW]) + { + opa = Math.round(opa * 0.8); + tt_SetOpa(tt_aElt[7], opa); + tt_SetOpa(tt_aElt[8], opa); + } +} +function tt_OnCloseBtnOver(iOver) +{ + var css = tt_aElt[4].style; + + iOver <<= 1; + css.background = tt_aV[CLOSEBTNCOLORS][iOver]; + css.color = tt_aV[CLOSEBTNCOLORS][iOver + 1]; +} +function tt_OnLClick(e) +{ + // Ignore right-clicks + e = e || window.event; + if(!((e.button && e.button & 2) || (e.which && e.which == 3))) + { + if(tt_aV[CLICKSTICKY] && (tt_iState & 0x4)) + { + tt_aV[STICKY] = true; + tt_iState &= ~0x4; + } + else if(tt_aV[CLICKCLOSE]) + tt_HideInit(); + } +} +function tt_Int(x) +{ + var y; + + return(isNaN(y = parseInt(x)) ? 0 : y); +} +Number.prototype.Timer = function(s, iT, bUrge) +{ + if(!this.value || bUrge) + this.value = window.setTimeout(s, iT); +} +Number.prototype.EndTimer = function() +{ + if(this.value) + { + window.clearTimeout(this.value); + this.value = 0; + } +} +function tt_GetWndCliSiz(s) +{ + var db, y = window["inner" + s], sC = "client" + s, sN = "number"; + if(typeof y == sN) + { + var y2; + return( + // Gecko or Opera with scrollbar + // ... quirks mode + ((db = document.body) && typeof(y2 = db[sC]) == sN && y2 && y2 <= y) ? y2 + // ... strict mode + : ((db = document.documentElement) && typeof(y2 = db[sC]) == sN && y2 && y2 <= y) ? y2 + // No scrollbar, or clientarea size == 0, or other browser (KHTML etc.) + : y + ); + } + // IE + return( + // document.documentElement.client+s functional, returns > 0 + ((db = document.documentElement) && (y = db[sC])) ? y + // ... not functional, in which case document.body.client+s + // is the clientarea size, fortunately + : document.body[sC] + ); +} +function tt_SetOpa(el, opa) +{ + var css = el.style; + + tt_opa = opa; + if(tt_flagOpa == 1) + { + if(opa < 100) + { + // Hacks for bugs of IE: + // 1.) Once a CSS filter has been applied, fonts are no longer + // anti-aliased, so we store the previous 'non-filter' to be + // able to restore it + if(typeof(el.filtNo) == tt_u) + el.filtNo = css.filter; + // 2.) A DIV cannot be made visible in a single step if an + // opacity < 100 has been applied while the DIV was hidden + var bVis = css.visibility != "hidden"; + // 3.) In IE6, applying an opacity < 100 has no effect if the + // element has no layout (position, size, zoom, ...) + css.zoom = "100%"; + if(!bVis) + css.visibility = "visible"; + css.filter = "alpha(opacity=" + opa + ")"; + if(!bVis) + css.visibility = "hidden"; + } + else if(typeof(el.filtNo) != tt_u) + // Restore 'non-filter' + css.filter = el.filtNo; + } + else + { + opa /= 100.0; + switch(tt_flagOpa) + { + case 2: + css.KhtmlOpacity = opa; break; + case 3: + css.KHTMLOpacity = opa; break; + case 4: + css.MozOpacity = opa; break; + case 5: + css.opacity = opa; break; + } + } +} +function tt_Err(sErr, bIfDebug) +{ + if(tt_Debug || !bIfDebug) + alert("Tooltip Script Error Message:\n\n" + sErr); +} + +//============ EXTENSION (PLUGIN) MANAGER ===============// +function tt_ExtCmdEnum() +{ + var s; + + // Add new command(s) to the commands enum + for(var i in config) + { + s = "window." + i.toString().toUpperCase(); + if(eval("typeof(" + s + ") == tt_u")) + { + eval(s + " = " + tt_aV.length); + tt_aV[tt_aV.length] = null; + } + } +} +function tt_ExtCallFncs(arg, sFnc) +{ + var b = false; + for(var i = tt_aExt.length; i;) + {--i; + var fnc = tt_aExt[i]["On" + sFnc]; + // Call the method the extension has defined for this event + if(fnc && fnc(arg)) + b = true; + } + return b; +} + +tt_Init(); diff --git a/webui/view/theme/default/images/arrowdown.gif b/webui/view/theme/default/images/arrowdown.gif new file mode 100644 index 0000000000000000000000000000000000000000..98193adbe39ccfabb111fd08e201671ebf9e8258 GIT binary patch literal 73 zcmZ?wbhEHbPx!3^1VhlZBCifrUW_Bmh#&z|8Mq Vwb<{C<29MJpV!^q@tl*v8US2r7V`iA literal 0 HcmV?d00001 diff --git a/webui/view/theme/default/images/attachment_icon.png b/webui/view/theme/default/images/attachment_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..beb212e92cfa3cda4ea1a1a6097e79c99fd4f302 GIT binary patch literal 893 zcmV-@1A_dCP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2igJ? z5f2%;3PZ2}00R9e2*Um<1>nAkz^mElr zKOrW}7q#6k{8iww*2;a^wU8_c!r8U6h2y!6NP6`Vt|35g|IAWL528Z6{tQ3RSSh3w za*wozX6FFbKdhjC>Raa2chTZ>W8<@GF1n$jrrp8OwyRp{k(|dJnbmA_4FtqJ)NoSD zYswlr2msq(=ope-%%W!7=*ds3TIqW#kGnIqwDt{(B~R3xbow>r^<4yjU0FKLNmsJK z&=qi}%*6ABjlUe+SDWdXEa%=ARcvv%vEg1By-(#+uJ0rOBs{O=ob+NUn(gA7B?fvP zd&!gedNlyxQH7ZkkLGaaQw@!u+=#th#()#Kl-IS>+BYEH{HUB^X$rnK+HqZJAQELv z%BlGdtIWNemXgbj_f%|k4&sPZ%b;XA<#p}fcg|3A)`dbUjW*m-wJRX>UAS~|4N~xp_`XVjMx$(!Zk_s=-c^Vv@!I!l$&lT z+1%qA5sb@44Gc?D@Tjzse@mEEQ4`qN=nKREVN-O(mo@q2(f11Q0F`QR6ms;yQL3 z`&{{sqoBqv3$N_guP@&@&-sp#5MtuoD>{=3-(Z`nKG)mjbQFbr_lb-^vmDwGOh zT&Peg!{yeUJa|4YJ(tV<^=vi^uIoBuZ2IDKy-M}%X{L&Csi zCh|GFg>T@?wfpDLA!%@4nmQ>E0v0Z$!>9{ulu$$|hPRw5lq*72B0{ShKhd~k{oFf; zazrQ~2ux8V5kyFYbSxqXg)k9>%fS-$Xm)9x$GTqHNC&_UF@vxlFvla47xcvXH4enF zf}ocUj0?(SAe`Iwwx(qg(<_gjRXuuqcdz4l-l@}P`a!QB_``5bd&TSq+1m6h^P#>n zIPjOBmTF5gV*?ZySJT)u#wJ%ULkI@!$N6Jc8^3(NndVoaAdO99Y?v9k2%!_f{vpCp zTCjfhVDT&P9|Zo5@+ZKCaCh!Age#WmPo03`PQ>26G5Vtk#xyfu8Difoe~hvDu-k2q zK(N}x+`$mOG@>W3jidU{_+f0g3&VhNxh=B)LS$40M**x-D9Vxiys-Rz+wSt<`$*>}Clhi^`|o32;x6<-u*7lt<(Rb``g{!5AdQ^e^1`9J*; ZU;xvKLXstcy_^65002ovPDHLkV1lQjAf^BS literal 0 HcmV?d00001 diff --git a/webui/view/theme/default/images/fileicons/audio.png b/webui/view/theme/default/images/fileicons/audio.png new file mode 100644 index 0000000000000000000000000000000000000000..98883256d6cd75ef9b73bea040bb8dac1588b97b GIT binary patch literal 727 zcmV;|0x127P)igX2`{3*RdwY9%d3ogR{N?Wa=I{L8>ip#H{O9of?)3eipP!4O z!r12f+2;G&=la^```+pM;_Uo(lf8SDyj6h6hk=R zm6eE~z>blZS%JoqsK%tHtEi}`m8-~?tjVmbtfjBKow3ccv$LbN(YCq0sk_v@z{9h{ z+QP)h#mLLW%F)Nm(8HFO2{N3sM-Rb;kjKOSimj~kKpV3iHwus z>-^yC{Ne2Ta*)5`?E8$4kaCf~adB~XcXyDImE-RG>El9GCryIo#i{6OKNG?xwbAD@QaG$=^6{`dR*sWONl z0B_n5+P)746u*b$;VRJ=6L0hn@+CRYpeh+nl`MSiD!L1d`D;cL#Mhyk_tIgV2k%qX z$q0hb7|<)SL@>|Vmk;5i?(x``@zv(3x_#HI2ho~nzS)jTl` zP)#u1T;=AimdUXQfREp@YjcZvd~~E1;Kk)~o@}hmPW@H5-Txf`D91UtYL);1002ov JPDHLkV1n4(zl8t* literal 0 HcmV?d00001 diff --git a/webui/view/theme/default/images/fileicons/doc.png b/webui/view/theme/default/images/fileicons/doc.png new file mode 100644 index 0000000000000000000000000000000000000000..932567f8a9368cd42cf25dfe911c1530f932fd19 GIT binary patch literal 659 zcmV;E0&M+>P)f(Sf_211)CK5Yq0vLQ^GI$D@ATed1V+0KxVW$X}CmcxlL-PLTQg_N#d(KsW$X|WKSbou2fyP*Z#bViq&k6z;2Gea*)4rk-v76y?2q-dX>9-mArnJx_p<|f||UAoxX#d+K8aQfS%@y zqQZ=#!i%Kck*CIqrRkTf$&jwrldI;PvCX5l(W$%Ct-8>!yx*_D*s8wqv%}iA$n?q5 z;?~^i(&GBmipsC{NwHX+=2Z^7`%b{qOYs@b>=l_x|+w{`L9(_xk?%`~Uy{{{b?1G1h1_00001bW%=J06^y0 zW&i*H0b)x>L;#2d9Y_EG010qNS#tmY3labT3lag+-G2N4000McNliru)&>v^01co) za&!Oy0N_bPK~xyiJ&xB_!axu}hh<%wMq@!N*dQn%s}x1t*rkOQAczG}hyVWvGNRtM zx%Zrz0RVWuyS=%-y2wfia~{9HJ}2YRheR@_St^_vk@c0}yF@Z3{vuvo;hNG@E?SLR zdQl7|0R=0!X=&DSOuP)7eosOg)7pct=&x{^yAllC(biaC0lA}8*FJ>})cs|~?$PUZ zyOV-d^n~8nA|mT4)oGu=(%;#s+uN-K1ceZsb1$3PO0}9t^!nw`e(KG}0g1fRS92Qm tJrddfUaxJDIL~BK$>aFp{_b`-JOfbNG^sL9V3Ys=002ovPDHLkV1nM`R&M|R literal 0 HcmV?d00001 diff --git a/webui/view/theme/default/images/fileicons/file.png b/webui/view/theme/default/images/fileicons/file.png new file mode 100644 index 0000000000000000000000000000000000000000..24d5f328cc8d3aeeb8451a2c2bef5270e6a84d75 GIT binary patch literal 720 zcmWmAeJs>*90%~oFq%L zqKwd$ij?zocgYc(h)W)iyK~QX?zran{r&W{y*}^n=kxjR^X10Tqn#bS9T5a^rco*J z@O9m*{kAXzf?N_1gusf6VMLNhS;-GZl1jd(m5I~K#2FkBiz~`17v88CzF9e(TQzj6 zYA~NSm|rtkSlfTUuCJ(0P+b45q(Shoae(t`sG?a|*(|JX5!bYiJZT%L>lm%?lr-?i z8$V1mc1<*Wo_yUi^`>X4_3QN8zL|ExZ~nmC`yuHk(frK%&MYK{&^b9OmG4Lu=pRUl z&MSB3mFQn3y08I(1r@rW0*fkiQ3aM%=#m-&%W8BPrUtBN&=n0>g^d=hYSC3KkZDmF zOdVL$p=&y@4jVm$t?Pk&4<2S7G~JOjnFn`f~@$a72CApW-D&_hwtw0USW?Gwi_An z(+LIf^aO;gkY?`PWd9}}64|yKUWFy@&S#!yP_SCR@8z<*ZMmjwz=OfdBL1{U8 zHZ=TLARz#8yF4b5#L&yD-RuZFHY+hDo|PMuna8dtCXvqs1s(|rJ1t(G6WO02y?E;C z;pVMXuBp|dF77;TMfm}%)trB?=ZnJDfg1UUh!z#~hNYxFH?!^hMK-pA#Wdf}pqR>D zvW+YP_tVq2L$Z%Y?K?~&1mBJgjV|&@@Hijt8^U9A9(VM=YvFb^4e&jksATEXq+?s! swb;~zQa68+KWXU4_=IF~>?b3|5%IeaTwVXtrxc!y&?4y+{yApJe~xvda{vGU literal 0 HcmV?d00001 diff --git a/webui/view/theme/default/images/fileicons/image.png b/webui/view/theme/default/images/fileicons/image.png new file mode 100644 index 0000000000000000000000000000000000000000..f83e2898d5257441e755d8f95421494e3d9eae6c GIT binary patch literal 906 zcmV;519kj~P)}3p zm%7~O``YLG^!WaElf8SDyx8XZ+2;G&=lb62`{C^T;_duZfXM&<|FC;jX^g>(hmLHH zz_)m7ZjQg)==^zLSHy&8%z|9CjdX&VyseOet&x7JY)n^y!G(Enbz@z0W@xy2WO9(d za*@Beeq^s{OOlR^f}Lu)fpB`2yNi#oxmZN4i)+q*T7+$6qGm^sZ&X=<##n;Il67}o zgv7s!c;bCvp_Q4_hhK%AzS4+Y(}`fkkZHn_X`P&-tCpRmnV!#(V#AYj*o8NwD!-BxIs;Rrwu)D>oyw&WkdF-!xtH9K* zzSrimg0H~X)wiv$#MraL+QP|`?zn`v%H8X~lJCBa?ZJ@V#;57Up76w#`NN3d%B{W9 z=g`xx;>)b^$e8oWoW|DT@6Mpp)6>_}(e%%v%-ZqD-tzX^vDD=H?c=`D=KI#<`uE_t z*5&%v<@?v=``G3BOQcF(gv8nB`+|Fxe1VAD=lk~M!L@Hwq<3E2>HFO2{N3sM-s$^c zh{NCO{OalH;OqS0?EK;E`(la1`s&4Hio)XV_v7vS?C?)~uX?DFyS?eqQY^!)4f z{_XVs?)3fd^!@Mk{_yqw@b>-j_Wk|%*YfxM^7sDp_x@*#!H0&0W>QPRM^)DV0004W zQchCM6giOD!0=e;~n3kfyGES7E{hB1qhL z@1=OuY@NE@)QPcITcNP0Dm^k=mRn~M4 z6=!$Ijt}@O*!0%l@^{p0T(Z(m;_vO4g1O(HS7u4~RByZS_%5d85aIM2J1}wf(Wgy%$9%tbc2-|>o=d~WZ&f_l5Ed!BO7T!FKDK2MzX3_-+9X6X~ grj(xVySs`+{~@wQBFi^6(*OVf07*qoM6N<$f_Rf4%K!iX literal 0 HcmV?d00001 diff --git a/webui/view/theme/default/images/fileicons/odf.png b/webui/view/theme/default/images/fileicons/odf.png new file mode 100644 index 0000000000000000000000000000000000000000..a2fbc5195a2c1ff0c785ab5498ffe985bc25e704 GIT binary patch literal 807 zcmV+?1K9kDP)vQgj=yq{zjBekc9Xq&mAiYDyoim^ewVs}n!JUbzKEc}k(t(uqQZ=#!jzoXprE9c zp4pG3#F3}QlBmX+q1lzI$d|0iny$;8u+5#Z&7`g1rmo%zSpn7 z*ucQRv%}iF#Oc1o>B7nD%*@Qj&hF0E@z>Ya&e-$R-1XGp_toI|)a3fvH6O3``+sN-|G9{ z>ipm9{NU^S;OzY2?EB&D{Nn8U;_Uq6?E2#E{NwHWHM{N?Wb&@VDNBuva>cf)YH*n zfB?6ip6<>_A(lRVsEBJ%SBDQ{pI~HfFGR$pE7F~@&!knS7b4=%&)C=3C)(Pm0|E>T zCX9VN{Jb13jrE0rp+!0j?u`8Y?QN}14Yj_^?3TGY47`pEwr#DAb=6hc!g+bwnjk}M zn!V&?y-Nj*bF$JkKmu0vo-zU=sjLC%X~}9J0gIZ7az8c)?(~$z1Qn2gS!G#K0UwuG zQer}!5=g+Pq&Pp@fXO~FJ|;>5B%oiEmz5F385|!Q9WD(L(96zDOGz}1jfn^gkpKzk lYH4Yxt12tXOG%200{~+FJ`R%|{4)Rm002ovPDHLkV1jA#znuU8 literal 0 HcmV?d00001 diff --git a/webui/view/theme/default/images/fileicons/pdf.png b/webui/view/theme/default/images/fileicons/pdf.png new file mode 100644 index 0000000000000000000000000000000000000000..638066dea602dc90953200c59158d02a95446b7f GIT binary patch literal 663 zcmV;I0%-k-P)vQgj=yq{zjBekc9Xq&mAiYDyndIu=W}y{ zn!JUbzKEc}|8sNidwYwb!i=KA-h_mYrNoh^#*(PU=ZuV%tH_tE$(gOnoUqKDvCX5l z(eIp`sk_vyzSgh6*t5gh@2#!gwY~4w*3#no)Z_Zrl9P0002eNkl%^t9BJ zMJ!~+g!uS)`M6o*j6r}wl!uFpor9f~ zjVU%JDl)>DftfLrMF0pm1wj08u(2+Q3Gs1~V1Ae(NWdA$_Y-yp@k0$j0*>)RY3ygCMGa` xfFel1EE3N5mjely8W|br>uRg3D9Fpm003uhH3Emj!Pfu)002ovPDHLkV1l6}LW2MR literal 0 HcmV?d00001 diff --git a/webui/view/theme/default/images/fileicons/ppt.png b/webui/view/theme/default/images/fileicons/ppt.png new file mode 100644 index 0000000000000000000000000000000000000000..adaefc6025a7e9dcceaa275652d5988d818505c6 GIT binary patch literal 762 zcmVMZT zIjT%JuTVR@PcO1lJ)K=hw^%{AT0*d2M7>@`*;y;UVMxGXNL7HyS%Jn_g2lsSOT%VM zU4+D5gv4Qp!^dk+Vu{1ZYfoj0!e@)YX^g?abX&}EQ_OKxY>vQgj=yq{zjBek(05qT zcUX3ly?T|qdzHM^d|ZB)y48JLf||V9fM3~xVD)=Kg`K|JgJOuF!0v)ni=x7eqQa4< z#^{e~@R3~bl3VbRXP2zWkgnG7mT2&nYw(w9ow3dEoL=ymaqydG@SR=opl_qL(eR~e z@TPRByVS41*t5gh@V0^Qy^HY0lJLow@Xew2*2dD}`qbn4*5vxv<@?#@``hRH-01t> z>HFa7{Ne2U5V{`~as^7sDq`2O|z z{`dO+`TPI>`}hC+`v3j=|NsA13=hO(4mSV*00DGTPE!Ct=GbNc0004EOGiWihy@); z00009a7bBm000XT000XT0n*)m`~Uy|2XskIMF-Xf5DWtZ^01i`0002(Nklm+rR{rPfs&okd_n^7U1JxWoFFu@kvY7207goY(7XnHAMp?;FOo+0|6ZlTMFQ=Kufz07*qoM6N<$f|A34cK`qY literal 0 HcmV?d00001 diff --git a/webui/view/theme/default/images/fileicons/rar.png b/webui/view/theme/default/images/fileicons/rar.png new file mode 100644 index 0000000000000000000000000000000000000000..a6af4d1cac16975bc6eff1bd9c1a02905e99db64 GIT binary patch literal 631 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GXl47?lHjLR^cBl}sG-N=!_$98Jni z(jC)HT+&U<(`T8K1b@rk+_y4i5-WNIuECI z9ZK&$nAvkMr|&>s-~OTr`->*-pEb**Z1Uc@vrMX{?yjD?r*8VL3njCfX6;E|ez|q- zKF6~Qx)&Xqxcu1kH7Dn8JiB{;ve2X1UWeCzJ5Sr=|yzIE&Jl_$Th z0nt++`hETB?;B5l-FWu{XE)7O>#8n*<4IDh@8rY}IDvz{)FArhC96A}^(E?m5J z=}JI&Xh=!}!`~e{ZoD}0A>e4mijKS(pAeS_j}1vSE-jKAJDz-*F|&b5LD1s9haihY z#Da#KCoD8BTz8-7$jQXBvqzZePwgI&gH{a=ZI%a5oWFhBd0wL;BhQYTy*+zv@5ZJ| zhA14EaNXkI;j2eIyBYpw*%pVq@UI2Mj9J^a8JU|tWare-);Qti-PO&-&Gq3UBLnk)^{Z1?%ijQc OjKR~@&t;ucLK6T`ZcQ@) literal 0 HcmV?d00001 diff --git a/webui/view/theme/default/images/fileicons/swf.png b/webui/view/theme/default/images/fileicons/swf.png new file mode 100644 index 0000000000000000000000000000000000000000..0729ed0203ea2b0b6c4402d9af5fccbdc2e6397f GIT binary patch literal 843 zcmV-R1GM~!P)fn0HfUvq_8ewJi`l~sVqS%Jn_g2i@# zie`nIaDtR*g_>Q2#9oBNVTi+Uh?`=G!)1!XXN$pniIr)L!EBDeZjQfwjhu3jzjBek zc9Xq_k(+vzyL*+qf0wC-m8E`{x{8^nf||UAoxX~qw3DE&i=x7np{-y~VD+*R#ONufW)|!`i;a&BDph$HFO2{N3sM-Rb<^>HFU5``+sO-|GC|>-^yB`{3*R;OzY2?EB&D{NnBW>Fn_1 z?fm2J{NwKZHM{pRod=I{OJ@crrV`|0uh>hk>S^8N4f^z8Hf?eqQZ^!@Gh z{_gbs?)3ie^!@Mk{_yqw@b>-j_Wkkq{_^+z^7sDp_x|_y_w@Mw|Ns94E>7zd0Ji`D z00DGTPE!Ct=GbNc0004EOGiWihy@);00009a7bBm000XT000XT0n*)m`~Uy|2XskI zMF-Xf5DWnVDdk?I0000TbVXQnLvL+uWo~o;Lvm$dbY)~9cWHEJAXI2&AV*0}Q14_V zZU6uP{YgYYR2b7^U|?Wyv^Fy}F*4BA(qe!BhxYc?=7zdztq!P&U3*JoeQi~RRtHqX zrlqN&rn0;gC;%3*l;z}ZMuFSNQ#5ffO9?!B+7A8h}51zE- zxY#Hq25tK`4Ms_)414XQxajZ@c?Ks|eE67PphzauZ0{|0Y VJPmL8*75)V002ovPDHLkV1j&6&w2m= literal 0 HcmV?d00001 diff --git a/webui/view/theme/default/images/fileicons/txt.png b/webui/view/theme/default/images/fileicons/txt.png new file mode 100644 index 0000000000000000000000000000000000000000..da20009c6ebc28d8286577735f0a2aed9402fdf5 GIT binary patch literal 542 zcmV+(0^$9MP)ipsC{NwHXhk^T^8M@b{_OJo?ehKY^ZoAg{_gbs?)3ie^!@Mk{qXhu@b&)i_Wtqq z{_*$y^7sDp_x%TEqudB$nZInuwrvMP0JG9BOzzh0ezk6zs>pvBoiAh|OLc&u8Fey` ziY$o~K;Jx&g(y@3dIv*?e@PVfWq^*Mlf`~l1ZXGs9iIniYARXqTo!;y?%Xy7(4c9m gRw)&7nRFQb04&@fraZ$Zy#N3J07*qoM6N<$g3-nx`~Uy| literal 0 HcmV?d00001 diff --git a/webui/view/theme/default/images/fileicons/vcf.png b/webui/view/theme/default/images/fileicons/vcf.png new file mode 100644 index 0000000000000000000000000000000000000000..195ab38bc73a823e8c9496e2fdcdeebff7ba9a46 GIT binary patch literal 711 zcmV;&0yzDNP)?_XP*_l)Kmedf0AN^Put)%4U|^t75U@}HU}#{#Pyldf zV6a#auvj2)aB#3-AaHnaz+fQIU=US+$XS8LSc1h}gv4Hi#DIW+VTi+GiNk=1fMtrp zXN$pUjKSb=AZ(7nZjQgucrcKNkaCc}a*@Awlf96Tkb0H7dzHL?m%4(QyoH^<;D|ur zh){^2z>A{7prD}OkWi7Q#_*6(;Fw^StjUnB)}67ipm9{Nd~T;q3h5?fm5J{N?Wa=+}8W^Zo7f{qFPr?ezWb z^!@Ji{_yqv@b&)j_xL;#2d9Y_EG010qNS#tmY3labT3lag+-G2N4000McNliru)(a6294et!htB{2 z0OUzTK~xyiV_;xl@Njjqx3w}iHZ)`a13fJzmm&}_EC!2+%3J7hI20D-2o6$VU=ZQqVrOQC$Oi=~f*fxa9~%`B22v3iAO{jK tj)lnw_)CKXj0_BPbu?6!6=Y?kqyP!8H-q$|e>VUC002ovPDHLkV1lRDU{nAA literal 0 HcmV?d00001 diff --git a/webui/view/theme/default/images/fileicons/video.png b/webui/view/theme/default/images/fileicons/video.png new file mode 100644 index 0000000000000000000000000000000000000000..b89fc52995fa519f3b84eeb069da835a4b8ae686 GIT binary patch literal 740 zcmV-^yB{M_jKKO{O9of=il+-z2fZrK`j=*k?zjBbj zgpiMNk-tDsK1ohZj*^&dp=x@SyL5kd-01v`k(Y>|z?z<<=<)q`eTHa(lrJwYFfcGp zPEl4{U2>ysb*5x^qkDpyyj`fSg`BvSnx9QzS6OFUVP#@ga!GTlwu_>|a;&M0qQYvd z&X1+UfwXm!sK%hHj-{xrm8-~F#FS;kfnmSJU%|VYuFG)7X>`JnqOik#!@-Zl$Ia2x z)a3fsHKndfoy+!Ha0fj>igg7{5v~4;OqNDL`321{NU{T;q3cFMM&c8`&og;Sc1jl?fX!V zW_*B#<9?)_ba#9oBNe1m-D@BHQO{bP-bVTi-$@BHWR{9=j2=jKK{1Avyp600DGTPE!Ct=GbNc008JoL_t(|UM0-ak_1r{MA3_~+O{#YZQHhO z+xX|{Q@tNoL?+5KTD0?0T-##67-idjO!c)#Cw{S(m7}F#W&c?BLJ!t-*^OThv{uyQ ztQKGmq@=WIcyQd)Fkk1x5JCs2bEJ8>G3iqzx0C8GfvWoQyh7P4-qBMX*2)q;pKp@? zmJlutFm!gK$fDm#PFThc(5uLjC{V&N){O{2*ZY%OaF9c0lQ)L|I-W)9IA(3@ym|2( zpiQ_s=U7`VZ&GJJ0P-ne_qO;IlW}hP0l>iRTQhT`Ix{tS0Z{F7*<<0quh;uai{&5I W&nfWoRDAIO0000d9cNsi)A3l2?I(;WUeIY`CB}RlSM};jyi8V)vJ57u>V18UrjyXt@KU0%H zQkO_ofXG;wM_GZ!Sc1h`nn_-mRb7O{UWCM0o>F0m!(xfUTcTKBp;Kjw!eO9TVWL!L zi@|A(!El>xY>vQgj=yE6TV$wUa*)4rk-ulEUv`tdX{};vtYvhiaC()ydzHL?m%44R zXM&o%g`K{KsfCE3z>A{7jH1Gkr^cMHo0qJ~kgnE{y^EoEGMu``qaJ-s$_` z>ip&G<>Bo7KO{OIug>hb;S^8M}e{qOYs@b>=l_x|+w{`L9(_xk?%`~Uy{ z|20V(8|tE!00001bW%=J06^y0W&i*H0b)x>L;#2d9Y_EG010qNS#tmY3labT3lag+ z-G2N4000McNliru)&>v^0uBp)K}-Mu0N_bPK~xyiV_;xlh>i>o_V@MnaCK#XfT+rf z^0LyBV%I8=h?|3zp{BCDjFfnhYZXYutqKYR3xNVa5w{R)m8w`REkC{jR}f&Z%L;Xr zbuyNV=gH5@&B=CUFsX`*Fp%Jlsp16jGhG?fsseSx3`ERR*>eK|GBcbR6a&SCxC500 zf>?p_8R_;6(jXf=g*gN!O+ilg z0h(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZvIXXoSFPOrta=4Ih7`WpzzJ>CPVp^{JFJCX-o)#>$(7lk>Ozg zq?B57Ds$pCt4I4Le+ph*xXDU&9e{d&gq@9@^lW*$oHoO!XYStaRVe3wfkJO@-PC_} z;d1xMtDhr;Bp!_7(LD&jvTc@1c^uc}-L4}%AMYBNn7-8`gs^oKv}Ib}IlFYZ`?X&` zB3J(aQLm0ixM%_Z)-8u8Tlb=rhgYt=50BHmzv+>wsk<|8>hXw?o6`!%PX7KGJJK1F zK1oos@k-Eyz;aEDXoBADhcSFHgm5{2?PIp@`{0-ni1y36c>STT=g#|Df`ZKt zi<;%IT2X|(Is60`rDp4c+1L*9es7>7 z8jc;*{c@Kp%q9Tgc;?NDJya;>&y}kiV@fG(+eRtHzXJdRJ7npG?+q&e0000_c# literal 0 HcmV?d00001 diff --git a/webui/view/theme/default/images/line.png b/webui/view/theme/default/images/line.png new file mode 100644 index 0000000000000000000000000000000000000000..f5da0b007c4ed7838528fe99af2e0bac01fc575c GIT binary patch literal 95 zcmeAS@N?(olHy`uVBq!ia0y~yV2lH@89A7Mq~x=}+dzsX-O<;Pfnj4m_n$;oAYaVW s#WBRfKl#sj11>k`1QQlFX9imq2Du1E#z2+@Hb4~&p00i_>zopr0A`pJ2LJ#7 literal 0 HcmV?d00001 diff --git a/webui/view/theme/default/images/navigation.png b/webui/view/theme/default/images/navigation.png new file mode 100644 index 0000000000000000000000000000000000000000..b87307576190e321c821bdae67275b7875edd7d5 GIT binary patch literal 1264 zcmeAS@N?(olHy`uVBq!ia0vp^wLq-S!2~4Ne!uV-NU@|l`Z_W&Z0zU$lgJ9>F86eC z49ReQJM*m9)j*M><@yhqU4TG9P*70F>w!zbixZv9?4nZxZ?uc?ePOL(QnwP2vC4T6 z<5D0|=Nc&H8K`lii}(5dUEk}^-<-2|p=Wl9-M60`zdf2&_I>8hpFbZzPA+`$)(I)aN*#O*P0D~|Nad$DcH7cThd$BFTaniojG%6Yb&eyGDe1u7tEr0=lQ2x&&zz5 z=flh(VBgfpwf#9e*Q_txc7Fua{&0ovu(c0}+qrapIY|8v6-nxDJ@!G<* zJEgmIQyKnogzngDrEpwZ-($xE-D~dd?y~B4qtEV*NL#Xy=fHc_hyGJmu3XvJ*ckM1 ze)VG8#m>q5?_Mn2^Jz{C_q|7|N7UD5e+|?zzI1>wpxb!XoH=)H+;Die^pO2`vFca% zlQ!*&?+gF1(({mO)b?+Ok7lm5i(0RhQNi@UeD;LhOAYeR-&?tD@=NpnM-@*cImLIq z{;K%s(Uvgzwc(;BHjE!u`<}QPB$2mX++comm$>bzU?IJd>#uFamv4P`uPW5>urR~^ z8!dNqTOWR_V*I>wX~o6GHi{3G-bM+=%(*tJ`gJHPuRp_|9O0tvBG2C5w7yzq^!Hhy z%=!o7Awqf;t3~WGV^{Yl&78=_*DycF>D@G^ZriW0#6MV_Sb2h((`b_#?2Ypt{tdFI;Zd(w(~v zc^M9TUkHkfQ_R~a4C@Ckm z@3nB+!pDyv+Z~Hv&sZZ3)?V^QF=pe{JKA#Js+bZU6o^8MD1;i(csO*yp|?L9o7Da` z@!Pj>E_{479%SUsx6|tG-JQY4knp17YdR=V%e$+z3Gvd6W}K`AHBspitIF!`fK z%DgfRpM!&s?A^7iEC1g0YuDV|-Mf{;5TSeBbBBj@=>$IY(Qdh?THrJ^ulsUTasJ*_3m$Sd99^l&CVTnvWp8iqqh2B{w_mfKc|Prt zYkyH|OZS#+*Mh>R?01mVW?*l6lwW7x+W5%GjXdFjleee854nBv%WU_;Jw-EtXo z6384_iUG!EGgttYVqno-bWQi{-QG+F1~$HMa0&2_t@rlYc`M4EtOOQe44$rjF6*2U FngC|hVwC^@ literal 0 HcmV?d00001 diff --git a/webui/view/theme/default/images/red_x.png b/webui/view/theme/default/images/red_x.png new file mode 100644 index 0000000000000000000000000000000000000000..7645cfa2e650416b685f06740882e0fdc0ce24f5 GIT binary patch literal 1004 zcmV(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ z6o%kHma$egWp-oPSiReosL&1E=*5J=n3FLfUThfAHLk9$CbrF?CTY^7`IB!K1>dXp z>bZCyUU55>LI{DBlD6Yu`u#&)!O)oLwDwZ3Z2?ejPi|exo25eGYNJ}cCxoEW=>Q;Z zr&60mN-f&A^{i**$*H9ufABv2`!6;s6#&dY0DJcyVh0b`%XT=qv@k!8Qtf8|1$unj z3zwTe&x~fKk_ZLva0F=>0JK{z8pS+9O17Q&0JZ=1>G{m;J5mToDxh~@V4`(>W;Ao* z99B3&bZ8j20JjvlrNAQ~Hnam@FwBF=^T^+R8SNc-exlQEBYn0#=*zF1p8qz99gh<~ zdW`KCk_3l$V%BSz^*W&)yVyRNBtCi!JKoRY#cv3fS5LbGfkA19Bgda!n|2vWVMSxa z4jsXWM(IzC(=|AZy?vPe#5hJIiv8w6G%J9q6l*irT%lO^aZy-a{&V%jdoQbvCd!fc zckHA)@d;X>i*}{FX~+stE0)M4KE%DafME!P>B9Zx#amLV)q1Fw@dXV$KApy|GvrQ= z;1rk90$oTeKs~?0{r5+)QomzaEt&Ycz5rinVCZiZ6%txg0w=^imUu{<_Lw)57DlckXDFr;tCsqt!zA) z!?SA-bxpq^E32hT-lJnpJ={%eK1cb=6xCdo%ty!RdUOjXonqzFcUfP~^6z&SaprRv zksi#$Bh7NLa7m=^+#wPl_{@Lfr^M2klL%9%+1H1;_87zGLMc#wl zDOO%OaBlhG+{aP~LE+KjMC-uFbk7%4Xtp0SGm9uooP39Np+mbQ5%*`YA{Md9DXRP4 zn$9mQOlZ1}xSLLIF0C6{Xv=eFt5{)-0I$ZZ_jW3wnrY* ao^>vJb!yu??&F_)u7B%&{wsum!5RR#h#&v} literal 0 HcmV?d00001 diff --git a/webui/view/theme/default/images/search.png b/webui/view/theme/default/images/search.png new file mode 100644 index 0000000000000000000000000000000000000000..7c0aec3789f408efb6977c17ba62439b6674e956 GIT binary patch literal 738 zcmV<80v-K{P)U@y+4EyC3pWyln4e_*iafi*YXM@lspLfCDgsh=#2xOb zsW?AOgMpo$je+s+ABN^V4;kj4dGVtsNG&}{Uu+Rp1F~0Ma^86N^X!drI*LZpd>9I@ zz52>vHu=oIQfsNq22ZtF7zQLQy}0D&yPwfVa!eV%|7Bo!{rw-q-~a!?PUB-^Vi00y zWU!fXnt_|0W&5r)BQFdC94DW++Tg9OWhO7caP{qPhTs2yni+xGfrfyLQRHJ`xcc-x zL+;vZpEqWkYpC+FJwq|Tdg9Ty^O7t<7BO6U{gZ(Sq!$`Ee}D`V5mtt8Kwj|FV+=A{ z8rIwWM312uVApr}R#&)*swf{j!{Mjj8UFlZU|@zC@*Bu@k>g}|{plw|!rWuur>0tI zJ4CI$+_A0-+WJ*lWGO@I|IY&n_u8z5U#-sR+K*H7z5+KKYR8T*}GzdLFI;P zep7c}UoFupuqw{40bBK>(+*-hX4clKZ*e$P`&j=%(XkO zBQ8IDtINj1DEi~izpsj-+$XQH2z!I%6YbO(<{!Gn;HtvCc&@*C8XFVi4-^AnVDpX7 zJf>nyVkckx_~fr8{N~8xFLtgo&mDBulVy+><71e&=PE;pf$-vm!CDDSjEw&<48R7q z-FW96wD7_f4OtNeX)%6=y=U(-cxwu*Um0r{L6iX?u;${ckdWD@SIYqn;pXFJxPJ8^ zLyo=d45AGHf$i5`dwaI;-oh>|!NA1D$?*O5ed4@;3^rbP9_Zh@e;tS&WG=G`0Mz6B U;$04-+yDRo07*qoM6N<$f*nR{JOBUy literal 0 HcmV?d00001 diff --git a/webui/view/theme/default/images/spinner.gif b/webui/view/theme/default/images/spinner.gif new file mode 100644 index 0000000000000000000000000000000000000000..3288d1035d70bb86517e2c233f1a904e41f06b29 GIT binary patch literal 3208 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 Pn1F;$An(;T&^-PCGf5vc literal 0 HcmV?d00001 diff --git a/webui/view/theme/default/images/tag_blue.png b/webui/view/theme/default/images/tag_blue.png new file mode 100644 index 0000000000000000000000000000000000000000..fa1a91e9816339b8e45deaea5b842efc3c854d82 GIT binary patch literal 495 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbL!WQl7;NpOBzNqJ&XDuZK6ep0G} zXKrG8YEWuoN@d~6R2!h8lL0;uyF;q>g!EsHY(E(_+o|*JW-fY=yYx}*{7Vb=KU;k0`SPPLR~>(~_SBp8 zXWni)|8C3058Ez%+;Qb2&=<{enUO$Gsg(rz1v9wAK_3EqLIYaw3*CS^x;$MRLnI_w z4;~CUWFW$Dz*l&M)#J0lQvd!xXZby4`Jsf@d5j-69f)F_H$7Op{rXzQdB0BFH-BHv z{LJpsxqadVF@E>|*lyW+aAE(El9c?6T9pTLdT$*UEjU?h{8g~wM0eOP4u>b~Yx@~o z)~&dFp2vmlO7zXNjz26{*X9^cjCXjNH(PmqL)UIy;Ro{akyg{=9_oUkl)=;0&t;uc GLK6VXFy%x5 literal 0 HcmV?d00001 diff --git a/webui/view/theme/default/stylesheet/colorbox.css b/webui/view/theme/default/stylesheet/colorbox.css new file mode 100644 index 00000000..10ab2717 --- /dev/null +++ b/webui/view/theme/default/stylesheet/colorbox.css @@ -0,0 +1,37 @@ +/* + ColorBox Core Style: + The following CSS is consistent between example themes and should not be altered. +*/ +#colorbox, #cboxOverlay, #cboxWrapper{position:absolute; top:0; left:0; z-index:9999; overflow:hidden;} +#cboxOverlay{position:fixed; width:100%; height:100%;} +#cboxMiddleLeft, #cboxBottomLeft{clear:left;} +#cboxContent{position:relative;} +#cboxLoadedContent{overflow:auto;} +#cboxTitle{margin:0;} +#cboxLoadingOverlay, #cboxLoadingGraphic{position:absolute; top:0; left:0; width:100%; height:100%;} +#cboxPrevious, #cboxNext, #cboxClose, #cboxSlideshow{cursor:pointer;} +.cboxPhoto{float:left; margin:auto; border:0; display:block;} +.cboxIframe{width:100%; height:100%; display:block; border:0;} + +/* + User Style: + Change the following styles to modify the appearance of ColorBox. They are + ordered & tabbed in a way that represents the nesting of the generated HTML. +*/ +#cboxOverlay{background:#000;} +#colorbox{} + #cboxContent{margin-top:20px;} + .cboxIframe{background:#fff;} + #cboxError{padding:50px; border:1px solid #ccc;} + #cboxLoadedContent{border:5px solid #000; background:#fff;} + #cboxTitle{position:absolute; top:-20px; left:0; color:#ccc;} + #cboxCurrent{position:absolute; top:-20px; right:0px; color:#ccc;} + #cboxSlideshow{position:absolute; top:-20px; right:90px; color:#fff;} + #cboxPrevious{position:absolute; top:50%; left:5px; margin-top:-32px; background:url(images/controls.png) no-repeat top left; width:28px; height:65px; text-indent:-9999px;} + #cboxPrevious:hover{background-position:bottom left;} + #cboxNext{position:absolute; top:50%; right:5px; margin-top:-32px; background:url(images/controls.png) no-repeat top right; width:28px; height:65px; text-indent:-9999px;} + #cboxNext:hover{background-position:bottom right;} + #cboxLoadingOverlay{background:#000;} + #cboxLoadingGraphic{background:url(images/loading.gif) no-repeat center center;} + #cboxClose{position:absolute; top:5px; right:5px; display:block; background:url(images/controls.png) no-repeat top center; width:38px; height:19px; text-indent:-9999px;} + #cboxClose:hover{background-position:bottom center;} \ No newline at end of file diff --git a/webui/view/theme/default/stylesheet/images/border.png b/webui/view/theme/default/stylesheet/images/border.png new file mode 100644 index 0000000000000000000000000000000000000000..f463a10d838aeba263ff44e5c3578dfe7ba07648 GIT binary patch literal 112 zcmeAS@N?(olHy`uVBq!ia0vp^j6iI}$P6Txn<}3KQfvV}A+A9B|Ns9>Z_d99WHFWm z`2{zujf-{zawI%m978JNrXFPE1@f8<7E8}%%lTu>&#KnM&G`7uteHSj22WQ%mvv4F FO#q`M9f1G< literal 0 HcmV?d00001 diff --git a/webui/view/theme/default/stylesheet/images/controls.png b/webui/view/theme/default/stylesheet/images/controls.png new file mode 100644 index 0000000000000000000000000000000000000000..e1e97982a6b4038f0aae1f9e2e7fa4d89df68841 GIT binary patch literal 1633 zcmV-n2A=teP)gwz2>+9y`=TcHq z-rnCuMn^(ILOMD+EiEn~AtAlJz0c6nGcz;A#m3Up)UB_vr>Lo=rKXvgnU9c?i;Iim z;R<0n*sHVxX1Wu=dDmb5@ zoduu*GO7Y3gN)R3LlCkA83ANu{udpGM*u$>gP0`<1_F8BNfnW-jvET2ri(~grcgs6 zfuNc}C`52O?KU>*_xBwlz$`(9h!7a5Xz`@Dfk^XqtL=`O&7MbyN*s{1cohspL^?w` zCJbt{9v>V2SM#J8C>P7Se={P=10MX=2jpbh>VWAOZ`4loT=P^~`R! z;id=$u@Od+m^K=9-@%NRBn(CZNpZq6&5@6g(`ZoI9)5wt!^aKD^z=@#Am195`0Y`!+$%p9c^CoEQgtOp5 zEEcDUb#KOlSex@S5iLQS2y^-+;ZIF|1UAxyZ{Y_TYaYbh#94ll@a=j?n6ogKmGGQ7 zu5N~n{5auRbxdHR(d%}*Gge|&-)9oTqXZGC!A?v^)WCU^aP1K#u)#ixQOY2MYgwb1 zQGiGo4k29I#st9$vMx?gBP7Mh{wQkmjt!+NK5(D1jEohRaI0HZk_dBDoB@dwAf&fhv$fjCdZNhQ<5A@t3*Uq1SKU_ z388}$(?g;PO09|sv0Oq#KnEqK1Ep+20b1FF28^-^1E7+Jp&@{vRHh(7OdzO~Cn)f+ zMpa5ed{x3CKtw zIjm=9~S z64&923<&Y#NBx+n|9Tn!B*WlGV1p8mZ+|0G)5x3`z^_<4m%OOPtq+R zx=*X^VHnsL6e7Z@h#Ade;$UE8&}ApcOhraO2-I4UVPIpA^otN=7>BSx2vohCaMdIv@Ur#r=q^%~zIp~i|2G5+~_YKx?`GWihq zr|&?z77t?7{=eO->2l8W0;7=B8p=plgrXCrz;i%N;_+EX@Qfhv`MBi>a0xK~6byma z5miB?_OlZTfAvRngQFlJ$A8OE=PEDPSfI@teg&4n|@EB5r09gnqfi%%sK5sU5ng9~KoTyQO6214=+ud?G zp#(K*ml1}pP=FHVpWU6m`1Afgr36jUjnjmoig`A?7XREdef;NUcb{vwNmPwbLd&~Y z&szSTYWsQj{WLKWiHb4C6Z00000NkvXXu0mjf#Rc%Z literal 0 HcmV?d00001 diff --git a/webui/view/theme/default/stylesheet/images/ie6/borderBottomCenter.png b/webui/view/theme/default/stylesheet/images/ie6/borderBottomCenter.png new file mode 100644 index 0000000000000000000000000000000000000000..0d4475edf4e1ebb18d41db83915a21a9a6bc5977 GIT binary patch literal 111 zcmeAS@N?(olHy`uVBq!ia0vp^j6f{P$P6U+&JlA5QfvV}A+A9B|Ns9>Z_d99WHFWm z`2{zujf-{za>PAd978JNY7Z)cbT)5ruP-ra%e~G}wTijXxbw&apdf>%tDnm{r-UW| DknJ7# literal 0 HcmV?d00001 diff --git a/webui/view/theme/default/stylesheet/images/ie6/borderBottomLeft.png b/webui/view/theme/default/stylesheet/images/ie6/borderBottomLeft.png new file mode 100644 index 0000000000000000000000000000000000000000..2775eba899d10d3dc6f8c4044ad69cb89a5f8499 GIT binary patch literal 215 zcmeAS@N?(olHy`uVBq!ia0vp^q9Dw|3?!p1cPs@`>H$6>u0R?BQd3j6Z{H4KpFe*d zCJdtg|NlSbL?0`V#ZwaG7u>*5G5>gk!F7ua0ST$+oA`j@!JaOTAr*10r#A97C`hm- z3dKH%oOr{aLpj2LsW&>nlF|6W##ZJ(&Vq|N!)H`n4WCnOwE6XE$$JkZ%dBmlKK#!l q^N>YH$6>u0R?BQd3j6Z{H4KpFe*d zCJdtg|NlSbL?0`V#ZwaG7u>*5G5>gk!F7ua0ST$+oA`j@p`I>|Ar*0Rk8R{_P!M3f za60r>rSy%6n-)#V7EE~whgkX^aO5~8RysR6J&4z+ys8}98}g<84F4bXKSykNqt5CV sw|{E#ePx# literal 0 HcmV?d00001 diff --git a/webui/view/theme/default/stylesheet/images/ie6/borderMiddleLeft.png b/webui/view/theme/default/stylesheet/images/ie6/borderMiddleLeft.png new file mode 100644 index 0000000000000000000000000000000000000000..a2d63d156e008a01fde9d2d68c531c34926a924a GIT binary patch literal 108 zcmeAS@N?(olHy`uVBq!ia0vp^qCm{Z$P6U8=aokQDYgKg5LY1m|NsA`H|O64NtXoq z1vjjXi*^HYL_A#_Ln`7}8#ZzRc@9(l|2O5zVPsZ_d99WHFWm z`2{zujf-{za>PAd978JNY7Z)cbT)5ruP@Q*%6-Zwv5L7-WU|;#pdf>%tDnm{r-UW| Dg{~b` literal 0 HcmV?d00001 diff --git a/webui/view/theme/default/stylesheet/images/ie6/borderTopLeft.png b/webui/view/theme/default/stylesheet/images/ie6/borderTopLeft.png new file mode 100644 index 0000000000000000000000000000000000000000..f9d458b5bba4a8cb84b9ee39a3844e258c1dcc20 GIT binary patch literal 216 zcmeAS@N?(olHy`uVBq!ia0vp^q9Dw|3?!p1cPs@`>H$6>u0R?qNKH*WfByXT?c0H} z|NsBDZcF_MWbu>)`2{yHR2W1EWLV67bmi? zvo+on5)g6V?RfL6QIf literal 0 HcmV?d00001 diff --git a/webui/view/theme/default/stylesheet/images/ie6/borderTopRight.png b/webui/view/theme/default/stylesheet/images/ie6/borderTopRight.png new file mode 100644 index 0000000000000000000000000000000000000000..74b8583cfbb2e62a84ef04ba01064ecb4d70e72a GIT binary patch literal 214 zcmeAS@N?(olHy`uVBq!ia0vp^q9Dw|3?!p1cPs@`>H$6>u0R?Sq^70<1<#*9zkU05 zAmji4|I_}5*Z^5PB|(0{4Ga|#78wHb4Xz)Tc+|OiK2SW!)5S5QBChw?MqY;mf#VnJ z^}ggWcLpW1DoZ@PeSjlp!DT5|UGpg|kLp?vt)3@$_tm@JIJ0M=)Av-}@ro0Ud)StJ qkbTcp`HhbYABf8t?|bZq*G4@Nf;!!};89ZJ6T-G@yGywoYi%4?- literal 0 HcmV?d00001 diff --git a/webui/view/theme/default/stylesheet/images/loading.gif b/webui/view/theme/default/stylesheet/images/loading.gif new file mode 100644 index 0000000000000000000000000000000000000000..19c67bbd0403f3f00d71bfb21a59cb6c55d482ab GIT binary patch literal 9427 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 literal 0 HcmV?d00001 diff --git a/webui/view/theme/default/stylesheet/images/overlay.png b/webui/view/theme/default/stylesheet/images/overlay.png new file mode 100644 index 0000000000000000000000000000000000000000..53ea98f7003cf014cda2f764a7d982e405bd1b5f GIT binary patch literal 182 zcmeAS@N?(olHy`uVBq!ia0vp^av;pY3?xs=ZJr3E3<7*YT>t<7&(6-y!NDOSA|fs> z4iv@@^0LaF09818x;TbZ%z1NeAuof1z|jlq0?ZV)A8h5lQLnD@Q>uGq<+3e(rH8NF wGFLG_IXT618W25kEc*C=-akH|?*IRp8MKNmPAJ`FsRUW)>FVdQ&MBb@0FX~HaR2}S literal 0 HcmV?d00001 diff --git a/webui/view/theme/default/stylesheet/images/ui-bg_flat_0_aaaaaa_40x100.png b/webui/view/theme/default/stylesheet/images/ui-bg_flat_0_aaaaaa_40x100.png new file mode 100644 index 0000000000000000000000000000000000000000..5b5dab2ab7b1c50dea9cfe73dc5a269a92d2d4b4 GIT binary patch literal 180 zcmeAS@N?(olHy`uVBq!ia0vp^8bF-F!3HG1q!d*FscKIb$B>N1x91EQ4=4yQ7#`R^ z$vje}bP0l+XkK DSH>_4 literal 0 HcmV?d00001 diff --git a/webui/view/theme/default/stylesheet/images/ui-bg_flat_75_ffffff_40x100.png b/webui/view/theme/default/stylesheet/images/ui-bg_flat_75_ffffff_40x100.png new file mode 100644 index 0000000000000000000000000000000000000000..ac8b229af950c29356abf64a6c4aa894575445f0 GIT binary patch literal 178 zcmeAS@N?(olHy`uVBq!ia0vp^8bF-F!3HG1q!d*FsY*{5$B>N1x91EQ4=4yQYz+E8 zPo9&<{J;c_6SHRil>2s{Zw^OT)6@jj2u|u!(plXsM>LJD`vD!n;OXk;vd$@?2>^GI BH@yG= literal 0 HcmV?d00001 diff --git a/webui/view/theme/default/stylesheet/images/ui-bg_glass_55_fbf9ee_1x400.png b/webui/view/theme/default/stylesheet/images/ui-bg_glass_55_fbf9ee_1x400.png new file mode 100644 index 0000000000000000000000000000000000000000..ad3d6346e00f246102f72f2e026ed0491988b394 GIT binary patch literal 120 zcmeAS@N?(olHy`uVBq!ia0vp^j6gJjgAK^akKnour0hLi978O6-<~(*I$*%ybaDOn z{W;e!B}_MSUQoPXhYd^Y6RUoS1yepnPx`2Kz)7OXQG!!=-jY=F+d2OOy?#DnJ32>z UEim$g7SJdLPgg&ebxsLQ09~*s;{X5v literal 0 HcmV?d00001 diff --git a/webui/view/theme/default/stylesheet/images/ui-bg_glass_65_ffffff_1x400.png b/webui/view/theme/default/stylesheet/images/ui-bg_glass_65_ffffff_1x400.png new file mode 100644 index 0000000000000000000000000000000000000000..42ccba269b6e91bef12ad0fa18be651b5ef0ee68 GIT binary patch literal 105 zcmeAS@N?(olHy`uVBq!ia0vp^j6gJjgAK^akKnouqzpV=978O6-=0?FV^9z|eBtf= z|7WztIJ;WT>{+tN>ySr~=F{k$>;_x^_y?afmf9pRKH0)6?eSP?3s5hEr>mdKI;Vst E0O;M1& literal 0 HcmV?d00001 diff --git a/webui/view/theme/default/stylesheet/images/ui-bg_glass_75_dadada_1x400.png b/webui/view/theme/default/stylesheet/images/ui-bg_glass_75_dadada_1x400.png new file mode 100644 index 0000000000000000000000000000000000000000..5a46b47cb16631068aee9e0bd61269fc4e95e5cd GIT binary patch literal 111 zcmeAS@N?(olHy`uVBq!ia0vp^j6gJjgAK^akKnouq|7{B978O6lPf+wIa#m9#>Unb zm^4K~wN3Zq+uP{vDV26o)#~38k_!`W=^oo1w6ixmPC4R1b Tyd6G3lNdZ*{an^LB{Ts5`idse literal 0 HcmV?d00001 diff --git a/webui/view/theme/default/stylesheet/images/ui-bg_highlight-soft_75_cccccc_1x100.png b/webui/view/theme/default/stylesheet/images/ui-bg_highlight-soft_75_cccccc_1x100.png new file mode 100644 index 0000000000000000000000000000000000000000..7c9fa6c6edcfcdd3e5b77e6f547b719e6fc66e30 GIT binary patch literal 101 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 literal 0 HcmV?d00001 diff --git a/webui/view/theme/default/stylesheet/images/ui-icons_2e83ff_256x240.png b/webui/view/theme/default/stylesheet/images/ui-icons_2e83ff_256x240.png new file mode 100644 index 0000000000000000000000000000000000000000..45e8928e5284adacea3f9ec07b9b50667d2ac65f GIT binary patch literal 4369 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 literal 0 HcmV?d00001 diff --git a/webui/view/theme/default/stylesheet/images/ui-icons_454545_256x240.png b/webui/view/theme/default/stylesheet/images/ui-icons_454545_256x240.png new file mode 100644 index 0000000000000000000000000000000000000000..7ec70d11bfb2f77374dfd00ef61ba0c3647b5a0c GIT binary patch literal 4369 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 k*Kv;w;*%(i9W@fAqs5i2wiq literal 0 HcmV?d00001 diff --git a/webui/view/theme/default/stylesheet/images/ui-icons_888888_256x240.png b/webui/view/theme/default/stylesheet/images/ui-icons_888888_256x240.png new file mode 100644 index 0000000000000000000000000000000000000000..5ba708c39172a69e069136bd1309c4322c61f571 GIT binary patch literal 4369 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 literal 0 HcmV?d00001 diff --git a/webui/view/theme/default/stylesheet/jquery.ui.accordion.css b/webui/view/theme/default/stylesheet/jquery.ui.accordion.css new file mode 100644 index 00000000..93e128a3 --- /dev/null +++ b/webui/view/theme/default/stylesheet/jquery.ui.accordion.css @@ -0,0 +1,19 @@ +/* + * jQuery UI Accordion 1.8.13 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Accordion#theming + */ +/* IE/Win - Fix animation bug - #4615 */ +.ui-accordion { width: 100%; } +.ui-accordion .ui-accordion-header { cursor: pointer; position: relative; margin-top: 1px; zoom: 1; } +.ui-accordion .ui-accordion-li-fix { display: inline; } +.ui-accordion .ui-accordion-header-active { border-bottom: 0 !important; } +.ui-accordion .ui-accordion-header a { display: block; font-size: 1em; padding: .5em .5em .5em .7em; } +.ui-accordion-icons .ui-accordion-header a { padding-left: 2.2em; } +.ui-accordion .ui-accordion-header .ui-icon { position: absolute; left: .5em; top: 50%; margin-top: -8px; } +.ui-accordion .ui-accordion-content { padding: 1em 2.2em; border-top: 0; margin-top: -2px; position: relative; top: 1px; margin-bottom: 2px; overflow: auto; display: none; zoom: 1; } +.ui-accordion .ui-accordion-content-active { display: block; } diff --git a/webui/view/theme/default/stylesheet/jquery.ui.all.css b/webui/view/theme/default/stylesheet/jquery.ui.all.css new file mode 100644 index 00000000..603aafd4 --- /dev/null +++ b/webui/view/theme/default/stylesheet/jquery.ui.all.css @@ -0,0 +1,11 @@ +/* + * jQuery UI CSS Framework 1.8.13 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Theming + */ +@import "jquery.ui.base.css"; +@import "jquery.ui.theme.css"; diff --git a/webui/view/theme/default/stylesheet/jquery.ui.autocomplete.css b/webui/view/theme/default/stylesheet/jquery.ui.autocomplete.css new file mode 100644 index 00000000..d90fc300 --- /dev/null +++ b/webui/view/theme/default/stylesheet/jquery.ui.autocomplete.css @@ -0,0 +1,53 @@ +/* + * jQuery UI Autocomplete 1.8.13 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Autocomplete#theming + */ +.ui-autocomplete { position: absolute; cursor: default; } + +/* workarounds */ +* html .ui-autocomplete { width:1px; } /* without this, the menu expands to 100% in IE6 */ + +/* + * jQuery UI Menu 1.8.13 + * + * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Menu#theming + */ +.ui-menu { + list-style:none; + padding: 2px; + margin: 0; + display:block; + float: left; +} +.ui-menu .ui-menu { + margin-top: -3px; +} +.ui-menu .ui-menu-item { + margin:0; + padding: 0; + zoom: 1; + float: left; + clear: left; + width: 100%; +} +.ui-menu .ui-menu-item a { + text-decoration:none; + display:block; + padding:.2em .4em; + line-height:1.5; + zoom:1; +} +.ui-menu .ui-menu-item a.ui-state-hover, +.ui-menu .ui-menu-item a.ui-state-active { + font-weight: normal; + margin: -1px; +} diff --git a/webui/view/theme/default/stylesheet/jquery.ui.base.css b/webui/view/theme/default/stylesheet/jquery.ui.base.css new file mode 100644 index 00000000..f52ee39b --- /dev/null +++ b/webui/view/theme/default/stylesheet/jquery.ui.base.css @@ -0,0 +1,11 @@ +@import url("jquery.ui.core.css"); +@import url("jquery.ui.resizable.css"); +@import url("jquery.ui.selectable.css"); +@import url("jquery.ui.accordion.css"); +@import url("jquery.ui.autocomplete.css"); +@import url("jquery.ui.button.css"); +@import url("jquery.ui.dialog.css"); +@import url("jquery.ui.slider.css"); +@import url("jquery.ui.tabs.css"); +@import url("jquery.ui.datepicker.css"); +@import url("jquery.ui.progressbar.css"); \ No newline at end of file diff --git a/webui/view/theme/default/stylesheet/jquery.ui.button.css b/webui/view/theme/default/stylesheet/jquery.ui.button.css new file mode 100644 index 00000000..e887fb64 --- /dev/null +++ b/webui/view/theme/default/stylesheet/jquery.ui.button.css @@ -0,0 +1,38 @@ +/* + * jQuery UI Button 1.8.13 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Button#theming + */ +.ui-button { display: inline-block; position: relative; padding: 0; margin-right: .1em; text-decoration: none !important; cursor: pointer; text-align: center; zoom: 1; overflow: visible; } /* the overflow property removes extra width in IE */ +.ui-button-icon-only { width: 2.2em; } /* to make room for the icon, a width needs to be set here */ +button.ui-button-icon-only { width: 2.4em; } /* button elements seem to need a little more width */ +.ui-button-icons-only { width: 3.4em; } +button.ui-button-icons-only { width: 3.7em; } + +/*button text element */ +.ui-button .ui-button-text { display: block; line-height: 1.4; } +.ui-button-text-only .ui-button-text { padding: .4em 1em; } +.ui-button-icon-only .ui-button-text, .ui-button-icons-only .ui-button-text { padding: .4em; text-indent: -9999999px; } +.ui-button-text-icon-primary .ui-button-text, .ui-button-text-icons .ui-button-text { padding: .4em 1em .4em 2.1em; } +.ui-button-text-icon-secondary .ui-button-text, .ui-button-text-icons .ui-button-text { padding: .4em 2.1em .4em 1em; } +.ui-button-text-icons .ui-button-text { padding-left: 2.1em; padding-right: 2.1em; } +/* no icon support for input elements, provide padding by default */ +input.ui-button { padding: .4em 1em; } + +/*button icon element(s) */ +.ui-button-icon-only .ui-icon, .ui-button-text-icon-primary .ui-icon, .ui-button-text-icon-secondary .ui-icon, .ui-button-text-icons .ui-icon, .ui-button-icons-only .ui-icon { position: absolute; top: 50%; margin-top: -8px; } +.ui-button-icon-only .ui-icon { left: 50%; margin-left: -8px; } +.ui-button-text-icon-primary .ui-button-icon-primary, .ui-button-text-icons .ui-button-icon-primary, .ui-button-icons-only .ui-button-icon-primary { left: .5em; } +.ui-button-text-icon-secondary .ui-button-icon-secondary, .ui-button-text-icons .ui-button-icon-secondary, .ui-button-icons-only .ui-button-icon-secondary { right: .5em; } +.ui-button-text-icons .ui-button-icon-secondary, .ui-button-icons-only .ui-button-icon-secondary { right: .5em; } + +/*button sets*/ +.ui-buttonset { margin-right: 7px; } +.ui-buttonset .ui-button { margin-left: 0; margin-right: -.3em; } + +/* workarounds */ +button.ui-button::-moz-focus-inner { border: 0; padding: 0; } /* reset extra padding in Firefox */ diff --git a/webui/view/theme/default/stylesheet/jquery.ui.core.css b/webui/view/theme/default/stylesheet/jquery.ui.core.css new file mode 100644 index 00000000..ea82f08a --- /dev/null +++ b/webui/view/theme/default/stylesheet/jquery.ui.core.css @@ -0,0 +1,41 @@ +/* + * jQuery UI CSS Framework 1.8.13 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Theming/API + */ + +/* Layout helpers +----------------------------------*/ +.ui-helper-hidden { display: none; } +.ui-helper-hidden-accessible { position: absolute !important; clip: rect(1px 1px 1px 1px); clip: rect(1px,1px,1px,1px); } +.ui-helper-reset { margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none; } +.ui-helper-clearfix:after { content: "."; display: block; height: 0; clear: both; visibility: hidden; } +.ui-helper-clearfix { display: inline-block; } +/* required comment for clearfix to work in Opera \*/ +* html .ui-helper-clearfix { height:1%; } +.ui-helper-clearfix { display:block; } +/* end clearfix */ +.ui-helper-zfix { width: 100%; height: 100%; top: 0; left: 0; position: absolute; opacity: 0; filter:Alpha(Opacity=0); } + + +/* Interaction Cues +----------------------------------*/ +.ui-state-disabled { cursor: default !important; } + + +/* Icons +----------------------------------*/ + +/* states and images */ +.ui-icon { display: block; text-indent: -99999px; overflow: hidden; background-repeat: no-repeat; } + + +/* Misc visuals +----------------------------------*/ + +/* Overlays */ +.ui-widget-overlay { position: absolute; top: 0; left: 0; width: 100%; height: 100%; } diff --git a/webui/view/theme/default/stylesheet/jquery.ui.datepicker.css b/webui/view/theme/default/stylesheet/jquery.ui.datepicker.css new file mode 100644 index 00000000..b370444e --- /dev/null +++ b/webui/view/theme/default/stylesheet/jquery.ui.datepicker.css @@ -0,0 +1,68 @@ +/* + * jQuery UI Datepicker 1.8.13 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Datepicker#theming + */ +.ui-datepicker { width: 17em; padding: .2em .2em 0; display: none; } +.ui-datepicker .ui-datepicker-header { position:relative; padding:.2em 0; } +.ui-datepicker .ui-datepicker-prev, .ui-datepicker .ui-datepicker-next { position:absolute; top: 2px; width: 1.8em; height: 1.8em; } +.ui-datepicker .ui-datepicker-prev-hover, .ui-datepicker .ui-datepicker-next-hover { top: 1px; } +.ui-datepicker .ui-datepicker-prev { left:2px; } +.ui-datepicker .ui-datepicker-next { right:2px; } +.ui-datepicker .ui-datepicker-prev-hover { left:1px; } +.ui-datepicker .ui-datepicker-next-hover { right:1px; } +.ui-datepicker .ui-datepicker-prev span, .ui-datepicker .ui-datepicker-next span { display: block; position: absolute; left: 50%; margin-left: -8px; top: 50%; margin-top: -8px; } +.ui-datepicker .ui-datepicker-title { margin: 0 2.3em; line-height: 1.8em; text-align: center; } +.ui-datepicker .ui-datepicker-title select { font-size:1em; margin:1px 0; } +.ui-datepicker select.ui-datepicker-month-year {width: 100%;} +.ui-datepicker select.ui-datepicker-month, +.ui-datepicker select.ui-datepicker-year { width: 49%;} +.ui-datepicker table {width: 100%; font-size: .9em; border-collapse: collapse; margin:0 0 .4em; } +.ui-datepicker th { padding: .7em .3em; text-align: center; font-weight: bold; border: 0; } +.ui-datepicker td { border: 0; padding: 1px; } +.ui-datepicker td span, .ui-datepicker td a { display: block; padding: .2em; text-align: right; text-decoration: none; } +.ui-datepicker .ui-datepicker-buttonpane { background-image: none; margin: .7em 0 0 0; padding:0 .2em; border-left: 0; border-right: 0; border-bottom: 0; } +.ui-datepicker .ui-datepicker-buttonpane button { float: right; margin: .5em .2em .4em; cursor: pointer; padding: .2em .6em .3em .6em; width:auto; overflow:visible; } +.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current { float:left; } + +/* with multiple calendars */ +.ui-datepicker.ui-datepicker-multi { width:auto; } +.ui-datepicker-multi .ui-datepicker-group { float:left; } +.ui-datepicker-multi .ui-datepicker-group table { width:95%; margin:0 auto .4em; } +.ui-datepicker-multi-2 .ui-datepicker-group { width:50%; } +.ui-datepicker-multi-3 .ui-datepicker-group { width:33.3%; } +.ui-datepicker-multi-4 .ui-datepicker-group { width:25%; } +.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header { border-left-width:0; } +.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header { border-left-width:0; } +.ui-datepicker-multi .ui-datepicker-buttonpane { clear:left; } +.ui-datepicker-row-break { clear:both; width:100%; } + +/* RTL support */ +.ui-datepicker-rtl { direction: rtl; } +.ui-datepicker-rtl .ui-datepicker-prev { right: 2px; left: auto; } +.ui-datepicker-rtl .ui-datepicker-next { left: 2px; right: auto; } +.ui-datepicker-rtl .ui-datepicker-prev:hover { right: 1px; left: auto; } +.ui-datepicker-rtl .ui-datepicker-next:hover { left: 1px; right: auto; } +.ui-datepicker-rtl .ui-datepicker-buttonpane { clear:right; } +.ui-datepicker-rtl .ui-datepicker-buttonpane button { float: left; } +.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current { float:right; } +.ui-datepicker-rtl .ui-datepicker-group { float:right; } +.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header { border-right-width:0; border-left-width:1px; } +.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header { border-right-width:0; border-left-width:1px; } + +/* IE6 IFRAME FIX (taken from datepicker 1.5.3 */ +.ui-datepicker-cover { + display: none; /*sorry for IE5*/ + display/**/: block; /*sorry for IE5*/ + position: absolute; /*must have*/ + z-index: -1; /*must have*/ + filter: mask(); /*must have*/ + top: -4px; /*must have*/ + left: -4px; /*must have*/ + width: 200px; /*must have*/ + height: 200px; /*must have*/ +} \ No newline at end of file diff --git a/webui/view/theme/default/stylesheet/jquery.ui.dialog.css b/webui/view/theme/default/stylesheet/jquery.ui.dialog.css new file mode 100644 index 00000000..722203e8 --- /dev/null +++ b/webui/view/theme/default/stylesheet/jquery.ui.dialog.css @@ -0,0 +1,21 @@ +/* + * jQuery UI Dialog 1.8.13 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Dialog#theming + */ +.ui-dialog { position: absolute; padding: .2em; width: 300px; overflow: hidden; } +.ui-dialog .ui-dialog-titlebar { padding: .4em 1em; position: relative; } +.ui-dialog .ui-dialog-title { float: left; margin: .1em 16px .1em 0; } +.ui-dialog .ui-dialog-titlebar-close { position: absolute; right: .3em; top: 50%; width: 19px; margin: -10px 0 0 0; padding: 1px; height: 18px; } +.ui-dialog .ui-dialog-titlebar-close span { display: block; margin: 1px; } +.ui-dialog .ui-dialog-titlebar-close:hover, .ui-dialog .ui-dialog-titlebar-close:focus { padding: 0; } +.ui-dialog .ui-dialog-content { position: relative; border: 0; padding: .5em 1em; background: none; overflow: auto; zoom: 1; } +.ui-dialog .ui-dialog-buttonpane { text-align: left; border-width: 1px 0 0 0; background-image: none; margin: .5em 0 0 0; padding: .3em 1em .5em .4em; } +.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset { float: right; } +.ui-dialog .ui-dialog-buttonpane button { margin: .5em .4em .5em 0; cursor: pointer; } +.ui-dialog .ui-resizable-se { width: 14px; height: 14px; right: 3px; bottom: 3px; } +.ui-draggable .ui-dialog-titlebar { cursor: move; } diff --git a/webui/view/theme/default/stylesheet/jquery.ui.progressbar.css b/webui/view/theme/default/stylesheet/jquery.ui.progressbar.css new file mode 100644 index 00000000..d896b2a0 --- /dev/null +++ b/webui/view/theme/default/stylesheet/jquery.ui.progressbar.css @@ -0,0 +1,11 @@ +/* + * jQuery UI Progressbar 1.8.13 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Progressbar#theming + */ +.ui-progressbar { height:2em; text-align: left; } +.ui-progressbar .ui-progressbar-value {margin: -1px; height:100%; } \ No newline at end of file diff --git a/webui/view/theme/default/stylesheet/jquery.ui.resizable.css b/webui/view/theme/default/stylesheet/jquery.ui.resizable.css new file mode 100644 index 00000000..bb0ee87d --- /dev/null +++ b/webui/view/theme/default/stylesheet/jquery.ui.resizable.css @@ -0,0 +1,25 @@ +/* + * jQuery UI Resizable 1.8.13 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Resizable#theming + */ +.ui-resizable { position: relative;} +.ui-resizable-handle { position: absolute;font-size: 0.1px;z-index: 99999; display: block; + /* http://bugs.jqueryui.com/ticket/7233 + - Resizable: resizable handles fail to work in IE if transparent and content overlaps + */ + background-image:url(data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs=); +} +.ui-resizable-disabled .ui-resizable-handle, .ui-resizable-autohide .ui-resizable-handle { display: none; } +.ui-resizable-n { cursor: n-resize; height: 7px; width: 100%; top: -5px; left: 0; } +.ui-resizable-s { cursor: s-resize; height: 7px; width: 100%; bottom: -5px; left: 0; } +.ui-resizable-e { cursor: e-resize; width: 7px; right: -5px; top: 0; height: 100%; } +.ui-resizable-w { cursor: w-resize; width: 7px; left: -5px; top: 0; height: 100%; } +.ui-resizable-se { cursor: se-resize; width: 12px; height: 12px; right: 1px; bottom: 1px; } +.ui-resizable-sw { cursor: sw-resize; width: 9px; height: 9px; left: -5px; bottom: -5px; } +.ui-resizable-nw { cursor: nw-resize; width: 9px; height: 9px; left: -5px; top: -5px; } +.ui-resizable-ne { cursor: ne-resize; width: 9px; height: 9px; right: -5px; top: -5px;} \ No newline at end of file diff --git a/webui/view/theme/default/stylesheet/jquery.ui.selectable.css b/webui/view/theme/default/stylesheet/jquery.ui.selectable.css new file mode 100644 index 00000000..47db29ef --- /dev/null +++ b/webui/view/theme/default/stylesheet/jquery.ui.selectable.css @@ -0,0 +1,10 @@ +/* + * jQuery UI Selectable 1.8.13 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Selectable#theming + */ +.ui-selectable-helper { position: absolute; z-index: 100; border:1px dotted black; } diff --git a/webui/view/theme/default/stylesheet/jquery.ui.slider.css b/webui/view/theme/default/stylesheet/jquery.ui.slider.css new file mode 100644 index 00000000..74b9d52f --- /dev/null +++ b/webui/view/theme/default/stylesheet/jquery.ui.slider.css @@ -0,0 +1,24 @@ +/* + * jQuery UI Slider 1.8.13 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Slider#theming + */ +.ui-slider { position: relative; text-align: left; } +.ui-slider .ui-slider-handle { position: absolute; z-index: 2; width: 1.2em; height: 1.2em; cursor: default; } +.ui-slider .ui-slider-range { position: absolute; z-index: 1; font-size: .7em; display: block; border: 0; background-position: 0 0; } + +.ui-slider-horizontal { height: .8em; } +.ui-slider-horizontal .ui-slider-handle { top: -.3em; margin-left: -.6em; } +.ui-slider-horizontal .ui-slider-range { top: 0; height: 100%; } +.ui-slider-horizontal .ui-slider-range-min { left: 0; } +.ui-slider-horizontal .ui-slider-range-max { right: 0; } + +.ui-slider-vertical { width: .8em; height: 100px; } +.ui-slider-vertical .ui-slider-handle { left: -.3em; margin-left: 0; margin-bottom: -.6em; } +.ui-slider-vertical .ui-slider-range { left: 0; width: 100%; } +.ui-slider-vertical .ui-slider-range-min { bottom: 0; } +.ui-slider-vertical .ui-slider-range-max { top: 0; } \ No newline at end of file diff --git a/webui/view/theme/default/stylesheet/jquery.ui.tabs.css b/webui/view/theme/default/stylesheet/jquery.ui.tabs.css new file mode 100644 index 00000000..1ed9c22d --- /dev/null +++ b/webui/view/theme/default/stylesheet/jquery.ui.tabs.css @@ -0,0 +1,18 @@ +/* + * jQuery UI Tabs 1.8.13 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Tabs#theming + */ +.ui-tabs { position: relative; padding: .2em; zoom: 1; } /* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */ +.ui-tabs .ui-tabs-nav { margin: 0; padding: .2em .2em 0; } +.ui-tabs .ui-tabs-nav li { list-style: none; float: left; position: relative; top: 1px; margin: 0 .2em 1px 0; border-bottom: 0 !important; padding: 0; white-space: nowrap; } +.ui-tabs .ui-tabs-nav li a { float: left; padding: .5em 1em; text-decoration: none; } +.ui-tabs .ui-tabs-nav li.ui-tabs-selected { margin-bottom: 0; padding-bottom: 1px; } +.ui-tabs .ui-tabs-nav li.ui-tabs-selected a, .ui-tabs .ui-tabs-nav li.ui-state-disabled a, .ui-tabs .ui-tabs-nav li.ui-state-processing a { cursor: text; } +.ui-tabs .ui-tabs-nav li a, .ui-tabs.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-selected a { cursor: pointer; } /* first selector in group seems obsolete, but required to overcome bug in Opera applying cursor: text overall if defined elsewhere... */ +.ui-tabs .ui-tabs-panel { display: block; border-width: 0; padding: 1em 1.4em; background: none; } +.ui-tabs .ui-tabs-hide { display: none !important; } diff --git a/webui/view/theme/default/stylesheet/jquery.ui.theme.css b/webui/view/theme/default/stylesheet/jquery.ui.theme.css new file mode 100644 index 00000000..c1018644 --- /dev/null +++ b/webui/view/theme/default/stylesheet/jquery.ui.theme.css @@ -0,0 +1,252 @@ +/* + * jQuery UI CSS Framework 1.8.13 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Theming/API + * + * To view and modify this theme, visit http://jqueryui.com/themeroller/ + */ + + +/* Component containers +----------------------------------*/ +.ui-widget { font-family: Verdana,Arial,sans-serif/*{ffDefault}*/; font-size: 1.1em/*{fsDefault}*/; } +.ui-widget .ui-widget { font-size: 1em; } +.ui-widget input, .ui-widget select, .ui-widget textarea, .ui-widget button { font-family: Verdana,Arial,sans-serif/*{ffDefault}*/; font-size: 1em; } +.ui-widget-content { border: 1px solid #aaaaaa/*{borderColorContent}*/; background: #ffffff/*{bgColorContent}*/ url(images/ui-bg_flat_75_ffffff_40x100.png)/*{bgImgUrlContent}*/ 50%/*{bgContentXPos}*/ 50%/*{bgContentYPos}*/ repeat-x/*{bgContentRepeat}*/; color: #222222/*{fcContent}*/; } +.ui-widget-content a { color: #222222/*{fcContent}*/; } +.ui-widget-header { border: 1px solid #aaaaaa/*{borderColorHeader}*/; background: #cccccc/*{bgColorHeader}*/ url(images/ui-bg_highlight-soft_75_cccccc_1x100.png)/*{bgImgUrlHeader}*/ 50%/*{bgHeaderXPos}*/ 50%/*{bgHeaderYPos}*/ repeat-x/*{bgHeaderRepeat}*/; color: #222222/*{fcHeader}*/; font-weight: bold; } +.ui-widget-header a { color: #222222/*{fcHeader}*/; } + +/* Interaction states +----------------------------------*/ +.ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default { border: 1px solid #d3d3d3/*{borderColorDefault}*/; background: #e6e6e6/*{bgColorDefault}*/ url(images/ui-bg_glass_75_e6e6e6_1x400.png)/*{bgImgUrlDefault}*/ 50%/*{bgDefaultXPos}*/ 50%/*{bgDefaultYPos}*/ repeat-x/*{bgDefaultRepeat}*/; font-weight: normal/*{fwDefault}*/; color: #555555/*{fcDefault}*/; } +.ui-state-default a, .ui-state-default a:link, .ui-state-default a:visited { color: #555555/*{fcDefault}*/; text-decoration: none; } +.ui-state-hover, .ui-widget-content .ui-state-hover, .ui-widget-header .ui-state-hover, .ui-state-focus, .ui-widget-content .ui-state-focus, .ui-widget-header .ui-state-focus { border: 1px solid #999999/*{borderColorHover}*/; background: #dadada/*{bgColorHover}*/ url(images/ui-bg_glass_75_dadada_1x400.png)/*{bgImgUrlHover}*/ 50%/*{bgHoverXPos}*/ 50%/*{bgHoverYPos}*/ repeat-x/*{bgHoverRepeat}*/; font-weight: normal/*{fwDefault}*/; color: #212121/*{fcHover}*/; } +.ui-state-hover a, .ui-state-hover a:hover { color: #212121/*{fcHover}*/; text-decoration: none; } +.ui-state-active, .ui-widget-content .ui-state-active, .ui-widget-header .ui-state-active { border: 1px solid #aaaaaa/*{borderColorActive}*/; background: #ffffff/*{bgColorActive}*/ url(images/ui-bg_glass_65_ffffff_1x400.png)/*{bgImgUrlActive}*/ 50%/*{bgActiveXPos}*/ 50%/*{bgActiveYPos}*/ repeat-x/*{bgActiveRepeat}*/; font-weight: normal/*{fwDefault}*/; color: #212121/*{fcActive}*/; } +.ui-state-active a, .ui-state-active a:link, .ui-state-active a:visited { color: #212121/*{fcActive}*/; text-decoration: none; } +.ui-widget :active { outline: none; } + +/* Interaction Cues +----------------------------------*/ +.ui-state-highlight, .ui-widget-content .ui-state-highlight, .ui-widget-header .ui-state-highlight {border: 1px solid #fcefa1/*{borderColorHighlight}*/; background: #fbf9ee/*{bgColorHighlight}*/ url(images/ui-bg_glass_55_fbf9ee_1x400.png)/*{bgImgUrlHighlight}*/ 50%/*{bgHighlightXPos}*/ 50%/*{bgHighlightYPos}*/ repeat-x/*{bgHighlightRepeat}*/; color: #363636/*{fcHighlight}*/; } +.ui-state-highlight a, .ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a { color: #363636/*{fcHighlight}*/; } +.ui-state-error, .ui-widget-content .ui-state-error, .ui-widget-header .ui-state-error {border: 1px solid #cd0a0a/*{borderColorError}*/; background: #fef1ec/*{bgColorError}*/ url(images/ui-bg_glass_95_fef1ec_1x400.png)/*{bgImgUrlError}*/ 50%/*{bgErrorXPos}*/ 50%/*{bgErrorYPos}*/ repeat-x/*{bgErrorRepeat}*/; color: #cd0a0a/*{fcError}*/; } +.ui-state-error a, .ui-widget-content .ui-state-error a, .ui-widget-header .ui-state-error a { color: #cd0a0a/*{fcError}*/; } +.ui-state-error-text, .ui-widget-content .ui-state-error-text, .ui-widget-header .ui-state-error-text { color: #cd0a0a/*{fcError}*/; } +.ui-priority-primary, .ui-widget-content .ui-priority-primary, .ui-widget-header .ui-priority-primary { font-weight: bold; } +.ui-priority-secondary, .ui-widget-content .ui-priority-secondary, .ui-widget-header .ui-priority-secondary { opacity: .7; filter:Alpha(Opacity=70); font-weight: normal; } +.ui-state-disabled, .ui-widget-content .ui-state-disabled, .ui-widget-header .ui-state-disabled { opacity: .35; filter:Alpha(Opacity=35); background-image: none; } + +/* Icons +----------------------------------*/ + +/* states and images */ +.ui-icon { width: 16px; height: 16px; background-image: url(images/ui-icons_222222_256x240.png)/*{iconsContent}*/; } +.ui-widget-content .ui-icon {background-image: url(images/ui-icons_222222_256x240.png)/*{iconsContent}*/; } +.ui-widget-header .ui-icon {background-image: url(images/ui-icons_222222_256x240.png)/*{iconsHeader}*/; } +.ui-state-default .ui-icon { background-image: url(images/ui-icons_888888_256x240.png)/*{iconsDefault}*/; } +.ui-state-hover .ui-icon, .ui-state-focus .ui-icon {background-image: url(images/ui-icons_454545_256x240.png)/*{iconsHover}*/; } +.ui-state-active .ui-icon {background-image: url(images/ui-icons_454545_256x240.png)/*{iconsActive}*/; } +.ui-state-highlight .ui-icon {background-image: url(images/ui-icons_2e83ff_256x240.png)/*{iconsHighlight}*/; } +.ui-state-error .ui-icon, .ui-state-error-text .ui-icon {background-image: url(images/ui-icons_cd0a0a_256x240.png)/*{iconsError}*/; } + +/* positioning */ +.ui-icon-carat-1-n { background-position: 0 0; } +.ui-icon-carat-1-ne { background-position: -16px 0; } +.ui-icon-carat-1-e { background-position: -32px 0; } +.ui-icon-carat-1-se { background-position: -48px 0; } +.ui-icon-carat-1-s { background-position: -64px 0; } +.ui-icon-carat-1-sw { background-position: -80px 0; } +.ui-icon-carat-1-w { background-position: -96px 0; } +.ui-icon-carat-1-nw { background-position: -112px 0; } +.ui-icon-carat-2-n-s { background-position: -128px 0; } +.ui-icon-carat-2-e-w { background-position: -144px 0; } +.ui-icon-triangle-1-n { background-position: 0 -16px; } +.ui-icon-triangle-1-ne { background-position: -16px -16px; } +.ui-icon-triangle-1-e { background-position: -32px -16px; } +.ui-icon-triangle-1-se { background-position: -48px -16px; } +.ui-icon-triangle-1-s { background-position: -64px -16px; } +.ui-icon-triangle-1-sw { background-position: -80px -16px; } +.ui-icon-triangle-1-w { background-position: -96px -16px; } +.ui-icon-triangle-1-nw { background-position: -112px -16px; } +.ui-icon-triangle-2-n-s { background-position: -128px -16px; } +.ui-icon-triangle-2-e-w { background-position: -144px -16px; } +.ui-icon-arrow-1-n { background-position: 0 -32px; } +.ui-icon-arrow-1-ne { background-position: -16px -32px; } +.ui-icon-arrow-1-e { background-position: -32px -32px; } +.ui-icon-arrow-1-se { background-position: -48px -32px; } +.ui-icon-arrow-1-s { background-position: -64px -32px; } +.ui-icon-arrow-1-sw { background-position: -80px -32px; } +.ui-icon-arrow-1-w { background-position: -96px -32px; } +.ui-icon-arrow-1-nw { background-position: -112px -32px; } +.ui-icon-arrow-2-n-s { background-position: -128px -32px; } +.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; } +.ui-icon-arrow-2-e-w { background-position: -160px -32px; } +.ui-icon-arrow-2-se-nw { background-position: -176px -32px; } +.ui-icon-arrowstop-1-n { background-position: -192px -32px; } +.ui-icon-arrowstop-1-e { background-position: -208px -32px; } +.ui-icon-arrowstop-1-s { background-position: -224px -32px; } +.ui-icon-arrowstop-1-w { background-position: -240px -32px; } +.ui-icon-arrowthick-1-n { background-position: 0 -48px; } +.ui-icon-arrowthick-1-ne { background-position: -16px -48px; } +.ui-icon-arrowthick-1-e { background-position: -32px -48px; } +.ui-icon-arrowthick-1-se { background-position: -48px -48px; } +.ui-icon-arrowthick-1-s { background-position: -64px -48px; } +.ui-icon-arrowthick-1-sw { background-position: -80px -48px; } +.ui-icon-arrowthick-1-w { background-position: -96px -48px; } +.ui-icon-arrowthick-1-nw { background-position: -112px -48px; } +.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; } +.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; } +.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; } +.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; } +.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; } +.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; } +.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; } +.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; } +.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; } +.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; } +.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; } +.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; } +.ui-icon-arrowreturn-1-w { background-position: -64px -64px; } +.ui-icon-arrowreturn-1-n { background-position: -80px -64px; } +.ui-icon-arrowreturn-1-e { background-position: -96px -64px; } +.ui-icon-arrowreturn-1-s { background-position: -112px -64px; } +.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; } +.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; } +.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; } +.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; } +.ui-icon-arrow-4 { background-position: 0 -80px; } +.ui-icon-arrow-4-diag { background-position: -16px -80px; } +.ui-icon-extlink { background-position: -32px -80px; } +.ui-icon-newwin { background-position: -48px -80px; } +.ui-icon-refresh { background-position: -64px -80px; } +.ui-icon-shuffle { background-position: -80px -80px; } +.ui-icon-transfer-e-w { background-position: -96px -80px; } +.ui-icon-transferthick-e-w { background-position: -112px -80px; } +.ui-icon-folder-collapsed { background-position: 0 -96px; } +.ui-icon-folder-open { background-position: -16px -96px; } +.ui-icon-document { background-position: -32px -96px; } +.ui-icon-document-b { background-position: -48px -96px; } +.ui-icon-note { background-position: -64px -96px; } +.ui-icon-mail-closed { background-position: -80px -96px; } +.ui-icon-mail-open { background-position: -96px -96px; } +.ui-icon-suitcase { background-position: -112px -96px; } +.ui-icon-comment { background-position: -128px -96px; } +.ui-icon-person { background-position: -144px -96px; } +.ui-icon-print { background-position: -160px -96px; } +.ui-icon-trash { background-position: -176px -96px; } +.ui-icon-locked { background-position: -192px -96px; } +.ui-icon-unlocked { background-position: -208px -96px; } +.ui-icon-bookmark { background-position: -224px -96px; } +.ui-icon-tag { background-position: -240px -96px; } +.ui-icon-home { background-position: 0 -112px; } +.ui-icon-flag { background-position: -16px -112px; } +.ui-icon-calendar { background-position: -32px -112px; } +.ui-icon-cart { background-position: -48px -112px; } +.ui-icon-pencil { background-position: -64px -112px; } +.ui-icon-clock { background-position: -80px -112px; } +.ui-icon-disk { background-position: -96px -112px; } +.ui-icon-calculator { background-position: -112px -112px; } +.ui-icon-zoomin { background-position: -128px -112px; } +.ui-icon-zoomout { background-position: -144px -112px; } +.ui-icon-search { background-position: -160px -112px; } +.ui-icon-wrench { background-position: -176px -112px; } +.ui-icon-gear { background-position: -192px -112px; } +.ui-icon-heart { background-position: -208px -112px; } +.ui-icon-star { background-position: -224px -112px; } +.ui-icon-link { background-position: -240px -112px; } +.ui-icon-cancel { background-position: 0 -128px; } +.ui-icon-plus { background-position: -16px -128px; } +.ui-icon-plusthick { background-position: -32px -128px; } +.ui-icon-minus { background-position: -48px -128px; } +.ui-icon-minusthick { background-position: -64px -128px; } +.ui-icon-close { background-position: -80px -128px; } +.ui-icon-closethick { background-position: -96px -128px; } +.ui-icon-key { background-position: -112px -128px; } +.ui-icon-lightbulb { background-position: -128px -128px; } +.ui-icon-scissors { background-position: -144px -128px; } +.ui-icon-clipboard { background-position: -160px -128px; } +.ui-icon-copy { background-position: -176px -128px; } +.ui-icon-contact { background-position: -192px -128px; } +.ui-icon-image { background-position: -208px -128px; } +.ui-icon-video { background-position: -224px -128px; } +.ui-icon-script { background-position: -240px -128px; } +.ui-icon-alert { background-position: 0 -144px; } +.ui-icon-info { background-position: -16px -144px; } +.ui-icon-notice { background-position: -32px -144px; } +.ui-icon-help { background-position: -48px -144px; } +.ui-icon-check { background-position: -64px -144px; } +.ui-icon-bullet { background-position: -80px -144px; } +.ui-icon-radio-off { background-position: -96px -144px; } +.ui-icon-radio-on { background-position: -112px -144px; } +.ui-icon-pin-w { background-position: -128px -144px; } +.ui-icon-pin-s { background-position: -144px -144px; } +.ui-icon-play { background-position: 0 -160px; } +.ui-icon-pause { background-position: -16px -160px; } +.ui-icon-seek-next { background-position: -32px -160px; } +.ui-icon-seek-prev { background-position: -48px -160px; } +.ui-icon-seek-end { background-position: -64px -160px; } +.ui-icon-seek-start { background-position: -80px -160px; } +/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */ +.ui-icon-seek-first { background-position: -80px -160px; } +.ui-icon-stop { background-position: -96px -160px; } +.ui-icon-eject { background-position: -112px -160px; } +.ui-icon-volume-off { background-position: -128px -160px; } +.ui-icon-volume-on { background-position: -144px -160px; } +.ui-icon-power { background-position: 0 -176px; } +.ui-icon-signal-diag { background-position: -16px -176px; } +.ui-icon-signal { background-position: -32px -176px; } +.ui-icon-battery-0 { background-position: -48px -176px; } +.ui-icon-battery-1 { background-position: -64px -176px; } +.ui-icon-battery-2 { background-position: -80px -176px; } +.ui-icon-battery-3 { background-position: -96px -176px; } +.ui-icon-circle-plus { background-position: 0 -192px; } +.ui-icon-circle-minus { background-position: -16px -192px; } +.ui-icon-circle-close { background-position: -32px -192px; } +.ui-icon-circle-triangle-e { background-position: -48px -192px; } +.ui-icon-circle-triangle-s { background-position: -64px -192px; } +.ui-icon-circle-triangle-w { background-position: -80px -192px; } +.ui-icon-circle-triangle-n { background-position: -96px -192px; } +.ui-icon-circle-arrow-e { background-position: -112px -192px; } +.ui-icon-circle-arrow-s { background-position: -128px -192px; } +.ui-icon-circle-arrow-w { background-position: -144px -192px; } +.ui-icon-circle-arrow-n { background-position: -160px -192px; } +.ui-icon-circle-zoomin { background-position: -176px -192px; } +.ui-icon-circle-zoomout { background-position: -192px -192px; } +.ui-icon-circle-check { background-position: -208px -192px; } +.ui-icon-circlesmall-plus { background-position: 0 -208px; } +.ui-icon-circlesmall-minus { background-position: -16px -208px; } +.ui-icon-circlesmall-close { background-position: -32px -208px; } +.ui-icon-squaresmall-plus { background-position: -48px -208px; } +.ui-icon-squaresmall-minus { background-position: -64px -208px; } +.ui-icon-squaresmall-close { background-position: -80px -208px; } +.ui-icon-grip-dotted-vertical { background-position: 0 -224px; } +.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; } +.ui-icon-grip-solid-vertical { background-position: -32px -224px; } +.ui-icon-grip-solid-horizontal { background-position: -48px -224px; } +.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; } +.ui-icon-grip-diagonal-se { background-position: -80px -224px; } + + +/* Misc visuals +----------------------------------*/ + +/* Corner radius */ +.ui-corner-tl { -moz-border-radius-topleft: 4px/*{cornerRadius}*/; -webkit-border-top-left-radius: 4px/*{cornerRadius}*/; border-top-left-radius: 4px/*{cornerRadius}*/; } +.ui-corner-tr { -moz-border-radius-topright: 4px/*{cornerRadius}*/; -webkit-border-top-right-radius: 4px/*{cornerRadius}*/; border-top-right-radius: 4px/*{cornerRadius}*/; } +.ui-corner-bl { -moz-border-radius-bottomleft: 4px/*{cornerRadius}*/; -webkit-border-bottom-left-radius: 4px/*{cornerRadius}*/; border-bottom-left-radius: 4px/*{cornerRadius}*/; } +.ui-corner-br { -moz-border-radius-bottomright: 4px/*{cornerRadius}*/; -webkit-border-bottom-right-radius: 4px/*{cornerRadius}*/; border-bottom-right-radius: 4px/*{cornerRadius}*/; } +.ui-corner-top { -moz-border-radius-topleft: 4px/*{cornerRadius}*/; -webkit-border-top-left-radius: 4px/*{cornerRadius}*/; border-top-left-radius: 4px/*{cornerRadius}*/; -moz-border-radius-topright: 4px/*{cornerRadius}*/; -webkit-border-top-right-radius: 4px/*{cornerRadius}*/; border-top-right-radius: 4px/*{cornerRadius}*/; } +.ui-corner-bottom { -moz-border-radius-bottomleft: 4px/*{cornerRadius}*/; -webkit-border-bottom-left-radius: 4px/*{cornerRadius}*/; border-bottom-left-radius: 4px/*{cornerRadius}*/; -moz-border-radius-bottomright: 4px/*{cornerRadius}*/; -webkit-border-bottom-right-radius: 4px/*{cornerRadius}*/; border-bottom-right-radius: 4px/*{cornerRadius}*/; } +.ui-corner-right { -moz-border-radius-topright: 4px/*{cornerRadius}*/; -webkit-border-top-right-radius: 4px/*{cornerRadius}*/; border-top-right-radius: 4px/*{cornerRadius}*/; -moz-border-radius-bottomright: 4px/*{cornerRadius}*/; -webkit-border-bottom-right-radius: 4px/*{cornerRadius}*/; border-bottom-right-radius: 4px/*{cornerRadius}*/; } +.ui-corner-left { -moz-border-radius-topleft: 4px/*{cornerRadius}*/; -webkit-border-top-left-radius: 4px/*{cornerRadius}*/; border-top-left-radius: 4px/*{cornerRadius}*/; -moz-border-radius-bottomleft: 4px/*{cornerRadius}*/; -webkit-border-bottom-left-radius: 4px/*{cornerRadius}*/; border-bottom-left-radius: 4px/*{cornerRadius}*/; } +.ui-corner-all { -moz-border-radius: 4px/*{cornerRadius}*/; -webkit-border-radius: 4px/*{cornerRadius}*/; border-radius: 4px/*{cornerRadius}*/; } + +/* Overlays */ +.ui-widget-overlay { background: #aaaaaa/*{bgColorOverlay}*/ url(images/ui-bg_flat_0_aaaaaa_40x100.png)/*{bgImgUrlOverlay}*/ 50%/*{bgOverlayXPos}*/ 50%/*{bgOverlayYPos}*/ repeat-x/*{bgOverlayRepeat}*/; opacity: .3;filter:Alpha(Opacity=30)/*{opacityOverlay}*/; } +.ui-widget-shadow { margin: -8px/*{offsetTopShadow}*/ 0 0 -8px/*{offsetLeftShadow}*/; padding: 8px/*{thicknessShadow}*/; background: #aaaaaa/*{bgColorShadow}*/ url(images/ui-bg_flat_0_aaaaaa_40x100.png)/*{bgImgUrlShadow}*/ 50%/*{bgShadowXPos}*/ 50%/*{bgShadowYPos}*/ repeat-x/*{bgShadowRepeat}*/; opacity: .3;filter:Alpha(Opacity=30)/*{opacityShadow}*/; -moz-border-radius: 8px/*{cornerRadiusShadow}*/; -webkit-border-radius: 8px/*{cornerRadiusShadow}*/; border-radius: 8px/*{cornerRadiusShadow}*/; } \ No newline at end of file diff --git a/webui/view/theme/default/stylesheet/style-default.css b/webui/view/theme/default/stylesheet/style-default.css new file mode 100644 index 00000000..5169ed0b --- /dev/null +++ b/webui/view/theme/default/stylesheet/style-default.css @@ -0,0 +1,183 @@ + +@media screen { + + a { color: #850505; text-decoration: none; } + + p { margin: 0 0 10px 0; } + + .loginfailed { color: red; font: normal 19px Arial, sans-serif; } + + + body { background-color: #6D6D6D; margin: 0 auto; padding: 15px 0; text-align: center; font: normal 12px Arial, sans-serif; color: #3d3d3d; } + + #wrap { margin: 0 auto; padding: 0; width: 1070px; background-color: white; border: 3px solid black; text-align: left; } + + #menu { display: table; margin: 0px 40px 15px 40px; padding: 10px 0 0px 0px; width: 990px; border-bottom: 1px solid gray; } + #menu .leftcell { display: table-cell; width: 490px; text-align: justify; } + #menu .rightcell { display: table-cell; width: 490px; text-align: right; font: normal 12px Arial, sans-serif; margin: 0; padding: 0; } + #menu .logout22 { float: right; text-align: right; } + #menu a:link.logout, a:visited.logout { color: #222; } + #menu a:hover.logout { background: #F3D673; } + + #menu ul { list-style: none; margin: 0; padding: 0; } + #menu li { background-image: none; font: normal 12px Arial, sans-serif; } + #menu a:hover, #menu a:active { color: #850505; } + #menu #active { color: #850505; font-weight: bold; } + + + #main { margin: 0px 40px 20px 40px; width: 990px; float: left; clear: both; } + + #footer { clear: both; text-align: left; margin: 0; padding: 0 36px; } + + #A1 { text-align: right; } + + h3 { margin: 0; padding: 10px 0 10px 0; font: bold 19px Arial, sans-serif; color: #850505; } + h4 { margin: 0; padding: 0px 0 0px 0; font: bold 12px Arial, sans-serif; color: #000000; } + + form { padding-top: 0px; margin: 0px; } + + input#date1,input#date2{background-image:url(../images/calendar.png);background-position:right center;background-repeat:no-repeat;color:#000;font: bold 12px Arial, sans-serif;text-align:left;text-indent:6px;width:200px;cursor:pointer;height:15px;} + + input#savedsearch{background-image:url(../images/search.png);background-position:right center;background-repeat:no-repeat;color:#000;font: bold 12px Arial, sans-serif;text-align:left;text-indent:6px;width:400px;height:15px; } + + + #search { float: left; width: 990px; margin-top: 5px; margin-bottom: 20px; } + + #search1 { float: left; width: 490px; margin: 0; border: 0px solid green; } + + #search2 { float: right; width: 490px; margin: 0; text-align: right; border: 0px solid green; } + + #ss1 { display: table; border-collapse: collapse; margin: 0; padding: 0;} + + #resultscontainer { float: left; width: 990px; padding: 0; padding-bottom: 5px; margin-top: 0px; margin-bottom: 0px; border-top: 3px solid black; border-bottom: 3px solid black; } + #resultscontainer.empty { border-bottom: 0px solid black; height: 580px; } + + /*#results { float: left; width: 990px; height: 580px; margin-top: 0px; margin-bottom: 0px; border-collapse: collapse; display: table; clear: both; }*/ + #results { float: left; width: 990px; margin-top: 0px; margin-bottom: 0px; border-collapse: collapse; display: table; clear: both; } + + + #auditresultscontainer { float: left; width: 990px; padding: 0; margin-top: 0px; margin-bottom: 0px; border-top: 3px solid black; border-bottom: 3px solid black; } + #auditresultscontainer.empty { border-bottom: 0px solid black; height: 580px; } + + #spinner { margin-left: 480px; margin-top: 275px; } + + .text { font: normal 12px Arial, sans-serif; font-weight: bold; text-align:left; width: 408px; } + .ruletext { font: normal 12px Arial, sans-serif; font-weight: bold; text-align:left; width: 365px; } + .advtext { font: bold 12px Arial, sans-serif; font-weight: bold; text-align:left; width: 280px; } + .textregular { font: normal 12px Arial, sans-serif; font-weight: bold; text-align:left; } + + .row { display: table-row; } + .row.savedsearch { display: table-row; text-align: right; } + .resultrow { display: table-row; height: 25px; } + .resultrow.odd { background: #f5f5f5; } + .resultrow.spam { color: #aaa; } + + .cell1 { display: table-cell; height: 25px; text-align: left; padding: 3px; font: bold 12px Arial, sans-serif; width: 80px; } + .cell1s { display: table-cell; height: 25px; text-align: left; padding: 3px; font: bold 12px Arial, sans-serif; width: 85px; } + .cell3 { display: table-cell; height: 25px; text-align: left; padding: 0px; padding-top: 3px; font: bold 19px Arial, sans-serif; } + + .cell3.title { color: black; text-align: left; } + .cell3.date { color: black; text-align: left; } + .cell3.error { color: black; } + + .cell2 { display: table-cell; width: 410px; height: 15px; } + + .cell4 { display: table-cell; width: 490px; height: 15px; margin: 0; padding: 0; } + + .cell5 { display: table-cell; height: 25px; text-align: left; padding-bottom: 0px; padding-right: 3px; vertical-align: middle; } + + .cell5.id { text-align: center; } + .cell5.date { text-align: left; } + .cell5.size { text-align: left; padding-right: 20px; } + .cell5.verification { text-align: right; padding-right: 0px; } + + .cell5 img { margin: 3px 0 -5px 0; border: 0px solid black; height: 16px; } + + .cellaudit { display: table-cell; height: 14px; text-align: left; font: normal 12px Arial, sans-serif; padding: 0; margin: 0; vertical-align: middle;} + .cellaudit.date { width: 120px; } + .cellaudit.title { font: bold 12px Arial, sans-serif;} + + #health1 { display: table-cell; margin-top: 10px; margin-bottom: 0; } + #health2 { display: table-cell; text-align: right; } + + .cellhealthleft { display: table-cell; height: 25px; text-align: left; padding: 3px; font: bold 12px Arial, sans-serif; } + .cellhealthright { display: table-cell; height: 25px; text-align: left; padding: 3px; font: normal 12px Arial, sans-serif; } + + #health1 .ok { color: green; font-weight: bold; } + #health1 .error { color: red; font-weight: bold; } + + #pagenav { float: left; margin-top: 0px; margin-bottom: 0px; text-align: left; width: 990px; border: 0px solid red; } + .navrow { display: table-row; width: 282px; border: 1px solid red; } + .navlink { color: #bbb; font: bold 12px Arial, sans-serif; } + #pagenav a.navlink { color: #850505; font: bold 12px Arial, sans-serif; } + + #pagingleft { display: table-cell; float: left; text-align: left; width: 60px; border: 0px solid red; } + #pagingcenter { display: table-cell; float: left; text-align: center; width: 145px; border: 0px solid red; } + #pagingright { display: table-cell; float: right; text-align: right; width: 60px; border: 0px solid red; } + + .messagelink { border-bottom: 1px solid gray; color: #850505; } + .messagelink.spam { border-bottom: 1px solid gray; color: #aaa; } + #results a:hover { border-bottom: 1px solid gray; color: black; } + + .select1 { width: 450px; font: bold 12px Arial, sans-serif; } + .advselect { width: 80px; font: bold 12px Arial, sans-serif; padding: 0; margin:0;} + .advselect2 { width: 205px; font: bold 12px Arial, sans-serif; padding: 0; margin:0;} + .ruleselect { width: 40px; font: bold 12px Arial, sans-serif; padding: 0; margin:0;} + + /*button { margin-left: 0px; background-color:gray; border-top:1px solid gray; border-left:1px solid gray; font: bold 12px Arial, sans-serif; border-left: yellow; border-right: black; width:50%;}*/ + button { margin: 0; background-color:gray; font: bold 12px Arial, sans-serif; width:40%; height: 40px; margin-left: 5%; margin-right: 5%; } + button.active { background-color: #850505; color:white; } + + .advbutton { margin: 0; background-color: #850505; color: white; font: bold 12px Arial, sans-serif; height: 40px; } + + input[type=button].secondary { margin: 0; background-color:#eee; color: gray; font: bold 12px Arial, sans-serif; width: 24%;} + input[type=button].advsecondary { margin: 0; background-color:#eee; color: gray; font: bold 12px Arial, sans-serif; width: 15%;} + input[type=button].load { margin: 0; background-color:#eee; color: black; font: bold 12px Arial, sans-serif; width: 16%;} + + input[type=button].short { margin: 0; background-color:#eee; color: gray; font: bold 12px Arial, sans-serif; width: 50px;} + input[type=checkbox].attachmenttype { margin: 0; vertical-align: middle; } + + #messagepopup { margin: 10px 20px 10px 20px; padding: 0; background-color: white; text-align: left; } + + .domainrow { display: table-row; border: 2px solid gray; padding: 10px; } + .domaincell { display: table-cell; font: bold 12px Arial, sans-serif; border: 1px solid gray; padding: 5px; vertical-align: top; } + .fcell { display: table-cell; font: bold 12px Arial, sans-serif; padding: 5px; vertical-align: top; } + .domain { font: normal 12px Arial, sans-serif; font-weight: bold; text-align:left; width: 408px;} + + + #dhtmltooltip { position: absolute; width: 150px; border: 2px solid black; padding: 2px; background-color: yellow; color: #ffffff; visibility: hidden; z-index: 100; } + + + /* + * dropdown menu + */ + + ul.dropdown { position: relative; } + ul.dropdown li { font-weight: bold; float: left; background: #ffffff; text-align: center; padding-right: 40px; padding-left: 40px; border: 0px solid red; } + ul.dropdown li.first_li { font-weight: bold; float: left; background: #ffffff; text-align: left; padding-left:80px; } + ul.dropdown li.center_li { font-weight: bold; float: left; background: #ffffff; text-align: center; padding: 0; width: 190px; } + ul.dropdown li.last_li { font-weight: bold; float: left; background: #ffffff; text-align: right; padding-right: 0; margin-left: 10px; } + + ul.dropdown li.admin { font-weight: bold; float: left; background: #ffffff; padding-right: 5px; padding-left: 2px; } + ul.dropdown li.first_li_admin { background: #ffffff; text-align: left; margin-left: 80px; padding-left: 0px; padding-right: 5px; } + ul.dropdown li.last_li_admin { background: #ffffff; text-align: right; padding: 0; } + + ul.dropdown li.logout { font-weight: bold; float: right; background: #ffffff; width: 100px; text-align: right; } + + ul.dropdown a:hover { color: #000; } + ul.dropdown a:active { color: #ffa500; } + ul.dropdown li a { padding: 0; color: #222; border-bottom: none; } + ul.dropdown li.hover, + ul.dropdown li:hover { background: #F3D673; color: black; position: relative; } + ul.dropdown li.hover a { color: black; } + + ul.dropdown ul { width: 150px; text-align: left; visibility: hidden; position: absolute; top: 100%; left: 0; } + ul.dropdown ul li { text-align: left; font-weight: normal; background: #f6f6f6; color: #000; border-bottom: 1px solid #ccc; float: none; paddin-left: 3px; } + + ul.sub_menu li { padding-left: 10px; padding-right: 10px; width: 140px; } + + ul.dropdown ul li a { border-right: none; width: 100%; display: inline-block; text-align: left; } + +} + + diff --git a/webui/view/theme/default/templates/audit/audit.tpl b/webui/view/theme/default/templates/audit/audit.tpl new file mode 100644 index 00000000..4cc311b2 --- /dev/null +++ b/webui/view/theme/default/templates/audit/audit.tpl @@ -0,0 +1,100 @@ + + + + +
    +
    +
    +
    + + + + + + + + diff --git a/webui/view/theme/default/templates/audit/helper.tpl b/webui/view/theme/default/templates/audit/helper.tpl new file mode 100644 index 00000000..eaaf0269 --- /dev/null +++ b/webui/view/theme/default/templates/audit/helper.tpl @@ -0,0 +1,118 @@ + + + + + + +
    class="empty"> + +
    + + +
    + 0){ ?> +
    + + + +
    +
    + + + +
    + +
    + + + +
    + +
    + + + +
    +
    + + + +
    + +
    + +
    + + +
    + +
    + + + + + +
    +
    +
    +
    +
    +
    ', BALLOON, true, ABOVE, true)" onmouseout="UnTip()">
    +
    +
    + + + + + + 0) { for($i=$i; $i<$page_len;$i++){ ?> +
    + + +
    + +
    + + + + + + diff --git a/webui/view/theme/default/templates/common/error.tpl b/webui/view/theme/default/templates/common/error.tpl new file mode 100644 index 00000000..6921e97f --- /dev/null +++ b/webui/view/theme/default/templates/common/error.tpl @@ -0,0 +1,3 @@ + +

    + diff --git a/webui/view/theme/default/templates/common/footer.tpl b/webui/view/theme/default/templates/common/footer.tpl new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/webui/view/theme/default/templates/common/footer.tpl @@ -0,0 +1 @@ + diff --git a/webui/view/theme/default/templates/common/layout-empty.tpl b/webui/view/theme/default/templates/common/layout-empty.tpl new file mode 100644 index 00000000..c688ed05 --- /dev/null +++ b/webui/view/theme/default/templates/common/layout-empty.tpl @@ -0,0 +1 @@ + diff --git a/webui/view/theme/default/templates/common/layout-health.tpl b/webui/view/theme/default/templates/common/layout-health.tpl new file mode 100644 index 00000000..6965aa4c --- /dev/null +++ b/webui/view/theme/default/templates/common/layout-health.tpl @@ -0,0 +1,59 @@ + + + + + piler | <?php print $title; ?> + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    + +

    + + +
    + + + + +
    + + + diff --git a/webui/view/theme/default/templates/common/layout-search.tpl b/webui/view/theme/default/templates/common/layout-search.tpl new file mode 100644 index 00000000..adff2b97 --- /dev/null +++ b/webui/view/theme/default/templates/common/layout-search.tpl @@ -0,0 +1,59 @@ + + + + + <?php print $title; ?> + + + + + + + + + + + + + + + + + + + + + + + onload="load_ajax_url('&');" style="cursor: wait"> + + + + + + +
    + + + +
    + + + +
    + + + + +
    + + + diff --git a/webui/view/theme/default/templates/common/layout.tpl b/webui/view/theme/default/templates/common/layout.tpl new file mode 100644 index 00000000..dd82a103 --- /dev/null +++ b/webui/view/theme/default/templates/common/layout.tpl @@ -0,0 +1,50 @@ + + + + + piler | <?php print $title; ?> + + + + + + + + + + + + + + + + + + + + +
    + + + +
    + +

    + + +
    + + + + + +
    + + + diff --git a/webui/view/theme/default/templates/common/menu-admin.tpl b/webui/view/theme/default/templates/common/menu-admin.tpl new file mode 100644 index 00000000..14de4b60 --- /dev/null +++ b/webui/view/theme/default/templates/common/menu-admin.tpl @@ -0,0 +1,42 @@ + + +
    + +
    + +
    + +
    +
    + : , id="active"> +
    +
    + + +
    + + + diff --git a/webui/view/theme/default/templates/common/menu.tpl b/webui/view/theme/default/templates/common/menu.tpl new file mode 100644 index 00000000..14d967b4 --- /dev/null +++ b/webui/view/theme/default/templates/common/menu.tpl @@ -0,0 +1,24 @@ + + +
    + + + +
    +
    + : , id="active"> +
    +
    + +
    + + + + + diff --git a/webui/view/theme/default/templates/common/not_found.tpl b/webui/view/theme/default/templates/common/not_found.tpl new file mode 100644 index 00000000..139597f9 --- /dev/null +++ b/webui/view/theme/default/templates/common/not_found.tpl @@ -0,0 +1,2 @@ + + diff --git a/webui/view/theme/default/templates/domain/list.tpl b/webui/view/theme/default/templates/domain/list.tpl new file mode 100644 index 00000000..19724fe9 --- /dev/null +++ b/webui/view/theme/default/templates/domain/list.tpl @@ -0,0 +1,50 @@ + +

    + +
    + +
    +
    +
    :
    +
    +
    +
    +
    :
    +
    +
    +
    +
     
    +
    +
    + +
    + +
    + + +

    + + + +
    +
    +
    +
    +
     
    +
    + + +
    +
    +
    +
    +
    + + +
    + + + + + + diff --git a/webui/view/theme/default/templates/domain/remove.tpl b/webui/view/theme/default/templates/domain/remove.tpl new file mode 100644 index 00000000..9fbf8fb8 --- /dev/null +++ b/webui/view/theme/default/templates/domain/remove.tpl @@ -0,0 +1,13 @@ + +

    + + + +. + + +: + + +

    + diff --git a/webui/view/theme/default/templates/health/counter-reset-confirm.tpl b/webui/view/theme/default/templates/health/counter-reset-confirm.tpl new file mode 100644 index 00000000..683d4872 --- /dev/null +++ b/webui/view/theme/default/templates/health/counter-reset-confirm.tpl @@ -0,0 +1,28 @@ + + + + + clapf web UI + + + + + + + + + + + + +

    +

    + + + +
    +

    + + + + diff --git a/webui/view/theme/default/templates/health/health.tpl b/webui/view/theme/default/templates/health/health.tpl new file mode 100644 index 00000000..d4eac179 --- /dev/null +++ b/webui/view/theme/default/templates/health/health.tpl @@ -0,0 +1 @@ + . . . diff --git a/webui/view/theme/default/templates/health/worker.tpl b/webui/view/theme/default/templates/health/worker.tpl new file mode 100644 index 00000000..de77466e --- /dev/null +++ b/webui/view/theme/default/templates/health/worker.tpl @@ -0,0 +1,125 @@ + + + diff --git a/webui/view/theme/default/templates/health/worker.tpl-old b/webui/view/theme/default/templates/health/worker.tpl-old new file mode 100644 index 00000000..fffb3e62 --- /dev/null +++ b/webui/view/theme/default/templates/health/worker.tpl-old @@ -0,0 +1,131 @@ + + + + + +
    + +

    : sec

    + +

    :

    + +

    :

    + +

    :

    + +

    : MB

    + +

    : //

    + + + + +

    : %, :

    + +

    : % / MB, : % / MB

    + +

    : %

    + +

    :

    + +

    + + + + +
    +

    + + +
    + + +
    + + +
    + +

    :

    + + + +

    + + + + +"; + $v = preg_replace("/^\*\<\/td\>/", "", $v); + if($i == 1) { print ""; } + print "$v\n"; + if($i == count($queue['lines'])-1) { break; } + } +?> + + + +
     

    + + + + + + +

    :

    + + + +

    + + + +"; + $v = preg_replace("/^\*\<\/td\>/", "", $v); + if($i == 1) { print ""; } + print "$v\n"; + if($i == count($queue['lines'])-1) { break; } + } +?> + + + +
     

    + + + + + +
    + diff --git a/webui/view/theme/default/templates/login/login.tpl b/webui/view/theme/default/templates/login/login.tpl new file mode 100644 index 00000000..29a98fc2 --- /dev/null +++ b/webui/view/theme/default/templates/login/login.tpl @@ -0,0 +1,36 @@ + + +
    + " /> + + + + +
    + +

    + + + diff --git a/webui/view/theme/default/templates/login/logout.tpl b/webui/view/theme/default/templates/login/logout.tpl new file mode 100644 index 00000000..8d1eff16 --- /dev/null +++ b/webui/view/theme/default/templates/login/logout.tpl @@ -0,0 +1,5 @@ +

    + +. + +

    diff --git a/webui/view/theme/default/templates/message/headers.tpl b/webui/view/theme/default/templates/message/headers.tpl new file mode 100644 index 00000000..050720ef --- /dev/null +++ b/webui/view/theme/default/templates/message/headers.tpl @@ -0,0 +1,24 @@ + + + + + + + +
    + +

    + | + | + + + | + +

    + +
    + +
    + + + diff --git a/webui/view/theme/default/templates/message/remove.tpl b/webui/view/theme/default/templates/message/remove.tpl new file mode 100644 index 00000000..90f219dd --- /dev/null +++ b/webui/view/theme/default/templates/message/remove.tpl @@ -0,0 +1,22 @@ + + + + + + + +
    + +

    + | + | + | + +

    + +

    + +
    + + + diff --git a/webui/view/theme/default/templates/message/restore.tpl b/webui/view/theme/default/templates/message/restore.tpl new file mode 100644 index 00000000..6b59a347 --- /dev/null +++ b/webui/view/theme/default/templates/message/restore.tpl @@ -0,0 +1,24 @@ + + + + + + + +
    + +

    + | + | + + + | + +

    + +

    + +
    + + + diff --git a/webui/view/theme/default/templates/message/view.tpl b/webui/view/theme/default/templates/message/view.tpl new file mode 100644 index 00000000..0b308664 --- /dev/null +++ b/webui/view/theme/default/templates/message/view.tpl @@ -0,0 +1,36 @@ + + + + + + + +
    + +

    + | + | + + +| + +

    + +
    +
    +
    +
    + +
    + +

    :

    +
    + +
    + +
    + +
    + + + diff --git a/webui/view/theme/default/templates/policy/archiving.tpl b/webui/view/theme/default/templates/policy/archiving.tpl new file mode 100644 index 00000000..262fa453 --- /dev/null +++ b/webui/view/theme/default/templates/policy/archiving.tpl @@ -0,0 +1,90 @@ + +

    + +
    + +
    + +
    +
    :
    +
    +
    +
    +
    :
    +
    +
    +
    +
    :
    +
    +
    +
    +
    :
    +
    + + +
    +
    +
    +
    :
    +
    +
    +
    +
    :
    +
    + + +
    +
    + +
    +
     
    +
    +
    + +
    + +
    + + +

    + + + +
    +
    +
    +
    +
    +
    +
    +
    +
     
    +
    + + +
    +
    +
    +
    +
    0) { print $rule['_size']; ?>
    +
    +
    0) { print $rule['_attachment_size']; ?>
    +
    +
    + + +
    + + + + + + diff --git a/webui/view/theme/default/templates/policy/removearchiving.tpl b/webui/view/theme/default/templates/policy/removearchiving.tpl new file mode 100644 index 00000000..041df7e7 --- /dev/null +++ b/webui/view/theme/default/templates/policy/removearchiving.tpl @@ -0,0 +1,22 @@ + +

    + + + +. + + +: 0) { print $text_size . ': ' . $rule['_size'] . ' ' . $rule['size'] . ', '; } +if($rule['attachment_type'] > 0) { print $text_attachment_type . ': ' . $rule['attachment_type'] . ', '; } +if($rule['attachment_size'] > 0) { print $text_attachment_size . ': ' . $rule['_attachment_size'] . ' ' . $rule['attachment_size'] . ' '; } +?> + + + +

    + diff --git a/webui/view/theme/default/templates/search/advanced.tpl b/webui/view/theme/default/templates/search/advanced.tpl new file mode 100644 index 00000000..5b7b7d38 --- /dev/null +++ b/webui/view/theme/default/templates/search/advanced.tpl @@ -0,0 +1,127 @@ + + + + +
    +
    +
    + + + + + + + + diff --git a/webui/view/theme/default/templates/search/expert.tpl b/webui/view/theme/default/templates/search/expert.tpl new file mode 100644 index 00000000..f56469ef --- /dev/null +++ b/webui/view/theme/default/templates/search/expert.tpl @@ -0,0 +1,65 @@ + + + + +
    +
    +
    + + + + + + + + diff --git a/webui/view/theme/default/templates/search/helper.tpl b/webui/view/theme/default/templates/search/helper.tpl new file mode 100644 index 00000000..f29efd56 --- /dev/null +++ b/webui/view/theme/default/templates/search/helper.tpl @@ -0,0 +1,117 @@ + + + + + + +
    class="empty"> + +
    + + +
    + 0){ ?> +
     
    +
    + + + +
    +
    + + + +
    +
    + + + +
    +
    + + + +
    +
     
    +
     
    + +
     
    + + +
    + +
    + + + + + +
    +
    .
    +
    +
    ', BALLOON, true, ABOVE, true)" onmouseout="UnTip()">
    + +
    +
    0) { ?> 
    +
     
    + +
    verification status
    + +
    + + + + + + 0) { for($i=$i; $i<$page_len;$i++){ ?> +
    + + + +
    + +
    + + + + + + diff --git a/webui/view/theme/default/templates/search/save.tpl b/webui/view/theme/default/templates/search/save.tpl new file mode 100644 index 00000000..4d64a322 --- /dev/null +++ b/webui/view/theme/default/templates/search/save.tpl @@ -0,0 +1,20 @@ + + 0) { ?> +
    + + + +
    + + + + + diff --git a/webui/view/theme/default/templates/search/search.tpl b/webui/view/theme/default/templates/search/search.tpl new file mode 100644 index 00000000..1888b548 --- /dev/null +++ b/webui/view/theme/default/templates/search/search.tpl @@ -0,0 +1,69 @@ + + + + +
    +
    +
    +
    + + + + + + + + diff --git a/webui/view/theme/default/templates/stat/counter.tpl b/webui/view/theme/default/templates/stat/counter.tpl new file mode 100644 index 00000000..5b5c76bb --- /dev/null +++ b/webui/view/theme/default/templates/stat/counter.tpl @@ -0,0 +1,20 @@ + +

     

    + +

    + + + + + 0) { ?> + 0) { ?> + +
    spam / %
    virus / %
    +

    + +

    +

    + + +
    +

    diff --git a/webui/view/theme/default/templates/stat/stat.tpl b/webui/view/theme/default/templates/stat/stat.tpl new file mode 100644 index 00000000..0c05bfe5 --- /dev/null +++ b/webui/view/theme/default/templates/stat/stat.tpl @@ -0,0 +1,15 @@ + +

     

    + +

    + + + + + + + +

    + +

    + diff --git a/webui/view/theme/default/templates/user/add.tpl b/webui/view/theme/default/templates/user/add.tpl new file mode 100644 index 00000000..93b4f30d --- /dev/null +++ b/webui/view/theme/default/templates/user/add.tpl @@ -0,0 +1,81 @@ + +

    + +

    :

    + + +
    + + +
    +
    +
    :
    +
    +
    + +
    +
    :
    +
    +
    + +
    +
    :
    +
    +
    + +
    +
    :
    +
    + +
    +
    + + +
    +
    LDAP DN:
    +

    ()
    +
    + + + +
    +
    :
    +
    +
    + +
    +
    :
    +
    +
    + +
    +
    :
    +
    + +
    +
    + +
    +
     
    +
    +
    + +
    + + + +
    + + +. + + diff --git a/webui/view/theme/default/templates/user/edit.tpl b/webui/view/theme/default/templates/user/edit.tpl new file mode 100644 index 00000000..2a88fabf --- /dev/null +++ b/webui/view/theme/default/templates/user/edit.tpl @@ -0,0 +1,99 @@ + + + + +
    + + +
    +
    +
    :
    +
    +
    + +
    +
    :
    +
    +
    + +
    +
    :
    +
    +
    + +
    +
    :
    +
    + +
    +
    + + +
    +
    LDAP DN:
    +

    ()
    +
    + + +
    +
    :
    +
    +
    + +
    +
    :
    +
    +
    + +
    +
    :
    +
    +
    + +
    +
    :
    +
    + +
    +
    + +
    +
    :
    +
    + + model_user_user->getEmailsByUid($_group_uid)); print $a[0]; ?>
    + +
    +
    + +
    +
     
    +
    +
    + +
    + + +
    + +

     

    +

    :

    +

     

    + +

    +. + + + +

    diff --git a/webui/view/theme/default/templates/user/list.tpl b/webui/view/theme/default/templates/user/list.tpl new file mode 100644 index 00000000..41e8eba7 --- /dev/null +++ b/webui/view/theme/default/templates/user/list.tpl @@ -0,0 +1,67 @@ + +

    + +

    + +

    + +
    + + +
    + + +

     

    + + + + + + +
    +
    +
    +
    +
    +
     
    +
    + + +
    +
    +
    +
    + +
    +
    +
    + + +
    + + + + + + + + + + diff --git a/webui/view/theme/default/templates/user/remove.tpl b/webui/view/theme/default/templates/user/remove.tpl new file mode 100644 index 00000000..00e53dcb --- /dev/null +++ b/webui/view/theme/default/templates/user/remove.tpl @@ -0,0 +1,13 @@ + +

    + + + +. + + +: + + +

    + diff --git a/webui/view/theme/default/templates/user/settings.tpl b/webui/view/theme/default/templates/user/settings.tpl new file mode 100644 index 00000000..ff934273 --- /dev/null +++ b/webui/view/theme/default/templates/user/settings.tpl @@ -0,0 +1,73 @@ + + + +
    + + + +
    + +

     

    + + +
    + + + + +
    :
    :
     
    +
    + + + +. + + +