From dd456159b4796b8d0b8db76ac988d56737e4bc2c Mon Sep 17 00:00:00 2001 From: Fabien Meghazi Date: Wed, 3 Aug 2011 16:09:14 +0200 Subject: [PATCH] [ADD] Updated dhtmlxSheduler to version 3.0. (Fixed dhtmlx core initialization) bzr revid: fme@openerp.com-20110803140914-5qjtozi94i4ruica --- addons/base_calendar/__openerp__.py | 2 +- .../lib/dhtmlxScheduler/License_GPL.html | 73 - .../codebase/connector/base_connector.php | 706 +++ .../codebase/connector/combo_connector.php | 89 + .../codebase/connector/connector.js | 141 + .../connector/crosslink_connector.php | 120 + .../codebase/connector/dataprocessor.php | 465 ++ .../codebase/connector/db_common.php | 959 ++++ .../codebase/connector/db_mssql.php | 66 + .../codebase/connector/db_mysqli.php | 53 + .../codebase/connector/db_oracle.php | 79 + .../codebase/connector/db_pdo.php | 65 + .../codebase/connector/db_postgre.php | 66 + .../codebase/connector/grid_connector.php | 268 ++ .../connector/scheduler_connector.php | 121 + .../codebase/connector/tools.php | 254 ++ .../codebase/connector/tree_connector.php | 274 ++ .../codebase/connector/treegrid_connector.php | 161 + .../codebase/connector/update.php | 262 ++ .../codebase/dhtmlxscheduler.css | 530 +-- .../codebase/dhtmlxscheduler.js | 3883 +---------------- .../codebase/dhtmlxscheduler_debug.js | 893 ++-- .../codebase/dhtmlxscheduler_glossy.css | 5 + .../codebase/dhtmlxscheduler_mobile.css | 5 + .../codebase/dhtmlxscheduler_mobile.js | 318 ++ .../ext/dhtmlxscheduler_active_links.js | 13 +- .../ext/dhtmlxscheduler_agenda_view.js | 17 +- .../codebase/ext/dhtmlxscheduler_collision.js | 9 +- .../codebase/ext/dhtmlxscheduler_cookie.js | 13 +- .../codebase/ext/dhtmlxscheduler_editors.js | 17 +- .../codebase/ext/dhtmlxscheduler_expand.js | 15 +- .../codebase/ext/dhtmlxscheduler_ext.css | 1 - .../ext/dhtmlxscheduler_html_templates.js | 12 +- .../codebase/ext/dhtmlxscheduler_key_nav.js | 13 +- .../codebase/ext/dhtmlxscheduler_limit.js | 19 +- .../codebase/ext/dhtmlxscheduler_map_view.js | 36 +- .../codebase/ext/dhtmlxscheduler_minical.js | 33 +- .../ext/dhtmlxscheduler_multiselect.js | 14 +- .../ext/dhtmlxscheduler_multisource.js | 12 +- .../codebase/ext/dhtmlxscheduler_offline.js | 9 + .../codebase/ext/dhtmlxscheduler_outerdrag.js | 13 +- .../codebase/ext/dhtmlxscheduler_pdf.js | 21 +- .../codebase/ext/dhtmlxscheduler_readonly.js | 16 +- .../ext/dhtmlxscheduler_recurring.css | 9 - .../codebase/ext/dhtmlxscheduler_recurring.js | 36 +- .../codebase/ext/dhtmlxscheduler_serialize.js | 15 +- .../codebase/ext/dhtmlxscheduler_timeline.js | 35 +- .../codebase/ext/dhtmlxscheduler_tooltip.js | 12 +- .../codebase/ext/dhtmlxscheduler_touch.css | 10 +- .../codebase/ext/dhtmlxscheduler_touch.js | 33 +- .../ext/dhtmlxscheduler_treetimeline.js | 20 +- .../codebase/ext/dhtmlxscheduler_units.js | 23 +- .../codebase/ext/dhtmlxscheduler_url.js | 13 +- .../ext/dhtmlxscheduler_week_agenda.js | 18 + .../codebase/ext/dhtmlxscheduler_year_view.js | 24 +- .../codebase/imgs/blue_tab.png | Bin 180 -> 0 bytes .../codebase/imgs/white_tab.png | Bin 366 -> 0 bytes .../codebase/imgs_glossy/blue_tab.png | Bin 0 -> 247 bytes .../codebase/imgs_glossy/blue_tab_wide.png | Bin 0 -> 252 bytes .../codebase/imgs_glossy/but_repeat.gif | Bin 0 -> 1149 bytes .../codebase/imgs_glossy/buttons.gif | Bin 0 -> 616 bytes .../codebase/imgs_glossy/calendar.gif | Bin 0 -> 622 bytes .../codebase/imgs_glossy/clock_big.gif | Bin 0 -> 1321 bytes .../codebase/imgs_glossy/clock_small.gif | Bin 0 -> 388 bytes .../imgs_glossy/colapce-expand-icon.gif | Bin 0 -> 452 bytes .../codebase/imgs_glossy/controlls5.png | Bin 0 -> 2835 bytes .../codebase/imgs_glossy/databg.png | Bin 0 -> 89 bytes .../codebase/imgs_glossy/databg_now.png | Bin 0 -> 89 bytes .../codebase/imgs_glossy/event-bg.png | Bin 0 -> 148 bytes .../codebase/imgs_glossy/icon.png | Bin 0 -> 230 bytes .../codebase/imgs_glossy/left-separator.png | Bin 0 -> 230 bytes .../codebase/imgs_glossy/left-time-bg.png | Bin 0 -> 124 bytes .../codebase/imgs_glossy/lightbox.png | Bin 0 -> 207 bytes .../codebase/imgs_glossy/loading.gif | Bin 0 -> 3951 bytes .../codebase/imgs_glossy/move.png | Bin 0 -> 145 bytes .../codebase/imgs_glossy/multi-days-bg.png | Bin 0 -> 350 bytes .../imgs_glossy/second-top-days-bg.png | Bin 0 -> 138 bytes .../codebase/imgs_glossy/top-days-bg.png | Bin 0 -> 177 bytes .../codebase/imgs_glossy/top-separator.gif | Bin 0 -> 259 bytes .../codebase/imgs_glossy/white_tab.png | Bin 0 -> 290 bytes .../codebase/imgs_glossy/white_tab_wide.png | Bin 0 -> 300 bytes .../codebase/imgs_mobile/add.png | Bin 0 -> 1404 bytes .../codebase/imgs_mobile/arrow_left.png | Bin 0 -> 1955 bytes .../codebase/imgs_mobile/arrow_right.png | Bin 0 -> 1975 bytes .../codebase/imgs_mobile/event.png | Bin 0 -> 1096 bytes .../codebase/imgs_mobile/event_focus.png | Bin 0 -> 1062 bytes .../codebase/imgs_mobile/noevents.png | Bin 0 -> 1687 bytes .../lib/dhtmlxScheduler/codebase/readme.txt | 16 + .../static/lib/dhtmlxScheduler/license.txt | 228 + .../static/lib/dhtmlxScheduler/readme.txt | 5 +- .../lib/dhtmlxScheduler/sources/base.js | 44 +- .../lib/dhtmlxScheduler/sources/clear.css | 4 + .../lib/dhtmlxScheduler/sources/config.js | 26 +- .../lib/dhtmlxScheduler/sources/connector.js | 22 +- .../sources/dataprocessor_hook.js | 6 +- .../lib/dhtmlxScheduler/sources/dayevents.js | 200 + .../dhtmlxScheduler/sources/dhtmlxcommon.js | 55 +- .../sources/dhtmlxdataprocessor.js | 6 + .../sources/dhtmlxdataprocessor_debug.js | 8 +- .../sources/dhtmlxdataprocessor_jsonp.js | 57 + .../lib/dhtmlxScheduler/sources/event.js | 250 +- .../lib/dhtmlxScheduler/sources/ext.css | 107 +- .../sources/ext/ext_active_links.js | 17 +- .../sources/ext/ext_agenda_view.js | 40 +- .../sources/ext/ext_collision.js | 56 +- .../dhtmlxScheduler/sources/ext/ext_cookie.js | 4 + .../sources/ext/ext_editors.js | 28 +- .../dhtmlxScheduler/sources/ext/ext_expand.js | 82 +- .../sources/ext/ext_html_templates.js | 4 + .../sources/ext/ext_key_nav.js | 4 + .../dhtmlxScheduler/sources/ext/ext_layer.js | 403 ++ .../dhtmlxScheduler/sources/ext/ext_limit.js | 104 +- .../sources/ext/ext_map_view.js | 577 ++- .../dhtmlxScheduler/sources/ext/ext_matrix.js | 276 +- .../sources/ext/ext_minical.js | 94 +- .../sources/ext/ext_monthheight.js | 4 + .../sources/ext/ext_multiselect.js | 4 + .../sources/ext/ext_multisource.js | 4 + .../sources/ext/ext_offline.js | 102 + .../sources/ext/ext_outerdrag.js | 84 +- .../dhtmlxScheduler/sources/ext/ext_pdf.js | 70 +- .../sources/ext/ext_readonly.js | 187 +- .../sources/ext/ext_serialize.js | 4 + .../sources/ext/ext_tooltip.js | 111 +- .../dhtmlxScheduler/sources/ext/ext_touch.js | 411 -- .../sources/ext/ext_treetimeline.js | 24 +- .../dhtmlxScheduler/sources/ext/ext_url.js | 4 + .../sources/ext/ext_week_agenda.js | 255 ++ .../lib/dhtmlxScheduler/sources/ext/ext_wp.js | 4 + .../sources/ext/ext_year_view.js | 483 +- .../lib/dhtmlxScheduler/sources/glossy.css | 294 ++ .../lib/dhtmlxScheduler/sources/ical.js | 4 + .../lib/dhtmlxScheduler/sources/layout.css | 37 +- .../lib/dhtmlxScheduler/sources/lightbox.css | 390 +- .../lib/dhtmlxScheduler/sources/lightbox.js | 216 +- .../lib/dhtmlxScheduler/sources/load.js | 60 +- .../lib/dhtmlxScheduler/sources/locale.js | 13 +- .../lib/dhtmlxScheduler/sources/locale_ar.js | 4 + .../lib/dhtmlxScheduler/sources/locale_ca.js | 11 +- .../lib/dhtmlxScheduler/sources/locale_cn.js | 9 +- .../lib/dhtmlxScheduler/sources/locale_cs.js | 13 +- .../lib/dhtmlxScheduler/sources/locale_da.js | 46 + .../lib/dhtmlxScheduler/sources/locale_de.js | 13 +- .../lib/dhtmlxScheduler/sources/locale_el.js | 47 + .../lib/dhtmlxScheduler/sources/locale_es.js | 11 +- .../lib/dhtmlxScheduler/sources/locale_fi.js | 11 +- .../lib/dhtmlxScheduler/sources/locale_fr.js | 13 +- .../lib/dhtmlxScheduler/sources/locale_he.js | 11 +- .../lib/dhtmlxScheduler/sources/locale_hu.js | 63 +- .../lib/dhtmlxScheduler/sources/locale_id.js | 6 +- .../lib/dhtmlxScheduler/sources/locale_it.js | 11 +- .../lib/dhtmlxScheduler/sources/locale_jp.js | 77 +- .../lib/dhtmlxScheduler/sources/locale_nb.js | 45 + .../lib/dhtmlxScheduler/sources/locale_nl.js | 11 +- .../lib/dhtmlxScheduler/sources/locale_no.js | 13 +- .../lib/dhtmlxScheduler/sources/locale_pl.js | 13 +- .../lib/dhtmlxScheduler/sources/locale_pt.js | 11 +- .../sources/locale_recurring_cn.js | 6 +- .../sources/locale_recurring_cs.js | 6 +- .../sources/locale_recurring_da.js | 6 + .../sources/locale_recurring_de.js | 6 +- .../sources/locale_recurring_el.js | 6 + .../sources/locale_recurring_es.js | 6 +- .../sources/locale_recurring_fi.js | 6 +- .../sources/locale_recurring_fr.js | 6 +- .../sources/locale_recurring_it.js | 6 +- .../sources/locale_recurring_nb.js | 5 + .../sources/locale_recurring_nl.js | 6 +- .../sources/locale_recurring_pl.js | 6 +- .../sources/locale_recurring_pt.js | 6 +- .../sources/locale_recurring_ru.js | 6 +- .../sources/locale_recurring_sv.js | 6 +- .../sources/locale_recurring_ua.js | 6 +- .../lib/dhtmlxScheduler/sources/locale_ru.js | 9 +- .../lib/dhtmlxScheduler/sources/locale_si.js | 9 +- .../lib/dhtmlxScheduler/sources/locale_sv.js | 9 +- .../lib/dhtmlxScheduler/sources/locale_tr.js | 47 + .../lib/dhtmlxScheduler/sources/locale_ua.js | 9 +- .../lib/dhtmlxScheduler/sources/mobile.css | 380 ++ .../lib/dhtmlxScheduler/sources/mobile.js | 626 +++ .../lib/dhtmlxScheduler/sources/note.css | 19 + .../lib/dhtmlxScheduler/sources/property.js | 126 +- .../lib/dhtmlxScheduler/sources/recurring.css | 43 +- .../lib/dhtmlxScheduler/sources/recurring.js | 217 +- .../sources/repeat_template.html | 2 +- .../sources/repeat_template_cn.html | 2 +- .../sources/repeat_template_de.html | 2 +- .../sources/repeat_template_el.html | 57 + .../sources/repeat_template_es.html | 2 +- .../sources/repeat_template_fr.html | 2 +- .../sources/repeat_template_it.html | 2 +- .../sources/repeat_template_nl.html | 2 +- .../sources/repeat_template_ru.html | 2 +- .../lib/dhtmlxScheduler/sources/scheduler.js | 212 +- .../lib/dhtmlxScheduler/sources/touch.css | 116 - .../static/lib/dhtmlxScheduler/whatsnew.txt | 32 +- 196 files changed, 11510 insertions(+), 6828 deletions(-) delete mode 100644 addons/base_calendar/static/lib/dhtmlxScheduler/License_GPL.html create mode 100644 addons/base_calendar/static/lib/dhtmlxScheduler/codebase/connector/base_connector.php create mode 100644 addons/base_calendar/static/lib/dhtmlxScheduler/codebase/connector/combo_connector.php create mode 100644 addons/base_calendar/static/lib/dhtmlxScheduler/codebase/connector/connector.js create mode 100644 addons/base_calendar/static/lib/dhtmlxScheduler/codebase/connector/crosslink_connector.php create mode 100644 addons/base_calendar/static/lib/dhtmlxScheduler/codebase/connector/dataprocessor.php create mode 100644 addons/base_calendar/static/lib/dhtmlxScheduler/codebase/connector/db_common.php create mode 100644 addons/base_calendar/static/lib/dhtmlxScheduler/codebase/connector/db_mssql.php create mode 100644 addons/base_calendar/static/lib/dhtmlxScheduler/codebase/connector/db_mysqli.php create mode 100644 addons/base_calendar/static/lib/dhtmlxScheduler/codebase/connector/db_oracle.php create mode 100644 addons/base_calendar/static/lib/dhtmlxScheduler/codebase/connector/db_pdo.php create mode 100644 addons/base_calendar/static/lib/dhtmlxScheduler/codebase/connector/db_postgre.php create mode 100644 addons/base_calendar/static/lib/dhtmlxScheduler/codebase/connector/grid_connector.php create mode 100644 addons/base_calendar/static/lib/dhtmlxScheduler/codebase/connector/scheduler_connector.php create mode 100644 addons/base_calendar/static/lib/dhtmlxScheduler/codebase/connector/tools.php create mode 100644 addons/base_calendar/static/lib/dhtmlxScheduler/codebase/connector/tree_connector.php create mode 100644 addons/base_calendar/static/lib/dhtmlxScheduler/codebase/connector/treegrid_connector.php create mode 100644 addons/base_calendar/static/lib/dhtmlxScheduler/codebase/connector/update.php create mode 100644 addons/base_calendar/static/lib/dhtmlxScheduler/codebase/dhtmlxscheduler_glossy.css create mode 100644 addons/base_calendar/static/lib/dhtmlxScheduler/codebase/dhtmlxscheduler_mobile.css create mode 100644 addons/base_calendar/static/lib/dhtmlxScheduler/codebase/dhtmlxscheduler_mobile.js delete mode 100644 addons/base_calendar/static/lib/dhtmlxScheduler/codebase/ext/dhtmlxscheduler_ext.css create mode 100644 addons/base_calendar/static/lib/dhtmlxScheduler/codebase/ext/dhtmlxscheduler_offline.js delete mode 100644 addons/base_calendar/static/lib/dhtmlxScheduler/codebase/ext/dhtmlxscheduler_recurring.css create mode 100644 addons/base_calendar/static/lib/dhtmlxScheduler/codebase/ext/dhtmlxscheduler_week_agenda.js delete mode 100644 addons/base_calendar/static/lib/dhtmlxScheduler/codebase/imgs/blue_tab.png delete mode 100644 addons/base_calendar/static/lib/dhtmlxScheduler/codebase/imgs/white_tab.png create mode 100644 addons/base_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/blue_tab.png create mode 100644 addons/base_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/blue_tab_wide.png create mode 100644 addons/base_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/but_repeat.gif create mode 100644 addons/base_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/buttons.gif create mode 100644 addons/base_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/calendar.gif create mode 100644 addons/base_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/clock_big.gif create mode 100644 addons/base_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/clock_small.gif create mode 100644 addons/base_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/colapce-expand-icon.gif create mode 100644 addons/base_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/controlls5.png create mode 100644 addons/base_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/databg.png create mode 100644 addons/base_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/databg_now.png create mode 100644 addons/base_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/event-bg.png create mode 100644 addons/base_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/icon.png create mode 100644 addons/base_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/left-separator.png create mode 100644 addons/base_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/left-time-bg.png create mode 100644 addons/base_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/lightbox.png create mode 100644 addons/base_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/loading.gif create mode 100644 addons/base_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/move.png create mode 100644 addons/base_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/multi-days-bg.png create mode 100644 addons/base_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/second-top-days-bg.png create mode 100644 addons/base_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/top-days-bg.png create mode 100644 addons/base_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/top-separator.gif create mode 100644 addons/base_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/white_tab.png create mode 100644 addons/base_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/white_tab_wide.png create mode 100644 addons/base_calendar/static/lib/dhtmlxScheduler/codebase/imgs_mobile/add.png create mode 100644 addons/base_calendar/static/lib/dhtmlxScheduler/codebase/imgs_mobile/arrow_left.png create mode 100644 addons/base_calendar/static/lib/dhtmlxScheduler/codebase/imgs_mobile/arrow_right.png create mode 100644 addons/base_calendar/static/lib/dhtmlxScheduler/codebase/imgs_mobile/event.png create mode 100644 addons/base_calendar/static/lib/dhtmlxScheduler/codebase/imgs_mobile/event_focus.png create mode 100644 addons/base_calendar/static/lib/dhtmlxScheduler/codebase/imgs_mobile/noevents.png create mode 100644 addons/base_calendar/static/lib/dhtmlxScheduler/codebase/readme.txt create mode 100644 addons/base_calendar/static/lib/dhtmlxScheduler/license.txt create mode 100644 addons/base_calendar/static/lib/dhtmlxScheduler/sources/dayevents.js create mode 100644 addons/base_calendar/static/lib/dhtmlxScheduler/sources/dhtmlxdataprocessor_jsonp.js create mode 100644 addons/base_calendar/static/lib/dhtmlxScheduler/sources/ext/ext_layer.js create mode 100644 addons/base_calendar/static/lib/dhtmlxScheduler/sources/ext/ext_offline.js delete mode 100644 addons/base_calendar/static/lib/dhtmlxScheduler/sources/ext/ext_touch.js create mode 100644 addons/base_calendar/static/lib/dhtmlxScheduler/sources/ext/ext_week_agenda.js create mode 100644 addons/base_calendar/static/lib/dhtmlxScheduler/sources/glossy.css create mode 100644 addons/base_calendar/static/lib/dhtmlxScheduler/sources/locale_da.js create mode 100644 addons/base_calendar/static/lib/dhtmlxScheduler/sources/locale_el.js create mode 100644 addons/base_calendar/static/lib/dhtmlxScheduler/sources/locale_nb.js create mode 100644 addons/base_calendar/static/lib/dhtmlxScheduler/sources/locale_recurring_da.js create mode 100644 addons/base_calendar/static/lib/dhtmlxScheduler/sources/locale_recurring_el.js create mode 100644 addons/base_calendar/static/lib/dhtmlxScheduler/sources/locale_recurring_nb.js create mode 100644 addons/base_calendar/static/lib/dhtmlxScheduler/sources/locale_tr.js create mode 100644 addons/base_calendar/static/lib/dhtmlxScheduler/sources/mobile.css create mode 100644 addons/base_calendar/static/lib/dhtmlxScheduler/sources/mobile.js create mode 100644 addons/base_calendar/static/lib/dhtmlxScheduler/sources/repeat_template_el.html delete mode 100644 addons/base_calendar/static/lib/dhtmlxScheduler/sources/touch.css diff --git a/addons/base_calendar/__openerp__.py b/addons/base_calendar/__openerp__.py index 02e75b5ebef..b8f6a954082 100644 --- a/addons/base_calendar/__openerp__.py +++ b/addons/base_calendar/__openerp__.py @@ -3,7 +3,7 @@ "version": "2.0", "depends": ['base'], "js": [ - 'static/lib/dhtmlxScheduler/codebase/dhtmlxscheduler.js', + 'static/lib/dhtmlxScheduler/codebase/dhtmlxscheduler_debug.js', 'static/lib/dhtmlxScheduler/codebase/ext/dhtmlxscheduler_minical.js', 'static/src/js/calendar.js' ], diff --git a/addons/base_calendar/static/lib/dhtmlxScheduler/License_GPL.html b/addons/base_calendar/static/lib/dhtmlxScheduler/License_GPL.html deleted file mode 100644 index afe2ef33f0b..00000000000 --- a/addons/base_calendar/static/lib/dhtmlxScheduler/License_GPL.html +++ /dev/null @@ -1,73 +0,0 @@ -

GNU GENERAL PUBLIC LICENSE

-Version 2, June 1991

-

-

Copyright (C) 1989, 1991 Free Software Foundation, Inc.

-

59 Temple Place - Suite 330, Boston, MA 02111-1307, USA

-

-

Everyone is permitted to copy and distribute verbatim copies

-

of this license document, but changing it is not allowed.

-

-

-

TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION

-

0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you".

-

-

Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does.

-

-

1. You may copy and distribute 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 and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program.

-

-

You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee.

-

-

2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions:

-

-

-

a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change.

-

-

b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License.

-

-

c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.)

-

These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it.

-

-

Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program.

-

-

In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License.

-

-

3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following:

-

-

a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or,

-

-

b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or,

-

-

c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.)

-

The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable.

-

-

If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code.

-

-

4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance.

-

-

5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it.

-

-

6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License.

-

-

7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), 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 distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program.

-

-

If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances.

-

-

It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice.

-

-

This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License.

-

-

8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License.

-

-

9. The Free Software Foundation may publish revised and/or new versions of the 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 a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation.

-

-

10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally.

-

-

NO WARRANTY

-

-

11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, 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.

-

-

12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE 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.

-

-

\ No newline at end of file diff --git a/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/connector/base_connector.php b/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/connector/base_connector.php new file mode 100644 index 00000000000..aab70e3c6ea --- /dev/null +++ b/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/connector/base_connector.php @@ -0,0 +1,706 @@ +start = $start; + $this->end = $end; + $this->type = "xml"; + } + public function add($add){ + $this->start.=$add; + } + public function reset(){ + $this->start=""; + $this->end=""; + } + public function set_type($add){ + $this->type=$add; + } + public function output($name="", $inline=true){ + ob_clean(); + if ($this->type == "xml") + header("Content-type: text/xml"); + + echo $this->__toString(); + } + public function __toString(){ + return $this->start.$this->end; + } +} + +/*! EventInterface + Base class , for iterable collections, which are used in event +**/ +class EventInterface{ + protected $request; ////!< DataRequestConfig instance + public $rules=array(); //!< array of sorting rules + + /*! constructor + creates a new interface based on existing request + @param request + DataRequestConfig object + */ + public function __construct($request){ + $this->request = $request; + } + + /*! remove all elements from collection + */ + public function clear(){ + array_splice($rules,0); + } + /*! get index by name + + @param name + name of field + @return + index of named field + */ + public function index($name){ + $len = sizeof($this->rules); + for ($i=0; $i < $len; $i++) { + if ($this->rules[$i]["name"]==$name) + return $i; + } + return false; + } +} +/*! Wrapper for collection of sorting rules +**/ +class SortInterface extends EventInterface{ + /*! constructor + creates a new interface based on existing request + @param request + DataRequestConfig object + */ + public function __construct($request){ + parent::__construct($request); + $this->rules = &$request->get_sort_by_ref(); + } + /*! add new sorting rule + + @param name + name of field + @param dir + direction of sorting + */ + public function add($name,$dir){ + $this->request->set_sort($name,$dir); + } + public function store(){ + $this->request->set_sort_by($this->rules); + } +} +/*! Wrapper for collection of filtering rules +**/ +class FilterInterface extends EventInterface{ + /*! constructor + creates a new interface based on existing request + @param request + DataRequestConfig object + */ + public function __construct($request){ + $this->request = $request; + $this->rules = &$request->get_filters_ref(); + } + /*! add new filatering rule + + @param name + name of field + @param value + value to filter by + @param rule + filtering rule + */ + public function add($name,$value,$rule){ + $this->request->set_filter($name,$value,$rule); + } + public function store(){ + $this->request->set_filters($this->rules); + } +} + +/*! base class for component item representation +**/ +class DataItem{ + protected $data; //!< hash of data + protected $config;//!< DataConfig instance + protected $index;//!< index of element + protected $skip;//!< flag , which set if element need to be skiped during rendering + /*! constructor + + @param data + hash of data + @param config + DataConfig object + @param index + index of element + */ + function __construct($data,$config,$index){ + $this->config=$config; + $this->data=$data; + $this->index=$index; + $this->skip=false; + } + /*! get named value + + @param name + name or alias of field + @return + value from field with provided name or alias + */ + public function get_value($name){ + return $this->data[$name]; + } + /*! set named value + + @param name + name or alias of field + @param value + value for field with provided name or alias + */ + public function set_value($name,$value){ + return $this->data[$name]=$value; + } + /*! get id of element + @return + id of element + */ + public function get_id(){ + $id = $this->config->id["name"]; + if (array_key_exists($id,$this->data)) + return $this->data[$id]; + return false; + } + /*! change id of element + + @param value + new id value + */ + public function set_id($value){ + $this->data[$this->config->id["name"]]=$value; + } + /*! get index of element + + @return + index of element + */ + public function get_index(){ + return $this->index; + } + /*! mark element for skiping ( such element will not be rendered ) + */ + public function skip(){ + $this->skip=true; + } + + /*! return self as XML string + */ + public function to_xml(){ + return $this->to_xml_start().$this->to_xml_end(); + } + + /*! replace xml unsafe characters + + @param string + string to be escaped + @return + escaped string + */ + protected function xmlentities($string) { + return str_replace( array( '&', '"', "'", '<', '>', '’' ), array( '&' , '"', ''' , '<' , '>', ''' ), $string); + } + + /*! return starting tag for self as XML string + */ + public function to_xml_start(){ + $str="config->data); $i++){ + $name=$this->config->data[$i]["name"]; + $str.=" ".$name."='".$this->xmlentities($this->data[$name])."'"; + } + return $str.">"; + } + /*! return ending tag for XML string + */ + public function to_xml_end(){ + return ""; + } +} + + + + + +/*! Base connector class + This class used as a base for all component specific connectors. + Can be used on its own to provide raw data. +**/ +class Connector { + protected $config;//DataConfig instance + protected $request;//DataRequestConfig instance + protected $names;//!< hash of names for used classes + private $encoding="utf-8";//!< assigned encoding (UTF-8 by default) + private $editing=false;//!< flag of edit mode ( response for dataprocessor ) + private $updating=false;//!< flag of update mode ( response for data-update ) + private $db; //!< db connection resource + protected $dload;//!< flag of dyn. loading mode + public $access; //!< AccessMaster instance + + public $sql; //DataWrapper instance + public $event; //EventMaster instance + public $limit=false; + + private $id_seed=0; //!< default value, used to generate auto-IDs + protected $live_update = false; // actions table name for autoupdating + + /*! constructor + + Here initilization of all Masters occurs, execution timer initialized + @param db + db connection resource + @param type + string , which hold type of database ( MySQL or Postgre ), optional, instead of short DB name, full name of DataWrapper-based class can be provided + @param item_type + name of class, which will be used for item rendering, optional, DataItem will be used by default + @param data_type + name of class which will be used for dataprocessor calls handling, optional, DataProcessor class will be used by default. + */ + public function __construct($db,$type=false, $item_type=false, $data_type=false){ + $this->exec_time=microtime(true); + + if (!$type) $type="MySQL"; + if (class_exists($type."DBDataWrapper",false)) $type.="DBDataWrapper"; + if (!$item_type) $item_type="DataItem"; + if (!$data_type) $data_type="DataProcessor"; + + $this->names=array( + "db_class"=>$type, + "item_class"=>$item_type, + "data_class"=>$data_type, + ); + + $this->config = new DataConfig(); + $this->request = new DataRequestConfig(); + $this->event = new EventMaster(); + $this->access = new AccessMaster(); + + if (!class_exists($this->names["db_class"],false)) + throw new Exception("DB class not found: ".$this->names["db_class"]); + $this->sql = new $this->names["db_class"]($db,$this->config); + + $this->db=$db;//saved for options connectors, if any + + EventMaster::trigger_static("connectorCreate",$this); + } + + /*! return db connection resource + nested class may neeed to access live connection object + @return + DB connection resource + */ + protected function get_connection(){ + return $this->db; + } + + public function get_config(){ + return new DataConfig($this->config); + } + + public function get_request(){ + return new DataRequestConfig($this->config); + } + + + /*! config connector based on table + + @param table + name of table in DB + @param id + name of id field + @param fields + list of fields names + @param extra + list of extra fields, optional, such fields will not be included in data rendering, but will be accessible in all inner events + @param relation_id + name of field used to define relations for hierarchical data organization, optional + */ + public function render_table($table,$id="",$fields=false,$extra=false,$relation_id=false){ + $this->configure($table,$id,$fields,$extra,$relation_id); + return $this->render(); + } + public function configure($table,$id="",$fields=false,$extra=false,$relation_id=false){ + if ($fields === false){ + //auto-config + $info = $this->sql->fields_list($table); + $fields = implode(",",$info["fields"]); + if ($info["key"]) + $id = $info["key"]; + } + $this->config->init($id,$fields,$extra,$relation_id); + $this->request->set_source($table); + } + + protected function uuid(){ + return time()."x".$this->id_seed++; + } + + /*! config connector based on sql + + @param sql + sql query used as base of configuration + @param id + name of id field + @param fields + list of fields names + @param extra + list of extra fields, optional, such fields will not be included in data rendering, but will be accessible in all inner events + @param relation_id + name of field used to define relations for hierarchical data organization, optional + */ + public function render_sql($sql,$id,$fields,$extra=false,$relation_id=false){ + $this->config->init($id,$fields,$extra,$relation_id); + $this->request->parse_sql($sql); + return $this->render(); + } + + /*! render already configured connector + + @param config + configuration of data + @param request + configuraton of request + */ + public function render_connector($config,$request){ + $this->config->copy($config); + $this->request->copy($request); + return $this->render(); + } + + /*! render self + process commands, output requested data as XML + */ + public function render(){ + EventMaster::trigger_static("connectorInit",$this); + + $this->parse_request(); + if ($this->live_update !== false && $this->updating!==false) { + $this->live_update->get_updates(); + } else { + if ($this->editing){ + $dp = new $this->names["data_class"]($this,$this->config,$this->request); + $dp->process($this->config,$this->request); + } + else { + $wrap = new SortInterface($this->request); + $this->event->trigger("beforeSort",$wrap); + $wrap->store(); + + $wrap = new FilterInterface($this->request); + $this->event->trigger("beforeFilter",$wrap); + $wrap->store(); + + $this->output_as_xml( $this->sql->select($this->request) ); + } + } + $this->end_run(); + } + + /*! prevent SQL injection through column names + replace dangerous chars in field names + @param str + incoming field name + @return + safe field name + */ + protected function safe_field_name($str){ + return strtok($str, " \n\t;',"); + } + + /*! limit max count of records + connector will ignore any records after outputing max count + @param limit + max count of records + @return + none + */ + public function set_limit($limit){ + $this->limit = $limit; + } + + protected function parse_request_mode(){ + //detect edit mode + if (isset($_GET["editing"])){ + $this->editing=true; + } else if (isset($_POST["ids"])){ + $this->editing=true; + LogMaster::log('While there is no edit mode mark, POST parameters similar to edit mode detected. \n Switching to edit mode ( to disable behavior remove POST[ids]'); + } else if (isset($_GET['dhx_version'])){ + $this->updating = true; + } + } + + /*! parse incoming request, detects commands and modes + */ + protected function parse_request(){ + //set default dyn. loading params, can be reset in child classes + if ($this->dload) + $this->request->set_limit(0,$this->dload); + else if ($this->limit) + $this->request->set_limit(0,$this->limit); + + $this->parse_request_mode(); + + if ($this->live_update && ($this->updating || $this->editing)){ + $this->request->set_version($_GET["dhx_version"]); + $this->request->set_user($_GET["dhx_user"]); + } + + if (isset($_GET["dhx_sort"])) + foreach($_GET["dhx_sort"] as $k => $v){ + $k = $this->safe_field_name($k); + $this->request->set_sort($this->resolve_parameter($k),$v); + } + + if (isset($_GET["dhx_filter"])) + foreach($_GET["dhx_filter"] as $k => $v){ + $k = $this->safe_field_name($k); + $this->request->set_filter($this->resolve_parameter($k),$v); + } + + + } + + /*! convert incoming request name to the actual DB name + @param name + incoming parameter name + @return + name of related DB field + */ + protected function resolve_parameter($name){ + return $name; + } + + + /*! replace xml unsafe characters + + @param string + string to be escaped + @return + escaped string + */ + private function xmlentities($string) { + return str_replace( array( '&', '"', "'", '<', '>', '’' ), array( '&' , '"', ''' , '<' , '>', ''' ), $string); + } + + /*! render from DB resultset + @param res + DB resultset + process commands, output requested data as XML + */ + protected function render_set($res){ + $output=""; + $index=0; + $this->event->trigger("beforeRenderSet",$this,$res,$this->config); + while ($data=$this->sql->get_next($res)){ + $data = new $this->names["item_class"]($data,$this->config,$index); + if ($data->get_id()===false) + $data->set_id($this->uuid()); + $this->event->trigger("beforeRender",$data); + $output.=$data->to_xml(); + $index++; + } + return $output; + } + + /*! output fetched data as XML + @param res + DB resultset + */ + protected function output_as_xml($res){ + $start="encoding."' ?>".$this->xml_start(); + $end=$this->render_set($res).$this->xml_end(); + + $out = new OutputWriter($start, $end); + $this->event->trigger("beforeOutput", $this, $out); + + $out->output(); + } + + + /*! end processing + stop execution timer, kill the process + */ + protected function end_run(){ + $time=microtime(true)-$this->exec_time; + LogMaster::log("Done in {$time}s"); + flush(); + die(); + } + + /*! set xml encoding + + methods sets only attribute in XML, no real encoding conversion occurs + @param encoding + value which will be used as XML encoding + */ + public function set_encoding($encoding){ + $this->encoding=$encoding; + } + + /*! enable or disable dynamic loading mode + + @param count + count of rows loaded from server, actual only for grid-connector, can be skiped in other cases. + If value is a false or 0 - dyn. loading will be disabled + */ + public function dynamic_loading($count){ + $this->dload=$count; + } + + /*! enable logging + + @param path + path to the log file. If set as false or empty strig - logging will be disabled + @param client_log + enable output of log data to the client side + */ + public function enable_log($path=true,$client_log=false){ + LogMaster::enable_log($path,$client_log); + } + + /*! provides infor about current processing mode + @return + true if processing dataprocessor command, false otherwise + */ + public function is_select_mode(){ + $this->parse_request_mode(); + return !$this->editing; + } + + public function is_first_call(){ + $this->parse_request_mode(); + return !($this->editing || $this->updating || $this->request->get_start() || sizeof($this->request->get_filters()) || sizeof($this->request->get_sort_by())); + + } + + /*! renders self as xml, starting part + */ + protected function xml_start(){ + return ""; + } + /*! renders self as xml, ending part + */ + protected function xml_end(){ + return ""; + } + + + public function insert($data) { + $action = new DataAction('inserted', false, $data); + $request = new DataRequestConfig(); + $request->set_source($this->request->get_source()); + + $this->config->limit_fields($data); + $this->sql->insert($action,$request); + $this->config->restore_fields($data); + + return $action->get_new_id(); + } + + public function delete($id) { + $action = new DataAction('deleted', $id, array()); + $request = new DataRequestConfig(); + $request->set_source($this->request->get_source()); + + $this->sql->delete($action,$request); + return $action->get_status(); +} + + public function update($data) { + $action = new DataAction('updated', $data[$this->config->id["name"]], $data); + $request = new DataRequestConfig(); + $request->set_source($this->request->get_source()); + + $this->config->limit_fields($data); + $this->sql->update($action,$request); + $this->config->restore_fields($data); + + return $action->get_status(); + } + + /*! sets actions_table for Optimistic concurrency control mode and start it + @param table_name + name of database table which will used for saving actions + @param url + url used for update notifications + */ + public function enable_live_update($table, $url=false){ + $this->live_update = new DataUpdate($this->sql, $this->config, $this->request, $table,$url); + $this->live_update->set_event($this->event,$this->names["item_class"]); + $this->event->attach("beforeOutput", Array($this->live_update, "version_output")); + $this->event->attach("beforeFiltering", Array($this->live_update, "get_updates")); + $this->event->attach("beforeProcessing", Array($this->live_update, "check_collision")); + $this->event->attach("afterProcessing", Array($this->live_update, "log_operations")); + } +} + + +/*! wrapper around options collection, used for comboboxes and filters +**/ +class OptionsConnector extends Connector{ + protected $init_flag=false;//!< used to prevent rendering while initialization + public function __construct($res,$type=false,$item_type=false,$data_type=false){ + if (!$item_type) $item_type="DataItem"; + if (!$data_type) $data_type=""; //has not sense, options not editable + parent::__construct($res,$type,$item_type,$data_type); + } + /*! render self + process commands, return data as XML, not output data to stdout, ignore parameters in incoming request + @return + data as XML string + */ + public function render(){ + if (!$this->init_flag){ + $this->init_flag=true; + return ""; + } + $res = $this->sql->select($this->request); + return $this->render_set($res); + } +} + + + +class DistinctOptionsConnector extends OptionsConnector{ + /*! render self + process commands, return data as XML, not output data to stdout, ignore parameters in incoming request + @return + data as XML string + */ + public function render(){ + if (!$this->init_flag){ + $this->init_flag=true; + return ""; + } + $res = $this->sql->get_variants($this->config->text[0]["db_name"],$this->request); + return $this->render_set($res); + } +} + +?> diff --git a/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/connector/combo_connector.php b/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/connector/combo_connector.php new file mode 100644 index 00000000000..65e6bfe8564 --- /dev/null +++ b/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/connector/combo_connector.php @@ -0,0 +1,89 @@ +selected=false; + } + /*! mark option as selected + */ + function select(){ + $this->selected=true; + } + /*! return self as XML string, starting part + */ + function to_xml_start(){ + if ($this->skip) return ""; + + return ""; + } +} + +/*! Connector for the dhtmlxCombo +**/ +class ComboConnector extends Connector{ + private $filter; //!< filtering mask from incoming request + private $position; //!< position from incoming request + + /*! constructor + + Here initilization of all Masters occurs, execution timer initialized + @param res + db connection resource + @param type + string , which hold type of database ( MySQL or Postgre ), optional, instead of short DB name, full name of DataWrapper-based class can be provided + @param item_type + name of class, which will be used for item rendering, optional, DataItem will be used by default + @param data_type + name of class which will be used for dataprocessor calls handling, optional, DataProcessor class will be used by default. + */ + public function __construct($res,$type=false,$item_type=false,$data_type=false){ + if (!$item_type) $item_type="ComboDataItem"; + parent::__construct($res,$type,$item_type,$data_type); + } + + //parse GET scoope, all operations with incoming request must be done here + function parse_request(){ + parent::parse_request(); + + if (isset($_GET["pos"])){ + if (!$this->dload) //not critical, so just write a log message + LogMaster::log("Dyn loading request received, but server side was not configured to process dyn. loading. "); + else + $this->request->set_limit($_GET["pos"],$this->dload); + } + + if (isset($_GET["mask"])) + $this->request->set_filter($this->config->text[0]["name"],$_GET["mask"]."%","LIKE"); + + LogMaster::log($this->request); + } + + + /*! renders self as xml, starting part + */ + public function xml_start(){ + if ($this->request->get_start()) + return ""; + else + return ""; + } + + /*! renders self as xml, ending part + */ + public function xml_end(){ + return ""; + } +} +?> \ No newline at end of file diff --git a/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/connector/connector.js b/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/connector/connector.js new file mode 100644 index 00000000000..f0d03f7a880 --- /dev/null +++ b/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/connector/connector.js @@ -0,0 +1,141 @@ +/* +This software is allowed to use under GPL or you need to obtain Commercial or Enterise License +to use it in not GPL project. Please contact sales@dhtmlx.com for details +*/ +/* + dhx_sort[index]=direction + dhx_filter[index]=mask +*/ +if (window.dhtmlXGridObject){ + dhtmlXGridObject.prototype._init_point_connector=dhtmlXGridObject.prototype._init_point; + dhtmlXGridObject.prototype._init_point=function(){ + var clear_url=function(url){ + url=url.replace(/(\?|\&)connector[^\f]*/g,""); + return url+(url.indexOf("?")!=-1?"&":"?")+"connector=true"; + } + var combine_urls=function(url){ + return clear_url(url)+(this._connector_sorting||"")+(this._connector_filter||""); + } + var sorting_url=function(url,ind,dir){ + this._connector_sorting="&dhx_sort["+ind+"]="+dir; + return combine_urls.call(this,url); + } + var filtering_url=function(url,inds,vals){ + for (var i=0; idata_mode = $name; + $this->data_result=array(); + } + public function getDataResult(){ + return $this->data_result; + } + + public function render(){ + if (!$this->init_flag){ + $this->init_flag=true; + return ""; + } + return parent::render(); + } + + protected function output_as_xml($res){ + if ($this->data_mode){ + while ($data=$this->sql->get_next($res)){ + $this->data_result[]=$data[$this->data_mode]; + } + } + else + return parent::output_as_xml($res); + } + protected function end_run(){ + if (!$this->data_mode) + parent::end_run(); + } +} + +class CrossOptionsConnector extends Connector{ + public $options, $link; + private $master_name, $link_name, $master_value; + + public function __construct($res,$type=false,$item_type=false,$data_type=false){ + $this->options = new OptionsConnector($res,$type,$item_type,$data_type); + $this->link = new DelayedConnector($res,$type,$item_type,$data_type); + + EventMaster::attach_static("connectorInit",array($this, "handle")); + } + public function handle($conn){ + if ($conn instanceof DelayedConnector) return; + if ($conn instanceof OptionsConnector) return; + + $this->master_name = $this->link->get_config()->id["db_name"]; + $this->link_name = $this->options->get_config()->id["db_name"]; + + $this->link->event->attach("beforeFilter",array($this, "get_only_related")); + + if (isset($_GET["dhx_crosslink_".$this->link_name])){ + $this->get_links($_GET["dhx_crosslink_".$this->link_name]); + die(); + } + + if (!$this->dload){ + $conn->event->attach("beforeRender", array($this, "getOptions")); + $conn->event->attach("beforeRenderSet", array($this, "prepareConfig")); + } + + + $conn->event->attach("afterProcessing", array($this, "afterProcessing")); + } + public function prepareConfig($conn, $res, $config){ + $config->add_field($this->link_name); + } + public function getOptions($data){ + $this->link->dataMode($this->link_name); + + $this->get_links($data->get_value($this->master_name)); + + $data->set_value($this->link_name, implode(",",$this->link->getDataResult())); + } + public function get_links($id){ + $this->master_value = $id; + $this->link->render(); + } + public function get_only_related($filters){ + $index = $filters->index($this->master_name); + if ($index!==false){ + $filters->rules[$index]["value"]=$this->master_value; + } else + $filters->add($this->master_name, $this->master_value, "="); + } + public function afterProcessing($action){ + $status = $action->get_status(); + + $master_key = $action->get_value($this->master_name); + $link_key = $action->get_value($this->link_name); + $link_key = explode(',', $link_key); + + if ($status == "inserted") + $master_key = $action->get_new_id(); + + switch ($status){ + case "deleted": + $this->link->delete($master_key); + break; + case "updated": + $this->link->delete($master_key); + case "inserted": + for ($i=0; $i < sizeof($link_key); $i++) + if ($link_key[$i]!="") + $this->link->insert(array( + $this->link_name => $link_key[$i], + $this->master_name => $master_key + )); + break; + } + } +} + +?> \ No newline at end of file diff --git a/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/connector/dataprocessor.php b/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/connector/dataprocessor.php new file mode 100644 index 00000000000..551a3ce7cb2 --- /dev/null +++ b/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/connector/dataprocessor.php @@ -0,0 +1,465 @@ +connector= $connector; + $this->config=$config; + $this->request=$request; + } + + /*! convert incoming data name to valid db name + redirect to Connector->name_data by default + @param data + data name from incoming request + @return + related db_name + */ + function name_data($data){ + return $data; + } + /*! retrieve data from incoming request and normalize it + + @param ids + array of extected IDs + @return + hash of data + */ + function get_post_values($ids){ + $data=array(); + for ($i=0; $i < sizeof($ids); $i++) + $data[$ids[$i]]=array(); + + foreach ($_POST as $key => $value) { + $details=explode("_",$key,2); + if (sizeof($details)==1) continue; + + $name=$this->name_data($details[1]); + $data[$details[0]][$name]=$value; + } + + return $data; + } + /*! process incoming request ( save|update|delete ) + */ + function process(){ + LogMaster::log("DataProcessor object initialized",$_POST); + + $results=array(); + + if (!isset($_POST["ids"])) + throw new Exception("Incorrect incoming data, ID of incoming records not recognized"); + + $ids=explode(",",$_POST["ids"]); + $rows_data=$this->get_post_values($ids); + $failed=false; + + try{ + if ($this->connector->sql->is_global_transaction()) + $this->connector->sql->begin_transaction(); + + for ($i=0; $i < sizeof($ids); $i++) { + $rid = $ids[$i]; + LogMaster::log("Row data [{$rid}]",$rows_data[$rid]); + + if (!isset($_POST[$rid."_!nativeeditor_status"])) + throw new Exception("Status of record [{$rid}] not found in incoming request"); + $status = $_POST[$rid."_!nativeeditor_status"]; + + $action=new DataAction($status,$rid,$rows_data[$rid]); + $results[]=$action; + $this->inner_process($action); + } + + } catch(Exception $e){ + $failed=true; + } + + if ($this->connector->sql->is_global_transaction()){ + if (!$failed) + for ($i=0; $i < sizeof($results); $i++) + if ($results[$i]->get_status()=="error" || $results[$i]->get_status()=="invalid"){ + $failed=true; + break; + } + if ($failed){ + for ($i=0; $i < sizeof($results); $i++) + $results[$i]->error(); + $this->connector->sql->rollback_transaction(); + } + else + $this->connector->sql->commit_transaction(); + } + + $this->output_as_xml($results); + } + + /*! converts status string to the inner mode name + + @param status + external status string + @return + inner mode name + */ + protected function status_to_mode($status){ + switch($status){ + case "updated": + return "update"; + break; + case "inserted": + return "insert"; + break; + case "deleted": + return "delete"; + break; + default: + return $status; + break; + } + } + /*! process data updated request received + + @param action + DataAction object + @return + DataAction object with details of processing + */ + protected function inner_process($action){ + + if ($this->connector->sql->is_record_transaction()) + $this->connector->sql->begin_transaction(); + + try{ + + $mode = $this->status_to_mode($action->get_status()); + if (!$this->connector->access->check($mode)){ + LogMaster::log("Access control: {$operation} operation blocked"); + $action->error(); + } else { + $check = $this->connector->event->trigger("beforeProcessing",$action); + if (!$action->is_ready()) + $this->check_exts($action,$mode); + $check = $this->connector->event->trigger("afterProcessing",$action); + } + + } catch (Exception $e){ + $action->set_status("error"); + } + + if ($this->connector->sql->is_record_transaction()){ + if ($action->get_status()=="error" || $action->get_status()=="invalid") + $this->connector->sql->rollback_transaction(); + else + $this->connector->sql->commit_transaction(); + } + + return $action; + } + /*! check if some event intercepts processing, send data to DataWrapper in other case + + @param action + DataAction object + @param mode + name of inner mode ( will be used to generate event names ) + */ + function check_exts($action,$mode){ + $old_config = new DataConfig($this->config); + + $this->connector->event->trigger("before".$mode,$action); + if ($action->is_ready()) + LogMaster::log("Event code for ".$mode." processed"); + else { + //check if custom sql defined + $sql = $this->connector->sql->get_sql($mode,$action); + if ($sql) + $this->connector->sql->query($sql); + else{ + $action->sync_config($this->config); + $method=array($this->connector->sql,$mode); + if (!is_callable($method)) + throw new Exception("Unknown dataprocessing action: ".$mode); + call_user_func($method,$action,$this->request); + } + } + $this->connector->event->trigger("after".$mode,$action); + + $this->config = $old_config; + } + + /*! output xml response for dataprocessor + + @param results + array of DataAction objects + */ + function output_as_xml($results){ + LogMaster::log("Edit operation finished",$results); + ob_clean(); + header("Content-type:text/xml"); + echo ""; + echo ""; + for ($i=0; $i < sizeof($results); $i++) + echo $results[$i]->to_xml(); + echo ""; + } + +} + +/*! contain all info related to action and controls customizaton +**/ +class DataAction{ + private $status; //!< cuurent status of record + private $id;//!< id of record + private $data;//!< data hash of record + private $userdata;//!< hash of extra data , attached to record + private $nid;//!< new id value , after operation executed + private $output;//!< custom output to client side code + private $attrs;//!< hash of custtom attributes + private $ready;//!< flag of operation's execution + private $addf;//!< array of added fields + private $delf;//!< array of deleted fields + + + /*! constructor + + @param status + current operation status + @param id + record id + @param data + hash of data + */ + function __construct($status,$id,$data){ + $this->status=$status; + $this->id=$id; + $this->data=$data; + $this->nid=$id; + + $this->output=""; + $this->attrs=array(); + $this->ready=false; + + $this->addf=array(); + $this->delf=array(); + } + + + /*! add custom field and value to DB operation + + @param name + name of field which will be added to DB operation + @param value + value which will be used for related field in DB operation + */ + function add_field($name,$value){ + LogMaster::log("adding field: ".$name.", with value: ".$value); + $this->data[$name]=$value; + $this->addf[]=$name; + } + /*! remove field from DB operation + + @param name + name of field which will be removed from DB operation + */ + function remove_field($name){ + LogMaster::log("removing field: ".$name); + $this->delf[]=$name; + } + + /*! sync field configuration with external object + + @param slave + SQLMaster object + @todo + check , if all fields removed then cancel action + */ + function sync_config($slave){ + foreach ($this->addf as $k => $v) + $slave->add_field($v); + foreach ($this->delf as $k => $v) + $slave->remove_field($v); + } + /*! get value of some record's propery + + @param name + name of record's property ( name of db field or alias ) + @return + value of related property + */ + function get_value($name){ + if (!array_key_exists($name,$this->data)){ + LogMaster::log("Incorrect field name used: ".$name); + LogMaster::log("data",$this->data); + return ""; + } + return $this->data[$name]; + } + /*! set value of some record's propery + + @param name + name of record's property ( name of db field or alias ) + @param value + value of related property + */ + function set_value($name,$value){ + LogMaster::log("change value of: ".$name." as: ".$value); + $this->data[$name]=$value; + } + /*! get hash of data properties + + @return + hash of data properties + */ + function get_data(){ + return $this->data; + } + /*! get some extra info attached to record + deprecated, exists just for backward compatibility, you can use set_value instead of it + @param name + name of userdata property + @return + value of related userdata property + */ + function get_userdata_value($name){ + return $this->get_value($name); + } + /*! set some extra info attached to record + deprecated, exists just for backward compatibility, you can use get_value instead of it + @param name + name of userdata property + @param value + value of userdata property + */ + function set_userdata_value($name,$value){ + return $this->set_value($name,$value); + } + /*! get current status of record + + @return + string with status value + */ + function get_status(){ + return $this->status; + } + /*! assign new status to the record + + @param status + new status value + */ + function set_status($status){ + $this->status=$status; + } + /*! get id of current record + + @return + id of record + */ + function get_id(){ + return $this->id; + } + /*! sets custom response text + + can be accessed through defineAction on client side. Text wrapped in CDATA, so no extra escaping necessary + @param text + custom response text + */ + function set_response_text($text){ + $this->set_response_xml(""); + } + /*! sets custom response xml + + can be accessed through defineAction on client side + @param text + string with XML data + */ + function set_response_xml($text){ + $this->output=$text; + } + /*! sets custom response attributes + + can be accessed through defineAction on client side + @param name + name of custom attribute + @param value + value of custom attribute + */ + function set_response_attribute($name,$value){ + $this->attrs[$name]=$value; + } + /*! check if action finished + + @return + true if action finished, false otherwise + */ + function is_ready(){ + return $this->ready; + } + /*! return new id value + + equal to original ID normally, after insert operation - value assigned for new DB record + @return + new id value + */ + function get_new_id(){ + return $this->nid; + } + + /*! set result of operation as error + */ + function error(){ + $this->status="error"; + $this->ready=true; + } + /*! set result of operation as invalid + */ + function invalid(){ + $this->status="invalid"; + $this->ready=true; + } + /*! confirm successful opeation execution + @param id + new id value, optional + */ + function success($id=false){ + if ($id!==false) + $this->nid = $id; + $this->ready=true; + } + /*! convert DataAction to xml format compatible with client side dataProcessor + @return + DataAction operation report as XML string + */ + function to_xml(){ + $str="attrs as $k => $v) { + $str.=$k."='".$v."' "; + } + $str.=">{$this->output}"; + return $str; + } + /*! convert self to string ( for logs ) + + @return + DataAction operation report as plain string + */ + function __toString(){ + return "action:{$this->status}; sid:{$this->id}; tid:{$this->nid};"; + } + + +} + + +?> \ No newline at end of file diff --git a/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/connector/db_common.php b/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/connector/db_common.php new file mode 100644 index 00000000000..7ef239c0488 --- /dev/null +++ b/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/connector/db_common.php @@ -0,0 +1,959 @@ +copy($proto); + else{ + $start=0; + $this->filters=array(); + $this->sort_by=array(); + } + } + + /*! copy parameters of source object into self + + @param proto + source object + */ + public function copy($proto){ + $this->filters =$proto->get_filters(); + $this->sort_by =$proto->get_sort_by(); + $this->count =$proto->get_count(); + $this->start =$proto->get_start(); + $this->source =$proto->get_source(); + $this->fieldset =$proto->get_fieldset(); + $this->relation =$proto->get_relation(); + $this->user = $proto->user; + $this->version = $proto->version; + } + + /*! convert self to string ( for logs ) + @return + self as plain string, + */ + public function __toString(){ + $str="Source:{$this->source}\nFieldset:{$this->fieldset}\nWhere:"; + for ($i=0; $i < sizeof($this->filters); $i++) + $str.=$this->filters[$i]["name"]." ".$this->filters[$i]["operation"]." ".$this->filters[$i]["value"].";"; + $str.="\nStart:{$this->start}\nCount:{$this->count}\n"; + for ($i=0; $i < sizeof($this->sort_by); $i++) + $str.=$this->sort_by[$i]["name"]."=".$this->sort_by[$i]["direction"].";"; + $str.="\nRelation:{$this->relation}"; + return $str; + } + + /*! returns set of filtering rules + @return + set of filtering rules + */ + public function get_filters(){ + return $this->filters; + } + public function &get_filters_ref(){ + return $this->filters; + } + public function set_filters($data){ + $this->filters=$data; + } + + + public function get_user(){ + return $this->user; + } + public function set_user($user){ + $this->user = $user; + } + public function get_version(){ + return $this->version; + } + public function set_version($version){ + $this->version = $version; + } + + /*! returns list of used fields + @return + list of used fields + */ + public function get_fieldset(){ + return $this->fieldset; + } + /*! returns name of source table + @return + name of source table + */ + public function get_source(){ + return $this->source; + } + /*! returns set of sorting rules + @return + set of sorting rules + */ + public function get_sort_by(){ + return $this->sort_by; + } + public function &get_sort_by_ref(){ + return $this->sort_by; + } + public function set_sort_by($data){ + $this->sort_by=$data; + } + + /*! returns start index + @return + start index + */ + public function get_start(){ + return $this->start; + } + /*! returns count of requested records + @return + count of requested records + */ + public function get_count(){ + return $this->count; + } + /*! returns name of relation id + @return + relation id name + */ + public function get_relation(){ + return $this->relation; + } + + /*! sets sorting rule + + @param field + name of column + @param order + direction of sorting + */ + public function set_sort($field,$order=false){ + if (!$field && !$order) + $this->sort_by=array(); + else{ + $order=strtolower($order)=="asc"?"ASC":"DESC"; + $this->sort_by[]=array("name"=>$field,"direction" => $order); + } + } + /*! sets filtering rule + + @param field + name of column + @param value + value for filtering + @param operation + operation for filtering, optional , LIKE by default + */ + public function set_filter($field,$value,$operation=false){ + array_push($this->filters,array("name"=>$field,"value"=>$value,"operation"=>$operation)); + } + + /*! sets list of used fields + + @param value + list of used fields + */ + public function set_fieldset($value){ + $this->fieldset=$value; + } + /*! sets name of source table + + @param value + name of source table + */ + public function set_source($value){ + $this->source=trim($value); + if (!$this->source) throw new Exception("Source of data can't be empty"); + } + /*! sets data limits + + @param start + start index + @param count + requested count of data + */ + public function set_limit($start,$count){ + $this->start=$start; + $this->count=$count; + } + /*! sets name of relation id + + @param value + name of relation id field + */ + public function set_relation($value){ + $this->relation=$value; + } + /*! parse incoming sql, to fill other properties + + @param sql + incoming sql string + */ + public function parse_sql($sql){ + $sql= preg_replace("/[ \n\t]+limit[\n ,0-9]/i","",$sql); + + $data = preg_split("/[ \n\t]+\\_from\\_/i",$sql,2); + if (count($data)!=2) + $data = preg_split("/[ \n\t]+from/i",$sql,2); + $this->fieldset = preg_replace("/^[\s]*select/i","",$data[0],1); + + $table_data = preg_split("/[ \n\t]+where/i",$data[1],2); + if (sizeof($table_data)>1){ //where construction exists + $this->set_source($table_data[0]); + $where_data = preg_split("/[ \n\t]+order[ ]+by/i",$table_data[1],2); + $this->filters[]=$where_data[0]; + if (sizeof($where_data)==1) return; //end of line detected + $data=$where_data[1]; + } else { + $table_data = preg_split("/[ \n\t]+order[ ]+by/i",$table_data[0],2); + $this->set_source($table_data[0]); + if (sizeof($table_data)==1) return; //end of line detected + $data=$table_data[1]; + } + + if (trim($data)){ //order by construction exists + $s_data = preg_split("/\\,/",trim($data)); + for ($i=0; $i < count($s_data); $i++) { + $data=preg_split("/[ ]+/",trim($s_data[$i]),2); + $this->set_sort($data[0],$data[1]); + } + + } + } +} + +/*! manager of data configuration +**/ +class DataConfig{ + public $id;////!< name of ID field + public $relation_id;//!< name or relation ID field + public $text;//!< array of text fields + public $data;//!< array of all known fields , fields which exists only in this collection will not be included in dataprocessor's operations + + + /*! converts self to the string, for logging purposes + **/ + public function __toString(){ + $str="ID:{$this->id['db_name']}(ID:{$this->id['name']})\n"; + $str.="Relation ID:{$this->relation_id['db_name']}({$this->relation_id['name']})\n"; + $str.="Data:"; + for ($i=0; $itext); $i++) + $str.="{$this->text[$i]['db_name']}({$this->text[$i]['name']}),"; + + $str.="\nExtra:"; + for ($i=0; $idata); $i++) + $str.="{$this->data[$i]['db_name']}({$this->data[$i]['name']}),"; + + return $str; + } + + /*! removes un-used fields from configuration + @param name + name of field , which need to be preserved + */ + public function minimize($name){ + for ($i=0; $i < sizeof($this->text); $i++){ + if ($this->text[$i]["name"]==$name){ + $this->text[$i]["name"]="value"; + $this->data=array($this->text[$i]); + $this->text=array($this->text[$i]); + return; + } + } + throw new Exception("Incorrect dataset minimization, master field not found."); + } + + public function limit_fields($data){ + if (isset($this->full_field_list)) + $this->restore_fields(); + $this->full_field_list = $this->text; + $this->text = array(); + + for ($i=0; $i < sizeof($this->full_field_list); $i++) { + if (array_key_exists($this->full_field_list[$i]["name"],$data)) + $this->text[] = $this->full_field_list[$i]; + } + } + + public function restore_fields(){ + if (isset($this->full_field_list)) + $this->text = $this->full_field_list; + } + + /*! initialize inner state by parsing configuration parameters + + @param id + name of id field + @param fields + name of data field(s) + @param extra + name of extra field(s) + @param relation + name of relation field + + */ + public function init($id,$fields,$extra,$relation){ + $this->id = $this->parse($id,false); + $this->text = $this->parse($fields,true); + $this->data = array_merge($this->text,$this->parse($extra,true)); + $this->relation_id = $this->parse($relation,false); + } + + /*! parse configuration string + + @param key + key string from configuration + @param mode + multi names flag + @return + parsed field name object + */ + private function parse($key,$mode){ + if ($mode){ + if (!$key) return array(); + $key=explode(",",$key); + for ($i=0; $i < sizeof($key); $i++) + $key[$i]=$this->parse($key[$i],false); + return $key; + } + $key=explode("(",$key); + $data=array("db_name"=>trim($key[0]), "name"=>trim($key[0])); + if (sizeof($key)>1) + $data["name"]=substr(trim($key[1]),0,-1); + return $data; + } + + /*! constructor + init public collectons + @param proto + DataConfig object used as prototype for new one, optional + */ + public function __construct($proto=false){ + if ($proto!==false) + $this->copy($proto); + else { + $this->text=array(); + $this->data=array(); + $this->id=array("name"=>"dhx_auto_id", "db_name"=>"dhx_auto_id"); + $this->relation_id=array("name"=>"", "db_name"=>""); + } + } + + /*! copy properties from source object + + @param proto + source object + */ + public function copy($proto){ + $this->id = $proto->id; + $this->relation_id = $proto->relation_id; + $this->text = $proto->text; + $this->data = $proto->data; + } + + /*! returns list of data fields (db_names) + @return + list of data fields ( ready to be used in SQL query ) + */ + public function db_names_list($db){ + $out=array(); + if ($this->id["db_name"]) + array_push($out,$db->escape_name($this->id["db_name"])); + if ($this->relation_id["db_name"]) + array_push($out,$db->escape_name($this->relation_id["db_name"])); + + for ($i=0; $i < sizeof($this->data); $i++){ + if ($this->data[$i]["db_name"]!=$this->data[$i]["name"]) + $out[]=$db->escape_name($this->data[$i]["db_name"])." as ".$this->data[$i]["name"]; + else + $out[]=$db->escape_name($this->data[$i]["db_name"]); + } + + return $out; + } + + /*! add field to dataset config ($text collection) + + added field will be used in all auto-generated queries + @param name + name of field + @param aliase + aliase of field, optional + */ + public function add_field($name,$aliase=false){ + if ($aliase===false) $aliase=$name; + + //adding to list of data-active fields + if ($this->id["db_name"]==$name || $this->relation_id["db_name"] == $name){ + LogMaster::log("Field name already used as ID, be sure that it is really necessary."); + } + if ($this->is_field($name,$this->text)!=-1) + throw new Exception('Data field already registered: '.$name); + array_push($this->text,array("db_name"=>$name,"name"=>$aliase)); + + //adding to list of all fields as well + if ($this->is_field($name,$this->data)==-1) + array_push($this->data,array("db_name"=>$name,"name"=>$aliase)); + + } + + /*! remove field from dataset config ($text collection) + + removed field will be excluded from all auto-generated queries + @param name + name of field, or aliase of field + */ + public function remove_field($name){ + $ind = $this->is_field($name); + if ($ind==-1) throw new Exception('There was no such data field registered as: '.$name); + array_splice($this->text,$ind,1); + //we not deleting field from $data collection, so it will not be included in data operation, but its data still available + } + + /*! check if field is a part of dataset + + @param name + name of field + @param collection + collection, against which check will be done, $text collection by default + @return + returns true if field already a part of dataset, otherwise returns true + */ + private function is_field($name,$collection = false){ + if (!$collection) + $collection=$this->text; + + for ($i=0; $iconfig=$config; + $this->connection=$connection; + } + + /*! insert record in storage + + @param data + DataAction object + @param source + DataRequestConfig object + */ + abstract function insert($data,$source); + + /*! delete record from storage + + @param data + DataAction object + @param source + DataRequestConfig object + */ + abstract function delete($data,$source); + + /*! update record in storage + + @param data + DataAction object + @param source + DataRequestConfig object + */ + abstract function update($data,$source); + + /*! select record from storage + + @param source + DataRequestConfig object + */ + abstract function select($source); + + /*! get size of storage + + @param source + DataRequestConfig object + */ + abstract function get_size($source); + + /*! get all variations of field in storage + + @param name + name of field + @param source + DataRequestConfig object + */ + abstract function get_variants($name,$source); + + /*! checks if there is a custom sql string for specified db operation + + @param name + name of DB operation + @param data + hash of data + @return + sql string + */ + public function get_sql($name,$data){ + return ""; //custom sql not supported by default + } + + /*! begins DB transaction + */ + public function begin_transaction(){ + throw new Exception("Data wrapper not supports transactions."); + } + /*! commits DB transaction + */ + public function commit_transaction(){ + throw new Exception("Data wrapper not supports transactions."); + } + /*! rollbacks DB transaction + */ + public function rollback_transaction(){ + throw new Exception("Data wrapper not supports transactions."); + } +} + +/*! Common database abstraction class + Class provides base set of methods to access and change data in DB, class used as a base for DB-specific wrappers +**/ +abstract class DBDataWrapper extends DataWrapper{ + private $transaction = false; //!< type of transaction + private $sequence=false;//!< sequence name + private $sqls = array();//!< predefined sql actions + + + /*! assign named sql query + @param name + name of sql query + @param data + sql query text + */ + public function attach($name,$data){ + $name=strtolower($name); + $this->sqls[$name]=$data; + } + /*! replace vars in sql string with actual values + + @param matches + array of field name matches + @return + value for the var name + */ + public function get_sql_callback($matches){ + return $this->escape($this->temp->get_value($matches[1])); + } + public function get_sql($name,$data){ + $name=strtolower($name); + if (!array_key_exists($name,$this->sqls)) return ""; + + + $str = $this->sqls[$name]; + $this->temp = $data; //dirty + $str = preg_replace_callback('|\{([^}]+)\}|',array($this,"get_sql_callback"),$str); + unset ($this->temp); //dirty + return $str; + } + + public function insert($data,$source){ + $sql=$this->insert_query($data,$source); + $this->query($sql); + $data->success($this->get_new_id()); + } + public function delete($data,$source){ + $sql=$this->delete_query($data,$source); + $this->query($sql); + $data->success(); + } + public function update($data,$source){ + $sql=$this->update_query($data,$source); + $this->query($sql); + $data->success(); + } + public function select($source){ + $select=$source->get_fieldset(); + if (!$select){ + $select=$this->config->db_names_list($this); + $select = implode(",",$select); + } + + $where=$this->build_where($source->get_filters(),$source->get_relation()); + $sort=$this->build_order($source->get_sort_by()); + + return $this->query($this->select_query($select,$source->get_source(),$where,$sort,$source->get_start(),$source->get_count())); + } + public function get_size($source){ + $count = new DataRequestConfig($source); + + $count->set_fieldset("COUNT(*) as DHX_COUNT "); + $count->set_sort(null); + $count->set_limit(0,0); + + $res=$this->select($count); + $data=$this->get_next($res); + if (array_key_exists("DHX_COUNT",$data)) return $data["DHX_COUNT"]; + else return $data["dhx_count"]; //postgresql + } + public function get_variants($name,$source){ + $count = new DataRequestConfig($source); + $count->set_fieldset("DISTINCT ".$this->escape_name($name)." as value"); + $count->set_sort(null); + $count->set_limit(0,0); + + return $this->select($count); + } + + public function sequence($sec){ + $this->sequence=$sec; + } + + + /*! create an sql string for filtering rules + + @param rules + set of filtering rules + @param relation + name of relation id field + @return + sql string with filtering rules + */ + protected function build_where($rules,$relation=false){ + $sql=array(); + for ($i=0; $i < sizeof($rules); $i++) + if (is_string($rules[$i])) + array_push($sql,$rules[$i]); + else + if ($rules[$i]["value"]!=""){ + if (!$rules[$i]["operation"]) + array_push($sql,$this->escape_name($rules[$i]["name"])." LIKE '%".$this->escape($rules[$i]["value"])."%'"); + else + array_push($sql,$this->escape_name($rules[$i]["name"])." ".$rules[$i]["operation"]." '".$this->escape($rules[$i]["value"])."'"); + } + if ($relation!==false) + array_push($sql,$this->escape_name($this->config->relation_id["db_name"])." = '".$this->escape($relation)."'"); + return implode(" AND ",$sql); + } + /*! convert sorting rules to sql string + + @param by + set of sorting rules + @return + sql string for set of sorting rules + */ + protected function build_order($by){ + if (!sizeof($by)) return ""; + $out = array(); + for ($i=0; $i < sizeof($by); $i++) + if ($by[$i]["name"]) + $out[]=$this->escape_name($by[$i]["name"])." ".$by[$i]["direction"]; + return implode(",",$out); + } + + /*! generates sql code for select operation + + @param select + list of fields in select + @param from + table name + @param where + list of filtering rules + @param sort + list of sorting rules + @param start + start index of fetching + @param count + count of records to fetch + @return + sql string for select operation + */ + protected function select_query($select,$from,$where,$sort,$start,$count){ + $sql="SELECT ".$select." FROM ".$from; + if ($where) $sql.=" WHERE ".$where; + if ($sort) $sql.=" ORDER BY ".$sort; + if ($start || $count) $sql.=" LIMIT ".$start.",".$count; + return $sql; + } + /*! generates update sql + + @param data + DataAction object + @param request + DataRequestConfig object + @return + sql string, which updates record with provided data + */ + protected function update_query($data,$request){ + $sql="UPDATE ".$request->get_source()." SET "; + $temp=array(); + for ($i=0; $i < sizeof($this->config->text); $i++) { + $step=$this->config->text[$i]; + + if ($data->get_value($step["name"])===Null) + $step_value ="Null"; + else + $step_value = "'".$this->escape($data->get_value($step["name"]))."'"; + $temp[$i]= $this->escape_name($step["db_name"])."=". $step_value; + } + if ($relation = $this->config->relation_id["db_name"]){ + $temp[]= $this->escape_name($relation)."='".$this->escape($data->get_value($relation))."'"; + } + $sql.=implode(",",$temp)." WHERE ".$this->escape_name($this->config->id["db_name"])."='".$this->escape($data->get_id())."'"; + + //if we have limited set - set constraints + $where=$this->build_where($request->get_filters(),$request->get_relation()); + if ($where) $sql.=" AND (".$where.")"; + + return $sql; + } + + /*! generates delete sql + + @param data + DataAction object + @param request + DataRequestConfig object + @return + sql string, which delete record + */ + protected function delete_query($data,$request){ + $sql="DELETE FROM ".$request->get_source(); + $sql.=" WHERE ".$this->escape_name($this->config->id["db_name"])."='".$this->escape($data->get_id())."'"; + + //if we have limited set - set constraints + $where=$this->build_where($request->get_filters(),$request->get_relation()); + if ($where) $sql.=" AND (".$where.")"; + + return $sql; + } + + /*! generates insert sql + + @param data + DataAction object + @param request + DataRequestConfig object + @return + sql string, which inserts new record with provided data + */ + protected function insert_query($data,$request){ + $temp_n=array(); + $temp_v=array(); + foreach($this->config->text as $k => $v){ + $temp_n[$k]=$this->escape_name($v["db_name"]); + if ($data->get_value($v["name"])===Null) + $temp_v[$k]="Null"; + else + $temp_v[$k]="'".$this->escape($data->get_value($v["name"]))."'"; + } + if ($relation = $this->config->relation_id["db_name"]){ + $temp_n[]=$this->escape_name($relation); + $temp_v[]="'".$this->escape($data->get_value($relation))."'"; + } + if ($this->sequence){ + $temp_n[]=$this->escape_name($this->config->id["db_name"]); + $temp_v[]=$this->sequence; + } + + $sql="INSERT INTO ".$request->get_source()."(".implode(",",$temp_n).") VALUES (".implode(",",$temp_v).")"; + + return $sql; + } + + /*! sets the transaction mode, used by dataprocessor + + @param mode + mode name + */ + public function set_transaction_mode($mode){ + if ($mode!="none" && $mode!="global" && $mode!="record") + throw new Exception("Unknown transaction mode"); + $this->transaction=$mode; + } + /*! returns true if global transaction mode was specified + @return + true if global transaction mode was specified + */ + public function is_global_transaction(){ + return $this->transaction == "global"; + } + /*! returns true if record transaction mode was specified + @return + true if record transaction mode was specified + */ + public function is_record_transaction(){ + return $this->transaction == "record"; + } + + + public function begin_transaction(){ + $this->query("BEGIN"); + } + public function commit_transaction(){ + $this->query("COMMIT"); + } + public function rollback_transaction(){ + $this->query("ROLLBACK"); + } + + /*! exec sql string + + @param sql + sql string + @return + sql result set + */ + abstract protected function query($sql); + /*! returns next record from result set + + @param res + sql result set + @return + hash of data + */ + abstract public function get_next($res); + /*! returns new id value, for newly inserted row + @return + new id value, for newly inserted row + */ + abstract protected function get_new_id(); + /*! escape data to prevent sql injections + @param data + unescaped data + @return + escaped data + */ + abstract public function escape($data); + + /*! escape field name to prevent sql reserved words conflict + @param data + unescaped data + @return + escaped data + */ + public function escape_name($data){ + return $data; + } + + /*! get list of tables in the database + + @return + array of table names + */ + public function tables_list() { + throw new Exception("Not implemented"); + } + + /*! returns list of fields for the table in question + + @param table + name of table in question + @return + array of field names + */ + public function fields_list($table) { + throw new Exception("Not implemented"); + } + +} +/*! Implementation of DataWrapper for MySQL +**/ +class MySQLDBDataWrapper extends DBDataWrapper{ + protected $last_result; + public function query($sql){ + LogMaster::log($sql); + $res=mysql_query($sql,$this->connection); + if ($res===false) throw new Exception("MySQL operation failed\n".mysql_error($this->connection)); + $this->last_result = $res; + return $res; + } + + public function get_next($res){ + if (!$res) + $res = $this->last_result; + + return mysql_fetch_assoc($res); + } + + protected function get_new_id(){ + return mysql_insert_id($this->connection); + } + + public function escape($data){ + return mysql_real_escape_string($data); + } + + public function tables_list() { + $result = mysql_query("SHOW TABLES"); + if ($result===false) throw new Exception("MySQL operation failed\n".mysql_error($this->connection)); + + $tables = array(); + while ($table = mysql_fetch_array($result)) { + $tables[] = $table[0]; + } + return $tables; + } + + public function fields_list($table) { + $result = mysql_query("SHOW COLUMNS FROM `".$table."`"); + if ($result===false) throw new Exception("MySQL operation failed\n".mysql_error($this->connection)); + + $fields = array(); + $id = ""; + while ($field = mysql_fetch_assoc($result)) { + if ($field['Key'] == "PRI") + $id = $field["Field"]; + else + $fields[] = $field["Field"]; + } + return array("fields" => $fields, "key" => $id ); + } + + /*! escape field name to prevent sql reserved words conflict + @param data + unescaped data + @return + escaped data + */ + public function escape_name($data){ + if ((strpos($data,"`")!==false || intval($data)==$data) || (strpos($data,".")!==false)) + return $data; + return '`'.$data.'`'; + } +} +?> \ No newline at end of file diff --git a/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/connector/db_mssql.php b/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/connector/db_mssql.php new file mode 100644 index 00000000000..4cad2217878 --- /dev/null +++ b/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/connector/db_mssql.php @@ -0,0 +1,66 @@ +connection); + if ($this->insert_operation){ + $last = mssql_fetch_assoc($res); + $this->last_id = $last["dhx_id"]; + mssql_free_result($res); + } + if ($this->start_from) + mssql_data_seek($res,$this->start_from); + return $res; + } + + public function get_next($res){ + return mssql_fetch_assoc($res); + } + + protected function get_new_id(){ + /* + MSSQL doesn't support identity or auto-increment fields + Insert SQL returns new ID value, which stored in last_id field + */ + return $this->last_id; + } + + protected function insert_query($data,$request){ + $sql = parent::insert_query($data,$request); + $this->insert_operation=true; + return $sql.";SELECT @@IDENTITY AS dhx_id"; + } + + protected function select_query($select,$from,$where,$sort,$start,$count){ + $sql="SELECT " ; + if ($count) + $sql.=" TOP ".($count+$start); + $sql.=" ".$select." FROM ".$from; + if ($where) $sql.=" WHERE ".$where; + if ($sort) $sql.=" ORDER BY ".$sort; + if ($start && $count) + $this->start_from=$start; + else + $this->start_from=false; + return $sql; + } + + public function escape($data){ + /* + there is no special escaping method for mssql - use common logic + */ + return str_replace("'","''",$data); + } + + public function begin_transaction(){ + $this->query("BEGIN TRAN"); + } +} +?> \ No newline at end of file diff --git a/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/connector/db_mysqli.php b/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/connector/db_mysqli.php new file mode 100644 index 00000000000..a33ca71bbe4 --- /dev/null +++ b/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/connector/db_mysqli.php @@ -0,0 +1,53 @@ +connection->query($sql); + if ($res===false) throw new Exception("MySQL operation failed\n".$this->connection->error); + return $res; + } + + public function get_next($res){ + return $res->fetch_assoc(); + } + + protected function get_new_id(){ + return $this->connection->insert_id; + } + + public function escape($data){ + return $this->connection->real_escape_string($data); + } + + public function tables_list() { + $result = $this->connection->query("SHOW TABLES"); + if ($result===false) throw new Exception("MySQL operation failed\n".$this->connection->error); + + $tables = array(); + while ($table = $result->fetch_array()) { + $tables[] = $table[0]; + } + return $tables; + } + + public function fields_list($table) { + $result = $this->connection->query("SHOW COLUMNS FROM `".$table."`"); + if ($result===false) throw new Exception("MySQL operation failed\n".$this->connection->error); + $fields = array(); + while ($field = $result->fetch_array()) { + if ($field['Key'] == "PRI") { + $fields[$field[0]] = 1; + } else { + $fields[$field[0]] = 0; + } + } + return $fields; + } + +} + +?> \ No newline at end of file diff --git a/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/connector/db_oracle.php b/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/connector/db_oracle.php new file mode 100644 index 00000000000..46c3e88bebe --- /dev/null +++ b/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/connector/db_oracle.php @@ -0,0 +1,79 @@ +connection,$sql); + if ($stm===false) throw new Exception("Oracle - sql parsing failed\n".oci_error($this->connection)); + + $out = array(0=>null); + if($this->insert_operation){ + oci_bind_by_name($stm,":outID",$out[0],999); + $this->insert_operation=false; + } + + + $mode = ($this->is_record_transaction() || $this->is_global_transaction())?OCI_DEFAULT:OCI_COMMIT_ON_SUCCESS; + $res=oci_execute($stm,$mode); + if ($res===false) throw new Exception("Oracle - sql execution failed\n".oci_error($this->connection)); + + $this->last_id=$out[0]; + + return $stm; + } + + public function get_next($res){ + $data = oci_fetch_assoc($res); + if (array_key_exists("VALUE",$data)) + $data["value"]=$data["VALUE"]; + return $data; + } + + protected function get_new_id(){ + /* + Oracle doesn't support identity or auto-increment fields + Insert SQL returns new ID value, which stored in last_id field + */ + return $this->last_id; + } + + protected function insert_query($data,$request){ + $sql = parent::insert_query($data,$request); + $this->insert_operation=true; + return $sql." returning ".$this->config->id["db_name"]." into :outID"; + } + + protected function select_query($select,$from,$where,$sort,$start,$count){ + $sql="SELECT ".$select." FROM ".$from; + if ($where) $sql.=" WHERE ".$where; + if ($sort) $sql.=" ORDER BY ".$sort; + if ($start || $count) + $sql="SELECT * FROM ( select /*+ FIRST_ROWS(".$count.")*/dhx_table.*, ROWNUM rnum FROM (".$sql.") dhx_table where ROWNUM <= ".($count+$start)." ) where rnum >".$start; + return $sql; + } + + public function escape($data){ + /* + as far as I can see the only way to escape data is by using oci_bind_by_name + while it is neat solution in common case, it conflicts with existing SQL building logic + fallback to simple escaping + */ + return str_replace("'","''",$data); + } + + public function begin_transaction(){ + //auto-start of transaction + } + public function commit_transaction(){ + oci_commit($this->connection); + } + public function rollback_transaction(){ + oci_rollback($this->connection); + } +} +?> \ No newline at end of file diff --git a/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/connector/db_pdo.php b/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/connector/db_pdo.php new file mode 100644 index 00000000000..8fb6cf4578b --- /dev/null +++ b/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/connector/db_pdo.php @@ -0,0 +1,65 @@ +connection->query($sql); + if ($res===false) throw new Exception("PDO - sql execution failed\n".$this->connection->errorInfo()); + + return new PDOResultSet($res); + } + + protected function select_query($select,$from,$where,$sort,$start,$count){ + $sql="SELECT ".$select." FROM ".$from; + if ($where) $sql.=" WHERE ".$where; + if ($sort) $sql.=" ORDER BY ".$sort; + if ($start || $count) { + if ($this->connection->getAttribute(PDO::ATTR_DRIVER_NAME)=="pgsql") + $sql.=" OFFSET ".$start." LIMIT ".$count; + else + $sql.=" LIMIT ".$start.",".$count; + } + return $sql; + } + + + public function get_next($res){ + $data = $res->next(); + return $data; + } + + protected function get_new_id(){ + return $this->connection->lastInsertId(); + } + + public function escape($str){ + $res=$this->connection->quote($str); + if ($res===false) //not supported by pdo driver + return str_replace("'","''",$str); + return substr($res,1,-1); + } + +} + +class PDOResultSet{ + private $res; + public function __construct($res){ + $this->res = $res; + } + public function next(){ + $data = $this->res->fetch(PDO::FETCH_ASSOC); + if (!$data){ + $this->res->closeCursor(); + return null; + } + return $data; + } +} +?> \ No newline at end of file diff --git a/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/connector/db_postgre.php b/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/connector/db_postgre.php new file mode 100644 index 00000000000..08f1b1aaa79 --- /dev/null +++ b/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/connector/db_postgre.php @@ -0,0 +1,66 @@ +connection,$sql); + if ($res===false) throw new Exception("Postgre - sql execution failed\n".pg_last_error($this->connection)); + + return $res; + } + + protected function select_query($select,$from,$where,$sort,$start,$count){ + $sql="SELECT ".$select." FROM ".$from; + if ($where) $sql.=" WHERE ".$where; + if ($sort) $sql.=" ORDER BY ".$sort; + if ($start || $count) + $sql.=" OFFSET ".$start." LIMIT ".$count; + return $sql; + } + + public function get_next($res){ + return pg_fetch_assoc($res); + } + + protected function get_new_id(){ + $res = pg_query( $this->connection, "SELECT LASTVAL() AS seq"); + $data = pg_fetch_assoc($res); + pg_free_result($res); + return $data['seq']; + } + + public function escape($data){ + //need to use oci_bind_by_name + return pg_escape_string($this->connection,$data); + } + + public function tables_list() { + $sql = "SELECT table_name FROM information_schema.tables WHERE table_schema = 'public'"; + $res = pg_query($this->connection, $sql); + $tables = array(); + while ($table = pg_fetch_assoc($res)) { + $tables[] = $table['table_name']; + } + return $tables; + } + + public function fields_list($table) { + $sql = "SELECT * FROM information_schema.constraint_column_usage"; + $result = pg_query($this->connection, $sql); + $field = pg_fetch_assoc($result); + $id = $field['column_name']; + + $sql = "SELECT * FROM information_schema.columns WHERE table_name ='".$table."';"; + $result = pg_query($this->connection, $sql); + $fields = array(); + $id = ""; + while ($field = pg_fetch_assoc($result)) { + $fields[] = $field["column_name"]; + } + return array('fields' => $fields, 'key' => $id ); + } +} +?> \ No newline at end of file diff --git a/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/connector/grid_connector.php b/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/connector/grid_connector.php new file mode 100644 index 00000000000..5167528739f --- /dev/null +++ b/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/connector/grid_connector.php @@ -0,0 +1,268 @@ +row_attrs=array(); + $this->cell_attrs=array(); + $this->userdata=array(); + } + /*! set color of row + + @param color + color of row + */ + function set_row_color($color){ + $this->row_attrs["bgColor"]=$color; + } + /*! set style of row + + @param color + color of row + */ + function set_row_style($color){ + $this->row_attrs["style"]=$color; + } + /*! assign custom style to the cell + + @param name + name of column + @param value + css style string + */ + function set_cell_style($name,$value){ + $this->set_cell_attribute($name,"style",$value); + } + /*! assign custom class to specific cell + + @param name + name of column + @param value + css class name + */ + function set_cell_class($name,$value){ + $this->set_cell_attribute($name,"class",$value); + } + /*! set custom cell attribute + + @param name + name of column + @param attr + name of attribute + @param value + value of attribute + */ + function set_cell_attribute($name,$attr,$value){ + if (!$this->cell_attrs[$name]) $this->cell_attrs[$name]=array(); + $this->cell_attrs[$name][$attr]=$value; + } + + /*! set userdata section for the item + + @param name + name of userdata + @param value + value of userdata + */ + function set_userdata($name, $value){ + $this->userdata[$name]=$value; + } + + /*! set custom row attribute + + @param attr + name of attribute + @param value + value of attribute + */ + function set_row_attribute($attr,$value){ + $this->row_attrs[$attr]=$value; + } + + /*! return self as XML string, starting part + */ + public function to_xml_start(){ + if ($this->skip) return ""; + + $str="row_attrs as $k=>$v) + $str.=" ".$k."='".$v."'"; + $str.=">"; + for ($i=0; $i < sizeof($this->config->text); $i++){ + $str.="config->text[$i]["name"]; + if (isset($this->cell_attrs[$name])){ + $cattrs=$this->cell_attrs[$name]; + foreach ($cattrs as $k => $v) + $str.=" ".$k."='".$this->xmlentities($v)."'"; + } + $str.=">data[$name]."]]>"; + } + foreach ($this->userdata as $key => $value) + $str.=""; + + return $str; + } + /*! return self as XML string, ending part + */ + public function to_xml_end(){ + if ($this->skip) return ""; + + return ""; + } +} +/*! Connector for the dhtmlxgrid +**/ +class GridConnector extends Connector{ + protected $extra_output="";//!< extra info which need to be sent to client side + private $options=array();//!< hash of OptionsConnector + + /*! constructor + + Here initilization of all Masters occurs, execution timer initialized + @param res + db connection resource + @param type + string , which hold type of database ( MySQL or Postgre ), optional, instead of short DB name, full name of DataWrapper-based class can be provided + @param item_type + name of class, which will be used for item rendering, optional, DataItem will be used by default + @param data_type + name of class which will be used for dataprocessor calls handling, optional, DataProcessor class will be used by default. + */ + public function __construct($res,$type=false,$item_type=false,$data_type=false){ + if (!$item_type) $item_type="GridDataItem"; + if (!$data_type) $data_type="GridDataProcessor"; + parent::__construct($res,$type,$item_type,$data_type); + } + + + protected function parse_request(){ + parent::parse_request(); + + if (isset($_GET["dhx_colls"])) + $this->fill_collections($_GET["dhx_colls"]); + + if (isset($_GET["posStart"]) && isset($_GET["count"])) + $this->request->set_limit($_GET["posStart"],$_GET["count"]); + } + protected function resolve_parameter($name){ + if (intval($name).""==$name) + return $this->config->text[intval($name)]["db_name"]; + return $name; + } + + /*! replace xml unsafe characters + + @param string + string to be escaped + @return + escaped string + */ + private function xmlentities($string) { + return str_replace( array( '&', '"', "'", '<', '>', '’' ), array( '&' , '"', ''' , '<' , '>', ''' ), $string); + } + + /*! assign options collection to the column + + @param name + name of the column + @param options + array or connector object + */ + public function set_options($name,$options){ + if (is_array($options)){ + $str=""; + foreach($options as $k => $v) + $str.=""; + $options=$str; + } + $this->options[$name]=$options; + } + /*! generates xml description for options collections + + @param list + comma separated list of column names, for which options need to be generated + */ + protected function fill_collections($list){ + $names=explode(",",$list); + for ($i=0; $i < sizeof($names); $i++) { + $name = $this->resolve_parameter($names[$i]); + if (!array_key_exists($name,$this->options)){ + $this->options[$name] = new DistinctOptionsConnector($this->get_connection(),$this->names["db_class"]); + $c = new DataConfig($this->config); + $r = new DataRequestConfig($this->request); + $c->minimize($name); + + $this->options[$name]->render_connector($c,$r); + } + + $this->extra_output.=""; + if (!is_string($this->options[$name])) + $this->extra_output.=$this->options[$name]->render(); + else + $this->extra_output.=$this->options[$name]; + $this->extra_output.=""; + } + } + + /*! renders self as xml, starting part + */ + protected function xml_start(){ + if ($this->dload){ + if ($pos=$this->request->get_start()) + return ""; + else + return ""; + } + else + return ""; + } + + + /*! renders self as xml, ending part + */ + protected function xml_end(){ + return $this->extra_output.""; + } + + public function set_config($config = false){ + if (gettype($config) == 'boolean') + $config = new GridConfiguration($config); + + $this->event->attach("beforeOutput", Array($config, "attachHeaderToXML")); + } +} + +/*! DataProcessor class for Grid component +**/ +class GridDataProcessor extends DataProcessor{ + + /*! convert incoming data name to valid db name + converts c0..cN to valid field names + @param data + data name from incoming request + @return + related db_name + */ + function name_data($data){ + if ($data == "gr_id") return $this->config->id["name"]; + $parts=explode("c",$data); + if ($parts[0]=="" && intval($parts[1])==$parts[1]) + return $this->config->text[intval($parts[1])]["name"]; + return $data; + } +} + +?> \ No newline at end of file diff --git a/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/connector/scheduler_connector.php b/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/connector/scheduler_connector.php new file mode 100644 index 00000000000..82a1f4601e0 --- /dev/null +++ b/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/connector/scheduler_connector.php @@ -0,0 +1,121 @@ +skip) return ""; + + $str=""; + $str.="data[$this->config->text[0]["name"]]."]]>"; + $str.="data[$this->config->text[1]["name"]]."]]>"; + $str.="data[$this->config->text[2]["name"]]."]]>"; + for ($i=3; $iconfig->text); $i++){ + $extra = $this->config->text[$i]["name"]; + $str.="<".$extra.">data[$extra]."]]>"; + } + return $str.""; + } +} + + +/*! Connector class for dhtmlxScheduler +**/ +class SchedulerConnector extends Connector{ + + protected $extra_output="";//!< extra info which need to be sent to client side + private $options=array();//!< hash of OptionsConnector + + + /*! assign options collection to the column + + @param name + name of the column + @param options + array or connector object + */ + public function set_options($name,$options){ + if (is_array($options)){ + $str=""; + foreach($options as $k => $v) + $str.=""; + $options=$str; + } + $this->options[$name]=$options; + } + /*! generates xml description for options collections + + @param list + comma separated list of column names, for which options need to be generated + */ + protected function fill_collections(){ + foreach ($this->options as $k=>$v) { + $name = $k; + $this->extra_output.=""; + if (!is_string($this->options[$name])) + $this->extra_output.=$this->options[$name]->render(); + else + $this->extra_output.=$this->options[$name]; + $this->extra_output.=""; + } + } + + /*! renders self as xml, ending part + */ + protected function xml_end(){ + $this->fill_collections(); + return $this->extra_output.""; + } + + + /*! constructor + + Here initilization of all Masters occurs, execution timer initialized + @param res + db connection resource + @param type + string , which hold type of database ( MySQL or Postgre ), optional, instead of short DB name, full name of DataWrapper-based class can be provided + @param item_type + name of class, which will be used for item rendering, optional, DataItem will be used by default + @param data_type + name of class which will be used for dataprocessor calls handling, optional, DataProcessor class will be used by default. + */ + public function __construct($res,$type=false,$item_type=false,$data_type=false){ + if (!$item_type) $item_type="SchedulerDataItem"; + if (!$data_type) $data_type="SchedulerDataProcessor"; + parent::__construct($res,$type,$item_type,$data_type); + } + + //parse GET scoope, all operations with incoming request must be done here + function parse_request(){ + parent::parse_request(); + if (count($this->config->text)){ + if (isset($_GET["to"])) + $this->request->set_filter($this->config->text[0]["name"],$_GET["to"],"<"); + if (isset($_GET["from"])) + $this->request->set_filter($this->config->text[1]["name"],$_GET["from"],">"); + } + } +} + +/*! DataProcessor class for Scheduler component +**/ +class SchedulerDataProcessor extends DataProcessor{ + function name_data($data){ + if ($data=="start_date") + return $this->config->text[0]["db_name"]; + if ($data=="id") + return $this->config->id["db_name"]; + if ($data=="end_date") + return $this->config->text[1]["db_name"]; + if ($data=="text") + return $this->config->text[2]["db_name"]; + + return $data; + } +} + +?> \ No newline at end of file diff --git a/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/connector/tools.php b/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/connector/tools.php new file mode 100644 index 00000000000..c5b92e6ab2b --- /dev/null +++ b/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/connector/tools.php @@ -0,0 +1,254 @@ +events=array(); + } + /*! Method check if event with such name already exists. + @param name + name of event, case non-sensitive + @return + true if event with such name registered, false otherwise + */ + public function exist($name){ + $name=strtolower($name); + return (isset($this->events[$name]) && sizeof($this->events[$name])); + } + /*! Attach custom code to event. + + Only on event handler can be attached in the same time. If new event handler attached - old will be detached. + + @param name + name of event, case non-sensitive + @param method + function which will be attached. You can use array(class, method) if you want to attach the method of the class. + */ + public function attach($name,$method){ + $name=strtolower($name); + if (!array_key_exists($name,$this->events)) + $this->events[$name]=array(); + $this->events[$name][]=$method; + } + + public static function attach_static($name, $method){ + $name=strtolower($name); + if (!array_key_exists($name,EventMaster::$eventsStatic)) + EventMaster::$eventsStatic[$name]=array(); + EventMaster::$eventsStatic[$name][]=$method; + } + + public static function trigger_static($name, $method){ + $arg_list = func_get_args(); + $name=strtolower(array_shift($arg_list)); + + if (isset(EventMaster::$eventsStatic[$name])) + foreach(EventMaster::$eventsStatic[$name] as $method){ + if (is_array($method) && !method_exists($method[0],$method[1])) + throw new Exception("Incorrect method assigned to event: ".$method[0].":".$method[1]); + if (!is_array($method) && !function_exists($method)) + throw new Exception("Incorrect function assigned to event: ".$method); + call_user_func_array($method, $arg_list); + } + return true; + } + + /*! Detach code from event + @param name + name of event, case non-sensitive + */ + public function detach($name){ + $name=strtolower($name); + unset($this->events[$name]); + } + /*! Trigger event. + @param name + name of event, case non-sensitive + @param data + value which will be provided as argument for event function, + you can provide multiple data arguments, method accepts variable number of parameters + @return + true if event handler was not assigned , result of event hangler otherwise + */ + public function trigger($name,$data){ + $arg_list = func_get_args(); + $name=strtolower(array_shift($arg_list)); + + if (isset($this->events[$name])) + foreach($this->events[$name] as $method){ + if (is_array($method) && !method_exists($method[0],$method[1])) + throw new Exception("Incorrect method assigned to event: ".$method[0].":".$method[1]); + if (!is_array($method) && !function_exists($method)) + throw new Exception("Incorrect function assigned to event: ".$method); + call_user_func_array($method, $arg_list); + } + return true; + } +} + +/*! Class which handles access rules. +**/ +class AccessMaster{ + private $rules,$local; + /*! constructor + + Set next access right to "allowed" by default : read, insert, update, delete + Basically - all common data operations allowed by default + */ + function __construct(){ + $this->rules=array("read" => true, "insert" => true, "update" => true, "delete" => true); + $this->local=true; + } + /*! change access rule to "allow" + @param name + name of access right + */ + public function allow($name){ + $this->rules[$name]=true; + } + /*! change access rule to "deny" + + @param name + name of access right + */ + public function deny($name){ + $this->rules[$name]=false; + } + + /*! change all access rules to "deny" + */ + public function deny_all(){ + $this->rules=array(); + } + + /*! check access rule + + @param name + name of access right + @return + true if access rule allowed, false otherwise + */ + public function check($name){ + if ($this->local){ + /*! + todo + add referrer check, to prevent access from remote points + */ + } + if (!isset($this->rules[$name]) || !$this->rules[$name]){ + return false; + } + return true; + } +} + +/*! Controls error and debug logging. + Class designed to be used as static object. +**/ +class LogMaster{ + private static $_log=false;//!< logging mode flag + private static $_output=false;//!< output error infor to client flag + private static $session="";//!< all messages generated for current request + + /*! convert array to string representation ( it is a bit more readable than var_dump ) + + @param data + data object + @param pref + prefix string, used for formating, optional + @return + string with array description + */ + private static function log_details($data,$pref=""){ + if (is_array($data)){ + $str=array(""); + foreach($data as $k=>$v) + array_push($str,$pref.$k." => ".LogMaster::log_details($v,$pref."\t")); + return implode("\n",$str); + } + return $data; + } + /*! put record in log + + @param str + string with log info, optional + @param data + data object, which will be added to log, optional + */ + public static function log($str="",$data=""){ + if (LogMaster::$_log){ + $message = $str.LogMaster::log_details($data)."\n\n"; + LogMaster::$session.=$message; + error_log($message,3,LogMaster::$_log); + } + } + + /*! get logs for current request + @return + string, which contains all log messages generated for current request + */ + public static function get_session_log(){ + return LogMaster::$session; + } + + /*! error handler, put normal php errors in log file + + @param errn + error number + @param errstr + error description + @param file + error file + @param line + error line + @param context + error cntext + */ + public static function error_log($errn,$errstr,$file,$line,$context){ + LogMaster::log($errstr." at ".$file." line ".$line); + } + + /*! exception handler, used as default reaction on any error - show execution log and stop processing + + @param exception + instance of Exception + */ + public static function exception_log($exception){ + LogMaster::log("!!!Uncaught Exception\nCode: " . $exception->getCode() . "\nMessage: " . $exception->getMessage()); + if (LogMaster::$_output){ + echo "

\n";
+			echo LogMaster::get_session_log();
+			echo "\n
"; + } + die(); + } + + /*! enable logging + + @param name + path to the log file, if boolean false provided as value - logging will be disabled + @param output + flag of client side output, if enabled - session log will be sent to client side in case of an error. + */ + public static function enable_log($name,$output=false){ + LogMaster::$_log=$name; + LogMaster::$_output=$output; + if ($name){ + set_error_handler(array("LogMaster","error_log"),E_ALL); + set_exception_handler(array("LogMaster","exception_log")); + LogMaster::log("\n\n====================================\nLog started, ".date("d/m/Y h:m:s")."\n===================================="); + } + } +} + +?> \ No newline at end of file diff --git a/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/connector/tree_connector.php b/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/connector/tree_connector.php new file mode 100644 index 00000000000..21886548d50 --- /dev/null +++ b/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/connector/tree_connector.php @@ -0,0 +1,274 @@ +im0=false; + $this->im1=false; + $this->im2=false; + $this->check=false; + $this->attrs = array(); + $this->userdata = array(); + } + /*! get id of parent record + + @return + id of parent record + */ + function get_parent_id(){ + return $this->data[$this->config->relation_id["name"]]; + } + /*! get state of items checkbox + + @return + state of item's checkbox as int value, false if state was not defined + */ + function get_check_state(){ + return $this->check; + } + /*! set state of item's checkbox + + @param value + int value, 1 - checked, 0 - unchecked, -1 - third state + */ + function set_check_state($value){ + $this->check=$value; + } + + /*! return count of child items + -1 if there is no info about childs + @return + count of child items + */ + function has_kids(){ + return $this->kids; + } + /*! sets count of child items + @param value + count of child items + */ + function set_kids($value){ + $this->kids=$value; + } + + /*! set custom attribute + + @param name + name of the attribute + @param value + new value of the attribute + */ + function set_attribute($name, $value){ + switch($name){ + case "id": + $this->set_id($value); + break; + case "text": + $this->data[$this->config->text[0]["name"]]=$value; + break; + case "checked": + $this->set_check_state($value); + break; + case "im0": + $this->im0=$value; + break; + case "im1": + $this->im1=$value; + break; + case "im2": + $this->im2=$value; + break; + case "child": + $this->set_kids($value); + break; + default: + $this->attrs[$name]=$value; + } + } + + /*! set userdata section for the item + + @param name + name of userdata + @param value + value of userdata + */ + function set_userdata($name, $value){ + $this->userdata[$name]=$value; + } + + /*! assign image for tree's item + + @param img_folder_closed + image for item, which represents folder in closed state + @param img_folder_open + image for item, which represents folder in opened state, optional + @param img_leaf + image for item, which represents leaf item, optional + */ + function set_image($img_folder_closed,$img_folder_open=false,$img_leaf=false){ + $this->im0=$img_folder_closed; + $this->im1=$img_folder_open?$img_folder_open:$img_folder_closed; + $this->im2=$img_leaf?$img_leaf:$img_folder_closed; + } + /*! return self as XML string, starting part + */ + function to_xml_start(){ + if ($this->skip) return ""; + + $str1="has_kids()==true) $str1.="child='".$this->has_kids()."' "; + if ($this->im0) $str1.="im0='".$this->im0."' "; + if ($this->im1) $str1.="im1='".$this->im0."' "; + if ($this->im2) $str1.="im2='".$this->im0."' "; + if ($this->check) $str1.="checked='".$this->check."' "; + foreach ($this->attrs as $key => $value) + $str1.=$key."='".$this->xmlentities($value)."' "; + $str1.=">"; + foreach ($this->userdata as $key => $value) + $str1.=""; + + return $str1; + } + /*! return self as XML string, ending part + */ + function to_xml_end(){ + if ($this->skip) return ""; + return ""; + } + +} + +require_once("filesystem_item.php"); + +/*! Connector for the dhtmlxtree +**/ +class TreeConnector extends Connector{ + private $id_swap = array(); + + /*! constructor + + Here initilization of all Masters occurs, execution timer initialized + @param res + db connection resource + @param type + string , which hold type of database ( MySQL or Postgre ), optional, instead of short DB name, full name of DataWrapper-based class can be provided + @param item_type + name of class, which will be used for item rendering, optional, DataItem will be used by default + @param data_type + name of class which will be used for dataprocessor calls handling, optional, DataProcessor class will be used by default. + */ + public function __construct($res,$type=false,$item_type=false,$data_type=false){ + if (!$item_type) $item_type="TreeDataItem"; + if (!$data_type) $data_type="TreeDataProcessor"; + parent::__construct($res,$type,$item_type,$data_type); + + $this->event->attach("afterInsert",array($this,"parent_id_correction_a")); + $this->event->attach("beforeProcessing",array($this,"parent_id_correction_b")); + } + + /*! store info about ID changes during insert operation + @param dataAction + data action object during insert operation + */ + public function parent_id_correction_a($dataAction){ + $this->id_swap[$dataAction->get_id()]=$dataAction->get_new_id(); + } + /*! update ID if it was affected by previous operation + @param dataAction + data action object, before any processing operation + */ + public function parent_id_correction_b($dataAction){ + $relation = $this->config->relation_id["db_name"]; + $value = $dataAction->get_value($relation); + + if (array_key_exists($value,$this->id_swap)) + $dataAction->set_value($relation,$this->id_swap[$value]); + } + + + public function parse_request(){ + parent::parse_request(); + + if (isset($_GET["id"])) + $this->request->set_relation($_GET["id"]); + else + $this->request->set_relation("0"); + + $this->request->set_limit(0,0); //netralize default reaction on dyn. loading mode + } + + + + protected function render_set($res){ + $output=""; + $index=0; + while ($data=$this->sql->get_next($res)){ + $data = new $this->names["item_class"]($data,$this->config,$index); + $this->event->trigger("beforeRender",$data); + //there is no info about child elements, + //if we are using dyn. loading - assume that it has, + //in normal mode juse exec sub-render routine + if ($data->has_kids()===-1 && $this->dload) + $data->set_kids(true); + $output.=$data->to_xml_start(); + if ($data->has_kids()===-1 || ( $data->has_kids()==true && !$this->dload)){ + $sub_request = new DataRequestConfig($this->request); + $sub_request->set_relation($data->get_id()); + $output.=$this->render_set($this->sql->select($sub_request)); + } + $output.=$data->to_xml_end(); + $index++; + } + return $output; + } + /*! renders self as xml, starting part + */ + public function xml_start(){ + return ""; + } + + /*! renders self as xml, ending part + */ + public function xml_end(){ + return ""; + } +} + + +class TreeDataProcessor extends DataProcessor{ + + function __construct($connector,$config,$request){ + parent::__construct($connector,$config,$request); + $request->set_relation(false); + } + + /*! convert incoming data name to valid db name + converts c0..cN to valid field names + @param data + data name from incoming request + @return + related db_name + */ + function name_data($data){ + if ($data=="tr_pid") + return $this->config->relation_id["db_name"]; + if ($data=="tr_text") + return $this->config->text[0]["db_name"]; + return $data; + } +} + +?> \ No newline at end of file diff --git a/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/connector/treegrid_connector.php b/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/connector/treegrid_connector.php new file mode 100644 index 00000000000..b410cb46527 --- /dev/null +++ b/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/connector/treegrid_connector.php @@ -0,0 +1,161 @@ +im0=false; + } + /*! return id of parent record + + @return + id of parent record + */ + function get_parent_id(){ + return $this->data[$this->config->relation_id["name"]]; + } + /*! assign image to treegrid's item + longer description + @param img + relative path to the image + */ + function set_image($img){ + $this->set_cell_attribute($this->config->text[0]["name"],"image",$img); + } + + /*! return count of child items + -1 if there is no info about childs + @return + count of child items + */ + function has_kids(){ + return $this->kids; + } + /*! sets count of child items + @param value + count of child items + */ + function set_kids($value){ + $this->kids=$value; + if ($value) + $this->set_row_attribute("xmlkids",$value); + } +} +/*! Connector for dhtmlxTreeGrid +**/ +class TreeGridConnector extends GridConnector{ + private $id_swap = array(); + + /*! constructor + + Here initilization of all Masters occurs, execution timer initialized + @param res + db connection resource + @param type + string , which hold type of database ( MySQL or Postgre ), optional, instead of short DB name, full name of DataWrapper-based class can be provided + @param item_type + name of class, which will be used for item rendering, optional, DataItem will be used by default + @param data_type + name of class which will be used for dataprocessor calls handling, optional, DataProcessor class will be used by default. + */ + public function __construct($res,$type=false,$item_type=false,$data_type=false){ + if (!$item_type) $item_type="TreeGridDataItem"; + if (!$data_type) $data_type="TreeGridDataProcessor"; + parent::__construct($res,$type,$item_type,$data_type); + + $this->event->attach("afterInsert",array($this,"parent_id_correction_a")); + $this->event->attach("beforeProcessing",array($this,"parent_id_correction_b")); + } + + /*! store info about ID changes during insert operation + @param dataAction + data action object during insert operation + */ + public function parent_id_correction_a($dataAction){ + $this->id_swap[$dataAction->get_id()]=$dataAction->get_new_id(); + } + /*! update ID if it was affected by previous operation + @param dataAction + data action object, before any processing operation + */ + public function parent_id_correction_b($dataAction){ + $relation = $this->config->relation_id["db_name"]; + $value = $dataAction->get_value($relation); + + if (array_key_exists($value,$this->id_swap)) + $dataAction->set_value($relation,$this->id_swap[$value]); + } + + /*! process treegrid specific options in incoming request + */ + public function parse_request(){ + parent::parse_request(); + + if (isset($_GET["id"])) + $this->request->set_relation($_GET["id"]); + else + $this->request->set_relation("0"); + + $this->request->set_limit(0,0); //netralize default reaction on dyn. loading mode + } + + /*! process treegrid specific options in incoming request + */ + protected function render_set($res){ + $output=""; + $index=0; + while ($data=$this->sql->get_next($res)){ + $data = new $this->names["item_class"]($data,$this->config,$index); + $this->event->trigger("beforeRender",$data); + //there is no info about child elements, + //if we are using dyn. loading - assume that it has, + //in normal mode juse exec sub-render routine + if ($data->has_kids()===-1 && $this->dload) + $data->set_kids(true); + $output.=$data->to_xml_start(); + if ($data->has_kids()===-1 || ( $data->has_kids()==true && !$this->dload)){ + $sub_request = new DataRequestConfig($this->request); + $sub_request->set_relation($data->get_id()); + $output.=$this->render_set($this->sql->select($sub_request)); + } + $output.=$data->to_xml_end(); + $index++; + } + return $output; + } + + /*! renders self as xml, starting part + */ + protected function xml_start(){ + return ""; + } +} + +/*! DataProcessor class for Grid component +**/ +class TreeGridDataProcessor extends GridDataProcessor{ + + function __construct($connector,$config,$request){ + parent::__construct($connector,$config,$request); + $request->set_relation(false); + } + + /*! convert incoming data name to valid db name + converts c0..cN to valid field names + @param data + data name from incoming request + @return + related db_name + */ + function name_data($data){ + + if ($data=="gr_pid") + return $this->config->relation_id["name"]; + else return parent::name_data($data); + } +} +?> \ No newline at end of file diff --git a/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/connector/update.php b/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/connector/update.php new file mode 100644 index 00000000000..014a326b051 --- /dev/null +++ b/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/connector/update.php @@ -0,0 +1,262 @@ +config=$config; + $this->data=$data; + $this->index=$index; + $this->skip=false; + $this->child = new $type($data, $config, $index); + } + + /*! returns parent_id (for Tree and TreeGrid components) + */ + public function get_parent_id(){ + if (method_exists($this->child, 'get_parent_id')) { + return $this->child->get_parent_id(); + } else { + return ''; + } + } + + + /*! generate XML on the data hash base + */ + public function to_xml(){ + $str= "data['type'].'" '; + $str .= 'id="'.$this->data['dataId'].'" '; + $str .= 'parent="'.$this->get_parent_id().'"'; + $str .= '>'; + $str .= $this->child->to_xml(); + $str .= ''; + return $str; + } + + /*! return starting tag for XML string + */ + public function to_xml_start(){ + $str="data['type'].'" '; + $str .= 'id="'.$this->data['dataId'].'" '; + $str .= 'parent="'.$this->get_parent_id().'"'; + $str .= '>'; + $str .= $this->child->to_xml_start(); + return $str; + } + + /*! return ending tag for XML string + */ + public function to_xml_end(){ + $str = $this->child->to_xml_end(); + $str .= ''; + return $str; + } + + /*! returns false for outputing only current item without child items + */ + public function has_kids(){ + return false; + } + + /*! sets count of child items + @param value + count of child items + */ + public function set_kids($value){ + if (method_exists($this->child, 'set_kids')) { + $this->child->set_kids($value); + } + } + + /*! sets attribute for item + */ + public function set_attribute($name, $value){ + if (method_exists($this->child, 'set_attribute')) { + LogMaster::log("setting attribute: \nname = {$name}\nvalue = {$value}"); + $this->child->set_attribute($name, $value); + } else { + LogMaster::log("set_attribute method doesn't exists"); + } + } +} + + +class DataUpdate{ + + protected $table; //!< table , where actions are stored + protected $url; //!< url for notification service, optional + protected $sql; //!< DB wrapper object + protected $config; //!< DBConfig object + protected $request; //!< DBRequestConfig object + protected $event; + protected $item_class; + protected $demu; + + //protected $config;//!< DataConfig instance + //protected $request;//!< DataRequestConfig instance + + /*! constructor + + @param connector + Connector object + @param config + DataConfig object + @param request + DataRequestConfig object + */ + function __construct($sql, $config, $request, $table, $url){ + $this->config= $config; + $this->request= $request; + $this->sql = $sql; + $this->table=$table; + $this->url=$url; + $this->demu = false; + } + + public function set_demultiplexor($path){ + $this->demu = $path; + } + + public function set_event($master, $name){ + $this->event = $master; + $this->item_class = $name; + } + + private function select_update($actions_table, $join_table, $id_field_name, $version, $user) { + $sql = "SELECT * FROM {$actions_table}"; + $sql .= " LEFT OUTER JOIN {$join_table} ON "; + $sql .= "{$actions_table}.DATAID = {$join_table}.{$id_field_name} "; + $sql .= "WHERE {$actions_table}.ID > '{$version}' AND {$actions_table}.USER <> '{$user}'"; + return $sql; + } + + private function get_update_max_version() { + $sql = "SELECT MAX(id) as VERSION FROM {$this->table}"; + $res = $this->sql->query($sql); + $data = $this->sql->get_next($res); + + if ($data == false || $data['VERSION'] == false) + return 1; + else + return $data['VERSION']; + } + + private function log_update_action($actions_table, $dataId, $status, $user) { + $sql = "INSERT INTO {$actions_table} (DATAID, TYPE, USER) VALUES ('{$dataId}', '{$status}', '{$user}')"; + $this->sql->query($sql); + if ($this->demu) + file_get_contents($this->demu); + } + + + + + /*! records operations in actions_table + @param action + DataAction object + */ + public function log_operations($action) { + $type = $this->sql->escape($action->get_status()); + $dataId = $this->sql->escape($action->get_new_id()); + $user = $this->sql->escape($this->request->get_user()); + if ($type!="error" && $type!="invalid" && $type !="collision") { + $this->log_update_action($this->table, $dataId, $type, $user); + } + } + + + /*! return action version in XMl format + */ + public function get_version() { + $version = $this->get_update_max_version(); + return "".$version.""; + } + + + /*! adds action version in output XML as userdata + */ + public function version_output() { + echo $this->get_version(); + } + + + /*! create update actions in XML-format and sends it to output + */ + public function get_updates() { + $sub_request = new DataRequestConfig($this->request); + $version = $this->request->get_version(); + $user = $this->request->get_user(); + + $sub_request->parse_sql($this->select_update($this->table, $this->request->get_source(), $this->config->id['db_name'], $version, $user)); + $sub_request->set_relation(false); + + $output = $this->render_set($this->sql->select($sub_request), $this->item_class); + + ob_clean(); + header("Content-type:text/xml"); + + echo $this->updates_start(); + echo $this->get_version(); + echo $output; + echo $this->updates_end(); + } + + + protected function render_set($res, $name){ + $output=""; + $index=0; + while ($data=$this->sql->get_next($res)){ + $data = new DataItemUpdate($data,$this->config,$index, $name); + $this->event->trigger("beforeRender",$data); + $output.=$data->to_xml(); + $index++; + } + return $output; + } + + /*! returns update start string + */ + protected function updates_start() { + $start = ''; + return $start; + } + + /*! returns update end string + */ + protected function updates_end() { + $start = ''; + return $start; + } + + /*! checks if action version given by client is deprecated + @param action + DataAction object + */ + public function check_collision($action) { + $version = $this->sql->escape($this->request->get_version()); + //$user = $this->sql->escape($this->request->get_user()); + $last_version = $this->get_update_max_version(); + if (($last_version > $version)&&($action->get_status() == 'update')) { + $action->error(); + $action->set_status('collision'); + } + } +} + +?> \ No newline at end of file diff --git a/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/dhtmlxscheduler.css b/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/dhtmlxscheduler.css index d3cd78ec9bc..6259fe59eba 100644 --- a/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/dhtmlxscheduler.css +++ b/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/dhtmlxscheduler.css @@ -1,525 +1,5 @@ -.dhx_cal_container { - background-color:#C2D5FC; - font-family:Tahoma; - font-size:8pt; - position:relative; - overflow:hidden; -} - -.dhx_cal_container div { - -moz-user-select:none; - -moz-user-select:-moz-none; -} - -.dhx_cal_navline { - height:20px; - position:absolute; - z-index:3; - width:750px; - color:#2F3A48; -} - -.dhx_cal_navline div { - position:absolute; - top:2px; - white-space:nowrap; -} - -.dhx_cal_navline .dhx_cal_date { - font-weight:600; - left:210px; -} - -.dhx_cal_button .dhx_left_bg { - width:1px; - overflow:hidden; - height:17px; - z-index:20; - top:0; -} - -.dhx_cal_prev_button { - background-image:url(imgs/buttons.png); - background-position:0 0; - width:29px; - height:17px; - left:50px; - cursor:pointer; -} - -.dhx_cal_next_button{ - background-image:url(imgs/buttons.png); - background-position:-30px 0; - width:29px; - height:17px; - left:80px; - cursor:pointer; -} - -.dhx_cal_today_button{ - background-image:url(imgs/buttons.png); - background-position:-60px 0; - width:75px; - height:17px; - left:112px; - cursor:pointer; - text-align:center; - text-decoration:underline; -} - -.dhx_cal_tab { - background-image:url(imgs/white_tab.png); - width:61px; - height:19px; - text-align:center; - text-decoration:underline; - padding-top:3px; - cursor:pointer; -} - -.dhx_cal_tab.active { - background-image:url(imgs/blue_tab.png); - text-decoration:none; - height:20px; - padding-top:2px; - cursor:default; - font-weight:bold; -} - -.dhx_cal_header { - position:absolute; - left:10px; - top:23px; - width:750px; - border-top:1px dotted #8894A3; - border-right:1px dotted #8894A3; - z-index:2; - overflow:hidden; - color:#2F3A48; -} - -.dhx_cal_data { - border-top:1px dotted #8894A3; - position:absolute; - top:44px; - width:600px; - overflow-y:auto; - overflow-x:hidden; -} - -.dhx_scale_bar { - position:absolute; - text-align:center; - background-color:#C2D5FC; - padding-top:3px; - border-left:1px dotted #586A7E; -} - -.dhx_scale_holder { - position:absolute; - border-right:1px dotted #586A7E; - background-image:url(imgs/databg.png); -} - -.dhx_scale_holder_now { - position:absolute; - border-right:1px dotted #586A7E; - background-image:url(imgs/databg_now.png); -} - -.dhx_scale_hour { - height:41px; - width:50px; - border-bottom:1px dotted #8894A3; - background-color:#C2D5FC; - text-align:center; - line-height:40px; - color:#586A7E; - overflow:hidden; -} - -.dhx_month_head { - background-color:#EBEFF4; - color:#2F3A48; - border-right:1px dotted #586A7E; - height:18px; - padding-right:5px; - padding-top:3px; - text-align:right; -} - -.dhx_month_body { - border-right:1px dotted #586A7E; - border-bottom:1px dotted #586A7E; - background-color:#FFF; -} - -.dhx_now .dhx_month_body { - background-color:#E2EDFF; -} - -.dhx_after .dhx_month_body,.dhx_before .dhx_month_body { - background-color:#ECECEC; -} - -.dhx_after .dhx_month_head,.dhx_before .dhx_month_head { - background-color:#E2E3E6; - color:#94A6BB; -} - -.dhx_now .dhx_month_head { - background-color:#D1DEF4; - font-weight:bold; -} - -.dhx_cal_drag { - position:absolute; - z-index:9999; - background-color:#FFE763; - border:1px solid #B7A543; - opacity:.5; - filter:alpha(opacity=50); -} - -.dhx_loading { - position:absolute; - width:128px; - height:15px; - background-image:url(imgs/loading.gif); - z-index:9999; -} - -.dhx_multi_day_icon,.dhx_multi_day { - position:absolute; - background-color:#E1E6FF; - background-repeat:no-repeat; - border-bottom:1px dotted #8894A3; - border-left:1px dotted #8894A3; -} - -.dhx_multi_day_icon { - background-image:url(imgs/clock_big.gif); -} - -.dhx_multi_day_icon_small { - background-image:url(imgs/clock_small.gif); -} - -.dhx_multi_day_icon,.dhx_multi_day_icon_small { - background-position:center center; - position:absolute; - background-color:#E1E6FF; - background-repeat:no-repeat; - border-bottom:1px dotted #8894A3; - border-left:1px dotted #8894A3; -} - -.dhtmlxLayoutPolyContainer_dhx_skyblue .dhx_cal_container { - background-color:#d0e5ff; -} - -.dhx_cal_event div { - background-color:#FFE763; - border:1px solid #B7A543; - color:#887A2E; - overflow:hidden;width:100%; - font-family:Tahoma; - font-size:8pt; -} - -/*event in day or week or month view*/ - -.dhx_cal_event.purple div, -.dhx_cal_event_line.purple { - background-color:purple !important; - color:white !important; -} - -.dhx_move_denied .dhx_cal_event .dhx_header,.dhx_move_denied .dhx_cal_event .dhx_title { - cursor:default; -} - -.dhx_cal_event .dhx_header { - height:1px; - margin-left:1px; - border-width:1px 1px 0 1px; - cursor:pointer; -} - -.dhx_cal_event .dhx_title { - height:12px; - border-width:0 1px 1px 1px; - border-bottom-style:dotted; - font-size:7pt; - font-weight:bold; - text-align:center; - background-position:right; - background-repeat:no-repeat; - cursor:pointer; -} - -.dhx_cal_event .dhx_body { - border-width:0 1px 1px 1px; - padding:5px; -} - -.dhx_resize_denied .dhx_cal_event .dhx_footer { - cursor:default; -} - -.dhx_cal_event .dhx_footer { - height:1px; - margin-left:2px; - border-width:0 1px 1px 1px; - cursor:s-resize; -} - -.dhx_cal_event_line { - background-color:#FFE763; - border:1px solid #B7A543; - font-family:Tahoma; - font-size:8pt; - height:13px; - padding-left:10px; - color:#887A2E; - cursor:pointer; - overflow:hidden; -} - -.dhx_cal_event_clear { - font-family:Tahoma; - font-size:8pt; - height:13px; - padding-left:2px; - color:#887A2E; - white-space:nowrap; - overflow:hidden; - cursor:pointer; -} - -.dhx_in_move { - background-color:#FFFF80; -} - -div.dhx_cal_editor { - background-color:#FFE763; - border:1px solid #B7A543; - border-top-style:dotted; - z-index:999; - position:absolute; - overflow:hidden; -} - -textarea.dhx_cal_editor { - width:100%; - height:100%; - border:0 solid black; - margin:none; - padding:none; - overflow:auto; -} - -div.dhx_menu_head { - background-image:url(imgs/controls.gif); - background-position:0 -43px; - width:10px; - height:10px; - margin-left:5px; - margin-top:1px; - border:none; - cursor:default; -} - -div.dhx_menu_icon { - background-image:url(imgs/controls.gif); - width:20px; - height:20px; - margin-left:-5px; - margin-top:0; - border:none; - cursor:pointer; -} - -div.icon_details { - background-position:0 0; -} - -div.icon_edit { - background-position:-22px 0; -} - -div.icon_save { - background-position:-84px -1px; -} - -div.icon_cancel { - background-position:-62px 0; -} - -div.icon_delete { - background-position:-42px 0; -} - -.dhx_cal_light { - height:400px; - light:300px; - background-color:#FFE763; - font-family:Tahoma; - font-size:8pt; - border:1px solid #B7A64B; - color:#887A2E; - position:absolute; - z-index:10001; - width:580px; - height:300px; -} - -.dhx_mark { - position:relative; - top:3px; - background-image:url('./imgs/controls.gif'); - background-position:0 -43px; - padding-left:10px; -} - -.dhx_ie6 .dhx_mark { - background-position:6px -41px; -} - -.dhx_cal_light select { - font-family:Tahoma; - font-size:8pt; - color:#887A2E; - padding:2px; - margin:0; -} - -.dhx_cal_ltitle { - padding:2px 0 2px 5px; - overflow:hidden; - white-space:nowrap; -} - -.dhx_cal_ltitle span { - white-space:nowrap; -} - -.dhx_cal_lsection { - background-color:#DBCF8C; - color:#FFF4B5; - font-size:18pt; - font-weight:bold; - padding:5px 0 3px 10px; -} - -.dhx_cal_ltext { - padding:2px 0 2px 10px; - height:130px; - height=140px; - overflow:hidden; -} - -.dhx_cal_ltext textarea { - background-color:transparent; - overflow:auto; - border:none; - color:#887A2E; - height:100%; - width:100%; - outline:none!important; -} - -.dhx_time { - font-weight:bold; -} - -.dhx_cal_light .dhx_title { - padding-left:10px; -} - -.dhx_cal_larea { - border:1px solid #DCC43E; - background-color:#FFF4B5; - overflow:hidden; - margin-left:3px; - width:572px; - height:1px; -} - -.dhx_btn_set { - padding:5px 10px 0 10px; - float:left; -} - -.dhx_btn_set div { - float:left; - height:21px; - line-height:21px; - vertical-align:middle; - cursor:pointer; -} - -.dhx_save_btn { - background-image:url('./imgs/controls.gif'); - background-position:-84px 0; - width:21px; -} - -.dhx_cancel_btn { - background-image:url('./imgs/controls.gif'); - background-position:-63px 0; - width:20px; -} - -.dhx_delete_btn { - background-image:url('./imgs/controls.gif'); - background-position:-42px 0; - width:20px; -} - -.dhx_cal_cover { - width:100%; - height:100%; - position:absolute; - z-index:10000; - top:0; - left:0; - background-color:black; - opacity:.1; - filter:alpha(opacity=10); -} - -.dhx_custom_button { - padding:0 3px 0 3px; - color:#887A2E; - font-family:Tahoma; - font-size:8pt; - background-color:#FFE763; - font-weight:normal; - margin-right:5px; - margin-top:5px; - cursor:pointer; -} - -.dhx_custom_button div { - cursor:pointer; - float:left; - height:21px; - line-height:21px; - vertical-align:middle; -} - -.dhx_fullday_checkbox { - padding-top:5px; - float:right; -} - -.dhx_fullday_checkbox input { - vertical-align:middle; -} - -.dhx_fullday_checkbox label { - font-size:12pt; - font-weight:bold; - vertical-align:middle; -} \ No newline at end of file +/* +This software is allowed to use under GPL or you need to obtain Commercial or Enterise License +to use it in not GPL project. Please contact sales@dhtmlx.com for details +*/ +.dhx_cal_container{background-color:#C2D5FC;font-family:Tahoma;font-size:8pt;position:relative;overflow:hidden;}.dhx_cal_container div{-moz-user-select:none;-moz-user-select:-moz-none;}.dhx_cal_navline{height:20px;position:absolute;z-index:3;width:750px;color:#2F3A48;}.dhx_cal_navline div{position:absolute;top:2px;white-space:nowrap;}.dhx_cal_navline .dhx_cal_date{font-weight:600;left:210px;}.dhx_cal_button .dhx_left_bg{width:1px;overflow:hidden;height:17px;z-index:20;top:0;}.dhx_cal_prev_button{background-image:url(imgs/buttons.png);background-position:0 0;width:29px;height:17px;left:50px;cursor:pointer;}.dhx_cal_next_button{background-image:url(imgs/buttons.png);background-position:-30px 0;width:29px;height:17px;left:80px;cursor:pointer;}.dhx_cal_today_button{background-image:url(imgs/buttons.png);background-position:-60px 0;width:75px;height:17px;left:112px;cursor:pointer;text-align:center;text-decoration:underline;}.dhx_cal_tab{width:59px;height:19px;text-align:center;text-decoration:underline;padding-top:2px;cursor:pointer;background-color:#D8E1EA;-webkit-border-top-left-radius:4px;-webkit-border-top-right-radius:4px;-moz-border-radius-topleft:4px;-moz-border-radius-topright:4px;border-top-left-radius:4px;border-top-right-radius:4px;}.dhx_cal_tab.active{text-decoration:none;cursor:default;font-weight:bold;border:1px dotted #586A7E;border-bottom:0;background-color:#C2D5FC;}.dhx_cal_header{position:absolute;left:10px;top:23px;width:750px;border-top:1px dotted #8894A3;border-right:1px dotted #8894A3;z-index:2;overflow:hidden;color:#2F3A48;}.dhx_cal_data{border-top:1px dotted #8894A3;position:absolute;top:44px;width:600px;overflow-y:auto;overflow-x:hidden;}.dhx_scale_bar{position:absolute;text-align:center;background-color:#C2D5FC;padding-top:3px;border-left:1px dotted #586A7E;}.dhx_scale_holder{position:absolute;border-right:1px dotted #586A7E;background-image:url(imgs/databg.png);}.dhx_scale_holder_now{position:absolute;border-right:1px dotted #586A7E;background-image:url(imgs/databg_now.png);}.dhx_scale_hour{height:41px;width:50px;border-bottom:1px dotted #8894A3;background-color:#C2D5FC;text-align:center;line-height:40px;color:#586A7E;overflow:hidden;}.dhx_month_head{background-color:#EBEFF4;color:#2F3A48;border-right:1px dotted #586A7E;height:18px;padding-right:5px;padding-top:3px;text-align:right;}.dhx_month_body{border-right:1px dotted #586A7E;border-bottom:1px dotted #586A7E;background-color:#FFF;}.dhx_now .dhx_month_body{background-color:#E2EDFF;}.dhx_after .dhx_month_body,.dhx_before .dhx_month_body{background-color:#ECECEC;}.dhx_after .dhx_month_head,.dhx_before .dhx_month_head{background-color:#E2E3E6;color:#94A6BB;}.dhx_now .dhx_month_head{background-color:#D1DEF4;font-weight:bold;}.dhx_cal_drag{position:absolute;z-index:9999;background-color:#FFE763;border:1px solid #B7A543;opacity:.5;filter:alpha(opacity=50);}.dhx_loading{position:absolute;width:128px;height:15px;background-image:url(imgs/loading.gif);z-index:9999;}.dhx_multi_day_icon,.dhx_multi_day{background-color:#E1E6FF;background-repeat:no-repeat;border-right:1px dotted #8894A3;}.dhx_multi_day{position:absolute;border-top:1px dotted #8894A3;}.dhx_multi_day_icon{background-image:url(imgs/clock_big.gif);}.dhx_multi_day_icon_small{background-image:url(imgs/clock_small.gif);}.dhx_multi_day_icon,.dhx_multi_day_icon_small{background-position:center center;background-color:#E1E6FF;background-repeat:no-repeat;border-bottom:1px dotted #8894A3;border-right:1px dotted #8894A3;}.dhtmlxLayoutPolyContainer_dhx_skyblue .dhx_cal_container{background-color:#d0e5ff;}.dhx_cal_event div{background-color:#FFE763;border:1px solid #B7A543;color:#887A2E;overflow:hidden;width:100%;font-family:Tahoma;font-size:8pt;}.dhx_move_denied .dhx_cal_event .dhx_header,.dhx_move_denied .dhx_cal_event .dhx_title{cursor:default;}.dhx_cal_event .dhx_header{height:1px;margin-left:1px;border-width:1px 1px 0 1px;cursor:pointer;}.dhx_cal_event .dhx_title{height:12px;border-width:0 1px 1px 1px;border-bottom-style:dotted;font-size:7pt;font-weight:bold;text-align:center;background-position:right;background-repeat:no-repeat;cursor:pointer;}.dhx_cal_event .dhx_body{border-width:0 1px 1px 1px;padding:5px;}.dhx_resize_denied .dhx_cal_event .dhx_footer{cursor:default;}.dhx_cal_event .dhx_footer{height:1px;margin-left:2px;border-width:0 1px 1px 1px;cursor:s-resize;}.dhx_cal_event_line{background-color:#FFE763;border:1px solid #B7A543;border-radius:3px;font-family:Tahoma;font-size:8pt;height:13px;padding-left:10px;color:#887A2E;cursor:pointer;overflow:hidden;}.dhx_cal_event_clear{font-family:Tahoma;font-size:8pt;height:13px;padding-left:2px;color:#887A2E;white-space:nowrap;overflow:hidden;cursor:pointer;}.dhx_in_move{background-color:#FFFF80;}div.dhx_cal_editor{background-color:#FFE763;border:1px solid #B7A543;border-top-style:dotted;z-index:999;position:absolute;overflow:hidden;}textarea.dhx_cal_editor{width:100%;height:100%;border:0 solid black;margin:none;padding:none;overflow:auto;}div.dhx_menu_head{background-image:url(imgs/controls.gif);background-position:0 -43px;width:10px;height:10px;margin-left:5px;margin-top:1px;border:none;cursor:default;}div.dhx_menu_icon{background-image:url(imgs/controls.gif);width:20px;height:20px;margin-left:-5px;margin-top:0;border:none;cursor:pointer;}div.icon_details{background-position:0 0;}div.icon_edit{background-position:-22px 0;}div.icon_save{background-position:-84px -1px;}div.icon_cancel{background-position:-62px 0;}div.icon_delete{background-position:-42px 0;}div.dhx_now_time{position:absolute;width:100%;border-bottom:2px dotted red;z-index:1;}div.dhx_time_block{position:absolute;width:100%;background:silver;opacity:.4;filter:alpha(opacity=40);z-index:1;}.dhx_unselectable,.dhx_unselectable div{-webkit-user-select:none;-moz-user-select:none;-moz-user-select:-moz-none;}.dhx_cal_light{background-color:#FFE763;border-radius:5px;font-family:Tahoma;font-size:8pt;border:1px solid #B7A64B;color:#887A2E;position:absolute;z-index:10001;width:580px;height:300px;box-shadow:5px 5px 5px #888;}.dhx_cal_light_wide{width:650px;}.dhx_mark{position:relative;top:3px;background-image:url('./imgs/controls.gif');background-position:0 -43px;padding-left:10px;}.dhx_ie6 .dhx_mark{background-position:6px -41px;}.dhx_cal_light select{font-family:Tahoma;font-size:8pt;color:#887A2E;padding:2px;margin:0;}.dhx_cal_ltitle{padding:2px 0 2px 5px;overflow:hidden;white-space:nowrap;}.dhx_cal_ltitle span{white-space:nowrap;}.dhx_cal_lsection{background-color:#DBCF8C;color:#FFF4B5;font-weight:bold;padding:5px 0 3px 10px;}.dhx_section_time{background-color:#DBCF8C;}.dhx_cal_lsection .dhx_fullday{float:right;margin-right:5px;color:#887A2E;font-size:12px;font-weight:normal;line-height:20px;vertical-align:top;cursor:pointer;}.dhx_cal_lsection{font-size:18px;font-family:Arial;}.dhx_cal_ltext{padding:2px 0 2px 10px;overflow:hidden;}.dhx_cal_ltext textarea{background-color:#FFF4B5;overflow:auto;border:none;color:#887A2E;height:100%;width:100%;outline:none!important;}.dhx_time{font-weight:bold;}.dhx_cal_light .dhx_title{padding-left:10px;}.dhx_cal_larea{border:1px solid #DCC43E;background-color:#FFF4B5;overflow:hidden;margin-left:3px;width:572px;height:1px;}.dhx_btn_set{padding:5px 10px 0 10px;float:left;}.dhx_btn_set div{float:left;height:21px;line-height:21px;vertical-align:middle;cursor:pointer;}.dhx_save_btn{background-image:url('./imgs/controls.gif');background-position:-84px 0;width:21px;}.dhx_cancel_btn{background-image:url('./imgs/controls.gif');background-position:-63px 0;width:20px;}.dhx_delete_btn{background-image:url('./imgs/controls.gif');background-position:-42px 0;width:20px;}.dhx_cal_cover{width:100%;height:100%;position:absolute;z-index:10000;top:0;left:0;background-color:black;opacity:.1;filter:alpha(opacity=10);}.dhx_custom_button{padding:0 3px 0 3px;color:#887A2E;font-family:Tahoma;font-size:8pt;background-color:#FFE763;font-weight:normal;margin-right:5px;margin-top:0;cursor:pointer;}.dhx_custom_button div{cursor:pointer;float:left;height:21px;line-height:21px;vertical-align:middle;}.dhx_cal_light_wide .dhx_cal_larea{border-top-width:0;}.dhx_cal_light_wide .dhx_cal_lsection{border:0;float:left;text-align:right;width:100px;height:20px;font-size:16px;padding:5px 0 0 10px;}.dhx_cal_light_wide .dhx_wrap_section{border-top:1px solid #DBCF8C;position:relative;background-color:#DBCF8C;overflow:hidden;}.dhx_cal_light_wide .dhx_section_time{padding-top:2px!important;height:20px!important;}.dhx_section_time{text-align:center;}.dhx_cal_light_wide .dhx_cal_larea{width:730px;}.dhx_cal_light_wide{width:738px;}.dhx_cal_light_wide .dhx_section_time{background:transparent;}.dhx_cal_light_wide .dhx_cal_checkbox label{padding-left:0;}.dhx_cal_wide_checkbox input{margin-top:8px;margin-left:14px;}.dhx_cal_light input{font-family:Tahoma;font-size:8pt;color:#887A2E;}.dhx_cal_light_wide .dhx_cal_lsection .dhx_fullday{float:none;margin-right:0;color:#FFF4B5;font-weight:bold;font-size:16px;font-family:Arial;cursor:pointer;}.dhx_custom_button{float:right;height:21px;width:90px;-webkit-border-radius:4px;-moz-border-radius:4px;-ms-border-radius:4px;-o-border-radius:4px;border-radius:4px;}.dhx_cal_light_wide .dhx_custom_button{position:absolute;top:0;right:0;margin-top:2px;}.dhx_cal_light_wide .dhx_repeat_right{margin-right:55px;}.dhx_scale_bar_header{position:absolute;border-bottom:1px dotted #8894A3;width:100%;}.dhx_expand_icon{position:absolute;top:0;right:0;background-image:url(./imgs/colapce-expand-icon.gif);width:18px;height:18px;cursor:pointer;background-position:0 18px;z-index:16;}.dhx_agenda_area{width:100%;height:100%;overflow-y:auto;background-image:url(./imgs/databg.png);}.dhx_agenda_line{height:21px;clear:both;overflow:hidden;}.dhx_agenda_line div{float:left;width:188px;border-right:1px dotted #8894A3;text-align:center;line-height:21px;overflow:hidden;}.dhx_agenda_area .dhx_agenda_line div{border-right:0 dotted #8894A3;}.dhx_v_border{position:absolute;left:186px;top:0;border-right:1px dotted #8894A3;width:1px;height:100%;}.dhx_agenda_line .dhx_event_icon{width:20px;border-width:0;background:url(./imgs/icon.png) no-repeat;background-position:5px 4px;cursor:pointer;}.dhx_agenda_line span{padding-left:5px;line-height:21px;}.dhx_year_body{border-left:1px dotted #586A7E;}.dhx_year_week{position:relative;}.dhx_scale_bar_last{border-right:1px dotted #586A7E;}.dhx_year_month{height:18px;padding-top:3px;border:1px dotted #586A7E;text-align:center;vertical-align:middle;}.dhx_year_body .dhx_before .dhx_month_head,.dhx_year_body .dhx_after .dhx_month_head,.dhx_year_body .dhx_before .dhx_month_head a,.dhx_year_body .dhx_after .dhx_month_head a{color:#E2E3E6!important;}.dhx_year_body .dhx_month_body{height:0;overflow:hidden;}.dhx_month_head.dhx_year_event{background-color:#FFE763;}.dhx_year_body .dhx_before .dhx_month_head,.dhx_year_body .dhx_after .dhx_month_head{cursor:default;}.dhx_tooltip{border:1px solid #BBB;background-image:url(./imgs/databg.png);position:absolute;z-index:9998;width:300px;height:auto;font-family:Tahoma;font-size:8pt;overflow:hidden;}.dhx_tooltip_line{line-height:20px;height:20px;overflow:hidden;}.dhx_tooltip_line .dhx_event_icon{width:20px;height:20px;padding-right:10px;float:left;border-width:0;position:relative;background:url(./imgs/icon.png) no-repeat;background-position:5px 4px;cursor:pointer;}.dhx_tooltip_date{float:left;width:auto;padding-left:5px;text-align:center;}.dhx_text_disabled{color:#887A2E;font-family:Tahoma;font-size:8pt;}.dhx_mini_calendar{-moz-box-shadow:5px 5px 5px #888;-khtml-box-shadow:5px 5px 5px #888;}.dhx_mini_calendar .dhx_month_head{cursor:pointer;}.dhx_mini_calendar .dhx_calendar_click{background-color:#C2D5FC;}.dhx_cal_navline div.dhx_minical_icon{width:18px;height:18px;left:190px;top:1px;cursor:pointer;background-image:url(./imgs/calendar.gif);}.dhx_matrix_scell{height:100%;}.dhx_matrix_cell,.dhx_matrix_scell{overflow:hidden;text-align:center;vertical-align:middle;border-bottom:1px dotted #8894A3;border-right:1px dotted #8894A3;}.dhx_matrix_cell{background-color:white;}.dhx_matrix_line{overflow:hidden;}.dhx_matrix_cell div,.dhx_matrix_scell div{overflow:hidden;text-align:center;height:auto;}.dhx_cal_lsection .dhx_readonly{font-size:9pt;font-size:8pt;padding:2px;color:#887A2E;}.dhx_matrix_scell.folder,.dhx_data_table.folder .dhx_matrix_cell{background-color:#969394;cursor:pointer;}.dhx_matrix_scell .dhx_scell_level0{padding-left:5px;}.dhx_matrix_scell .dhx_scell_level1{padding-left:20px;}.dhx_matrix_scell .dhx_scell_level2{padding-left:35px;}.dhx_matrix_scell .dhx_scell_level3{padding-left:50px;}.dhx_matrix_scell .dhx_scell_level4{padding-left:65px;}.dhx_matrix_scell.folder{font-weight:bold;text-align:left;}.dhx_matrix_scell.folder .dhx_scell_expand{float:left;width:10px;padding-right:3px;}.dhx_matrix_scell.folder .dhx_scell_name{float:left;width:auto;}.dhx_matrix_scell.item .dhx_scell_name{padding-left:15px;text-align:left;}.dhx_data_table.folder .dhx_matrix_cell{border-right:0;}.dhx_section_timeline{overflow:hidden;padding:4px 0 2px 10px;}.dhx_section_timeline select{width:552px;}.dhx_map_area{width:100%;height:100%;overflow-y:auto;overflow-x:hidden;background-image:url(./imgs/databg.png);}.dhx_map_line .dhx_event_icon{width:20px;border-width:0;background:url(./imgs/icon.png) no-repeat;background-position:5px 4px;cursor:pointer;}.dhx_map_line{height:21px;clear:both;overflow:hidden;}.dhx_map{position:absolute;}.dhx_map_line div{float:left;border-right:1px dotted #8894A3;text-align:center;line-height:21px;overflow:hidden;}.dhx_map_line .headline_description{float:left;border-right:1px dotted #8894A3;text-align:center;line-height:21px;overflow:hidden;}.dhx_map_line .dhx_map_description{float:left;border-right:0 dotted #8894A3;text-align:center;line-height:21px;overflow:hidden;}.dhx_map_line .line_description{float:left;border-right:1px dotted #8894A3;text-align:left;padding-left:5px;line-height:21px;overflow:hidden;}.dhx_map_line.highlight{background-color:#C4C5CC;}.dhx_map_area .dhx_map_line div{border-right:0 dotted #8894A3;}.dhtmlXTooltip.tooltip{-moz-box-shadow:3px 3px 3px #888;-webkit-box-shadow:3px 3px 3px #888;-o-box-shadow:3px 3px 3px #888;box-shadow:3px 3px 3px #888;filter:progid:DXImageTransform.Microsoft.Shadow(color='#888888',Direction=135,Strength=5);background-color:white;border-left:1px dotted #887A2E;border-top:1px dotted #887A2E;color:#887A2E;cursor:default;padding:10px;position:absolute;z-index:500;}.dhx_cal_checkbox label{padding-left:5px;}.dhx_cal_light .radio{padding:2px 0 2px 10px;}.dhx_cal_light .radio input,.dhx_cal_light .radio label{line-height:15px;}.dhx_cal_light .radio input{vertical-align:middle;margin:0;padding:0;}.dhx_cal_light .radio label{vertical-align:middle;padding-right:10px;}.dhx_cal_light .combo{padding:4px;}.dhx_wa_column{float:left;}.dhx_wa_column_last .dhx_wa_day_cont{border-left:1px dotted #8894A3;}.dhx_wa_scale_bar{font-family:Tahoma;padding-left:10px;font-size:11px;border-top:1px dotted #8894A3;border-bottom:1px dotted #8894A3;}.dhx_wa_day_data{background-color:#FCFEFC;overflow-y:auto;}.dhx_wa_ev_body{border-bottom:1px dotted #789;font-size:12px;padding:5px 0 5px 7px;}.dhx_wa_dnd{font-family:Tahoma;position:absolute;padding-right:7px;color:#887AE2!important;background-color:#FFE763!important;border:1px solid #B7A543;}.dhx_cal_event_selected{background-color:#9cc1db;color:white;}.dhx_second_scale_bar{border-bottom:1px dotted #586A7E;padding-top:2px;}div.dhx_form_repeat input.radio{margin:-4px 0 0 -4px!ie;}div.dhx_form_repeat input.checkbox{margin:0 0 0 -4px!ie;}.dhx_form_repeat,.dhx_form_repeat input{padding:0;margin:0;padding-left:5px;font-family:Tahoma,Verdana;font-size:11px;line-height:24px;}.dhx_form_repeat{overflow:hidden;height:0;background-color:#FFF4B5;}.dhx_cal_light_wide .dhx_form_repeat{background-color:transparent;}.dhx_repeat_center,.dhx_repeat_left{height:115px;padding:10px 0 10px 10px;float:left;}.dhx_repeat_left{width:95px;}.dhx_repeat_center{width:335px;margin-top:12px;}.dhx_repeat_divider{float:left;height:115px;border-left:1px dotted #DCC43E;width:1px;}.dhx_repeat_right{float:right;height:115px;width:160px;padding:10px 3px 10px 10px;margin-top:7px;}input.dhx_repeat_text{height:16px;width:27px;margin:0 4px 0 4px;line-height:18px;padding:0 0 0 2px;}.dhx_form_repeat select{height:20px;width:87px;padding:0 0 0 2px;margin:0 4px 0 4px;}input.dhx_repeat_date{height:18px;width:80px;padding:0 0 0 2px;margin:0 4px 0 4px;background-repeat:no-repeat;background-position:64px 0;border:1px #7f9db9 solid;line-height:18px;}input.dhx_repeat_radio{margin-right:4px;}input.dhx_repeat_checkbox{margin:4px 4px 0 0;}.dhx_repeat_days td{padding-right:5px;}.dhx_repeat_days label{font-size:10px;}.dhx_custom_button{width:90px;-webkit-border-radius:4px;-moz-border-radius:4px;-ms-border-radius:4px;-o-border-radius:4px;border-radius:4px;}.dhx_custom_button_recurring{background-image:url(./imgs/but_repeat.gif);background-position:-5px 20px;width:20px;margin-right:10px;}.dhx_cal_light_rec{width:640px;}.dhx_cal_light_rec .dhx_cal_larea{width:632px;}.dhx_cal_light_rec.dhx_cal_light_wide{width:816px;}.dhx_cal_light_rec.dhx_cal_light_wide .dhx_cal_larea{width:808px;} \ No newline at end of file diff --git a/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/dhtmlxscheduler.js b/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/dhtmlxscheduler.js index ec0b61b638d..2c78468e81e 100644 --- a/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/dhtmlxscheduler.js +++ b/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/dhtmlxscheduler.js @@ -1,3694 +1,195 @@ /* -dhtmlxScheduler v.2.3 - -This software is allowed to use under GPL or you need to obtain Commercial or Enterise License +This software is allowed to use under GPL or you need to obtain Commercial or Enterise License to use it in not GPL project. Please contact sales@dhtmlx.com for details - -(c) DHTMLX Ltd. -*/ -dhtmlxAjax = { - get: function (A, C) { - var B = new dtmlXMLLoaderObject(true); - B.async = (arguments.length < 3); - B.waitCall = C; - B.loadXML(A); - return B - }, - post: function (A, C, D) { - var B = new dtmlXMLLoaderObject(true); - B.async = (arguments.length < 4); - B.waitCall = D; - B.loadXML(A, true, C); - return B - }, - getSync: function (A) { - return this.get(A, null, true) - }, - postSync: function (A, B) { - return this.post(A, B, null, true) - } -}; - -function dtmlXMLLoaderObject(B, D, C, A) { - this.xmlDoc = ""; - if (typeof(C) != "undefined") { - this.async = C - } else { - this.async = true - } - this.onloadAction = B || null; - this.mainObject = D || null; - this.waitCall = null; - this.rSeed = A || false; - return this -} -dtmlXMLLoaderObject.prototype.waitLoadFunction = function (B) { - var A = true; - this.check = function () { - if ((B) && (B.onloadAction != null)) { - if ((!B.xmlDoc.readyState) || (B.xmlDoc.readyState == 4)) { - if (!A) { - return - } - A = false; - if (typeof B.onloadAction == "function") { - B.onloadAction(B.mainObject, null, null, null, B) - } - if (B.waitCall) { - B.waitCall.call(this, B); - B.waitCall = null - } - } - } - }; - return this.check -}; -dtmlXMLLoaderObject.prototype.getXMLTopNode = function (C, A) { - if (this.xmlDoc.responseXML) { - var B = this.xmlDoc.responseXML.getElementsByTagName(C); - if (B.length == 0 && C.indexOf(":") != -1) { - var B = this.xmlDoc.responseXML.getElementsByTagName((C.split(":"))[1]) - } - var E = B[0] - } else { - var E = this.xmlDoc.documentElement - } - if (E) { - this._retry = false; - return E - } - if ((_isIE) && (!this._retry)) { - var D = this.xmlDoc.responseText; - var A = this.xmlDoc; - this._retry = true; - this.xmlDoc = new ActiveXObject("Microsoft.XMLDOM"); - this.xmlDoc.async = false; - this.xmlDoc.loadXML(D); - return this.getXMLTopNode(C, A) - } - dhtmlxError.throwError("LoadXML", "Incorrect XML", [(A || this.xmlDoc), this.mainObject]); - return document.createElement("DIV") -}; -dtmlXMLLoaderObject.prototype.loadXMLString = function (B) { - try { - var C = new DOMParser(); - this.xmlDoc = C.parseFromString(B, "text/xml") - } catch (A) { - this.xmlDoc = new ActiveXObject("Microsoft.XMLDOM"); - this.xmlDoc.async = this.async; - this.xmlDoc.loadXML(B) - } - this.onloadAction(this.mainObject, null, null, null, this); - if (this.waitCall) { - this.waitCall(); - this.waitCall = null - } -}; -dtmlXMLLoaderObject.prototype.loadXML = function (C, B, A, D) { - if (this.rSeed) { - C += ((C.indexOf("?") != -1) ? "&" : "?") + "a_dhx_rSeed=" + (new Date()).valueOf() - } - this.filePath = C; - if ((!_isIE) && (window.XMLHttpRequest)) { - this.xmlDoc = new XMLHttpRequest() - } else { - this.xmlDoc = new ActiveXObject("Microsoft.XMLHTTP") - } - if (this.async) { - this.xmlDoc.onreadystatechange = new this.waitLoadFunction(this) - } - this.xmlDoc.open(B ? "POST" : "GET", C, this.async); - if (D) { - this.xmlDoc.setRequestHeader("User-Agent", "dhtmlxRPC v0.1 (" + navigator.userAgent + ")"); - this.xmlDoc.setRequestHeader("Content-type", "text/xml") - } else { - if (B) { - this.xmlDoc.setRequestHeader("Content-type", "application/x-www-form-urlencoded") - } - } - this.xmlDoc.setRequestHeader("X-Requested-With", "XMLHttpRequest"); - this.xmlDoc.send(null || A); - if (!this.async) { - (new this.waitLoadFunction(this))() - } -}; -dtmlXMLLoaderObject.prototype.destructor = function () { - this.onloadAction = null; - this.mainObject = null; - this.xmlDoc = null; - return null -}; -dtmlXMLLoaderObject.prototype.xmlNodeToJSON = function (D) { - var C = {}; - for (var B = 0; B < D.attributes.length; B++) { - C[D.attributes[B].name] = D.attributes[B].value - } - C._tagvalue = D.firstChild ? D.firstChild.nodeValue : ""; - for (var B = 0; B < D.childNodes.length; B++) { - var A = D.childNodes[B].tagName; - if (A) { - if (!C[A]) { - C[A] = [] - } - C[A].push(this.xmlNodeToJSON(D.childNodes[B])) - } - } - return C -}; - -function callerFunction(A, B) { - this.handler = function (C) { - if (!C) { - C = window.event - } - A(C, B); - return true - }; - return this.handler -} -function getAbsoluteLeft(A) { - return getOffset(A).left -} -function getAbsoluteTop(A) { - return getOffset(A).top -} -function getOffsetSum(A) { - var C = 0, - B = 0; - while (A) { - C = C + parseInt(A.offsetTop); - B = B + parseInt(A.offsetLeft); - A = A.offsetParent - } - return { - top: C, - left: B - } -} -function getOffsetRect(D) { - var G = D.getBoundingClientRect(); - var H = document.body; - var B = document.documentElement; - var A = window.pageYOffset || B.scrollTop || H.scrollTop; - var E = window.pageXOffset || B.scrollLeft || H.scrollLeft; - var F = B.clientTop || H.clientTop || 0; - var I = B.clientLeft || H.clientLeft || 0; - var J = G.top + A - F; - var C = G.left + E - I; - return { - top: Math.round(J), - left: Math.round(C) - } -} -function getOffset(A) { - if (A.getBoundingClientRect && !_isChrome) { - return getOffsetRect(A) - } else { - return getOffsetSum(A) - } -} -function convertStringToBoolean(A) { - if (typeof(A) == "string") { - A = A.toLowerCase() - } - switch (A) { - case "1": - case "true": - case "yes": - case "y": - case 1: - case true: - return true; - break; - default: - return false - } -} -function getUrlSymbol(A) { - if (A.indexOf("?") != -1) { - return "&" - } else { - return "?" - } -} -function dhtmlDragAndDropObject() { - if (window.dhtmlDragAndDrop) { - return window.dhtmlDragAndDrop - } - this.lastLanding = 0; - this.dragNode = 0; - this.dragStartNode = 0; - this.dragStartObject = 0; - this.tempDOMU = null; - this.tempDOMM = null; - this.waitDrag = 0; - window.dhtmlDragAndDrop = this; - return this -} -dhtmlDragAndDropObject.prototype.removeDraggableItem = function (A) { - A.onmousedown = null; - A.dragStarter = null; - A.dragLanding = null -}; -dhtmlDragAndDropObject.prototype.addDraggableItem = function (A, B) { - A.onmousedown = this.preCreateDragCopy; - A.dragStarter = B; - this.addDragLanding(A, B) -}; -dhtmlDragAndDropObject.prototype.addDragLanding = function (A, B) { - A.dragLanding = B -}; -dhtmlDragAndDropObject.prototype.preCreateDragCopy = function (A) { - if ((A || event) && (A || event).button == 2) { - return - } - if (window.dhtmlDragAndDrop.waitDrag) { - window.dhtmlDragAndDrop.waitDrag = 0; - document.body.onmouseup = window.dhtmlDragAndDrop.tempDOMU; - document.body.onmousemove = window.dhtmlDragAndDrop.tempDOMM; - return false - } - window.dhtmlDragAndDrop.waitDrag = 1; - window.dhtmlDragAndDrop.tempDOMU = document.body.onmouseup; - window.dhtmlDragAndDrop.tempDOMM = document.body.onmousemove; - window.dhtmlDragAndDrop.dragStartNode = this; - window.dhtmlDragAndDrop.dragStartObject = this.dragStarter; - document.body.onmouseup = window.dhtmlDragAndDrop.preCreateDragCopy; - document.body.onmousemove = window.dhtmlDragAndDrop.callDrag; - window.dhtmlDragAndDrop.downtime = new Date().valueOf(); - if ((A) && (A.preventDefault)) { - A.preventDefault(); - return false - } - return false -}; -dhtmlDragAndDropObject.prototype.callDrag = function (C) { - if (!C) { - C = window.event - } - dragger = window.dhtmlDragAndDrop; - if ((new Date()).valueOf() - dragger.downtime < 100) { - return - } - if ((C.button == 0) && (_isIE)) { - return dragger.stopDrag() - } - if (!dragger.dragNode && dragger.waitDrag) { - dragger.dragNode = dragger.dragStartObject._createDragNode(dragger.dragStartNode, C); - if (!dragger.dragNode) { - return dragger.stopDrag() - } - dragger.dragNode.onselectstart = function () { - return false - }; - dragger.gldragNode = dragger.dragNode; - document.body.appendChild(dragger.dragNode); - document.body.onmouseup = dragger.stopDrag; - dragger.waitDrag = 0; - dragger.dragNode.pWindow = window; - dragger.initFrameRoute() - } - if (dragger.dragNode.parentNode != window.document.body) { - var A = dragger.gldragNode; - if (dragger.gldragNode.old) { - A = dragger.gldragNode.old - } - A.parentNode.removeChild(A); - var B = dragger.dragNode.pWindow; - if (_isIE) { - var E = document.createElement("Div"); - E.innerHTML = dragger.dragNode.outerHTML; - dragger.dragNode = E.childNodes[0] - } else { - dragger.dragNode = dragger.dragNode.cloneNode(true) - } - dragger.dragNode.pWindow = window; - dragger.gldragNode.old = dragger.dragNode; - document.body.appendChild(dragger.dragNode); - B.dhtmlDragAndDrop.dragNode = dragger.dragNode - } - dragger.dragNode.style.left = C.clientX + 15 + (dragger.fx ? dragger.fx * (-1) : 0) + (document.body.scrollLeft || document.documentElement.scrollLeft) + "px"; - dragger.dragNode.style.top = C.clientY + 3 + (dragger.fy ? dragger.fy * (-1) : 0) + (document.body.scrollTop || document.documentElement.scrollTop) + "px"; - if (!C.srcElement) { - var D = C.target - } else { - D = C.srcElement - } - dragger.checkLanding(D, C) -}; -dhtmlDragAndDropObject.prototype.calculateFramePosition = function (E) { - if (window.name) { - var C = parent.frames[window.name].frameElement.offsetParent; - var D = 0; - var B = 0; - while (C) { - D += C.offsetLeft; - B += C.offsetTop; - C = C.offsetParent - } - if ((parent.dhtmlDragAndDrop)) { - var A = parent.dhtmlDragAndDrop.calculateFramePosition(1); - D += A.split("_")[0] * 1; - B += A.split("_")[1] * 1 - } - if (E) { - return D + "_" + B - } else { - this.fx = D - } - this.fy = B - } - return "0_0" -}; -dhtmlDragAndDropObject.prototype.checkLanding = function (B, A) { - if ((B) && (B.dragLanding)) { - if (this.lastLanding) { - this.lastLanding.dragLanding._dragOut(this.lastLanding) - } - this.lastLanding = B; - this.lastLanding = this.lastLanding.dragLanding._dragIn(this.lastLanding, this.dragStartNode, A.clientX, A.clientY, A); - this.lastLanding_scr = (_isIE ? A.srcElement : A.target) - } else { - if ((B) && (B.tagName != "BODY")) { - this.checkLanding(B.parentNode, A) - } else { - if (this.lastLanding) { - this.lastLanding.dragLanding._dragOut(this.lastLanding, A.clientX, A.clientY, A) - } - this.lastLanding = 0; - if (this._onNotFound) { - this._onNotFound() - } - } - } -}; -dhtmlDragAndDropObject.prototype.stopDrag = function (B, C) { - dragger = window.dhtmlDragAndDrop; - if (!C) { - dragger.stopFrameRoute(); - var A = dragger.lastLanding; - dragger.lastLanding = null; - if (A) { - A.dragLanding._drag(dragger.dragStartNode, dragger.dragStartObject, A, (_isIE ? event.srcElement : B.target)) - } - } - dragger.lastLanding = null; - if ((dragger.dragNode) && (dragger.dragNode.parentNode == document.body)) { - dragger.dragNode.parentNode.removeChild(dragger.dragNode) - } - dragger.dragNode = 0; - dragger.gldragNode = 0; - dragger.fx = 0; - dragger.fy = 0; - dragger.dragStartNode = 0; - dragger.dragStartObject = 0; - document.body.onmouseup = dragger.tempDOMU; - document.body.onmousemove = dragger.tempDOMM; - dragger.tempDOMU = null; - dragger.tempDOMM = null; - dragger.waitDrag = 0 -}; -dhtmlDragAndDropObject.prototype.stopFrameRoute = function (C) { - if (C) { - window.dhtmlDragAndDrop.stopDrag(1, 1) - } - for (var A = 0; A < window.frames.length; A++) { - try { - if ((window.frames[A] != C) && (window.frames[A].dhtmlDragAndDrop)) { - window.frames[A].dhtmlDragAndDrop.stopFrameRoute(window) - } - } catch (B) {} - } - try { - if ((parent.dhtmlDragAndDrop) && (parent != window) && (parent != C)) { - parent.dhtmlDragAndDrop.stopFrameRoute(window) - } - } catch (B) {} -}; -dhtmlDragAndDropObject.prototype.initFrameRoute = function (C, D) { - if (C) { - window.dhtmlDragAndDrop.preCreateDragCopy({}); - window.dhtmlDragAndDrop.dragStartNode = C.dhtmlDragAndDrop.dragStartNode; - window.dhtmlDragAndDrop.dragStartObject = C.dhtmlDragAndDrop.dragStartObject; - window.dhtmlDragAndDrop.dragNode = C.dhtmlDragAndDrop.dragNode; - window.dhtmlDragAndDrop.gldragNode = C.dhtmlDragAndDrop.dragNode; - window.document.body.onmouseup = window.dhtmlDragAndDrop.stopDrag; - window.waitDrag = 0; - if (((!_isIE) && (D)) && ((!_isFF) || (_FFrv < 1.8))) { - window.dhtmlDragAndDrop.calculateFramePosition() - } - } - try { - if ((parent.dhtmlDragAndDrop) && (parent != window) && (parent != C)) { - parent.dhtmlDragAndDrop.initFrameRoute(window) - } - } catch (B) {} - for (var A = 0; A < window.frames.length; A++) { - try { - if ((window.frames[A] != C) && (window.frames[A].dhtmlDragAndDrop)) { - window.frames[A].dhtmlDragAndDrop.initFrameRoute(window, ((!C || D) ? 1 : 0)) - } - } catch (B) {} - } -}; -var _isFF = false; -var _isIE = false; -var _isOpera = false; -var _isKHTML = false; -var _isMacOS = false; -var _isChrome = false; -if (navigator.userAgent.indexOf("Macintosh") != -1) { - _isMacOS = true -} -if (navigator.userAgent.toLowerCase().indexOf("chrome") > -1) { - _isChrome = true -} -if ((navigator.userAgent.indexOf("Safari") != -1) || (navigator.userAgent.indexOf("Konqueror") != -1)) { - var _KHTMLrv = parseFloat(navigator.userAgent.substr(navigator.userAgent.indexOf("Safari") + 7, 5)); - if (_KHTMLrv > 525) { - _isFF = true; - var _FFrv = 1.9 - } else { - _isKHTML = true - } -} else { - if (navigator.userAgent.indexOf("Opera") != -1) { - _isOpera = true; - _OperaRv = parseFloat(navigator.userAgent.substr(navigator.userAgent.indexOf("Opera") + 6, 3)) - } else { - if (navigator.appName.indexOf("Microsoft") != -1) { - _isIE = true; - if (navigator.appVersion.indexOf("MSIE 8.0") != -1 && document.compatMode != "BackCompat") { - _isIE = 8 - } - } else { - _isFF = true; - var _FFrv = parseFloat(navigator.userAgent.split("rv:")[1]) - } - } -} -dtmlXMLLoaderObject.prototype.doXPath = function (C, E, D, I) { - if (_isKHTML || (!_isIE && !window.XPathResult)) { - return this.doXPathOpera(C, E) - } - if (_isIE) { - if (!E) { - if (!this.xmlDoc.nodeName) { - E = this.xmlDoc.responseXML - } else { - E = this.xmlDoc - } - } - if (!E) { - dhtmlxError.throwError("LoadXML", "Incorrect XML", [(E || this.xmlDoc), this.mainObject]) - } - if (D != null) { - E.setProperty("SelectionNamespaces", "xmlns:xsl='" + D + "'") - } - if (I == "single") { - return E.selectSingleNode(C) - } else { - return E.selectNodes(C) || new Array(0) - } - } else { - var A = E; - if (!E) { - if (!this.xmlDoc.nodeName) { - E = this.xmlDoc.responseXML - } else { - E = this.xmlDoc - } - } - if (!E) { - dhtmlxError.throwError("LoadXML", "Incorrect XML", [(E || this.xmlDoc), this.mainObject]) - } - if (E.nodeName.indexOf("document") != -1) { - A = E - } else { - A = E; - E = E.ownerDocument - } - var G = XPathResult.ANY_TYPE; - if (I == "single") { - G = XPathResult.FIRST_ORDERED_NODE_TYPE - } - var F = new Array(); - var B = E.evaluate(C, A, function (J) { - return D - }, G, null); - if (G == XPathResult.FIRST_ORDERED_NODE_TYPE) { - return B.singleNodeValue - } - var H = B.iterateNext(); - while (H) { - F[F.length] = H; - H = B.iterateNext() - } - return F - } -}; - -function _dhtmlxError(B, A, C) { - if (!this.catches) { - this.catches = new Array() - } - return this -} -_dhtmlxError.prototype.catchError = function (B, A) { - this.catches[B] = A -}; -_dhtmlxError.prototype.throwError = function (B, A, C) { - if (this.catches[B]) { - return this.catches[B](B, A, C) - } - if (this.catches.ALL) { - return this.catches.ALL(B, A, C) - } - alert("Error type: " + arguments[0] + "\nDescription: " + arguments[1]); - return null -}; -window.dhtmlxError = new _dhtmlxError(); -dtmlXMLLoaderObject.prototype.doXPathOpera = function (C, A) { - var E = C.replace(/[\/]+/gi, "/").split("/"); - var D = null; - var B = 1; - if (!E.length) { - return [] - } - if (E[0] == ".") { - D = [A] - } else { - if (E[0] == "") { - D = (this.xmlDoc.responseXML || this.xmlDoc).getElementsByTagName(E[B].replace(/\[[^\]]*\]/g, "")); - B++ - } else { - return [] - } - } - for (B; B < E.length; B++) { - D = this._getAllNamedChilds(D, E[B]) - } - if (E[B - 1].indexOf("[") != -1) { - D = this._filterXPath(D, E[B - 1]) - } - return D -}; -dtmlXMLLoaderObject.prototype._filterXPath = function (B, A) { - var D = new Array(); - var A = A.replace(/[^\[]*\[\@/g, "").replace(/[\[\]\@]*/g, ""); - for (var C = 0; C < B.length; C++) { - if (B[C].getAttribute(A)) { - D[D.length] = B[C] - } - } - return D -}; -dtmlXMLLoaderObject.prototype._getAllNamedChilds = function (B, A) { - var E = new Array(); - if (_isKHTML) { - A = A.toUpperCase() - } - for (var D = 0; D < B.length; D++) { - for (var C = 0; C < B[D].childNodes.length; C++) { - if (_isKHTML) { - if (B[D].childNodes[C].tagName && B[D].childNodes[C].tagName.toUpperCase() == A) { - E[E.length] = B[D].childNodes[C] - } - } else { - if (B[D].childNodes[C].tagName == A) { - E[E.length] = B[D].childNodes[C] - } - } - } - } - return E -}; - -function dhtmlXHeir(B, A) { - for (var C in A) { - if (typeof(A[C]) == "function") { - B[C] = A[C] - } - } - return B -} -function dhtmlxEvent(B, C, A) { - if (B.addEventListener) { - B.addEventListener(C, A, false) - } else { - if (B.attachEvent) { - B.attachEvent("on" + C, A) - } - } -} -dtmlXMLLoaderObject.prototype.xslDoc = null; -dtmlXMLLoaderObject.prototype.setXSLParamValue = function (B, C, D) { - if (!D) { - D = this.xslDoc - } - if (D.responseXML) { - D = D.responseXML - } - var A = this.doXPath("/xsl:stylesheet/xsl:variable[@name='" + B + "']", D, "http://www.w3.org/1999/XSL/Transform", "single"); - if (A != null) { - A.firstChild.nodeValue = C - } -}; -dtmlXMLLoaderObject.prototype.doXSLTransToObject = function (D, B) { - if (!D) { - D = this.xslDoc - } - if (D.responseXML) { - D = D.responseXML - } - if (!B) { - B = this.xmlDoc - } - if (B.responseXML) { - B = B.responseXML - } - if (!_isIE) { - if (!this.XSLProcessor) { - this.XSLProcessor = new XSLTProcessor(); - this.XSLProcessor.importStylesheet(D) - } - var A = this.XSLProcessor.transformToDocument(B) - } else { - var A = new ActiveXObject("Msxml2.DOMDocument.3.0"); - try { - B.transformNodeToObject(D, A) - } catch (C) { - A = B.transformNode(D) - } - } - return A -}; -dtmlXMLLoaderObject.prototype.doXSLTransToString = function (C, B) { - var A = this.doXSLTransToObject(C, B); - if (typeof(A) == "string") { - return A - } - return this.doSerialization(A) -}; -dtmlXMLLoaderObject.prototype.doSerialization = function (B) { - if (!B) { - B = this.xmlDoc - } - if (B.responseXML) { - B = B.responseXML - } - if (!_isIE) { - var A = new XMLSerializer(); - return A.serializeToString(B) - } else { - return B.xml - } -}; -dhtmlxEventable = function (obj) { - obj.dhx_SeverCatcherPath = ""; - obj.attachEvent = function (name, catcher, callObj) { - name = "ev_" + name.toLowerCase(); - if (!this[name]) { - this[name] = new this.eventCatcher(callObj || this) - } - return (name + ":" + this[name].addEvent(catcher)) - }; - obj.callEvent = function (name, arg0) { - name = "ev_" + name.toLowerCase(); - if (this[name]) { - return this[name].apply(this, arg0) - } - return true - }; - obj.checkEvent = function (name) { - return ( !! this["ev_" + name.toLowerCase()]) - }; - obj.eventCatcher = function (obj) { - var dhx_catch = []; - var z = function () { - var res = true; - for (var i = 0; i < dhx_catch.length; i++) { - if (dhx_catch[i] != null) { - var zr = dhx_catch[i].apply(obj, arguments); - res = res && zr - } - } - return res - }; - z.addEvent = function (ev) { - if (typeof(ev) != "function") { - ev = eval(ev) - } - if (ev) { - return dhx_catch.push(ev) - 1 - } - return false - }; - z.removeEvent = function (id) { - dhx_catch[id] = null - }; - return z - }; - obj.detachEvent = function (id) { - if (id != false) { - var list = id.split(":"); - this[list[0]].removeEvent(list[1]) - } - } -}; - -function dataProcessor(A) { - this.serverProcessor = A; - this.action_param = "!nativeeditor_status"; - this.object = null; - this.updatedRows = []; - this.autoUpdate = true; - this.updateMode = "cell"; - this._tMode = "GET"; - this.post_delim = "_"; - this._waitMode = 0; - this._in_progress = {}; - this._invalid = {}; - this.mandatoryFields = []; - this.messages = []; - this.styles = { - updated: "font-weight:bold;", - inserted: "font-weight:bold;", - deleted: "text-decoration : line-through;", - invalid: "background-color:FFE0E0;", - invalid_cell: "border-bottom:2px solid red;", - error: "color:red;", - clear: "font-weight:normal;text-decoration:none;" - }; - this.enableUTFencoding(true); - dhtmlxEventable(this); - return this -} -dataProcessor.prototype = { - setTransactionMode: function (B, A) { - this._tMode = B; - this._tSend = A - }, - escape: function (A) { - if (this._utf) { - return encodeURIComponent(A) - } else { - return escape(A) - } - }, - enableUTFencoding: function (A) { - this._utf = convertStringToBoolean(A) - }, - setDataColumns: function (A) { - this._columns = (typeof A == "string") ? A.split(",") : A - }, - getSyncState: function () { - return !this.updatedRows.length - }, - enableDataNames: function (A) { - this._endnm = convertStringToBoolean(A) - }, - enablePartialDataSend: function (A) { - this._changed = convertStringToBoolean(A) - }, - setUpdateMode: function (B, A) { - this.autoUpdate = (B == "cell"); - this.updateMode = B; - this.dnd = A - }, - ignore: function (B, A) { - this._silent_mode = true; - B.call(A || window); - this._silent_mode = false - }, - setUpdated: function (D, C, E) { - if (this._silent_mode) { - return - } - var B = this.findRow(D); - E = E || "updated"; - var A = this.obj.getUserData(D, this.action_param); - if (A && E == "updated") { - E = A - } - if (C) { - this.set_invalid(D, false); - this.updatedRows[B] = D; - this.obj.setUserData(D, this.action_param, E); - if (this._in_progress[D]) { - this._in_progress[D] = "wait" - } - } else { - if (!this.is_invalid(D)) { - this.updatedRows.splice(B, 1); - this.obj.setUserData(D, this.action_param, "") - } - } - if (!C) { - this._clearUpdateFlag(D) - } - this.markRow(D, C, E); - if (C && this.autoUpdate) { - this.sendData(D) - } - }, - _clearUpdateFlag: function (A) {}, - markRow: function (F, C, E) { - var D = ""; - var B = this.is_invalid(F); - if (B) { - D = this.styles[B]; - C = true - } - if (this.callEvent("onRowMark", [F, C, E, B])) { - D = this.styles[C ? E : "clear"] + D; - this.obj[this._methods[0]](F, D); - if (B && B.details) { - D += this.styles[B + "_cell"]; - for (var A = 0; A < B.details.length; A++) { - if (B.details[A]) { - this.obj[this._methods[1]](F, A, D) - } - } - } - } - }, - getState: function (A) { - return this.obj.getUserData(A, this.action_param) - }, - is_invalid: function (A) { - return this._invalid[A] - }, - set_invalid: function (C, B, A) { - if (A) { - B = { - value: B, - details: A, - toString: function () { - return this.value.toString() - } - } - } - this._invalid[C] = B - }, - checkBeforeUpdate: function (A) { - return true - }, - sendData: function (A) { - if (this._waitMode && (this.obj.mytype == "tree" || this.obj._h2)) { - return - } - if (this.obj.editStop) { - this.obj.editStop() - } - if (typeof A == "undefined" || this._tSend) { - return this.sendAllData() - } - if (this._in_progress[A]) { - return false - } - this.messages = []; - if (!this.checkBeforeUpdate(A) && this.callEvent("onValidatationError", [A, this.messages])) { - return false - } - this._beforeSendData(this._getRowData(A), A) - }, - _beforeSendData: function (A, B) { - if (!this.callEvent("onBeforeUpdate", [B, this.getState(B), A])) { - return false - } - this._sendData(A, B) - }, - serialize: function (D, E) { - if (typeof D == "string") { - return D - } - if (typeof E != "undefined") { - return this.serialize_one(D, "") - } else { - var A = []; - var C = []; - for (var B in D) { - if (D.hasOwnProperty(B)) { - A.push(this.serialize_one(D[B], B + this.post_delim)); - C.push(B) - } - } - A.push("ids=" + this.escape(C.join(","))); - return A.join("&") - } - }, - serialize_one: function (D, B) { - if (typeof D == "string") { - return D - } - var A = []; - for (var C in D) { - if (D.hasOwnProperty(C)) { - A.push(this.escape((B || "") + C) + "=" + this.escape(D[C])) - } - } - return A.join("&") - }, - _sendData: function (B, C) { - if (!B) { - return - } - if (!this.callEvent("onBeforeDataSending", C ? [C, this.getState(C), B] : [null, null, B])) { - return false - } - if (C) { - this._in_progress[C] = (new Date()).valueOf() - } - var A = new dtmlXMLLoaderObject(this.afterUpdate, this, true); - var D = this.serverProcessor + (this._user ? (getUrlSymbol(this.serverProcessor) + ["dhx_user=" + this._user, "dhx_version=" + this.obj.getUserData(0, "version")].join("&")) : ""); - if (this._tMode != "POST") { - A.loadXML(D + ((D.indexOf("?") != -1) ? "&" : "?") + this.serialize(B, C)) - } else { - A.loadXML(D, true, this.serialize(B, C)) - } - this._waitMode++ - }, - sendAllData: function () { - if (!this.updatedRows.length) { - return - } - this.messages = []; - var B = true; - for (var A = 0; A < this.updatedRows.length; A++) { - B &= this.checkBeforeUpdate(this.updatedRows[A]) - } - if (!B && !this.callEvent("onValidatationError", ["", this.messages])) { - return false - } - if (this._tSend) { - this._sendData(this._getAllData()) - } else { - for (var A = 0; A < this.updatedRows.length; A++) { - if (!this._in_progress[this.updatedRows[A]]) { - if (this.is_invalid(this.updatedRows[A])) { - continue - } - this._beforeSendData(this._getRowData(this.updatedRows[A]), this.updatedRows[A]); - if (this._waitMode && (this.obj.mytype == "tree" || this.obj._h2)) { - return - } - } - } - } - }, - _getAllData: function (D) { - var B = {}; - var A = false; - for (var C = 0; C < this.updatedRows.length; C++) { - var E = this.updatedRows[C]; - if (this._in_progress[E] || this.is_invalid(E)) { - continue - } - if (!this.callEvent("onBeforeUpdate", [E, this.getState(E)])) { - continue - } - B[E] = this._getRowData(E, E + this.post_delim); - A = true; - this._in_progress[E] = (new Date()).valueOf() - } - return A ? B : null - }, - setVerificator: function (B, A) { - this.mandatoryFields[B] = A || (function (C) { - return (C != "") - }) - }, - clearVerificator: function (A) { - this.mandatoryFields[A] = false - }, - findRow: function (B) { - var A = 0; - for (A = 0; A < this.updatedRows.length; A++) { - if (B == this.updatedRows[A]) { - break - } - } - return A - }, - defineAction: function (A, B) { - if (!this._uActions) { - this._uActions = [] - } - this._uActions[A] = B - }, - afterUpdateCallback: function (B, G, F, E) { - var A = B; - var D = (F != "error" && F != "invalid"); - if (!D) { - this.set_invalid(B, F) - } - if ((this._uActions) && (this._uActions[F]) && (!this._uActions[F](E))) { - return (delete this._in_progress[A]) - } - if (this._in_progress[A] != "wait") { - this.setUpdated(B, false) - } - var C = B; - switch (F) { - case "inserted": - case "insert": - if (G != B) { - this.obj[this._methods[2]](B, G); - B = G - } - break; - case "delete": - case "deleted": - this.obj.setUserData(B, this.action_param, "true_deleted"); - this.obj[this._methods[3]](B); - delete this._in_progress[A]; - return this.callEvent("onAfterUpdate", [B, F, G, E]); - break - } - if (this._in_progress[A] != "wait") { - if (D) { - this.obj.setUserData(B, this.action_param, "") - } - delete this._in_progress[A] - } else { - delete this._in_progress[A]; - this.setUpdated(G, true, this.obj.getUserData(B, this.action_param)) - } - this.callEvent("onAfterUpdate", [B, F, G, E]) - }, - afterUpdate: function (G, K, I, H, F) { - F.getXMLTopNode("data"); - if (!F.xmlDoc.responseXML) { - return - } - var J = F.doXPath("//data/action"); - for (var D = 0; D < J.length; D++) { - var E = J[D]; - var C = E.getAttribute("type"); - var A = E.getAttribute("sid"); - var B = E.getAttribute("tid"); - G.afterUpdateCallback(A, B, C, E) - } - G.finalizeUpdate() - }, - finalizeUpdate: function () { - if (this._waitMode) { - this._waitMode-- - } - if ((this.obj.mytype == "tree" || this.obj._h2) && this.updatedRows.length) { - this.sendData() - } - this.callEvent("onAfterUpdateFinish", []); - if (!this.updatedRows.length) { - this.callEvent("onFullSync", []) - } - }, - init: function (A) { - this.obj = A; - if (this.obj._dp_init) { - this.obj._dp_init(this) - } - }, - setOnAfterUpdate: function (A) { - this.attachEvent("onAfterUpdate", A) - }, - enableDebug: function (A) {}, - setOnBeforeUpdateHandler: function (A) { - this.attachEvent("onBeforeDataSending", A) - }, -/* starts autoupdate mode - @param interval - time interval for sending update requests - */ - setAutoUpdate: function (C, B) { - C = C || 2000; - this._user = B || (new Date()).valueOf(); - this._need_update = false; - this._loader = null; - this._update_busy = false; - this.attachEvent("onAfterUpdate", function (D, F, G, E) { - this.afterAutoUpdate(D, F, G, E) - }); - this.attachEvent("onFullSync", function () { - this.fullSync() - }); - var A = this; - window.setInterval(function () { - A.loadUpdate() - }, C) - }, -/* process updating request answer - if status == collision version is depricated - set flag for autoupdating immidiatly - */ - afterAutoUpdate: function (A, C, D, B) { - if (C == "collision") { - this._need_update = true; - return false - } else { - return true - } - }, -/* callback function for onFillSync event - call update function if it's need - */ - fullSync: function () { - if (this._need_update == true) { - this._need_update = false; - this.loadUpdate() - } - return true - }, -/* sends query to the server and call callback function - */ - getUpdates: function (A, B) { - if (this._update_busy) { - return false - } else { - this._update_busy = true - } - this._loader = this._loader || new dtmlXMLLoaderObject(true); - this._loader.async = true; - this._loader.waitCall = B; - this._loader.loadXML(A) - }, -/* returns xml node value - @param node - xml node - */ - _v: function (A) { - if (A.firstChild) { - return A.firstChild.nodeValue - } - return "" - }, -/* returns values array of xml nodes array - @param arr - array of xml nodes - */ - _a: function (A) { - var C = []; - for (var B = 0; B < A.length; B++) { - C[B] = this._v(A[B]) - } - return C - }, -/* loads updates and processes them - */ - loadUpdate: function () { - var B = this; - var A = this.obj.getUserData(0, "version"); - var C = this.serverProcessor + getUrlSymbol(this.serverProcessor) + ["dhx_user=" + this._user, "dhx_version=" + A].join("&"); - C = C.replace("editing=true&", ""); - this.getUpdates(C, function () { - var F = B._loader.doXPath("//userdata"); - B.obj.setUserData(0, "version", B._v(F[0])); - var D = B._loader.doXPath("//update"); - if (D.length) { - B._silent_mode = true; - for (var G = 0; G < D.length; G++) { - var E = D[G].getAttribute("status"); - var I = D[G].getAttribute("id"); - var H = D[G].getAttribute("parent"); - switch (E) { - case "inserted": - B.callEvent("insertCallback", [D[G], I, H]); - break; - case "updated": - B.callEvent("updateCallback", [D[G], I, H]); - break; - case "deleted": - B.callEvent("deleteCallback", [D[G], I, H]); - break - } - } - B._silent_mode = false - } - B._update_busy = false; - B = null - }) - } -}; -if (window.dhtmlXGridObject) { - dhtmlXGridObject.prototype._init_point_connector = dhtmlXGridObject.prototype._init_point; - dhtmlXGridObject.prototype._init_point = function () { - var A = function (E) { - E = E.replace(/(\?|\&)connector[^\f]*/g, ""); - return E + (E.indexOf("?") != -1 ? "&" : "?") + "connector=true" + (mygrid.hdr.rows.length > 0 ? "&dhx_no_header=1" : "") - }; - var D = function (E) { - return A(E) + (this._connector_sorting || "") + (this._connector_filter || "") - }; - var C = function (F, G, E) { - this._connector_sorting = "&dhx_sort[" + G + "]=" + E; - return D.call(this, F) - }; - var B = function (F, E, H) { - for (var G = 0; G < E.length; G++) { - E[G] = "dhx_filter[" + E[G] + "]=" + encodeURIComponent(H[G]) - } - this._connector_filter = "&" + E.join("&"); - return D.call(this, F) - }; - this.attachEvent("onCollectValues", function (E) { - if (this._con_f_used[E]) { - if (typeof(this._con_f_used[E]) == "object") { - return this._con_f_used[E] - } else { - return false - } - } - return true - }); - this.attachEvent("onDynXLS", function () { - this.xmlFileUrl = D.call(this, this.xmlFileUrl); - return true - }); - this.attachEvent("onBeforeSorting", function (H, G, F) { - if (G == "connector") { - var E = this; - this.clearAndLoad(C.call(this, this.xmlFileUrl, H, F), function () { - E.setSortImgState(true, H, F) - }); - return false - } - return true - }); - this.attachEvent("onFilterStart", function (F, E) { - if (this._con_f_used.length) { - this.clearAndLoad(B.call(this, this.xmlFileUrl, F, E)); - return false - } - return true - }); - this.attachEvent("onXLE", function (F, E, H, G) { - if (!G) { - return - } - }); - if (this._init_point_connector) { - this._init_point_connector() - } - }; - dhtmlXGridObject.prototype._con_f_used = []; - dhtmlXGridObject.prototype._in_header_connector_text_filter = function (B, A) { - if (!this._con_f_used[A]) { - this._con_f_used[A] = 1 - } - return this._in_header_text_filter(B, A) - }; - dhtmlXGridObject.prototype._in_header_connector_select_filter = function (B, A) { - if (!this._con_f_used[A]) { - this._con_f_used[A] = 2 - } - return this._in_header_select_filter(B, A) - }; - dhtmlXGridObject.prototype.load_connector = dhtmlXGridObject.prototype.load; - dhtmlXGridObject.prototype.load = function (B, E, D) { - if (!this._colls_loaded && this.cellType) { - var A = []; - for (var C = 0; C < this.cellType.length; C++) { - if (this.cellType[C].indexOf("co") == 0 || this._con_f_used[C] == 2) { - A.push(C) - } - } - if (A.length) { - arguments[0] += (arguments[0].indexOf("?") != -1 ? "&" : "?") + "connector=true&dhx_colls=" + A.join(",") - } - } - return this.load_connector.apply(this, arguments) - }; - dhtmlXGridObject.prototype._parseHead_connector = dhtmlXGridObject.prototype._parseHead; - dhtmlXGridObject.prototype._parseHead = function (A, L, I) { - this._parseHead_connector.apply(this, arguments); - if (!this._colls_loaded) { - var J = this.xmlLoader.doXPath("./coll_options", arguments[0]); - for (var F = 0; F < J.length; F++) { - var H = J[F].getAttribute("for"); - var K = []; - var C = null; - if (this.cellType[H] == "combo") { - C = this.getColumnCombo(H) - } - if (this.cellType[H].indexOf("co") == 0) { - C = this.getCombo(H) - } - var E = this.xmlLoader.doXPath("./item", J[F]); - for (var D = 0; D < E.length; D++) { - var B = E[D].getAttribute("value"); - if (C) { - var G = E[D].getAttribute("label") || B; - if (C.addOption) { - C.addOption([ - [B, G] - ]) - } else { - C.put(B, G) - } - K[K.length] = G - } else { - K[K.length] = B - } - } - if (this._con_f_used[H * 1]) { - this._con_f_used[H * 1] = K - } - } - this._colls_loaded = true - } - } -} -if (window.dataProcessor) { - dataProcessor.prototype.init_original = dataProcessor.prototype.init; - dataProcessor.prototype.init = function (A) { - this.init_original(A); - A._dataprocessor = this; - this.setTransactionMode("POST", true); - this.serverProcessor += (this.serverProcessor.indexOf("?") != -1 ? "&" : "?") + "editing=true" - } -} -dhtmlxError.catchError("LoadXML", function (B, A, C) { - alert(C[0].responseText) -}); -window.dhtmlXScheduler = window.scheduler = { - version: 2.2 -}; -dhtmlxEventable(scheduler); -scheduler.init = function (C, A, B) { - A = A || (new Date()); - B = B || "week"; - this._obj = (typeof C == "string") ? document.getElementById(C) : C; - this._els = []; - this._scroll = true; - this._quirks = (_isIE && document.compatMode == "BackCompat"); - this._quirks7 = (_isIE && navigator.appVersion.indexOf("MSIE 8") == -1); - this.get_elements(); - this.init_templates(); - this.set_actions(); - dhtmlxEvent(window, "resize", function () { - window.clearTimeout(scheduler._resize_timer); - scheduler._resize_timer = window.setTimeout(function () { - if (scheduler.callEvent("onSchedulerResize", [])) { - scheduler.update_view() - } - }, 100) - }); - this.set_sizes(); - this.setCurrentView(A, B) -}; -scheduler.xy = { - nav_height: 22, - min_event_height: 40, - scale_width: 50, - bar_height: 20, - scroll_width: 18, - scale_height: 20, - month_scale_height: 20, - menu_width: 25, - margin_top: 0, - margin_left: 0, - editor_width: 140 -}; -scheduler.keys = { - edit_save: 13, - edit_cancel: 27 -}; -scheduler.set_sizes = function () { - var B = this._x = this._obj.clientWidth - this.xy.margin_left; - var D = this._y = this._obj.clientHeight - this.xy.margin_top; - var E = this._table_view ? 0 : (this.xy.scale_width + this.xy.scroll_width); - var A = this._table_view ? -1 : this.xy.scale_width; - this.set_xy(this._els.dhx_cal_navline[0], B, this.xy.nav_height, 0, 0); - this.set_xy(this._els.dhx_cal_header[0], B - E, this.xy.scale_height, A, this.xy.nav_height + (this._quirks ? -1 : 1)); - var F = this._els.dhx_cal_navline[0].offsetHeight; - if (F > 0) { - this.xy.nav_height = F - } - var C = this.xy.scale_height + this.xy.nav_height + (this._quirks ? -2 : 0); - this.set_xy(this._els.dhx_cal_data[0], B, D - (C + 2), 0, C + 2) -}; -scheduler.set_xy = function (D, B, C, A, E) { - D.style.width = Math.max(0, B) + "px"; - D.style.height = Math.max(0, C) + "px"; - if (arguments.length > 3) { - D.style.left = A + "px"; - D.style.top = E + "px" - } -}; -scheduler.get_elements = function () { - var D = this._obj.getElementsByTagName("DIV"); - for (var C = 0; C < D.length; C++) { - var A = D[C].className; - if (!this._els[A]) { - this._els[A] = [] - } - this._els[A].push(D[C]); - var B = scheduler.locale.labels[D[C].getAttribute("name") || A]; - if (B) { - D[C].innerHTML = B - } - } -}; -scheduler.set_actions = function () { - for (var A in this._els) { - if (this._click[A]) { - for (var B = 0; B < this._els[A].length; B++) { - this._els[A][B].onclick = scheduler._click[A] - } - } - } - this._obj.onselectstart = function (C) { - return false - }; - this._obj.onmousemove = function (C) { - scheduler._on_mouse_move(C || event) - }; - this._obj.onmousedown = function (C) { - scheduler._on_mouse_down(C || event) - }; - this._obj.onmouseup = function (C) { - scheduler._on_mouse_up(C || event) - }; - this._obj.ondblclick = function (C) { - scheduler._on_dbl_click(C || event) - } -}; -scheduler.select = function (A) { - if (this._table_view || !this.getEvent(A)._timed) { - return - } - if (this._select_id == A) { - return - } - this.editStop(false); - this.unselect(); - this._select_id = A; - this.updateEvent(A) -}; -scheduler.unselect = function (B) { - if (B && B != this._select_id) { - return - } - var A = this._select_id; - this._select_id = null; - if (A) { - this.updateEvent(A) - } -}; -scheduler.getState = function () { - return { - mode: this._mode, - date: this._date, - min_date: this._min_date, - max_date: this._max_date, - editor_id: this._edit_id, - lightbox_id: this._lightbox_id - } -}; -scheduler._click = { - dhx_cal_data: function (C) { - var B = C ? C.target : event.srcElement; - var D = scheduler._locate_event(B); - C = C || event; - if ((D && !scheduler.callEvent("onClick", [D, C])) || scheduler.config.readonly) { - return - } - if (D) { - scheduler.select(D); - var A = B.className; - if (A.indexOf("_icon") != -1) { - scheduler._click.buttons[A.split(" ")[1].replace("icon_", "")](D) - } - } else { - scheduler._close_not_saved() - } - }, - dhx_cal_prev_button: function () { - scheduler._click.dhx_cal_next_button(0, -1) - }, - dhx_cal_next_button: function (B, A) { - scheduler.setCurrentView(scheduler.date.add(scheduler.date[scheduler._mode + "_start"](scheduler._date), (A || 1), scheduler._mode)) - }, - dhx_cal_today_button: function () { - scheduler.setCurrentView(new Date()) - }, - dhx_cal_tab: function () { - var A = this.getAttribute("name").split("_")[0]; - scheduler.setCurrentView(scheduler._date, A) - }, - buttons: { - "delete": function (B) { - var A = scheduler.locale.labels.confirm_deleting; - if (!A || confirm(A)) { - scheduler.deleteEvent(B) - } - }, - edit: function (A) { - scheduler.edit(A) - }, - save: function (A) { - scheduler.editStop(true) - }, - details: function (A) { - scheduler.showLightbox(A) - }, - cancel: function (A) { - scheduler.editStop(false) - } - } -}; -scheduler.addEventNow = function (G, B, D) { - var C = {}; - if (typeof G == "object") { - C = G; - G = null - } - var E = (this.config.event_duration || this.config.time_step) * 60000; - if (!G) { - G = Math.round((new Date()).valueOf() / E) * E - } - var A = new Date(G); - if (!B) { - var F = this.config.first_hour; - if (F > A.getHours()) { - A.setHours(F); - G = A.valueOf() - } - B = G + E - } - C.start_date = C.start_date || A; - C.end_date = C.end_date || new Date(B); - C.text = C.text || this.locale.labels.new_event; - C.id = this._drag_id = this.uid(); - this._drag_mode = "new-size"; - this._loading = true; - this.addEvent(C); - this.callEvent("onEventCreated", [this._drag_id, D]); - this._loading = false; - this._drag_event = {}; - this._on_mouse_up(D) -}; -scheduler._on_dbl_click = function (C, D) { - D = D || (C.target || C.srcElement); - if (this.config.readonly) { - return - } - var A = D.className.split(" ")[0]; - switch (A) { - case "dhx_scale_holder": - case "dhx_scale_holder_now": - case "dhx_month_body": - if (!scheduler.config.dblclick_create) { - break - } - var G = this._mouse_coords(C); - var F = this._min_date.valueOf() + (G.y * this.config.time_step + (this._table_view ? 0 : G.x) * 24 * 60) * 60000; - F = this._correct_shift(F); - this.addEventNow(F, null, C); - break; - case "dhx_body": - case "dhx_cal_event_line": - case "dhx_cal_event_clear": - var E = this._locate_event(D); - if (!this.callEvent("onDblClick", [E, C])) { - return - } - if (this.config.details_on_dblclick || this._table_view || !this.getEvent(E)._timed) { - this.showLightbox(E) - } else { - this.edit(E) - } - break; - case "": - if (D.parentNode) { - return scheduler._on_dbl_click(C, D.parentNode) - } - default: - var B = this["dblclick_" + A]; - if (B) { - B.call(this, C) - } - break - } -}; -scheduler._mouse_coords = function (D) { - var F; - var A = document.body; - var E = document.documentElement; - if (D.pageX || D.pageY) { - F = { - x: D.pageX, - y: D.pageY - } - } else { - F = { - x: D.clientX + (A.scrollLeft || E.scrollLeft || 0) - A.clientLeft, - y: D.clientY + (A.scrollTop || E.scrollTop || 0) - A.clientTop - } - } - F.x -= getAbsoluteLeft(this._obj) + (this._table_view ? 0 : this.xy.scale_width); - F.y -= getAbsoluteTop(this._obj) + this.xy.nav_height + (this._dy_shift || 0) + this.xy.scale_height - this._els.dhx_cal_data[0].scrollTop; - F.ev = D; - var C = this["mouse_" + this._mode]; - if (C) { - return C.call(this, F) - } - if (!this._table_view) { - F.x = Math.max(0, Math.ceil(F.x / this._cols[0]) - 1); - F.y = Math.max(0, Math.ceil(F.y * 60 / (this.config.time_step * this.config.hour_size_px)) - 1) + this.config.first_hour * (60 / this.config.time_step) - } else { - var B = 0; - for (B = 1; B < this._colsS.heights.length; B++) { - if (this._colsS.heights[B] > F.y) { - break - } - } - F.y = (Math.max(0, Math.ceil(F.x / this._cols[0]) - 1) + Math.max(0, B - 1) * 7) * 24 * 60 / this.config.time_step; - F.x = 0 - } - return F -}; -scheduler._close_not_saved = function () { - if (new Date().valueOf() - (scheduler._new_event || 0) > 500 && scheduler._edit_id) { - var A = scheduler.locale.labels.confirm_closing; - if (!A || confirm(A)) { - scheduler.editStop(scheduler.config.positive_closing) - } - } -}; -scheduler._correct_shift = function (B, A) { - return B -= ((new Date(scheduler._min_date)).getTimezoneOffset() - (new Date(B)).getTimezoneOffset()) * 60000 * (A ? -1 : 1) -}; -scheduler._on_mouse_move = function (F) { - if (this._drag_mode) { - var G = this._mouse_coords(F); - if (!this._drag_pos || this._drag_pos.x != G.x || this._drag_pos.y != G.y) { - if (this._edit_id != this._drag_id) { - this._close_not_saved() - } - this._drag_pos = G; - if (this._drag_mode == "create") { - this._close_not_saved(); - this._loading = true; - var B = this._min_date.valueOf() + (G.y * this.config.time_step + (this._table_view ? 0 : G.x) * 24 * 60) * 60000; - B = this._correct_shift(B); - if (!this._drag_start) { - this._drag_start = B; - return - } - var E = B; - if (E == this._drag_start) { - return - } - this._drag_id = this.uid(); - this.addEvent(new Date(this._drag_start), new Date(E), this.locale.labels.new_event, this._drag_id, G.fields); - this.callEvent("onEventCreated", [this._drag_id, F]); - this._loading = false; - this._drag_mode = "new-size" - } - var H = this.getEvent(this._drag_id); - var B, E; - if (this._drag_mode == "move") { - B = this._min_date.valueOf() + (G.y * this.config.time_step + G.x * 24 * 60) * 60000; - if (!G.custom && this._table_view) { - B += this.date.time_part(H.start_date) * 1000 - } - B = this._correct_shift(B); - E = H.end_date.valueOf() - (H.start_date.valueOf() - B) - } else { - B = H.start_date.valueOf(); - if (this._table_view) { - E = this._min_date.valueOf() + G.y * this.config.time_step * 60000 + (G.custom ? 0 : 24 * 60 * 60000) - } else { - E = this.date.date_part(new Date(H.end_date)).valueOf() + G.y * this.config.time_step * 60000; - this._els.dhx_cal_data[0].style.cursor = "s-resize"; - if (this._mode == "week" || this._mode == "day") { - E = this._correct_shift(E) - } - } - if (this._drag_mode == "new-size") { - if (E <= this._drag_start) { - var D = G.shift || ((this._table_view && !G.custom) ? 24 * 60 * 60000 : 0); - B = E - D; - E = this._drag_start + (D || (this.config.time_step * 60000)) - } else { - B = this._drag_start - } - } else { - if (E <= B) { - E = B + this.config.time_step * 60000 - } - } - } - var I = new Date(E - 1); - var C = new Date(B); - if (this._table_view || (I.getDate() == C.getDate() && I.getHours() < this.config.last_hour)) { - H.start_date = C; - H.end_date = new Date(E); - if (this.config.update_render) { - this.update_view() - } else { - this.updateEvent(this._drag_id) - } - } - if (this._table_view) { - this.for_rendered(this._drag_id, function (J) { - J.className += " dhx_in_move" - }) - } - } - } else { - if (scheduler.checkEvent("onMouseMove")) { - var A = this._locate_event(F.target || F.srcElement); - this.callEvent("onMouseMove", [A, F]) - } - } -}; -scheduler._on_mouse_context = function (A, B) { - return this.callEvent("onContextMenu", [this._locate_event(B), A]) -}; -scheduler._on_mouse_down = function (A, B) { - if (this.config.readonly || this._drag_mode) { - return - } - B = B || (A.target || A.srcElement); - if (A.button == 2 || A.ctrlKey) { - return this._on_mouse_context(A, B) - } - switch (B.className.split(" ")[0]) { - case "dhx_cal_event_line": - case "dhx_cal_event_clear": - if (this._table_view) { - this._drag_mode = "move" - } - break; - case "dhx_header": - case "dhx_title": - this._drag_mode = "move"; - break; - case "dhx_footer": - this._drag_mode = "resize"; - break; - case "dhx_scale_holder": - case "dhx_scale_holder_now": - case "dhx_month_body": - case "dhx_matrix_cell": - this._drag_mode = "create"; - break; - case "": - if (B.parentNode) { - return scheduler._on_mouse_down(A, B.parentNode) - } - default: - this._drag_mode = null; - this._drag_id = null - } - if (this._drag_mode) { - var C = this._locate_event(B); - if (!this.config["drag_" + this._drag_mode] || !this.callEvent("onBeforeDrag", [C, this._drag_mode, A])) { - this._drag_mode = this._drag_id = 0 - } else { - this._drag_id = C; - this._drag_event = this._copy_event(this.getEvent(this._drag_id) || {}) - } - } - this._drag_start = null -}; -scheduler._on_mouse_up = function (B) { - if (this._drag_mode && this._drag_id) { - this._els.dhx_cal_data[0].style.cursor = "default"; - var A = this.getEvent(this._drag_id); - if (this._drag_event._dhx_changed || !this._drag_event.start_date || A.start_date.valueOf() != this._drag_event.start_date.valueOf() || A.end_date.valueOf() != this._drag_event.end_date.valueOf()) { - var C = (this._drag_mode == "new-size"); - if (!this.callEvent("onBeforeEventChanged", [A, B, C])) { - if (C) { - this.deleteEvent(A.id, true) - } else { - A.start_date = this._drag_event.start_date; - A.end_date = this._drag_event.end_date; - this.updateEvent(A.id) - } - } else { - if (C && this.config.edit_on_create) { - this.unselect(); - this._new_event = new Date(); - if (this._table_view || this.config.details_on_create) { - this._drag_mode = null; - return this.showLightbox(this._drag_id) - } - this._drag_pos = true; - this._select_id = this._edit_id = this._drag_id - } else { - if (!this._new_event) { - this.callEvent(C ? "onEventAdded" : "onEventChanged", [this._drag_id, this.getEvent(this._drag_id)]) - } - } - } - } - if (this._drag_pos) { - this.render_view_data() - } - } - this._drag_mode = null; - this._drag_pos = null -}; -scheduler.update_view = function () { - this._reset_scale(); - if (this._load_mode && this._load()) { - return this._render_wait = true - } - this.render_view_data() -}; -scheduler.setCurrentView = function (B, E) { - if (!this.callEvent("onBeforeViewChange", [this._mode, this._date, E, B])) { - return - } - if (this[this._mode + "_view"] && E && this._mode != E) { - this[this._mode + "_view"](false) - } - this._close_not_saved(); - this._mode = E || this._mode; - this._date = B; - this._table_view = (this._mode == "month"); - var D = this._els.dhx_cal_tab; - for (var C = 0; C < D.length; C++) { - D[C].className = "dhx_cal_tab" + ((D[C].getAttribute("name") == this._mode + "_tab") ? " active" : "") - } - var A = this[this._mode + "_view"]; - A ? A(true) : this.update_view(); - this.callEvent("onViewChange", [this._mode, this._date]) -}; -scheduler._render_x_header = function (B, D, E, C) { - var A = document.createElement("DIV"); - A.className = "dhx_scale_bar"; - this.set_xy(A, this._cols[B] - 1, this.xy.scale_height - 2, D, 0); - A.innerHTML = this.templates[this._mode + "_scale_date"](E, this._mode); - C.appendChild(A) -}; -scheduler._reset_scale = function () { - if (!this.templates[this._mode + "_date"]) { - return - } - var M = this._els.dhx_cal_header[0]; - var R = this._els.dhx_cal_data[0]; - var P = this.config; - M.innerHTML = ""; - R.scrollTop = 0; - R.innerHTML = ""; - var K = ((P.readonly || (!P.drag_resize)) ? " dhx_resize_denied" : "") + ((P.readonly || (!P.drag_move)) ? " dhx_move_denied" : ""); - if (K) { - R.className = "dhx_cal_data" + K - } - this._cols = []; - this._colsS = { - height: 0 - }; - this._dy_shift = 0; - this.set_sizes(); - var I = parseInt(M.style.width); - var C = 0; - var O, Q, A, N; - Q = this.date[this._mode + "_start"](new Date(this._date.valueOf())); - O = A = this._table_view ? scheduler.date.week_start(Q) : Q; - N = this.date.date_part(new Date()); - var D = scheduler.date.add(Q, 1, this._mode); - var E = 7; - if (!this._table_view) { - var G = this.date["get_" + this._mode + "_end"]; - if (G) { - D = G(Q) - } - E = Math.round((D.valueOf() - Q.valueOf()) / (1000 * 60 * 60 * 24)) - } - this._min_date = O; - this._els.dhx_cal_date[0].innerHTML = this.templates[this._mode + "_date"](Q, D, this._mode); - for (var L = 0; L < E; L++) { - this._cols[L] = Math.floor(I / (E - L)); - this._render_x_header(L, C, O, M); - if (!this._table_view) { - var F = document.createElement("DIV"); - var B = "dhx_scale_holder"; - if (O.valueOf() == N.valueOf()) { - B = "dhx_scale_holder_now" - } - F.className = B + " " + this.templates.week_date_class(O, N); - this.set_xy(F, this._cols[L] - 1, P.hour_size_px * (P.last_hour - P.first_hour), C + this.xy.scale_width + 1, 0); - R.appendChild(F) - } - O = this.date.add(O, 1, "day"); - I -= this._cols[L]; - C += this._cols[L]; - this._colsS[L] = (this._cols[L - 1] || 0) + (this._colsS[L - 1] || (this._table_view ? 0 : this.xy.scale_width + 2)) - } - this._max_date = O; - this._colsS[E] = this._cols[E - 1] + this._colsS[E - 1]; - if (this._table_view) { - this._reset_month_scale(R, Q, A) - } else { - this._reset_hours_scale(R, Q, A); - if (P.multi_day) { - var J = document.createElement("DIV"); - J.className = "dhx_multi_day"; - J.style.visibility = "hidden"; - this.set_xy(J, parseInt(M.style.width), 0, this.xy.scale_width, 0); - R.appendChild(J); - var H = J.cloneNode(true); - H.className = "dhx_multi_day_icon"; - H.style.visibility = "hidden"; - this.set_xy(H, this.xy.scale_width - 1, 0, 0, 0); - R.appendChild(H); - this._els.dhx_multi_day = [J, H] - } - } -}; -scheduler._reset_hours_scale = function (B, A, E) { - var G = document.createElement("DIV"); - G.className = "dhx_scale_holder"; - var C = new Date(1980, 1, 1, this.config.first_hour, 0, 0); - for (var D = this.config.first_hour * 1; D < this.config.last_hour; D++) { - var F = document.createElement("DIV"); - F.className = "dhx_scale_hour"; - F.style.height = this.config.hour_size_px - (this._quirks ? 0 : 1) + "px"; - F.style.width = this.xy.scale_width + "px"; - F.innerHTML = scheduler.templates.hour_scale(C); - G.appendChild(F); - C = this.date.add(C, 1, "hour") - } - B.appendChild(G); - if (this.config.scroll_hour) { - B.scrollTop = this.config.hour_size_px * (this.config.scroll_hour - this.config.first_hour) - } -}; -scheduler._reset_month_scale = function (J, K, I) { - var H = scheduler.date.add(K, 1, "month"); - var A = new Date(); - this.date.date_part(A); - this.date.date_part(I); - var N = Math.ceil((H.valueOf() - I.valueOf()) / (60 * 60 * 24 * 1000 * 7)); - var B = []; - var L = (Math.floor(J.clientHeight / N) - 22); - this._colsS.height = L + 22; - var G = this._colsS.heights = []; - for (var E = 0; E <= 7; E++) { - B[E] = " style='height:" + L + "px; width:" + ((this._cols[E] || 0) - 1) + "px;' " - } - var D = 0; - this._min_date = I; - var F = ""; - for (var E = 0; E < N; E++) { - F += ""; - for (var C = 0; C < 7; C++) { - F += "= H) { - M = "dhx_after" - } else { - if (I.valueOf() == A.valueOf()) { - M = "dhx_now" - } - } - } - F += " class='" + M + " " + this.templates.month_date_class(I, A) + "' "; - F += ">
" + this.templates.month_day(I) + "
"; - I = this.date.add(I, 1, "day") - } - F += "
"; - G[E] = D; - D += this._colsS.height - } - F += "
"; - this._max_date = I; - J.innerHTML = F; - return I -}; -scheduler.getLabel = function (E, D) { - var F = this.config.lightbox.sections; - for (var C = 0; C < F.length; C++) { - if (F[C].map_to == E) { - var B = F[C].options; - for (var A = 0; A < B.length; A++) { - if (B[A].key == D) { - return B[A].label - } - } - } - } - return "" -}; -scheduler.date = { - date_part: function (A) { - A.setHours(0); - A.setMinutes(0); - A.setSeconds(0); - A.setMilliseconds(0); - return A - }, - time_part: function (A) { - return (A.valueOf() / 1000 - A.getTimezoneOffset() * 60) % 86400 - }, - week_start: function (B) { - var A = B.getDay(); - if (scheduler.config.start_on_monday) { - if (A == 0) { - A = 6 - } else { - A-- - } - } - return this.date_part(this.add(B, -1 * A, "day")) - }, - month_start: function (A) { - A.setDate(1); - return this.date_part(A) - }, - year_start: function (A) { - A.setMonth(0); - return this.month_start(A) - }, - day_start: function (A) { - return this.date_part(A) - }, - add: function (B, C, D) { - var A = new Date(B.valueOf()); - switch (D) { - case "day": - A.setDate(A.getDate() + C); - break; - case "week": - A.setDate(A.getDate() + 7 * C); - break; - case "month": - A.setMonth(A.getMonth() + C); - break; - case "year": - A.setYear(A.getFullYear() + C); - break; - case "hour": - A.setHours(A.getHours() + C); - break; - case "minute": - A.setMinutes(A.getMinutes() + C); - break; - default: - return scheduler.date["add_" + D](B, C, D) - } - return A - }, - to_fixed: function (A) { - if (A < 10) { - return "0" + A - } - return A - }, - copy: function (A) { - return new Date(A.valueOf()) - }, - date_to_str: function (B, A) { - B = B.replace(/%[a-zA-Z]/g, function (C) { - switch (C) { - case "%d": - return '"+scheduler.date.to_fixed(date.getDate())+"'; - case "%m": - return '"+scheduler.date.to_fixed((date.getMonth()+1))+"'; - case "%j": - return '"+date.getDate()+"'; - case "%n": - return '"+(date.getMonth()+1)+"'; - case "%y": - return '"+scheduler.date.to_fixed(date.getFullYear()%100)+"'; - case "%Y": - return '"+date.getFullYear()+"'; - case "%D": - return '"+scheduler.locale.date.day_short[date.getDay()]+"'; - case "%l": - return '"+scheduler.locale.date.day_full[date.getDay()]+"'; - case "%M": - return '"+scheduler.locale.date.month_short[date.getMonth()]+"'; - case "%F": - return '"+scheduler.locale.date.month_full[date.getMonth()]+"'; - case "%h": - return '"+scheduler.date.to_fixed((date.getHours()+11)%12+1)+"'; - case "%g": - return '"+((date.getHours()+11)%12+1)+"'; - case "%G": - return '"+date.getHours()+"'; - case "%H": - return '"+scheduler.date.to_fixed(date.getHours())+"'; - case "%i": - return '"+scheduler.date.to_fixed(date.getMinutes())+"'; - case "%a": - return '"+(date.getHours()>11?"pm":"am")+"'; - case "%A": - return '"+(date.getHours()>11?"PM":"AM")+"'; - case "%s": - return '"+scheduler.date.to_fixed(date.getSeconds())+"'; - case "%W": - return '"+scheduler.date.to_fixed(scheduler.date.getISOWeek(date))+"'; - default: - return C - } - }); - if (A) { - B = B.replace(/date\.get/g, "date.getUTC") - } - return new Function("date", 'return "' + B + '";') - }, - str_to_date: function (E, C) { - var F = "var temp=date.split(/[^0-9a-zA-Z]+/g);"; - var A = E.match(/%[a-zA-Z]/g); - for (var B = 0; B < A.length; B++) { - switch (A[B]) { - case "%j": - case "%d": - F += "set[2]=temp[" + B + "]||1;"; - break; - case "%n": - case "%m": - F += "set[1]=(temp[" + B + "]||1)-1;"; - break; - case "%y": - F += "set[0]=temp[" + B + "]*1+(temp[" + B + "]>50?1900:2000);"; - break; - case "%g": - case "%G": - case "%h": - case "%H": - F += "set[3]=temp[" + B + "]||0;"; - break; - case "%i": - F += "set[4]=temp[" + B + "]||0;"; - break; - case "%Y": - F += "set[0]=temp[" + B + "]||0;"; - break; - case "%a": - case "%A": - F += "set[3]=set[3]%12+((temp[" + B + "]||'').toLowerCase()=='am'?0:12);"; - break; - case "%s": - F += "set[5]=temp[" + B + "]||0;"; - break - } - } - var D = "set[0],set[1],set[2],set[3],set[4],set[5]"; - if (C) { - D = " Date.UTC(" + D + ")" - } - return new Function("date", "var set=[0,0,1,0,0,0]; " + F + " return new Date(" + D + ");") - }, - getISOWeek: function (C) { - if (!C) { - return false - } - var B = C.getDay(); - if (B == 0) { - B = 7 - } - var D = new Date(C.valueOf()); - D.setDate(C.getDate() + (4 - B)); - var A = D.getFullYear(); - var F = Math.floor((D.getTime() - new Date(A, 0, 1).getTime()) / 86400000); - var E = 1 + Math.floor(F / 7); - return E - }, - getUTCISOWeek: function (A) { - return this.getISOWeek(A) - } -}; -scheduler.locale = { - date: { - month_full: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"], - month_short: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"], - day_full: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], - day_short: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"] - }, - labels: { - dhx_cal_today_button: "Today", - day_tab: "Day", - week_tab: "Week", - month_tab: "Month", - new_event: "New event", - icon_save: "Save", - icon_cancel: "Cancel", - icon_details: "Details", - icon_edit: "Edit", - icon_delete: "Delete", - confirm_closing: "", - confirm_deleting: "Event will be deleted permanently, are you sure?", - section_description: "Description", - section_time: "Time period", - full_day: "Full day", - confirm_recurring: "Do you want to edit the whole set of repeated events?", - section_recurring: "Repeat event", - button_recurring: "Disabled", - button_recurring_open: "Enabled", - agenda_tab: "Agenda", - date: "Date", - description: "Description", - year_tab: "Year" - } -}; -scheduler.config = { - default_date: "%j %M %Y", - month_date: "%F %Y", - load_date: "%Y-%m-%d", - week_date: "%l", - day_date: "%D, %F %j", - hour_date: "%H:%i", - month_day: "%d", - xml_date: "%m/%d/%Y %H:%i", - api_date: "%d-%m-%Y %H:%i", - hour_size_px: 42, - time_step: 5, - start_on_monday: 1, - first_hour: 0, - last_hour: 24, - readonly: false, - drag_resize: 1, - drag_move: 1, - drag_create: 1, - dblclick_create: 1, - edit_on_create: 1, - details_on_create: 0, - click_form_details: 0, - server_utc: false, - positive_closing: false, - icons_edit: ["icon_save", "icon_cancel"], - icons_select: ["icon_details", "icon_edit", "icon_delete"], - lightbox: { - sections: [{ - name: "description", - height: 200, - map_to: "text", - type: "textarea", - focus: true - }, { - name: "time", - height: 72, - type: "time", - map_to: "auto" - }] - } -}; -scheduler.templates = {}; -scheduler.init_templates = function () { - var B = scheduler.date.date_to_str; - var C = scheduler.config; - var A = function (E, D) { - for (var F in D) { - if (!E[F]) { - E[F] = D[F] - } - } - }; - A(scheduler.templates, { - day_date: B(C.default_date), - month_date: B(C.month_date), - week_date: function (E, D) { - return scheduler.templates.day_date(E) + " – " + scheduler.templates.day_date(scheduler.date.add(D, -1, "day")) - }, - day_scale_date: B(C.default_date), - month_scale_date: B(C.week_date), - week_scale_date: B(C.day_date), - hour_scale: B(C.hour_date), - time_picker: B(C.hour_date), - event_date: B(C.hour_date), - month_day: B(C.month_day), - xml_date: scheduler.date.str_to_date(C.xml_date, C.server_utc), - load_format: B(C.load_date, C.server_utc), - xml_format: B(C.xml_date, C.server_utc), - api_date: scheduler.date.str_to_date(C.api_date), - event_header: function (F, D, E) { - return scheduler.templates.event_date(F) + " - " + scheduler.templates.event_date(D) - }, - event_text: function (F, D, E) { - return E.text - }, - event_class: function (F, D, E) { - return "" - }, - month_date_class: function (D) { - return "" - }, - week_date_class: function (D) { - return "" - }, - event_bar_date: function (F, D, E) { - return scheduler.templates.event_date(F) + " " - }, - event_bar_text: function (F, D, E) { - return E.text - } - }); - this.callEvent("onTemplatesReady", []) -}; -scheduler.uid = function () { - if (!this._seed) { - this._seed = (new Date).valueOf() - } - return this._seed++ -}; -scheduler._events = {}; -scheduler.clearAll = function () { - this._events = {}; - this._loaded = {}; - this.clear_view() -}; -scheduler.addEvent = function (A, G, D, F, B) { - var C = A; - if (arguments.length != 1) { - C = B || {}; - C.start_date = A; - C.end_date = G; - C.text = D; - C.id = F - } - C.id = C.id || scheduler.uid(); - C.text = C.text || ""; - if (typeof C.start_date == "string") { - C.start_date = this.templates.api_date(C.start_date) - } - if (typeof C.end_date == "string") { - C.end_date = this.templates.api_date(C.end_date) - } - C._timed = this.is_one_day_event(C); - var E = !this._events[C.id]; - this._events[C.id] = C; - this.event_updated(C); - if (!this._loading) { - this.callEvent(E ? "onEventAdded" : "onEventChanged", [C.id, C]) - } -}; -scheduler.deleteEvent = function (C, A) { - var B = this._events[C]; - if (!A && !this.callEvent("onBeforeEventDelete", [C, B])) { - return - } - if (B) { - delete this._events[C]; - this.unselect(C); - this.event_updated(B) - } -}; -scheduler.getEvent = function (A) { - return this._events[A] -}; -scheduler.setEvent = function (B, A) { - this._events[B] = A -}; -scheduler.for_rendered = function (C, B) { - for (var A = this._rendered.length - 1; A >= 0; A--) { - if (this._rendered[A].getAttribute("event_id") == C) { - B(this._rendered[A], A) - } - } -}; -scheduler.changeEventId = function (C, A) { - if (C == A) { - return - } - var B = this._events[C]; - if (B) { - B.id = A; - this._events[A] = B; - delete this._events[C] - } - this.for_rendered(C, function (D) { - D.setAttribute("event_id", A) - }); - if (this._select_id == C) { - this._select_id = A - } - if (this._edit_id == C) { - this._edit_id = A - } - this.callEvent("onEventIdChange", [C, A]) -}; -(function () { - var A = ["text", "Text", "start_date", "StartDate", "end_date", "EndDate"]; - var C = function (E) { - return function (F) { - return (scheduler.getEvent(F))[E] - } - }; - var D = function (E) { - return function (H, G) { - var F = scheduler.getEvent(H); - F[E] = G; - F._changed = true; - F._timed = this.is_one_day_event(F); - scheduler.event_updated(F, true) - } - }; - for (var B = 0; B < A.length; B += 2) { - scheduler["getEvent" + A[B + 1]] = C(A[B]); - scheduler["setEvent" + A[B + 1]] = D(A[B]) - } -})(); -scheduler.event_updated = function (A, B) { - if (this.is_visible_events(A)) { - this.render_view_data() - } else { - this.clear_event(A.id) - } -}; -scheduler.is_visible_events = function (A) { - if (A.start_date < this._max_date && this._min_date < A.end_date) { - return true - } - return false -}; -scheduler.is_one_day_event = function (A) { - var B = A.end_date.getDate() - A.start_date.getDate(); - if (!B) { - return A.start_date.getMonth() == A.end_date.getMonth() && A.start_date.getFullYear() == A.end_date.getFullYear() - } else { - if (B < 0) { - B = Math.ceil((A.end_date.valueOf() - A.start_date.valueOf()) / (24 * 60 * 60 * 1000)) - } - return (B == 1 && !A.end_date.getHours() && !A.end_date.getMinutes() && (A.start_date.getHours() || A.start_date.getMinutes())) - } -}; -scheduler.get_visible_events = function () { - var A = []; - var B = this["filter_" + this._mode]; - for (var C in this._events) { - if (this.is_visible_events(this._events[C])) { - if (this._table_view || this.config.multi_day || this._events[C]._timed) { - if (!B || B(C, this._events[C])) { - A.push(this._events[C]) - } - } - } - } - return A -}; -scheduler.render_view_data = function () { - if (this._not_render) { - this._render_wait = true; - return - } - this._render_wait = false; - this.clear_view(); - var B = this.get_visible_events(); - if (this.config.multi_day && !this._table_view) { - var D = []; - var A = []; - for (var C = 0; C < B.length; C++) { - if (B[C]._timed) { - D.push(B[C]) - } else { - A.push(B[C]) - } - } - this._table_view = true; - this.render_data(A); - this._table_view = false; - this.render_data(D) - } else { - this.render_data(B) - } -}; -scheduler.render_data = function (A, C) { - A = this._pre_render_events(A, C); - for (var B = 0; B < A.length; B++) { - if (this._table_view) { - this.render_event_bar(A[B]) - } else { - this.render_event(A[B]) - } - } -}; -scheduler._pre_render_events = function (M, A) { - var G = this.xy.bar_height; - var D = this._colsS.heights; - var F = this._colsS.heights = [0, 0, 0, 0, 0, 0, 0]; - if (!this._table_view) { - M = this._pre_render_events_line(M, A) - } else { - M = this._pre_render_events_table(M, A) - } - if (this._table_view) { - if (A) { - this._colsS.heights = D - } else { - var B = this._els.dhx_cal_data[0].firstChild; - if (B.rows) { - for (var E = 0; E < B.rows.length; E++) { - F[E]++; - if ((F[E]) * G > this._colsS.height - 22) { - var N = B.rows[E].cells; - for (var C = 0; C < N.length; C++) { - N[C].childNodes[1].style.height = F[E] * G + "px" - } - F[E] = (F[E - 1] || 0) + N[0].offsetHeight - } - F[E] = (F[E - 1] || 0) + B.rows[E].cells[0].offsetHeight - } - F.unshift(0); - if (B.parentNode.offsetHeight < B.parentNode.scrollHeight && !B._h_fix) { - for (var E = 0; E < B.rows.length; E++) { - var L = B.rows[E].cells[6].childNodes[0]; - var J = L.offsetWidth - scheduler.xy.scroll_width + "px"; - L.style.width = J; - L.nextSibling.style.width = J - } - B._h_fix = true - } - } else { - if (!M.length && this._els.dhx_multi_day[0].style.visibility == "visible") { - F[0] = -1 - } - if (M.length || F[0] == -1) { - var H = B.parentNode.childNodes; - var I = (F[0] + 1) * G + "px"; - for (var E = 0; E < H.length; E++) { - if (this._colsS[E]) { - H[E].style.top = I - } - } - var K = this._els.dhx_multi_day[0]; - K.style.top = "0px"; - K.style.height = I; - K.style.visibility = (F[0] == -1 ? "hidden" : "visible"); - K = this._els.dhx_multi_day[1]; - K.style.height = I; - K.style.visibility = (F[0] == -1 ? "hidden" : "visible"); - K.className = F[0] ? "dhx_multi_day_icon" : "dhx_multi_day_icon_small"; - this._dy_shift = (F[0] + 1) * G; - F[0] = 0 - } - } - } - } - return M -}; -scheduler._get_event_sday = function (A) { - return Math.floor((A.start_date.valueOf() - this._min_date.valueOf()) / (24 * 60 * 60 * 1000)) -}; -scheduler._pre_render_events_line = function (H, A) { - H.sort(function (K, J) { - return K.start_date > J.start_date ? 1 : -1 - }); - var G = []; - var I = []; - for (var C = 0; C < H.length; C++) { - var F = H[C]; - var D = F.start_date.getHours(); - var B = F.end_date.getHours(); - F._sday = this._get_event_sday(F); - if (!G[F._sday]) { - G[F._sday] = [] - } - if (!A) { - F._inner = false; - var E = G[F._sday]; - while (E.length && E[E.length - 1].end_date <= F.start_date) { - E.splice(E.length - 1, 1) - } - if (E.length) { - E[E.length - 1]._inner = true - } - F._sorder = E.length; - E.push(F); - if (E.length > (E.max_count || 0)) { - E.max_count = E.length - } - } - if (D < this.config.first_hour || B >= this.config.last_hour) { - I.push(F); - H[C] = F = this._copy_event(F); - if (D < this.config.first_hour) { - F.start_date.setHours(this.config.first_hour); - F.start_date.setMinutes(0) - } - if (B >= this.config.last_hour) { - F.end_date.setMinutes(0); - F.end_date.setHours(this.config.last_hour) - } - if (F.start_date > F.end_date || D == this.config.last_hour) { - H.splice(C, 1); - C--; - continue - } - } - } - if (!A) { - for (var C = 0; C < H.length; C++) { - H[C]._count = G[H[C]._sday].max_count - } - for (var C = 0; C < I.length; C++) { - I[C]._count = G[I[C]._sday].max_count - } - } - return H -}; -scheduler._time_order = function (A) { - A.sort(function (C, B) { - if (C.start_date.valueOf() == B.start_date.valueOf()) { - if (C._timed && !B._timed) { - return 1 - } - if (!C._timed && B._timed) { - return -1 - } - return 0 - } - return C.start_date > B.start_date ? 1 : -1 - }) -}; -scheduler._pre_render_events_table = function (P, C) { - this._time_order(P); - var F = []; - var A = [ - [], - [], - [], - [], - [], - [], - [] - ]; - var N = this._colsS.heights; - var I; - var M = this._cols.length; - for (var G = 0; G < P.length; G++) { - var L = P[G]; - var J = (I || L.start_date); - var H = L.end_date; - if (J < this._min_date) { - J = this._min_date - } - if (H > this._max_date) { - H = this._max_date - } - var E = this.locate_holder_day(J, false, L); - L._sday = E % M; - var O = this.locate_holder_day(H, true, L) || M; - L._eday = (O % M) || M; - L._length = O - E; - L._sweek = Math.floor((this._correct_shift(J.valueOf(), 1) - this._min_date.valueOf()) / (60 * 60 * 1000 * 24 * M)); - var K = A[L._sweek]; - var D; - for (D = 0; D < K.length; D++) { - if (K[D]._eday <= L._sday) { - break - } - } - L._sorder = D; - if (L._sday + L._length <= M) { - I = null; - F.push(L); - K[D] = L; - N[L._sweek] = K.length - 1 - } else { - var B = this._copy_event(L); - B._length = M - L._sday; - B._eday = M; - B._sday = L._sday; - B._sweek = L._sweek; - B._sorder = L._sorder; - B.end_date = this.date.add(J, B._length, "day"); - F.push(B); - K[D] = B; - I = B.end_date; - N[L._sweek] = K.length - 1; - G--; - continue - } - } - return F -}; -scheduler._copy_dummy = function () { - this.start_date = new Date(this.start_date); - this.end_date = new Date(this.end_date) -}; -scheduler._copy_event = function (A) { - this._copy_dummy.prototype = A; - return new this._copy_dummy() -}; -scheduler._rendered = []; -scheduler.clear_view = function () { - for (var A = 0; A < this._rendered.length; A++) { - var B = this._rendered[A]; - if (B.parentNode) { - B.parentNode.removeChild(B) - } - } - this._rendered = [] -}; -scheduler.updateEvent = function (B) { - var A = this.getEvent(B); - this.clear_event(B); - if (A && this.is_visible_events(A)) { - this.render_data([A], true) - } -}; -scheduler.clear_event = function (A) { - this.for_rendered(A, function (C, B) { - if (C.parentNode) { - C.parentNode.removeChild(C) - } - scheduler._rendered.splice(B, 1) - }) -}; -scheduler.render_event = function (L) { - var D = scheduler.xy.menu_width; - if (L._sday < 0) { - return - } - var M = scheduler.locate_holder(L._sday); - if (!M) { - return - } - var F = L.start_date.getHours() * 60 + L.start_date.getMinutes(); - var C = (L.end_date.getHours() * 60 + L.end_date.getMinutes()) || (scheduler.config.last_hour * 60); - var K = (Math.round((F * 60 * 1000 - this.config.first_hour * 60 * 60 * 1000) * this.config.hour_size_px / (60 * 60 * 1000))) % (this.config.hour_size_px * 24) + 1; - var O = Math.max(scheduler.xy.min_event_height, (C - F) * this.config.hour_size_px / 60) + 1; - var B = Math.floor((M.clientWidth - D) / L._count); - var E = L._sorder * B + 1; - if (!L._inner) { - B = B * (L._count - L._sorder) - } - var J = this._render_v_bar(L.id, D + E, K, B, O, L._text_style, scheduler.templates.event_header(L.start_date, L.end_date, L), scheduler.templates.event_text(L.start_date, L.end_date, L)); - this._rendered.push(J); - M.appendChild(J); - E = E + parseInt(M.style.left, 10) + D; - K += this._dy_shift; - if (this._edit_id == L.id) { - J.style.zIndex = 1; - B = Math.max(B - 4, scheduler.xy.editor_width); - var J = document.createElement("DIV"); - J.setAttribute("event_id", L.id); - this.set_xy(J, B, O - 20, E, K + 14); - J.className = "dhx_cal_editor"; - var A = document.createElement("DIV"); - this.set_xy(A, B - 6, O - 26); - A.style.cssText += ";margin:2px 2px 2px 2px;overflow:hidden;"; - J.appendChild(A); - this._els.dhx_cal_data[0].appendChild(J); - this._rendered.push(J); - A.innerHTML = ""; - if (this._quirks7) { - A.firstChild.style.height = O - 12 + "px" - } - this._editor = A.firstChild; - this._editor.onkeypress = function (Q) { - if ((Q || event).shiftKey) { - return true - } - var P = (Q || event).keyCode; - if (P == scheduler.keys.edit_save) { - scheduler.editStop(true) - } - if (P == scheduler.keys.edit_cancel) { - scheduler.editStop(false) - } - }; - this._editor.onselectstart = function (P) { - return (P || event).cancelBubble = true - }; - A.firstChild.focus(); - this._els.dhx_cal_data[0].scrollLeft = 0; - A.firstChild.select() - } - if (this._select_id == L.id) { - var N = this.config["icons_" + ((this._edit_id == L.id) ? "edit" : "select")]; - var I = ""; - for (var H = 0; H < N.length; H++) { - I += "
" - } - var G = this._render_v_bar(L.id, E - D + 1, K, D, N.length * 20 + 26, "", "
", I, true); - G.style.left = E - D + 1; - this._els.dhx_cal_data[0].appendChild(G); - this._rendered.push(G) - } -}; -scheduler._render_v_bar = function (D, M, L, N, H, B, F, E, A) { - var J = document.createElement("DIV"); - var K = this.getEvent(D); - var I = "dhx_cal_event"; - var C = scheduler.templates.event_class(K.start_date, K.end_date, K); - if (C) { - I = I + " " + C - } - var G = jQuery('
', - { - 'event_id': D, - 'class': I - }).css({ - 'position':'absolute', - 'top': L, - 'left': M, - 'width': (N - 4), - 'height': H - }).append( - jQuery('
', { - 'class': 'dhx_header', - 'width': (N - 6) - }), - jQuery('
', { - 'class': 'dhx_title' - }).html(F), - jQuery('
', { - 'class': 'dhx_body', - 'width': (N - (this._quirks ? 4 : 14)), - 'height': (H - (this._quirks ? 20 : 30)) - - }).html(E), - jQuery('
', { - 'class': 'dhx_footer', - 'width': (N - 8), - 'margin-top': A ? 1 : '' - }) - ) - if(K.color) { - jQuery('div', G).css({'background': K.color, 'color': '#FFFFFF'}) - } - jQuery(J).html(G); - return J.firstChild -}; -scheduler.locate_holder = function (A) { - if (this._mode == "day") { - return this._els.dhx_cal_data[0].firstChild - } - return this._els.dhx_cal_data[0].childNodes[A] -}; -scheduler.locate_holder_day = function (B, C) { - var A = Math.floor((this._correct_shift(B, 1) - this._min_date) / (60 * 60 * 24 * 1000)); - if (C && this.date.time_part(B)) { - A++ - } - return A -}; -scheduler.render_event_bar = function (H) { - var J = this._els.dhx_cal_data[0]; - var I = this._colsS[H._sday]; - var A = this._colsS[H._eday]; - if (A == I) { - A = this._colsS[H._eday + 1] - } - var D = this.xy.bar_height; - var G = this._colsS.heights[H._sweek] + (this._colsS.height ? (this.xy.month_scale_height + 2) : 2) + H._sorder * D; - var F = document.createElement("DIV"); - var E = H._timed ? "dhx_cal_event_clear" : "dhx_cal_event_line"; - var B = scheduler.templates.event_class(H.start_date, H.end_date, H); - if (B) { - E = E + " " + B - } - - var c_innerHTML = " "; - var C = jQuery('
', - { - 'event_id': H.id, - 'class': E - }).css({ - 'position': 'absolute', - 'top': G, - 'left': I, - 'width': (A - I - 15) - }) - if (H._timed) { - c_innerHTML = scheduler.templates.event_bar_date(H.start_date, H.end_date, H) - } - - C.html(c_innerHTML + scheduler.templates.event_bar_text(H.start_date, H.end_date, H)) - jQuery(F).html(C); - - if (H.color) { - if (H._length) { - C.css({'background-color':H.color, 'color': '#FFFFFF'}); - } else { - C.css('color',H.color);; - } - } - - if(H.title) { - C.attr('title',H.title); - } - - this._rendered.push(F.firstChild); - J.appendChild(F.firstChild) -}; - -scheduler._locate_event = function (A) { - var B = null; - while (A && !B && A.getAttribute) { - B = A.getAttribute("event_id"); - A = A.parentNode - } - return B -}; -scheduler.edit = function (A) { - if (this._edit_id == A) { - return - } - this.editStop(false, A); - this._edit_id = A; - this.updateEvent(A) -}; -scheduler.editStop = function (B, C) { - if (C && this._edit_id == C) { - return - } - var A = this.getEvent(this._edit_id); - if (A) { - if (B) { - A.text = this._editor.value - } - this._edit_id = null; - this._editor = null; - this.updateEvent(A.id); - this._edit_stop_event(A, B) - } -}; -scheduler._edit_stop_event = function (A, B) { - if (this._new_event) { - if (!B) { - this.deleteEvent(A.id, true) - } else { - this.callEvent("onEventAdded", [A.id, A]) - } - this._new_event = null - } else { - if (B) { - this.callEvent("onEventChanged", [A.id, A]) - } - } -}; -scheduler.getEvents = function (E, D) { - var A = []; - for (var B in this._events) { - var C = this._events[B]; - if (C && C.start_date < D && C.end_date > E) { - A.push(C) - } - } - return A -}; -scheduler._loaded = {}; -scheduler._load = function (C, F) { - C = C || this._load_url; - C += (C.indexOf("?") == -1 ? "?" : "&") + "timeshift=" + (new Date()).getTimezoneOffset(); - if (this.config.prevent_cache) { - C += "&uid=" + this.uid() - } - var E; - F = F || this._date; - if (this._load_mode) { - var B = this.templates.load_format; - F = this.date[this._load_mode + "_start"](new Date(F.valueOf())); - while (F > this._min_date) { - F = this.date.add(F, -1, this._load_mode) - } - E = F; - var D = true; - while (E < this._max_date) { - E = this.date.add(E, 1, this._load_mode); - if (this._loaded[B(F)] && D) { - F = this.date.add(F, 1, this._load_mode) - } else { - D = false - } - } - var A = E; - do { - E = A; - A = this.date.add(E, -1, this._load_mode) - } while (A > F && this._loaded[B(A)]); - if (E <= F) { - return false - } - dhtmlxAjax.get(C + "&from=" + B(F) + "&to=" + B(E), function (G) { - scheduler.on_load(G) - }); - while (F < E) { - this._loaded[B(F)] = true; - F = this.date.add(F, 1, this._load_mode) - } - } else { - dhtmlxAjax.get(C, function (G) { - scheduler.on_load(G) - }) - } - this.callEvent("onXLS", []); - return true -}; -scheduler.on_load = function (A) { - this._loading = true; - if (this._process) { - var B = this[this._process].parse(A.xmlDoc.responseText) - } else { - var B = this._magic_parser(A) - } - this._not_render = true; - for (var C = 0; C < B.length; C++) { - if (!this.callEvent("onEventLoading", [B[C]])) { - continue - } - this.addEvent(B[C]) - } - this._not_render = false; - if (this._render_wait) { - this.render_view_data() - } - if (this._after_call) { - this._after_call() - } - this._after_call = null; - this._loading = false; - this.callEvent("onXLE", []) -}; -scheduler.json = {}; -scheduler.json.parse = function (data) { - if (typeof data == "string") { - eval("scheduler._temp = " + data + ";"); - data = scheduler._temp - } - var evs = []; - for (var i = 0; i < data.length; i++) { - data[i].start_date = scheduler.templates.xml_date(data[i].start_date); - data[i].end_date = scheduler.templates.xml_date(data[i].end_date); - evs.push(data[i]) - } - return evs -}; -scheduler.parse = function (B, A) { - this._process = A; - this.on_load({ - xmlDoc: { - responseText: B - } - }) -}; -scheduler.load = function (A, B) { - if (typeof B == "string") { - this._process = B; - B = arguments[2] - } - this._load_url = A; - this._after_call = B; - this._load(A, this._date) -}; -scheduler.setLoadMode = function (A) { - if (A == "all") { - A = "" - } - this._load_mode = A -}; -scheduler.refresh = function (A) { - alert("not implemented") -}; -scheduler.serverList = function (A) { - return this.serverList[A] = (this.serverList[A] || []) -}; -scheduler._userdata = {}; -scheduler._magic_parser = function (I) { - if (!I.getXMLTopNode) { - var B = I.xmlDoc.responseText; - I = new dtmlXMLLoaderObject(function () {}); - I.loadXMLString(B) - } - var F = I.getXMLTopNode("data"); - if (F.tagName != "data") { - return [] - } - var A = I.doXPath("//coll_options"); - for (var E = 0; E < A.length; E++) { - var H = A[E].getAttribute("for"); - var G = this.serverList[H]; - if (!G) { - continue - } - G.splice(0, G.length); - var K = I.doXPath(".//item", A[E]); - for (var C = 0; C < K.length; C++) { - G.push({ - key: K[C].getAttribute("value"), - label: K[C].getAttribute("label") - }) - } - } - if (A.length) { - scheduler.callEvent("onOptionsLoad", []) - } - var L = I.doXPath("//userdata"); - for (var E = 0; E < L.length; E++) { - var D = this.xmlNodeToJSON(L[E]); - this._userdata[D.name] = D.text - } - var J = []; - var F = I.doXPath("//event"); - for (var E = 0; E < F.length; E++) { - J[E] = this.xmlNodeToJSON(F[E]); - J[E].text = J[E].text || J[E]._tagvalue; - J[E].start_date = this.templates.xml_date(J[E].start_date); - J[E].end_date = this.templates.xml_date(J[E].end_date) - } - return J -}; -scheduler.xmlNodeToJSON = function (C) { - var B = {}; - for (var A = 0; A < C.attributes.length; A++) { - B[C.attributes[A].name] = C.attributes[A].value - } - for (var A = 0; A < C.childNodes.length; A++) { - var D = C.childNodes[A]; - if (D.nodeType == 1) { - B[D.tagName] = D.firstChild ? D.firstChild.nodeValue : "" - } - } - if (!B.text) { - B.text = C.firstChild ? C.firstChild.nodeValue : "" - } - return B -}; -scheduler.attachEvent("onXLS", function () { - if (this.config.show_loading === true) { - var A; - A = this.config.show_loading = document.createElement("DIV"); - A.className = "dhx_loading"; - A.style.left = Math.round((this._x - 128) / 2) + "px"; - A.style.top = Math.round((this._y - 15) / 2) + "px"; - this._obj.appendChild(A) - } -}); -scheduler.attachEvent("onXLE", function () { - var A; - if (A = this.config.show_loading) { - if (typeof A == "object") { - this._obj.removeChild(A); - this.config.show_loading = true - } - } -}); -scheduler.ical = { - parse: function (H) { - var E = H.match(RegExp(this.c_start + "[^\f]*" + this.c_end, "")); - if (!E.length) { - return - } - E[0] = E[0].replace(/[\r\n]+(?=[a-z \t])/g, " "); - E[0] = E[0].replace(/\;[^:\r\n]*/g, ""); - var B = []; - var D; - var C = RegExp("(?:" + this.e_start + ")([^\f]*?)(?:" + this.e_end + ")", "g"); - while (D = C.exec(E)) { - var F = {}; - var G; - var A = /[^\r\n]+[\r\n]+/g; - while (G = A.exec(D[1])) { - this.parse_param(G.toString(), F) - } - if (F.uid && !F.id) { - F.id = F.uid - } - B.push(F) - } - return B - }, - parse_param: function (E, C) { - var D = E.indexOf(":"); - if (D == -1) { - return - } - var A = E.substr(0, D).toLowerCase(); - var B = E.substr(D + 1).replace(/\\\,/g, ",").replace(/[\r\n]+$/, ""); - if (A == "summary") { - A = "text" - } else { - if (A == "dtstart") { - A = "start_date"; - B = this.parse_date(B, 0, 0) - } else { - if (A == "dtend") { - A = "end_date"; - if (C.start_date && C.start_date.getHours() == 0) { - B = this.parse_date(B, 24, 0) - } else { - B = this.parse_date(B, 23, 59) - } - } - } - } - C[A] = B - }, - parse_date: function (G, F, D) { - var E = G.split("T"); - if (E[1]) { - F = E[1].substr(0, 2); - D = E[1].substr(2, 2) - } - var C = E[0].substr(0, 4); - var B = parseInt(E[0].substr(4, 2), 10) - 1; - var A = E[0].substr(6, 2); - if (scheduler.config.server_utc && !E[1]) { - return new Date(Date.UTC(C, B, A, F, D)) - } - return new Date(C, B, A, F, D) - }, - c_start: "BEGIN:VCALENDAR", - e_start: "BEGIN:VEVENT", - e_end: "END:VEVENT", - c_end: "END:VCALENDAR" -}; -scheduler.form_blocks = { - textarea: { - render: function (B) { - var A = (B.height || "130") + "px"; - return "
" - }, - set_value: function (B, C, A) { - B.firstChild.value = C || "" - }, - get_value: function (B, A) { - return B.firstChild.value - }, - focus: function (B) { - var A = B.firstChild; - A.select(); - A.focus() - } - }, - select: { - render: function (D) { - var A = (D.height || "23") + "px"; - var C = "
"; - return C - }, - set_value: function (B, C, A) { - if (typeof C == "undefined") { - C = (B.firstChild.options[0] || {}).value - } - B.firstChild.value = C || "" - }, - get_value: function (B, A) { - return B.firstChild.value - }, - focus: function (B) { - var A = B.firstChild; - if (A.select) { - A.select() - } - A.focus() - } - }, - time: { - render: function () { - var A = scheduler.config; - var E = this.date.date_part(new Date()); - var D = 24 * 60, - G = 0; - if (scheduler.config.limit_time_select) { - D = 60 * A.last_hour + 1; - G = 60 * A.first_hour; - E.setHours(A.first_hour) - } - var C = " "; - return "
" + C + "  –  " + C + "
" - }, - set_value: function (A, I, G) { - var J = A.getElementsByTagName("select"); - if (scheduler.config.full_day) { - if (!A._full_day) { - A.previousSibling.innerHTML += "
"; - A._full_day = true - } - var H = A.previousSibling.getElementsByTagName("input")[0]; - var F = (scheduler.date.time_part(G.start_date) == 0 && scheduler.date.time_part(G.end_date) == 0 && G.end_date.valueOf() - G.start_date.valueOf() < 2 * 24 * 60 * 60 * 1000); - H.checked = F; - for (var B in J) { - J[B].disabled = H.checked - } - H.onclick = function () { - if (H.checked) { - var K = new Date(G.start_date); - var M = new Date(G.end_date); - scheduler.date.date_part(K); - M = scheduler.date.add(K, 1, "day") - } - for (var L in J) { - J[L].disabled = H.checked - } - C(J, 0, K || G.start_date); - C(J, 4, M || G.end_date) - } - } - if (scheduler.config.auto_end_date && scheduler.config.event_duration) { - function E() { - G.start_date = new Date(J[3].value, J[2].value, J[1].value, 0, J[0].value); - G.end_date.setTime(G.start_date.getTime() + (scheduler.config.event_duration * 60 * 1000)); - C(J, 4, G.end_date) - } - for (var D = 0; D < 4; D++) { - J[D].onchange = E - } - } - function C(L, K, M) { - L[K + 0].value = Math.round((M.getHours() * 60 + M.getMinutes()) / scheduler.config.time_step) * scheduler.config.time_step; - L[K + 1].value = M.getDate(); - L[K + 2].value = M.getMonth(); - L[K + 3].value = M.getFullYear() - } - C(J, 0, G.start_date); - C(J, 4, G.end_date) - }, - get_value: function (B, A) { - s = B.getElementsByTagName("select"); - A.start_date = new Date(s[3].value, s[2].value, s[1].value, 0, s[0].value); - A.end_date = new Date(s[7].value, s[6].value, s[5].value, 0, s[4].value); - if (A.end_date <= A.start_date) { - A.end_date = scheduler.date.add(A.start_date, scheduler.config.time_step, "minute") - } - }, - focus: function (A) { - A.getElementsByTagName("select")[0].focus() - } - } -}; -scheduler.showCover = function (A) { - this.show_cover(); - if (A) { - A.style.display = "block"; - var B = getOffset(this._obj); - A.style.top = Math.round(B.top + (this._obj.offsetHeight - A.offsetHeight) / 2) + "px"; - A.style.left = Math.round(B.left + (this._obj.offsetWidth - A.offsetWidth) / 2) + "px" - } -}; -scheduler.showLightbox = function (B) { - if (!B) { - return - } - if (!this.callEvent("onBeforeLightbox", [B])) { - return - } - var A = this._get_lightbox(); - this.showCover(A); - this._fill_lightbox(B, A); - this.callEvent("onLightbox", [B]) -}; -scheduler._fill_lightbox = function (H, E) { - var D = this.getEvent(H); - var B = E.getElementsByTagName("span"); - if (scheduler.templates.lightbox_header) { - B[1].innerHTML = ""; - B[2].innerHTML = scheduler.templates.lightbox_header(D.start_date, D.end_date, D) - } else { - B[1].innerHTML = this.templates.event_header(D.start_date, D.end_date, D); - B[2].innerHTML = (this.templates.event_bar_text(D.start_date, D.end_date, D) || "").substr(0, 70) - } - var F = this.config.lightbox.sections; - for (var A = 0; A < F.length; A++) { - var C = document.getElementById(F[A].id).nextSibling; - var G = this.form_blocks[F[A].type]; - G.set_value.call(this, C, D[F[A].map_to], D, F[A]); - if (F[A].focus) { - G.focus.call(this, C) - } - } - scheduler._lightbox_id = H -}; -scheduler._lightbox_out = function (D) { - var E = this.config.lightbox.sections; - for (var B = 0; B < E.length; B++) { - var C = document.getElementById(E[B].id).nextSibling; - var F = this.form_blocks[E[B].type]; - var A = F.get_value.call(this, C, D, E[B]); - if (E[B].map_to != "auto") { - D[E[B].map_to] = A - } - } - return D -}; -scheduler._empty_lightbox = function () { - var C = scheduler._lightbox_id; - var B = this.getEvent(C); - var A = this._get_lightbox(); - this._lightbox_out(B); - B._timed = this.is_one_day_event(B); - this.setEvent(B.id, B); - this._edit_stop_event(B, true); - this.render_view_data() -}; -scheduler.hide_lightbox = function (A) { - this.hideCover(this._get_lightbox()); - this._lightbox_id = null; - this.callEvent("onAfterLightbox", []) -}; -scheduler.hideCover = function (A) { - if (A) { - A.style.display = "none" - } - this.hide_cover() -}; -scheduler.hide_cover = function () { - if (this._cover) { - this._cover.parentNode.removeChild(this._cover) - } - this._cover = null -}; -scheduler.show_cover = function () { - this._cover = document.createElement("DIV"); - this._cover.className = "dhx_cal_cover"; - document.body.appendChild(this._cover) -}; -scheduler.save_lightbox = function () { - if (this.checkEvent("onEventSave") && !this.callEvent("onEventSave", [this._lightbox_id, this._lightbox_out({ - id: this._lightbox_id - }), this._new_event])) { - return - } - this._empty_lightbox(); - this.hide_lightbox() -}; -scheduler.startLightbox = function (B, A) { - this._lightbox_id = B; - this.showCover(A) -}; -scheduler.endLightbox = function (B, A) { - this._edit_stop_event(scheduler.getEvent(this._lightbox_id), B); - if (B) { - scheduler.render_view_data() - } - this.hideCover(A) -}; -scheduler.resetLightbox = function () { - scheduler._lightbox = null -}; -scheduler.cancel_lightbox = function () { - this.callEvent("onEventCancel", [this._lightbox_id, this._new_event]); - this.endLightbox(false); - this.hide_lightbox() -}; -scheduler._init_lightbox_events = function () { - this._get_lightbox().onclick = function (C) { - var E = C ? C.target : event.srcElement; - if (!E.className) { - E = E.previousSibling - } - if (E && E.className) { - switch (E.className) { - case "dhx_save_btn": - scheduler.save_lightbox(); - break; - case "dhx_delete_btn": - var F = scheduler.locale.labels.confirm_deleting; - if (!F || confirm(F)) { - scheduler.deleteEvent(scheduler._lightbox_id); - scheduler._new_event = null; - scheduler.hide_lightbox() - } - break; - case "dhx_cancel_btn": - scheduler.cancel_lightbox(); - break; - default: - if (E.className.indexOf("dhx_custom_button_") != -1) { - var A = E.parentNode.getAttribute("index"); - var D = scheduler.form_blocks[scheduler.config.lightbox.sections[A].type]; - var B = E.parentNode.parentNode; - D.button_click(A, E, B, B.nextSibling) - } - } - } - }; - this._get_lightbox().onkeypress = function (A) { - switch ((A || event).keyCode) { - case scheduler.keys.edit_save: - if ((A || event).shiftKey) { - return - } - scheduler.save_lightbox(); - break; - case scheduler.keys.edit_cancel: - scheduler.cancel_lightbox(); - break - } - } -}; -scheduler.setLightboxSize = function () { - var B = this._lightbox; - if (!B) { - return - } - var A = B.childNodes[1]; - A.style.height = "0px"; - A.style.height = A.scrollHeight + "px"; - B.style.height = A.scrollHeight + 50 + "px"; - A.style.height = A.scrollHeight + "px" -}; -scheduler._get_lightbox = function () { - if (!this._lightbox) { - var G = document.createElement("DIV"); - G.className = "dhx_cal_light"; - if (/msie|MSIE 6/.test(navigator.userAgent)) { - G.className += " dhx_ie6" - } - G.style.visibility = "hidden"; - G.innerHTML = this._lightbox_template; - document.body.insertBefore(G, document.body.firstChild); - this._lightbox = G; - var E = this.config.lightbox.sections; - var C = ""; - for (var B = 0; B < E.length; B++) { - var F = this.form_blocks[E[B].type]; - if (!F) { - continue - } - E[B].id = "area_" + this.uid(); - var A = ""; - if (E[B].button) { - A = "
" + this.locale.labels["button_" + E[B].button] + "
" - } - C += "
" + A + this.locale.labels["section_" + E[B].name] + "
" + F.render.call(this, E[B]) - } - var D = G.getElementsByTagName("div"); - D[4].innerHTML = scheduler.locale.labels.icon_save; - D[7].innerHTML = scheduler.locale.labels.icon_cancel; - D[10].innerHTML = scheduler.locale.labels.icon_delete; - D[1].innerHTML = C; - this.setLightboxSize(); - this._init_lightbox_events(this); - G.style.display = "none"; - G.style.visibility = "visible" - } - return this._lightbox -}; -scheduler._lightbox_template = "
 
 
 
 
"; -scheduler._dp_init = function (A) { - A._methods = ["setEventTextStyle", "", "changeEventId", "deleteEvent"]; - this.attachEvent("onEventAdded", function (B) { - if (!this._loading && this.validId(B)) { - A.setUpdated(B, true, "inserted") - } - }); - this.attachEvent("onBeforeEventDelete", function (C) { - if (!this.validId(C)) { - return - } - var B = A.getState(C); - if (B == "inserted" || this._new_event) { - A.setUpdated(C, false); - return true - } - if (B == "deleted") { - return false - } - if (B == "true_deleted") { - return true - } - A.setUpdated(C, true, "deleted"); - return false - }); - this.attachEvent("onEventChanged", function (B) { - if (!this._loading && this.validId(B)) { - A.setUpdated(B, true, "updated") - } - }); - A._getRowData = function (F, B) { - var D = this.obj.getEvent(F); - var E = {}; - for (var C in D) { - if (C.indexOf("_") == 0) { - continue - } - if (D[C] && D[C].getUTCFullYear) { - E[C] = this.obj.templates.xml_format(D[C]) - } else { - E[C] = D[C] - } - } - return E - }; - A._clearUpdateFlag = function () {}; - A.attachEvent("insertCallback", scheduler._update_callback); - A.attachEvent("updateCallback", scheduler._update_callback); - A.attachEvent("deleteCallback", function (B, C) { - this.obj.setUserData(C, this.action_param, "true_deleted"); - this.obj.deleteEvent(C) - }) -}; -scheduler.setUserData = function (C, A, B) { - if (C) { - this.getEvent(C)[A] = B - } else { - this._userdata[A] = B - } -}; -scheduler.getUserData = function (B, A) { - return B ? this.getEvent(B)[A] : this._userdata[A] -}; -scheduler.setEventTextStyle = function (C, A) { - this.for_rendered(C, function (D) { - D.style.cssText += ";" + A - }); - var B = this.getEvent(C); - B._text_style = A; - this.event_updated(B) -}; -scheduler.validId = function (A) { - return true -}; -scheduler._update_callback = function (B, C) { - var A = scheduler.xmlNodeToJSON(B.firstChild); - A.text = A.text || A._tagvalue; - A.start_date = scheduler.templates.xml_date(A.start_date); - A.end_date = scheduler.templates.xml_date(A.end_date); - scheduler.addEvent(A) -}; - -/* -dhtmlxScheduler v.2.3 - -This software is allowed to use under GPL or you need to obtain Commercial or Enterise License -to use it in not GPL project. Please contact sales@dhtmlx.com for details - -(c) DHTMLX Ltd. */ +dhtmlx=function(a){for(var b in a)dhtmlx[b]=a[b];return dhtmlx}; +dhtmlx.extend_api=function(a,b,c){var d=window[a];if(d)window[a]=function(a){if(a&&typeof a=="object"&&!a.tagName&&!(a instanceof Array)){var c=d.apply(this,b._init?b._init(a):arguments),g;for(g in dhtmlx)if(b[g])this[b[g]](dhtmlx[g]);for(g in a)if(b[g])this[b[g]](a[g]);else g.indexOf("on")==0&&this.attachEvent(g,a[g])}else c=d.apply(this,arguments);b._patch&&b._patch(this);return c||this},window[a].prototype=d.prototype,c&&dhtmlXHeir(window[a].prototype,c)}; +dhtmlxAjax={get:function(a,b){var c=new dtmlXMLLoaderObject(!0);c.async=arguments.length<3;c.waitCall=b;c.loadXML(a);return c},post:function(a,b,c){var d=new dtmlXMLLoaderObject(!0);d.async=arguments.length<4;d.waitCall=c;d.loadXML(a,!0,b);return d},getSync:function(a){return this.get(a,null,!0)},postSync:function(a,b){return this.post(a,b,null,!0)}}; +function dtmlXMLLoaderObject(a,b,c,d){this.xmlDoc="";this.async=typeof c!="undefined"?c:!0;this.onloadAction=a||null;this.mainObject=b||null;this.waitCall=null;this.rSeed=d||!1;return this} +dtmlXMLLoaderObject.prototype.waitLoadFunction=function(a){var b=!0;return this.check=function(){if(a&&a.onloadAction!=null&&(!a.xmlDoc.readyState||a.xmlDoc.readyState==4)&&b){b=!1;if(typeof a.onloadAction=="function")a.onloadAction(a.mainObject,null,null,null,a);if(a.waitCall)a.waitCall.call(this,a),a.waitCall=null}}}; +dtmlXMLLoaderObject.prototype.getXMLTopNode=function(a,b){if(this.xmlDoc.responseXML){var c=this.xmlDoc.responseXML.getElementsByTagName(a);c.length==0&&a.indexOf(":")!=-1&&(c=this.xmlDoc.responseXML.getElementsByTagName(a.split(":")[1]));var d=c[0]}else d=this.xmlDoc.documentElement;if(d)return this._retry=!1,d;if(_isIE&&!this._retry){var e=this.xmlDoc.responseText,b=this.xmlDoc;this._retry=!0;this.xmlDoc=new ActiveXObject("Microsoft.XMLDOM");this.xmlDoc.async=!1;this.xmlDoc.loadXML(e);return this.getXMLTopNode(a, +b)}dhtmlxError.throwError("LoadXML","Incorrect XML",[b||this.xmlDoc,this.mainObject]);return document.createElement("DIV")};dtmlXMLLoaderObject.prototype.loadXMLString=function(a){try{var b=new DOMParser;this.xmlDoc=b.parseFromString(a,"text/xml")}catch(c){this.xmlDoc=new ActiveXObject("Microsoft.XMLDOM"),this.xmlDoc.async=this.async,this.xmlDoc.loadXML(a)}this.onloadAction(this.mainObject,null,null,null,this);if(this.waitCall)this.waitCall(),this.waitCall=null}; +dtmlXMLLoaderObject.prototype.loadXML=function(a,b,c,d){this.rSeed&&(a+=(a.indexOf("?")!=-1?"&":"?")+"a_dhx_rSeed="+(new Date).valueOf());this.filePath=a;this.xmlDoc=!_isIE&&window.XMLHttpRequest?new XMLHttpRequest:new ActiveXObject("Microsoft.XMLHTTP");if(this.async)this.xmlDoc.onreadystatechange=new this.waitLoadFunction(this);this.xmlDoc.open(b?"POST":"GET",a,this.async);d?(this.xmlDoc.setRequestHeader("User-Agent","dhtmlxRPC v0.1 ("+navigator.userAgent+")"),this.xmlDoc.setRequestHeader("Content-type", +"text/xml")):b&&this.xmlDoc.setRequestHeader("Content-type","application/x-www-form-urlencoded");this.xmlDoc.setRequestHeader("X-Requested-With","XMLHttpRequest");this.xmlDoc.send(c);this.async||(new this.waitLoadFunction(this))()};dtmlXMLLoaderObject.prototype.destructor=function(){return this.xmlDoc=this.mainObject=this.onloadAction=null}; +dtmlXMLLoaderObject.prototype.xmlNodeToJSON=function(a){for(var b={},c=0;c-1&&(_isChrome=!0); +if(navigator.userAgent.indexOf("Safari")!=-1||navigator.userAgent.indexOf("Konqueror")!=-1){var x=parseFloat(navigator.userAgent.substr(navigator.userAgent.indexOf("Safari")+7,5));if(x>525){_isFF=!0;var w=1.9}else _isKHTML=!0}else navigator.userAgent.indexOf("Opera")!=-1?(_isOpera=!0,_OperaRv=parseFloat(navigator.userAgent.substr(navigator.userAgent.indexOf("Opera")+6,3))):navigator.appName.indexOf("Microsoft")!=-1?(_isIE=!0,navigator.appVersion.indexOf("MSIE 8.0")!=-1&&document.compatMode!="BackCompat"&& +(_isIE=8)):(_isFF=!0,w=parseFloat(navigator.userAgent.split("rv:")[1])); +dtmlXMLLoaderObject.prototype.doXPath=function(a,b,c,d){if(_isKHTML||!_isIE&&!window.XPathResult)return this.doXPathOpera(a,b);if(_isIE)return b||(b=this.xmlDoc.nodeName?this.xmlDoc:this.xmlDoc.responseXML),b||dhtmlxError.throwError("LoadXML","Incorrect XML",[b||this.xmlDoc,this.mainObject]),c!=null&&b.setProperty("SelectionNamespaces","xmlns:xsl='"+c+"'"),d=="single"?b.selectSingleNode(a):b.selectNodes(a)||[];else{var e=b;b||(b=this.xmlDoc.nodeName?this.xmlDoc:this.xmlDoc.responseXML);b||dhtmlxError.throwError("LoadXML", +"Incorrect XML",[b||this.xmlDoc,this.mainObject]);b.nodeName.indexOf("document")!=-1?e=b:(e=b,b=b.ownerDocument);var f=XPathResult.ANY_TYPE;if(d=="single")f=XPathResult.FIRST_ORDERED_NODE_TYPE;var g=[],h=b.evaluate(a,e,function(){return c},f,null);if(f==XPathResult.FIRST_ORDERED_NODE_TYPE)return h.singleNodeValue;for(var i=h.iterateNext();i;)g[g.length]=i,i=h.iterateNext();return g}};function z(){if(!this.catches)this.catches=[];return this}z.prototype.catchError=function(a,b){this.catches[a]=b}; +z.prototype.throwError=function(a,b,c){if(this.catches[a])return this.catches[a](a,b,c);if(this.catches.ALL)return this.catches.ALL(a,b,c);alert("Error type: "+a+"\nDescription: "+b);return null};window.dhtmlxError=new z; +dtmlXMLLoaderObject.prototype.doXPathOpera=function(a,b){var c=a.replace(/[\/]+/gi,"/").split("/"),d=null,e=1;if(!c.length)return[];if(c[0]==".")d=[b];else if(c[0]=="")d=(this.xmlDoc.responseXML||this.xmlDoc).getElementsByTagName(c[e].replace(/\[[^\]]*\]/g,"")),e++;else return[];for(;e0?"&dhx_no_header=1":"")},b=function(b){return a.call(this,b)+(this._connector_sorting||"")+(this._connector_filter||"")},c=function(a,c,d){this._connector_sorting="&dhx_sort["+c+"]="+d;return b.call(this, +a)},d=function(a,c,d){for(var h=0;h0)this.xy.nav_height=e;var f=this.xy.scale_height+ +this.xy.nav_height+(this._quirks?-2:0);this.set_xy(this._els.dhx_cal_data[0],a,b-(f+2),0,f+2)};scheduler.set_xy=function(a,b,c,d,e){a.style.width=Math.max(0,b)+"px";a.style.height=Math.max(0,c)+"px";if(arguments.length>3)a.style.left=d+"px",a.style.top=e+"px"}; +scheduler.get_elements=function(){for(var a=this._obj.getElementsByTagName("DIV"),b=0;bf.getHours()&&(f.setHours(g),a=f.valueOf());b=a+e}var h=new Date(b);f.valueOf()==h.valueOf()&&h.setTime(h.valueOf()+e);d.start_date=d.start_date||f;d.end_date=d.end_date||h;d.text=d.text||this.locale.labels.new_event;d.id=this._drag_id= +this.uid();this._drag_mode="new-size";this._loading=!0;this.addEvent(d);this.callEvent("onEventCreated",[this._drag_id,c]);this._loading=!1;this._drag_event={};this._on_mouse_up(c)}; +scheduler._on_dbl_click=function(a,b){b=b||a.target||a.srcElement;if(!this.config.readonly){var c=b.className.split(" ")[0];switch(c){case "dhx_scale_holder":case "dhx_scale_holder_now":case "dhx_month_body":case "dhx_wa_day_data":if(!scheduler.config.dblclick_create)break;var d=this._mouse_coords(a),e=this._min_date.valueOf()+(d.y*this.config.time_step+(this._table_view?0:d.x)*1440)*6E4,e=this._correct_shift(e);this.addEventNow(e,null,a);break;case "dhx_body":case "dhx_wa_ev_body":case "dhx_cal_event_line":case "dhx_cal_event_clear":var f= +this._locate_event(b);if(!this.callEvent("onDblClick",[f,a]))break;this.config.details_on_dblclick||this._table_view||!this.getEvent(f)._timed?this.showLightbox(f):this.edit(f);break;case "":if(b.parentNode)return scheduler._on_dbl_click(a,b.parentNode);default:var g=this["dblclick_"+c];g&&g.call(this,a)}}}; +scheduler._mouse_coords=function(a){var b,c=document.body,d=document.documentElement;b=a.pageX||a.pageY?{x:a.pageX,y:a.pageY}:{x:a.clientX+(c.scrollLeft||d.scrollLeft||0)-c.clientLeft,y:a.clientY+(c.scrollTop||d.scrollTop||0)-c.clientTop};b.x-=getAbsoluteLeft(this._obj)+(this._table_view?0:this.xy.scale_width);b.y-=getAbsoluteTop(this._obj)+this.xy.nav_height+(this._dy_shift||0)+this.xy.scale_height-this._els.dhx_cal_data[0].scrollTop;b.ev=a;var e=this["mouse_"+this._mode];if(e)return e.call(this, +b);if(this._table_view){for(var f=0,f=1;fb.y)break;b.y=(Math.max(0,Math.ceil(b.x/this._cols[0])-1)+Math.max(0,f-1)*7)*1440/this.config.time_step;b.x=0}else b.x=Math.max(0,Math.ceil(b.x/this._cols[0])-1),b.y=Math.max(0,Math.ceil(b.y*60/(this.config.time_step*this.config.hour_size_px))-1)+this.config.first_hour*(60/this.config.time_step);return b}; +scheduler._close_not_saved=function(){if((new Date).valueOf()-(scheduler._new_event||0)>500&&scheduler._edit_id){var a=scheduler.locale.labels.confirm_closing;(!a||confirm(a))&&scheduler.editStop(scheduler.config.positive_closing)}};scheduler._correct_shift=function(a,b){return a-=((new Date(scheduler._min_date)).getTimezoneOffset()-(new Date(a)).getTimezoneOffset())*6E4*(b?-1:1)}; +scheduler._on_mouse_move=function(a){if(this._drag_mode){var b=this._mouse_coords(a);if(!this._drag_pos||b.custom||this._drag_pos.x!=b.x||this._drag_pos.y!=b.y){this._edit_id!=this._drag_id&&this._close_not_saved();this._drag_pos=b;if(this._drag_mode=="create"){this._close_not_saved();this._loading=!0;var c=this._min_date.valueOf()+(b.y*this.config.time_step+(this._table_view?0:b.x)*1440)*6E4,c=this._correct_shift(c);if(!this._drag_start){this._drag_start=c;return}var d=c;if(d==this._drag_start)return; +this._drag_id=this.uid();this.addEvent(new Date(this._drag_start),new Date(d),this.locale.labels.new_event,this._drag_id,b.fields);this.callEvent("onEventCreated",[this._drag_id,a]);this._loading=!1;this._drag_mode="new-size"}var e=this.getEvent(this._drag_id);if(this._drag_mode=="move")c=this._min_date.valueOf()+(b.y*this.config.time_step+b.x*1440)*6E4,!b.custom&&this._table_view&&(c+=this.date.time_part(e.start_date)*1E3),c=this._correct_shift(c),d=e.end_date.valueOf()-(e.start_date.valueOf()-c); +else{c=e.start_date.valueOf();if(this._table_view)d=this._min_date.valueOf()+b.y*this.config.time_step*6E4+(b.custom?0:864E5),this._mode=="month"&&(d=this._correct_shift(d,!1));else if(d=this.date.date_part(new Date(e.end_date)).valueOf()+b.y*this.config.time_step*6E4,this._els.dhx_cal_data[0].style.cursor="s-resize",this._mode=="week"||this._mode=="day")d=this._correct_shift(d);if(this._drag_mode=="new-size")if(d<=this._drag_start)var f=b.shift||(this._table_view&&!b.custom?864E5:0),c=d-(b.shift? +0:f),d=this._drag_start+(f||this.config.time_step*6E4);else c=this._drag_start;else d<=c&&(d=c+this.config.time_step*6E4)}var g=new Date(d-1),h=new Date(c);if(this._table_view||g.getDate()==h.getDate()&&g.getHours()this._min_date&&t.getHours()>=this.config.first_hour&&t.getHours()";for(var o=0;o<7;o++){l+= +"=d?m="dhx_after":c.valueOf()==e.valueOf()&&(m="dhx_now");l+=" class='"+m+" "+this.templates.month_date_class(c,e)+"' ";l+=">
"+this.templates.month_day(c)+"
";c=this.date.add(c,1,"day")}l+="";i[k]=j;j+=this._colsS.height}l+="";this._max_date=c;a.innerHTML=l;return c}; +scheduler.getLabel=function(a,b){for(var c=this.config.lightbox.sections,d=0;d11?"pm":"am")+"';case "%A":return'"+(date.getHours()>11?"PM":"AM")+"';case "%s":return'"+scheduler.date.to_fixed(date.getSeconds())+"';case "%W":return'"+scheduler.date.to_fixed(scheduler.date.getISOWeek(date))+"';default:return a}});b&&(a=a.replace(/date\.get/g, +"date.getUTC"));return new Function("date",'return "'+a+'";')},str_to_date:function(a,b){for(var c="var temp=date.split(/[^0-9a-zA-Z]+/g);",d=a.match(/%[a-zA-Z]/g),e=0;e50?1900:2000);";break;case "%g":case "%G":case "%h":case "%H":c+="set[3]=temp["+e+"]||0;";break;case "%i":c+="set[4]=temp["+e+"]||0;";break;case "%Y":c+= +"set[0]=temp["+e+"]||0;";break;case "%a":case "%A":c+="set[3]=set[3]%12+((temp["+e+"]||'').toLowerCase()=='am'?0:12);";break;case "%s":c+="set[5]=temp["+e+"]||0;";break;case "%M":c+="set[1]=scheduler.locale.date.month_short_hash[temp["+e+"]]||0;";break;case "%F":c+="set[1]=scheduler.locale.date.month_full_hash[temp["+e+"]]||0;"}var f="set[0],set[1],set[2],set[3],set[4],set[5]";b&&(f=" Date.UTC("+f+")");return new Function("date","var set=[0,0,1,0,0,0]; "+c+" return new Date("+f+");")},getISOWeek:function(a){if(!a)return!1; +var b=a.getDay();b===0&&(b=7);var c=new Date(a.valueOf());c.setDate(a.getDate()+(4-b));var d=c.getFullYear(),e=Math.round((c.getTime()-(new Date(d,0,1)).getTime())/864E5),f=1+Math.floor(e/7);return f},getUTCISOWeek:function(a){return this.getISOWeek(a)}}; +scheduler.locale={date:{month_full:"January,February,March,April,May,June,July,August,September,October,November,December".split(","),month_short:"Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec".split(","),day_full:"Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday".split(","),day_short:"Sun,Mon,Tue,Wed,Thu,Fri,Sat".split(",")},labels:{dhx_cal_today_button:"Today",day_tab:"Day",week_tab:"Week",month_tab:"Month",new_event:"New event",icon_save:"Save",icon_cancel:"Cancel",icon_details:"Details", +icon_edit:"Edit",icon_delete:"Delete",confirm_closing:"",confirm_deleting:"Event will be deleted permanently, are you sure?",section_description:"Description",section_time:"Time period",full_day:"Full day",confirm_recurring:"Do you want to edit the whole set of repeated events?",section_recurring:"Repeat event",button_recurring:"Disabled",button_recurring_open:"Enabled",agenda_tab:"Agenda",date:"Date",description:"Description",year_tab:"Year",week_agenda_tab:"Agenda"}}; +scheduler.config={default_date:"%j %M %Y",month_date:"%F %Y",load_date:"%Y-%m-%d",week_date:"%l",day_date:"%D, %F %j",hour_date:"%H:%i",month_day:"%d",xml_date:"%m/%d/%Y %H:%i",api_date:"%d-%m-%Y %H:%i",hour_size_px:42,time_step:5,start_on_monday:1,first_hour:0,last_hour:24,readonly:!1,drag_resize:1,drag_move:1,drag_create:1,dblclick_create:1,edit_on_create:1,details_on_create:0,click_form_details:0,cascade_event_display:!1,cascade_event_count:4,cascade_event_margin:30,drag_lightbox:!0,preserve_scroll:!0, +server_utc:!1,positive_closing:!1,icons_edit:["icon_save","icon_cancel"],icons_select:["icon_details","icon_edit","icon_delete"],buttons_left:["dhx_save_btn","dhx_cancel_btn"],buttons_right:["dhx_delete_btn"],lightbox:{sections:[{name:"description",height:200,map_to:"text",type:"textarea",focus:!0},{name:"time",height:72,type:"time",map_to:"auto"}]},repeat_date_of_end:"01.01.2010"};scheduler.templates={}; +scheduler.init_templates=function(){var a=scheduler.date.date_to_str,b=scheduler.config,c=function(a,b){for(var c in b)a[c]||(a[c]=b[c])};c(scheduler.templates,{day_date:a(b.default_date),month_date:a(b.month_date),week_date:function(a,b){return scheduler.templates.day_date(a)+" – "+scheduler.templates.day_date(scheduler.date.add(b,-1,"day"))},day_scale_date:a(b.default_date),month_scale_date:a(b.week_date),week_scale_date:a(b.day_date),hour_scale:a(b.hour_date),time_picker:a(b.hour_date),event_date:a(b.hour_date), +month_day:a(b.month_day),xml_date:scheduler.date.str_to_date(b.xml_date,b.server_utc),load_format:a(b.load_date,b.server_utc),xml_format:a(b.xml_date,b.server_utc),api_date:scheduler.date.str_to_date(b.api_date),event_header:function(a,b){return scheduler.templates.event_date(a)+" - "+scheduler.templates.event_date(b)},event_text:function(a,b,c){return c.text},event_class:function(){return""},month_date_class:function(){return""},week_date_class:function(){return""},event_bar_date:function(a){return scheduler.templates.event_date(a)+ +" "},event_bar_text:function(a,b,c){return c.text}});this.callEvent("onTemplatesReady",[])};scheduler.uid=function(){if(!this._seed)this._seed=(new Date).valueOf();return this._seed++};scheduler._events={};scheduler.clearAll=function(){this._events={};this._loaded={};this.clear_view()}; +scheduler.addEvent=function(a,b,c,d,e){if(!arguments.length)return this.addEventNow();var f=a;if(arguments.length!=1)f=e||{},f.start_date=a,f.end_date=b,f.text=c,f.id=d;f.id=f.id||scheduler.uid();f.text=f.text||"";if(typeof f.start_date=="string")f.start_date=this.templates.api_date(f.start_date);if(typeof f.end_date=="string")f.end_date=this.templates.api_date(f.end_date);var g=(this.config.event_duration||this.config.time_step)*6E4;f.start_date.valueOf()==f.end_date.valueOf()&&f.end_date.setTime(f.end_date.valueOf()+ +g);f._timed=this.is_one_day_event(f);var h=!this._events[f.id];this._events[f.id]=f;this.event_updated(f);this._loading||this.callEvent(h?"onEventAdded":"onEventChanged",[f.id,f])};scheduler.deleteEvent=function(a,b){var c=this._events[a];if(b||this.callEvent("onBeforeEventDelete",[a,c])&&this.callEvent("onConfirmedBeforeEventDelete",[a,c]))c&&(delete this._events[a],this.unselect(a),this.event_updated(c)),this.callEvent("onEventDeleted",[a])};scheduler.getEvent=function(a){return this._events[a]}; +scheduler.setEvent=function(a,b){this._events[a]=b};scheduler.for_rendered=function(a,b){for(var c=this._rendered.length-1;c>=0;c--)this._rendered[c].getAttribute("event_id")==a&&b(this._rendered[c],c)};scheduler.changeEventId=function(a,b){if(a!=b){var c=this._events[a];if(c)c.id=b,this._events[b]=c,delete this._events[a];this.for_rendered(a,function(a){a.setAttribute("event_id",b)});if(this._select_id==a)this._select_id=b;if(this._edit_id==a)this._edit_id=b;this.callEvent("onEventIdChange",[a,b])}}; +(function(){for(var a="text,Text,start_date,StartDate,end_date,EndDate".split(","),b=function(a){return function(b){return scheduler.getEvent(b)[a]}},c=function(a){return function(b,c){var d=scheduler.getEvent(b);d[a]=c;d._changed=!0;d._timed=this.is_one_day_event(d);scheduler.event_updated(d,!0)}},d=0;dthis._colsS.height-22){for(var i=g.rows[h].cells,k=0;kb.id?1:-1:a.start_date>b.start_date?1:-1});for(var c=[],d=[],e=0;el)l=i[j]._sorder;f._sorder=l+1;f._inner=!1}else f._sorder=0;i.push(f);i.length>(i.max_count||0)?(i.max_count=i.length,f._count= +i.length):f._count=f._count?f._count:1}if(g=this.config.last_hour)if(d.push(f),a[e]=f=this._copy_event(f),g=this.config.last_hour&&(f.end_date.setMinutes(0),f.end_date.setHours(this.config.last_hour)),f.start_date>f.end_date||g==this.config.last_hour)a.splice(e,1),e--}if(!b){for(e=0;ec.id?1:-1:a.start_date>c.start_date?1:-1})}; +scheduler._pre_render_events_table=function(a,b){this._time_order(a);for(var c=[],d=[[],[],[],[],[],[],[]],e=this._colsS.heights,f,g=this._cols.length,h=0;hthis._max_date)j=this._max_date;var l=this.locate_holder_day(k,!1,i);i._sday=l%g;var o=this.locate_holder_day(j,!0,i)||g;i._eday=o%g||g;i._length=o-l;i._sweek=Math.floor((this._correct_shift(k.valueOf(),1)-this._min_date.valueOf())/(864E5*g));var m= +d[i._sweek],n;for(n=0;n";if(this._quirks7)m.firstChild.style.height=g- +12+"px";this._editor=m.firstChild;this._editor.onkeypress=function(a){if((a||event).shiftKey)return!0;var b=(a||event).keyCode;b==scheduler.keys.edit_save&&scheduler.editStop(!0);b==scheduler.keys.edit_cancel&&scheduler.editStop(!1)};this._editor.onselectstart=function(a){return(a||event).cancelBubble=!0};m.firstChild.focus();this._els.dhx_cal_data[0].scrollLeft=0;m.firstChild.select()}if(this._select_id==a.id){if(this.config.cascade_event_display&&this._drag_mode)o.style.zIndex=1;for(var n=this.config["icons_"+ +(this._edit_id==a.id?"edit":"select")],p="",q=a.color?"background-color:"+a.color+";":"",v=a.textColor?"color:"+a.textColor+";":"",s=0;s
";var r=this._render_v_bar(a.id,i-b+1,f,b,n.length*20+26,"","
",p,!0);r.style.left=i-b+1;this._els.dhx_cal_data[0].appendChild(r);this._rendered.push(r)}}}}; +scheduler._render_v_bar=function(a,b,c,d,e,f,g,h,i){var k=document.createElement("DIV"),j=this.getEvent(a),l="dhx_cal_event",o=scheduler.templates.event_class(j.start_date,j.end_date,j);o&&(l=l+" "+o);var m=j.color?"background-color:"+j.color+";":"",n=j.textColor?"color:"+j.textColor+";":"",p='
';p+='
 
'; +p+='
'+g+"
";p+='
'+h+"
";p+='
';k.innerHTML=p;return k.firstChild};scheduler.locate_holder=function(a){return this._mode=="day"?this._els.dhx_cal_data[0].firstChild:this._els.dhx_cal_data[0].childNodes[a]}; +scheduler.locate_holder_day=function(a,b){var c=Math.floor((this._correct_shift(a,1)-this._min_date)/864E5);b&&this.date.time_part(a)&&c++;return c}; +scheduler.render_event_bar=function(a){var b=this._rendered_location,c=this._colsS[a._sday],d=this._colsS[a._eday];d==c&&(d=this._colsS[a._eday+1]);var e=this.xy.bar_height,f=this._colsS.heights[a._sweek]+(this._colsS.height?this.xy.month_scale_height+2:2)+a._sorder*e,g=document.createElement("DIV"),h=a._timed?"dhx_cal_event_clear":"dhx_cal_event_line",i=scheduler.templates.event_class(a.start_date,a.end_date,a);i&&(h=h+" "+i);var k=a.color?"background-color:"+a.color+";":"",j=a.textColor?"color:"+ +a.textColor+";":"",l='
';a._timed&&(l+=scheduler.templates.event_bar_date(a.start_date,a.end_date,a));l+=scheduler.templates.event_bar_text(a.start_date,a.end_date,a)+"
";l+="
";g.innerHTML=l;this._rendered.push(g.firstChild);b.appendChild(g.firstChild)}; +scheduler._locate_event=function(a){for(var b=null;a&&!b&&a.getAttribute;)b=a.getAttribute("event_id"),a=a.parentNode;return b};scheduler.edit=function(a){if(this._edit_id!=a)this.editStop(!1,a),this._edit_id=a,this.updateEvent(a)};scheduler.editStop=function(a,b){if(!(b&&this._edit_id==b)){var c=this.getEvent(this._edit_id);if(c){if(a)c.text=this._editor.value;this._editor=this._edit_id=null;this.updateEvent(c.id);this._edit_stop_event(c,a)}}}; +scheduler._edit_stop_event=function(a,b){this._new_event?(b?this.callEvent("onEventAdded",[a.id,a]):this.deleteEvent(a.id,!0),this._new_event=null):b&&this.callEvent("onEventChanged",[a.id,a])};scheduler.getEvents=function(a,b){var c=[],d;for(d in this._events){var e=this._events[d];e&&e.start_datea&&c.push(e)}return c};scheduler._loaded={}; +scheduler._load=function(a,b){a=a||this._load_url;a+=(a.indexOf("?")==-1?"?":"&")+"timeshift="+(new Date).getTimezoneOffset();this.config.prevent_cache&&(a+="&uid="+this.uid());var c,b=b||this._date;if(this._load_mode){for(var d=this.templates.load_format,b=this.date[this._load_mode+"_start"](new Date(b.valueOf()));b>this._min_date;)b=this.date.add(b,-1,this._load_mode);c=b;for(var e=!0;cb&&this._loaded[d(f)]);if(c<=b)return!1;for(dhtmlxAjax.get(a+"&from="+d(b)+"&to="+d(c),function(a){scheduler.on_load(a)});b
"},set_value:function(a,b){a.innerHTML=b||""},get_value:function(a){return a.innerHTML||""},focus:function(){}},textarea:{render:function(a){var b=(a.height||"130")+"px";return"
"},set_value:function(a,b){a.firstChild.value=b||""},get_value:function(a){return a.firstChild.value}, +focus:function(a){var b=a.firstChild;b.select();b.focus()}},select:{render:function(a){for(var b=(a.height||"23")+"px",c="
";return c},set_value:function(a,b){if(typeof b=="undefined")b=(a.firstChild.options[0]||{}).value;a.firstChild.value=b||""},get_value:function(a){return a.firstChild.value},focus:function(a){var b= +a.firstChild;b.select&&b.select();b.focus()}},time:{render:function(){var a=scheduler.config,b=this.date.date_part(new Date),c=1440,d=0;scheduler.config.limit_time_select&&(c=60*a.last_hour+1,d=60*a.first_hour,b.setHours(a.first_hour));for(var e=" ";return"
"+e+"  –  "+e+"
"},set_value:function(a, +b,c){function d(a,b,c){a[b+0].value=Math.round((c.getHours()*60+c.getMinutes())/scheduler.config.time_step)*scheduler.config.time_step;a[b+1].value=c.getDate();a[b+2].value=c.getMonth();a[b+3].value=c.getFullYear()}var e=a.getElementsByTagName("select");if(scheduler.config.full_day){if(!a._full_day){var f="";scheduler.config.wide_form||(f=a.previousSibling.innerHTML+ +f);a.previousSibling.innerHTML=f;a._full_day=!0}var g=a.previousSibling.getElementsByTagName("input")[0],h=scheduler.date.time_part(c.start_date)===0&&scheduler.date.time_part(c.end_date)===0&&c.end_date.valueOf()-c.start_date.valueOf()<1728E5;g.checked=h;for(var i in e)e[i].disabled=g.checked;g.onclick=function(){if(g.checked){var a=new Date(c.start_date),b=new Date(c.end_date);scheduler.date.date_part(a);b=scheduler.date.add(a,1,"day")}for(var f in e)e[f].disabled=g.checked;d(e,0,a||c.start_date); +d(e,4,b||c.end_date)}}if(scheduler.config.auto_end_date&&scheduler.config.event_duration)for(var k=function(){c.start_date=new Date(e[3].value,e[2].value,e[1].value,0,e[0].value);c.end_date.setTime(c.start_date.getTime()+scheduler.config.event_duration*6E4);d(e,4,c.end_date)},j=0;j<4;j++)e[j].onchange=k;d(e,0,c.start_date);d(e,4,c.end_date)},get_value:function(a,b){s=a.getElementsByTagName("select");b.start_date=new Date(s[3].value,s[2].value,s[1].value,0,s[0].value);b.end_date=new Date(s[7].value, +s[6].value,s[5].value,0,s[4].value);if(b.end_date<=b.start_date)b.end_date=scheduler.date.add(b.start_date,scheduler.config.time_step,"minute")},focus:function(a){a.getElementsByTagName("select")[0].focus()}}}; +scheduler.showCover=function(a){if(a){a.style.display="block";var b=window.pageYOffset||document.body.scrollTop||document.documentElement.scrollTop,c=window.pageXOffset||document.body.scrollLeft||document.documentElement.scrollLeft,d=window.innerHeight||document.documentElement.clientHeight;a.style.top=b?Math.round(b+Math.max((d-a.offsetHeight)/2,0))+"px":Math.round(Math.max((d-a.offsetHeight)/2,0)+9)+"px";a.style.left=document.documentElement.scrollWidth>document.body.offsetWidth?Math.round(c+(document.body.offsetWidth- +a.offsetWidth)/2)+"px":Math.round((document.body.offsetWidth-a.offsetWidth)/2)+"px"}this.show_cover()};scheduler.showLightbox=function(a){if(a&&this.callEvent("onBeforeLightbox",[a])){var b=this._get_lightbox();this.showCover(b);this._fill_lightbox(a,b);this.callEvent("onLightbox",[a])}}; +scheduler._fill_lightbox=function(a,b){var c=this.getEvent(a),d=b.getElementsByTagName("span");scheduler.templates.lightbox_header?(d[1].innerHTML="",d[2].innerHTML=scheduler.templates.lightbox_header(c.start_date,c.end_date,c)):(d[1].innerHTML=this.templates.event_header(c.start_date,c.end_date,c),d[2].innerHTML=(this.templates.event_bar_text(c.start_date,c.end_date,c)||"").substr(0,70));for(var e=this.config.lightbox.sections,f=0;f
"+scheduler.locale.labels[c[d]]+"
";c=this.config.buttons_right;for(d=0;d
"+scheduler.locale.labels[c[d]]+"
";b+="
";a.innerHTML=b;if(scheduler.config.drag_lightbox)a.firstChild.onmousedown= +scheduler._ready_to_dnd,a.firstChild.onselectstart=function(){return!1},a.firstChild.style.cursor="pointer",scheduler._init_dnd_events();document.body.insertBefore(a,document.body.firstChild);this._lightbox=a;for(var e=this.config.lightbox.sections,b="",d=0;d
"+this.locale.labels["button_"+ +e[d].button]+"
");this.config.wide_form&&(b+="
");b+="
"+g+this.locale.labels["section_"+e[d].name]+"
"+f.render.call(this,e[d]);b+="
"}}var h=a.getElementsByTagName("div");h[1].innerHTML=b;this.setLightboxSize();this._init_lightbox_events(this);a.style.display="none";a.style.visibility="visible"}return this._lightbox};scheduler._lightbox_template="
 
"; +scheduler._dp_init=function(a){a._methods=["setEventTextStyle","","changeEventId","deleteEvent"];this.attachEvent("onEventAdded",function(b){!this._loading&&this.validId(b)&&a.setUpdated(b,!0,"inserted")});this.attachEvent("onConfirmedBeforeEventDelete",function(b){if(this.validId(b)){var c=a.getState(b);if(c=="inserted"||this._new_event)return a.setUpdated(b,!1),!0;if(c=="deleted")return!1;if(c=="true_deleted")return!0;a.setUpdated(b,!0,"deleted");return!1}});this.attachEvent("onEventChanged",function(b){!this._loading&& +this.validId(b)&&a.setUpdated(b,!0,"updated")});a._getRowData=function(a){var c=this.obj.getEvent(a),d={},e;for(e in c)e.indexOf("_")!=0&&(d[e]=c[e]&&c[e].getUTCFullYear?this.obj.templates.xml_format(c[e]):c[e]);return d};a._clearUpdateFlag=function(){};a.attachEvent("insertCallback",scheduler._update_callback);a.attachEvent("updateCallback",scheduler._update_callback);a.attachEvent("deleteCallback",function(a,c){this.obj.setUserData(c,this.action_param,"true_deleted");this.obj.deleteEvent(c)})}; +scheduler.setUserData=function(a,b,c){a?this.getEvent(a)[b]=c:this._userdata[b]=c};scheduler.getUserData=function(a,b){return a?this.getEvent(a)[b]:this._userdata[b]};scheduler.setEventTextStyle=function(a,b){this.for_rendered(a,function(a){a.style.cssText+=";"+b});var c=this.getEvent(a);c._text_style=b;this.event_updated(c)};scheduler.validId=function(){return!0}; +scheduler._update_callback=function(a){var b=scheduler.xmlNodeToJSON(a.firstChild);b.text=b.text||b._tagvalue;b.start_date=scheduler.templates.xml_date(b.start_date);b.end_date=scheduler.templates.xml_date(b.end_date);scheduler.addEvent(b)}; diff --git a/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/dhtmlxscheduler_debug.js b/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/dhtmlxscheduler_debug.js index a3c14bee033..6b2e961051c 100644 --- a/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/dhtmlxscheduler_debug.js +++ b/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/dhtmlxscheduler_debug.js @@ -1,11 +1,38 @@ -/* -dhtmlxScheduler v.2.3 - +/* This software is allowed to use under GPL or you need to obtain Commercial or Enterise License -to use it in not GPL project. Please contact sales@dhtmlx.com for details +to use it in not GPL project. Please contact sales@dhtmlx.com for details +*/ + +window.dhtmlx || (dhtmlx=function(obj){ + for (var a in obj) dhtmlx[a]=obj[a]; + return dhtmlx; //simple singleton +}) +dhtmlx.extend_api=function(name,map,ext){ + var t = window[name]; + if (!t) return; //component not defined + window[name]=function(obj){ + if (obj && typeof obj == "object" && !obj.tagName && !(obj instanceof Array)){ + var that = t.apply(this,(map._init?map._init(obj):arguments)); + //global settings + for (var a in dhtmlx) + if (map[a]) this[map[a]](dhtmlx[a]); + //local settings + for (var a in obj){ + if (map[a]) this[map[a]](obj[a]); + else if (a.indexOf("on")==0){ + this.attachEvent(a,obj[a]); + } + } + } else + var that = t.apply(this,arguments); + if (map._patch) map._patch(this); + return that||this; + }; + window[name].prototype=t.prototype; + if (ext) + dhtmlXHeir(window[name].prototype,ext); +}; -(c) DHTMLX Ltd. -*/ dhtmlxAjax={ get:function(url,callback){ var t=new dtmlXMLLoaderObject(true); @@ -554,12 +581,15 @@ dhtmlDragAndDropObject.prototype.initFrameRoute=function(win, mode){ } } -var _isFF = false; -var _isIE = false; -var _isOpera = false; -var _isKHTML = false; -var _isMacOS = false; -var _isChrome = false; +_isFF = false; +_isIE = false; +_isOpera = false; +_isKHTML = false; +_isMacOS = false; +_isChrome = false; +_KHTMLrv = false; +_OperaRv = false; +_FFrv = false; if (navigator.userAgent.indexOf('Macintosh') != -1) _isMacOS=true; @@ -876,8 +906,14 @@ dhtmlxEventable=function(obj){ this[list[0]].removeEvent(list[1]); //remove event } } + obj.detachAllEvents = function(){ + for (var name in this){ + if (name.indexOf("ev_")==0) + delete this[name]; + } + } } - + /** * @desc: constructor, data processor object * @param: serverProcessorURL - url used for update @@ -1242,6 +1278,8 @@ dataProcessor.prototype={ var soid = sid; switch (action) { + case "update": + case "updated": case "inserted": case "insert": if (tid != sid) { @@ -1458,7 +1496,7 @@ dataProcessor.prototype={ }; -//(c)dhtmlx ltd. www.dhtmlx.com +//(c)dhtmlx ltd. www.dhtmlx.com dataProcessor.prototype._o_init = dataProcessor.prototype.init; dataProcessor.prototype.init=function(obj){ this._console=this._console||this._createConsole(); @@ -1547,7 +1585,7 @@ dataProcessor.wrap("sendData",function(rowId){ if (!this.obj._idpull[rowId]) this._log(" Error! item with such ID not exists "+rowId+""); } else { - if (!this.obj.rowsAr[rowId]) + if (this.rowsAr && !this.obj.rowsAr[rowId]) this._log(" Error! row with such ID not exists "+rowId+""); } } @@ -1611,7 +1649,7 @@ dataProcessor.wrap("afterUpdateCallback",function(sid,tid,action){ if (this.obj.mytype=="tree"){ if (!this.obj._idpull[sid]) this._log("Incorrect SID, item with such ID not exists in grid"); } else { - if (!this.obj.rowsAr[sid]) this._log("Incorrect SID, row with such ID not exists in grid"); + if (this.obj.rowsAr && !this.obj.rowsAr[sid]) this._log("Incorrect SID, row with such ID not exists in grid"); } this._log(" Action: "+action+" SID:"+sid+" TID:"+tid); },function(){ @@ -1623,7 +1661,7 @@ dataProcessor.wrap("afterUpdateCallback",function(sid,tid,action){ - + /* dhx_sort[index]=direction dhx_filter[index]=mask @@ -1633,10 +1671,10 @@ if (window.dhtmlXGridObject){ dhtmlXGridObject.prototype._init_point=function(){ var clear_url=function(url){ url=url.replace(/(\?|\&)connector[^\f]*/g,""); - return url+(url.indexOf("?")!=-1?"&":"?")+"connector=true"+(mygrid.hdr.rows.length > 0 ? "&dhx_no_header=1":""); + return url+(url.indexOf("?")!=-1?"&":"?")+"connector=true"+(this.hdr.rows.length > 0 ? "&dhx_no_header=1":""); }; var combine_urls=function(url){ - return clear_url(url)+(this._connector_sorting||"")+(this._connector_filter||""); + return clear_url.call(this,url)+(this._connector_sorting||"")+(this._connector_filter||""); }; var sorting_url=function(url,ind,dir){ this._connector_sorting="&dhx_sort["+ind+"]="+dir; @@ -1738,14 +1776,10 @@ if (window.dhtmlXGridObject){ } if (this._con_f_used[f*1]) this._con_f_used[f*1]=v; - }; + } this._colls_loaded=true; } - }; - - - - + }; } if (window.dataProcessor){ @@ -1757,16 +1791,20 @@ if (window.dataProcessor){ this.setTransactionMode("POST",true); this.serverProcessor+=(this.serverProcessor.indexOf("?")!=-1?"&":"?")+"editing=true"; }; -}; +} dhtmlxError.catchError("LoadXML",function(a,b,c){ - alert(c[0].responseText); + if (c[0].status != 0) { + alert(c[0].responseText); + } }); - -window.dhtmlXScheduler=window.scheduler={version:2.2}; + +window.dhtmlXScheduler=window.scheduler={version:3.0}; dhtmlxEventable(scheduler); scheduler.init=function(id,date,mode){ date=date||(new Date()); mode=mode||"week"; + + scheduler.date.init(); this._obj=(typeof id == "string")?document.getElementById(id):id; this._els=[]; @@ -1783,9 +1821,9 @@ scheduler.init=function(id,date,mode){ if (scheduler.callEvent("onSchedulerResize",[])) scheduler.update_view(); }, 100); - }) - + }); this.set_sizes(); + scheduler.callEvent('onSchedulerReady', []); this.setCurrentView(date,mode); }; scheduler.xy={ @@ -1821,7 +1859,7 @@ scheduler.set_sizes=function(){ var data_y=this.xy.scale_height+this.xy.nav_height+(this._quirks?-2:0); this.set_xy(this._els["dhx_cal_data"][0],w,h-(data_y+2),0,data_y+2); -} +}; scheduler.set_xy=function(node,w,h,x,y){ node.style.width=Math.max(0,w)+"px"; node.style.height=Math.max(0,h)+"px"; @@ -1829,7 +1867,7 @@ scheduler.set_xy=function(node,w,h,x,y){ node.style.left=x+"px"; node.style.top=y+"px"; } -} +}; scheduler.get_elements=function(){ //get all child elements as named hash var els=this._obj.getElementsByTagName("DIV"); @@ -1842,26 +1880,26 @@ scheduler.get_elements=function(){ var t=scheduler.locale.labels[els[i].getAttribute("name")||name]; if (t) els[i].innerHTML=t; } -} +}; scheduler.set_actions=function(){ for (var a in this._els) if (this._click[a]) for (var i=0; i < this._els[a].length; i++) this._els[a][i].onclick=scheduler._click[a]; - this._obj.onselectstart=function(e){ return false; } + this._obj.onselectstart=function(e){ return false; }; this._obj.onmousemove=function(e){ scheduler._on_mouse_move(e||event); - } + }; this._obj.onmousedown=function(e){ scheduler._on_mouse_down(e||event); - } + }; this._obj.onmouseup=function(e){ scheduler._on_mouse_up(e||event); - } + }; this._obj.ondblclick=function(e){ scheduler._on_dbl_click(e||event); } -} +}; scheduler.select=function(id){ if (this._table_view || !this.getEvent(id)._timed) return; //temporary block if (this._select_id==id) return; @@ -1869,13 +1907,13 @@ scheduler.select=function(id){ this.unselect(); this._select_id = id; this.updateEvent(id); -} +}; scheduler.unselect=function(id){ if (id && id!=this._select_id) return; var t=this._select_id; this._select_id = null; if (t) this.updateEvent(t); -} +}; scheduler.getState=function(){ return { mode: this._mode, @@ -1883,11 +1921,13 @@ scheduler.getState=function(){ min_date: this._min_date, max_date: this._max_date, editor_id: this._edit_id, - lightbox_id: this._lightbox_id + lightbox_id: this._lightbox_id, + new_event: this._new_event }; -} +}; scheduler._click={ dhx_cal_data:function(e){ + //debugger; var trg = e?e.target:event.srcElement; var id = scheduler._locate_event(trg); @@ -1913,7 +1953,8 @@ scheduler._click={ scheduler.setCurrentView(new Date()); }, dhx_cal_tab:function(){ - var mode = this.getAttribute("name").split("_")[0]; + var name = this.getAttribute("name"); + var mode = name.substring(0, name.search("_tab")); scheduler.setCurrentView(scheduler._date,mode); }, buttons:{ @@ -1923,11 +1964,10 @@ scheduler._click={ details:function(id){ scheduler.showLightbox(id); }, cancel:function(id){ scheduler.editStop(false); } } -} - +}; scheduler.addEventNow=function(start,end,e){ var base = {}; - if (typeof start == "object"){ + if (start && start.constructor.toString().match(/object/i) !== null){ base = start; start = null; } @@ -1943,14 +1983,18 @@ scheduler.addEventNow=function(start,end,e){ } end = start+d; } - - + var end_date = new Date(end); + + // scheduler.addEventNow(new Date(), new Date()) + collision though get_visible events defect (such event was not retrieved) + if(start_date.valueOf() == end_date.valueOf()) + end_date.setTime(end_date.valueOf()+d); + base.start_date = base.start_date||start_date; - base.end_date = base.end_date||new Date(end); + base.end_date = base.end_date||end_date; base.text = base.text||this.locale.labels.new_event; base.id = this._drag_id = this.uid(); this._drag_mode="new-size"; - + this._loading=true; this.addEvent(base); this.callEvent("onEventCreated",[this._drag_id,e]); @@ -1958,7 +2002,7 @@ scheduler.addEventNow=function(start,end,e){ this._drag_event={}; //dummy , to trigger correct event updating logic this._on_mouse_up(e); -} +}; scheduler._on_dbl_click=function(e,src){ src = src||(e.target||e.srcElement); if (this.config.readonly) return; @@ -1967,6 +2011,7 @@ scheduler._on_dbl_click=function(e,src){ case "dhx_scale_holder": case "dhx_scale_holder_now": case "dhx_month_body": + case "dhx_wa_day_data": if (!scheduler.config.dblclick_create) break; var pos=this._mouse_coords(e); var start=this._min_date.valueOf()+(pos.y*this.config.time_step+(this._table_view?0:pos.x)*24*60)*60000; @@ -1974,6 +2019,7 @@ scheduler._on_dbl_click=function(e,src){ this.addEventNow(start,null,e); break; case "dhx_body": + case "dhx_wa_ev_body": case "dhx_cal_event_line": case "dhx_cal_event_clear": var id = this._locate_event(src); @@ -1991,7 +2037,7 @@ scheduler._on_dbl_click=function(e,src){ if (t) t.call(this,e); break; } -} +}; scheduler._mouse_coords=function(ev){ var pos; @@ -2002,17 +2048,17 @@ scheduler._mouse_coords=function(ev){ else pos={ x:ev.clientX + (b.scrollLeft||d.scrollLeft||0) - b.clientLeft, y:ev.clientY + (b.scrollTop||d.scrollTop||0) - b.clientTop - } + }; //apply layout pos.x-=getAbsoluteLeft(this._obj)+(this._table_view?0:this.xy.scale_width); pos.y-=getAbsoluteTop(this._obj)+this.xy.nav_height+(this._dy_shift||0)+this.xy.scale_height-this._els["dhx_cal_data"][0].scrollTop; pos.ev = ev; - + var handler = this["mouse_"+this._mode]; if (handler) return handler.call(this,pos); - + //transform to date if (!this._table_view){ pos.x=Math.max(0,Math.ceil(pos.x/this._cols[0])-1); @@ -2022,7 +2068,7 @@ scheduler._mouse_coords=function(ev){ for (dy=1; dy < this._colsS.heights.length; dy++) if (this._colsS.heights[dy]>pos.y) break; - pos.y=(Math.max(0,Math.ceil(pos.x/this._cols[0])-1)+Math.max(0,dy-1)*7)*24*60/this.config.time_step; + pos.y=(Math.max(0,Math.ceil(pos.x/this._cols[0])-1)+Math.max(0,dy-1)*7)*24*60/this.config.time_step; pos.x=0; } @@ -2034,14 +2080,14 @@ scheduler._close_not_saved=function(){ if (!c || confirm(c)) scheduler.editStop(scheduler.config.positive_closing); } -} +}; scheduler._correct_shift=function(start, back){ return start-=((new Date(scheduler._min_date)).getTimezoneOffset()-(new Date(start)).getTimezoneOffset())*60000*(back?-1:1); -} +}; scheduler._on_mouse_move=function(e){ if (this._drag_mode){ var pos=this._mouse_coords(e); - if (!this._drag_pos || this._drag_pos.x!=pos.x || this._drag_pos.y!=pos.y){ + if (!this._drag_pos || pos.custom || this._drag_pos.x!=pos.x || this._drag_pos.y!=pos.y){ if (this._edit_id!=this._drag_id) this._close_not_saved(); @@ -2080,8 +2126,11 @@ scheduler._on_mouse_move=function(e){ end = ev.end_date.valueOf()-(ev.start_date.valueOf()-start); } else { start = ev.start_date.valueOf(); - if (this._table_view) + if (this._table_view) { end = this._min_date.valueOf()+pos.y*this.config.time_step*60000 + (pos.custom?0:24*60*60000); + if (this._mode == "month") + end = this._correct_shift(end, false); + } else{ end = this.date.date_part(new Date(ev.end_date)).valueOf()+pos.y*this.config.time_step*60000; this._els["dhx_cal_data"][0].style.cursor="s-resize"; @@ -2091,7 +2140,7 @@ scheduler._on_mouse_move=function(e){ if (this._drag_mode == "new-size"){ if (end <= this._drag_start){ var shift = pos.shift||((this._table_view && !pos.custom)?24*60*60000:0); - start = end-shift; + start = end-(pos.shift?0:shift); end = this._drag_start+(shift||(this.config.time_step*60000)); } else { start = this._drag_start; @@ -2103,7 +2152,7 @@ scheduler._on_mouse_move=function(e){ var new_end = new Date(end-1); var new_start = new Date(start); //prevent out-of-borders situation for day|week view - if (this._table_view || (new_end.getDate()==new_start.getDate() && new_end.getHours() this._min_date && now.getHours() >= this.config.first_hour && now.getHours()
" + html+=">
"+this.templates.month_day(sd)+"
"; sd=this.date.add(sd,1,"day"); } html+=""; @@ -2389,7 +2479,7 @@ scheduler._reset_month_scale=function(b,dd,sd){ b.innerHTML=html; return sd; -} +}; scheduler.getLabel = function(property, key) { var sections = this.config.lightbox.sections; for (var i=0; ib.start_date?1:-1; }); + evs.sort(function(a,b){ + if(a.start_date.valueOf()==b.start_date.valueOf()) + return a.id>b.id?1:-1; + return a.start_date>b.start_date?1:-1; + }); var days=[]; //events by weeks var evs_originals = []; for (var i=0; i < evs.length; i++) { @@ -2926,12 +3090,70 @@ scheduler._pre_render_events_line=function(evs,hold){ if (!hold){ ev._inner=false; + var stack=days[ev._sday]; while (stack.length && stack[stack.length-1].end_date<=ev.start_date) stack.splice(stack.length-1,1); - if (stack.length) stack[stack.length-1]._inner=true; - ev._sorder=stack.length; stack.push(ev); - if (stack.length>(stack.max_count||0)) stack.max_count=stack.length; + + var sorderSet = false; + for(var j=0; j _max_sorder) + _max_sorder = stack[j]._sorder; + ev._sorder = _max_sorder + 1; + ev._inner = false; + } + + } + else + ev._sorder = 0; + } + + stack.push(ev); + + if (stack.length>(stack.max_count||0)) { + stack.max_count=stack.length; + ev._count=stack.length; + } + else { + ev._count=(ev._count)?ev._count:1; + } } if (sh < this.config.first_hour || eh >= this.config.last_hour){ @@ -2949,23 +3171,23 @@ scheduler._pre_render_events_line=function(evs,hold){ evs.splice(i,1); i--; continue; } } - } if (!hold){ - for (var i=0; i < evs.length; i++) - evs[i]._count=days[evs[i]._sday].max_count; - for (var i=0; i < evs_originals.length; i++) + for (var i=0; i < evs.length; i++) { + evs[i]._count = days[evs[i]._sday].max_count; + } + for (var i=0; i < evs_originals.length; i++) evs_originals[i]._count=days[evs_originals[i]._sday].max_count; } return evs; }; scheduler._time_order=function(evs){ - evs.sort(function(a,b){ + evs.sort(function(a,b){ if (a.start_date.valueOf()==b.start_date.valueOf()){ if (a._timed && !b._timed) return 1; if (!a._timed && b._timed) return -1; - return 0; + return a.id>b.id?1:-1; } return a.start_date>b.start_date?1:-1; }); @@ -3004,8 +3226,10 @@ scheduler._pre_render_events_table=function(evs,hold){ // max - max height of we for (stack_line=0; stack_line"; - var obj = this._render_v_bar(ev.id,left-menu+1,top,menu,icons.length*20+26,"","
",icons_str,true); + icons_str+="
"; + var obj = this._render_v_bar(ev.id,left-menu+1,top,menu,icons.length*20+26,"","
",icons_str,true); obj.style.left=left-menu+1; this._els["dhx_cal_data"][0].appendChild(obj); this._rendered.push(obj); @@ -3132,17 +3364,19 @@ scheduler.render_event=function(ev){ }; scheduler._render_v_bar=function(id,x,y,w,h,style,contentA,contentB,bottom){ var d=document.createElement("DIV"); - var ev = this.getEvent(id); var cs = "dhx_cal_event"; var cse = scheduler.templates.event_class(ev.start_date,ev.end_date,ev); if (cse) cs=cs+" "+cse; + + var bg_color = (ev.color?("background-color:"+ev.color+";"):""); + var color = (ev.textColor?("color:"+ev.textColor+";"):""); var html='
'; - html+='
 
'; - html+='
'+contentA+'
'; - html+='
'+contentB+'
'; - html+='
'; + html+='
 
'; + html+='
'+contentA+'
'; + html+='
'+contentB+'
'; + html+=''; d.innerHTML=html; return d.firstChild; @@ -3158,22 +3392,25 @@ scheduler.locate_holder_day=function(date,past){ return day; }; scheduler.render_event_bar=function(ev){ - var parent=this._els["dhx_cal_data"][0]; + var parent=this._rendered_location; var x=this._colsS[ev._sday]; var x2=this._colsS[ev._eday]; if (x2==x) x2=this._colsS[ev._eday+1]; var hb = this.xy.bar_height; - var y=this._colsS.heights[ev._sweek]+(this._colsS.height?(this.xy.month_scale_height+2):2)+ev._sorder*hb; + var y=this._colsS.heights[ev._sweek]+(this._colsS.height?(this.xy.month_scale_height+2):2)+(ev._sorder*hb); var d=document.createElement("DIV"); var cs = ev._timed?"dhx_cal_event_clear":"dhx_cal_event_line"; var cse = scheduler.templates.event_class(ev.start_date,ev.end_date,ev); - if (cse) cs=cs+" "+cse; + if (cse) cs=cs+" "+cse; + + var bg_color = (ev.color?("background-color:"+ev.color+";"):""); + var color = (ev.textColor?("color:"+ev.textColor+";"):""); + + var html='
'; - var html='
'; - if (ev._timed) html+=scheduler.templates.event_bar_date(ev.start_date,ev.end_date,ev); html+=scheduler.templates.event_bar_text(ev.start_date,ev.end_date,ev)+'
'; @@ -3230,6 +3467,7 @@ scheduler.getEvents = function(from,to){ } return result; }; + scheduler._loaded={}; scheduler._load=function(url,from){ url=url||this._load_url; @@ -3270,13 +3508,14 @@ scheduler._load=function(url,from){ dhtmlxAjax.get(url,function(l){scheduler.on_load(l);}); this.callEvent("onXLS",[]); return true; -} +}; scheduler.on_load=function(loader){ this._loading=true; + var evs; if (this._process) - var evs=this[this._process].parse(loader.xmlDoc.responseText); + evs=this[this._process].parse(loader.xmlDoc.responseText); else - var evs=this._magic_parser(loader); + evs=this._magic_parser(loader); this._not_render=true; for (var i=0; i
"; + }, + set_value:function(node,value,ev,config){ + node.innerHTML = value||""; + }, + get_value:function(node,ev,config){ + return node.innerHTML||""; + }, + focus: function(node){ + } + }, textarea:{ render:function(sns){ var height=(sns.height||"130")+"px"; @@ -3499,7 +3783,7 @@ scheduler.form_blocks={ select:{ render:function(sns){ var height=(sns.height||"23")+"px"; - var html="
"; for (var i=0; i < sns.options.length; i++) html+=""; html+="
"; @@ -3530,10 +3814,16 @@ scheduler.form_blocks={ } var html=" "; - return "
"+html+"  –  "+html+"
"; + return "
"+html+"  –  "+html+"
"; }, set_value:function(node,value,ev){ + var s=node.getElementsByTagName("select"); if(scheduler.config.full_day) { if (!node._full_day){ - node.previousSibling.innerHTML+="
"; + var html = ""; + if (!scheduler.config.wide_form) + html = node.previousSibling.innerHTML+html; + node.previousSibling.innerHTML=html; node._full_day=true; } var input=node.previousSibling.getElementsByTagName("input")[0]; - var isFulldayEvent = (scheduler.date.time_part(ev.start_date)==0 && scheduler.date.time_part(ev.end_date)==0 && ev.end_date.valueOf()-ev.start_date.valueOf() < 2*24*60*60*1000); + var isFulldayEvent = (scheduler.date.time_part(ev.start_date)===0 && scheduler.date.time_part(ev.end_date)===0 && ev.end_date.valueOf()-ev.start_date.valueOf() < 2*24*60*60*1000); input.checked = isFulldayEvent; for(var k in s) @@ -3578,14 +3872,14 @@ scheduler.form_blocks={ var end_date = new Date(ev.end_date); scheduler.date.date_part(start_date); - end_date = scheduler.date.add(start_date, 1, "day") + end_date = scheduler.date.add(start_date, 1, "day"); } for(var i in s) s[i].disabled=input.checked; _fill_lightbox_select(s,0,start_date||ev.start_date); _fill_lightbox_select(s,4,end_date||ev.end_date); - } + }; } if(scheduler.config.auto_end_date && scheduler.config.event_duration) { @@ -3620,16 +3914,29 @@ scheduler.form_blocks={ node.getElementsByTagName("select")[0].focus(); } } -} +}; scheduler.showCover=function(box){ - this.show_cover(); if (box){ box.style.display="block"; - var pos = getOffset(this._obj); - box.style.top=Math.round(pos.top+(this._obj.offsetHeight-box.offsetHeight)/2)+"px"; - box.style.left=Math.round(pos.left+(this._obj.offsetWidth-box.offsetWidth)/2)+"px"; + + var scroll_top = window.pageYOffset||document.body.scrollTop||document.documentElement.scrollTop; + var scroll_left = window.pageXOffset||document.body.scrollLeft||document.documentElement.scrollLeft; + + var view_height = window.innerHeight||document.documentElement.clientHeight; + + if(scroll_top) // if vertical scroll on window + box.style.top=Math.round(scroll_top+Math.max((view_height-box.offsetHeight)/2, 0))+"px"; + else // vertical scroll on body + box.style.top=Math.round(Math.max(((view_height-box.offsetHeight)/2), 0) + 9)+"px"; // +9 for compatibility with auto tests + + // not quite accurate but used for compatibility reasons + if(document.documentElement.scrollWidth > document.body.offsetWidth) // if horizontal scroll on the window + box.style.left=Math.round(scroll_left+(document.body.offsetWidth-box.offsetWidth)/2)+"px"; + else // horizontal scroll on the body + box.style.left=Math.round((document.body.offsetWidth-box.offsetWidth)/2)+"px"; } -} + this.show_cover(); +}; scheduler.showLightbox=function(id){ if (!id) return; if (!this.callEvent("onBeforeLightbox",[id])) return; @@ -3637,7 +3944,7 @@ scheduler.showLightbox=function(id){ this.showCover(box); this._fill_lightbox(id,box); this.callEvent("onLightbox",[id]); -} +}; scheduler._fill_lightbox=function(id,box){ var ev=this.getEvent(id); var s=box.getElementsByTagName("span"); @@ -3654,24 +3961,25 @@ scheduler._fill_lightbox=function(id,box){ for (var i=0; i < sns.length; i++) { var node=document.getElementById(sns[i].id).nextSibling; var block=this.form_blocks[sns[i].type]; - block.set_value.call(this,node,ev[sns[i].map_to],ev, sns[i]) + block.set_value.call(this,node,ev[sns[i].map_to],ev, sns[i]); if (sns[i].focus) block.focus.call(this,node); - }; + } scheduler._lightbox_id=id; -} +}; scheduler._lightbox_out=function(ev){ var sns = this.config.lightbox.sections; for (var i=0; i < sns.length; i++) { - var node=document.getElementById(sns[i].id).nextSibling; + var node = document.getElementById(sns[i].id); + node=(node?node.nextSibling:node); var block=this.form_blocks[sns[i].type]; var res=block.get_value.call(this,node,ev, sns[i]); if (sns[i].map_to!="auto") ev[sns[i].map_to]=res; } return ev; -} +}; scheduler._empty_lightbox=function(){ var id=scheduler._lightbox_id; var ev=this.getEvent(id); @@ -3681,38 +3989,41 @@ scheduler._empty_lightbox=function(){ ev._timed=this.is_one_day_event(ev); this.setEvent(ev.id,ev); - this._edit_stop_event(ev,true) + this._edit_stop_event(ev,true); this.render_view_data(); -} +}; scheduler.hide_lightbox=function(id){ this.hideCover(this._get_lightbox()); this._lightbox_id=null; this.callEvent("onAfterLightbox",[]); -} +}; scheduler.hideCover=function(box){ if (box) box.style.display="none"; this.hide_cover(); -} +}; scheduler.hide_cover=function(){ if (this._cover) this._cover.parentNode.removeChild(this._cover); this._cover=null; -} +}; scheduler.show_cover=function(){ this._cover=document.createElement("DIV"); this._cover.className="dhx_cal_cover"; + var _document_height = ((document.height !== undefined) ? document.height : document.body.offsetHeight); + var _scroll_height = ((document.documentElement) ? document.documentElement.scrollHeight : 0); + this._cover.style.height = Math.max(_document_height, _scroll_height) + 'px'; document.body.appendChild(this._cover); -} +}; scheduler.save_lightbox=function(){ - if (this.checkEvent("onEventSave") && !this.callEvent("onEventSave",[this._lightbox_id,this._lightbox_out({ id: this._lightbox_id}), this._new_event])) + if (this.checkEvent("onEventSave") && !this.callEvent("onEventSave",[this._lightbox_id,this._lightbox_out({ id: this._lightbox_id}), this._new_event])) return; - this._empty_lightbox() + this._empty_lightbox(); this.hide_lightbox(); }; scheduler.startLightbox = function(id, box){ this._lightbox_id=id; this.showCover(box); -} +}; scheduler.endLightbox = function(mode, box){ this._edit_stop_event(scheduler.getEvent(this._lightbox_id),mode); if (mode) @@ -3720,6 +4031,8 @@ scheduler.endLightbox = function(mode, box){ this.hideCover(box); }; scheduler.resetLightbox = function(){ + if (scheduler._lightbox) + scheduler._lightbox.parentNode.removeChild(scheduler._lightbox); scheduler._lightbox = null; }; scheduler.cancel_lightbox=function(){ @@ -3749,15 +4062,18 @@ scheduler._init_lightbox_events=function(){ break; default: - if (src.className.indexOf("dhx_custom_button_")!=-1){ + if (src.getAttribute("dhx_button")){ + scheduler.callEvent("onLightboxButton", [src.className, src, e]); + } else if (src.className.indexOf("dhx_custom_button_")!=-1){ var index = src.parentNode.getAttribute("index"); var block=scheduler.form_blocks[scheduler.config.lightbox.sections[index].type]; var sec = src.parentNode.parentNode; block.button_click(index,src,sec,sec.nextSibling); } + break; } }; - this._get_lightbox().onkeypress=function(e){ + this._get_lightbox().onkeydown=function(e){ switch((e||event).keyCode){ case scheduler.keys.edit_save: if ((e||event).shiftKey) return; @@ -3766,9 +4082,11 @@ scheduler._init_lightbox_events=function(){ case scheduler.keys.edit_cancel: scheduler.cancel_lightbox(); break; + default: + break; } - } -} + }; +}; scheduler.setLightboxSize=function(){ var d = this._lightbox; if (!d) return; @@ -3778,36 +4096,92 @@ scheduler.setLightboxSize=function(){ con.style.height=con.scrollHeight+"px"; d.style.height=con.scrollHeight+50+"px"; con.style.height=con.scrollHeight+"px"; //it is incredible , how ugly IE can be -} +}; -scheduler._get_lightbox=function(){ +scheduler._init_dnd_events = function(){ + dhtmlxEvent(document.body, "mousemove", scheduler._move_while_dnd); + dhtmlxEvent(document.body, "mouseup", scheduler._finish_dnd); + scheduler._init_dnd_events = function(){}; +}; +scheduler._move_while_dnd = function(e){ + if (scheduler._dnd_start_lb){ + if (!document.dhx_unselectable){ + document.body.className += " dhx_unselectable"; + document.dhx_unselectable = true; + } + var lb = scheduler._get_lightbox(); + var now = (e&&e.target)?[e.pageX, e.pageY]:[event.clientX, event.clientY]; + lb.style.top = scheduler._lb_start[1]+now[1]-scheduler._dnd_start_lb[1]+"px"; + lb.style.left = scheduler._lb_start[0]+now[0]-scheduler._dnd_start_lb[0]+"px"; + } +}; +scheduler._ready_to_dnd = function(e){ + var lb = scheduler._get_lightbox(); + scheduler._lb_start = [parseInt(lb.style.left,10), parseInt(lb.style.top,10)]; + scheduler._dnd_start_lb = (e&&e.target)?[e.pageX, e.pageY]:[event.clientX, event.clientY]; +}; +scheduler._finish_dnd = function(){ + if (scheduler._lb_start){ + scheduler._lb_start = scheduler._dnd_start_lb = false; + document.body.className = document.body.className.replace(" dhx_unselectable",""); + document.dhx_unselectable = false; + } +}; +scheduler._get_lightbox=function(){ //scheduler.config.wide_form=true; if (!this._lightbox){ var d=document.createElement("DIV"); d.className="dhx_cal_light"; + if (scheduler.config.wide_form) + d.className+=" dhx_cal_light_wide"; + if (scheduler.form_blocks.recurring) + d.className+=" dhx_cal_light_rec"; + if (/msie|MSIE 6/.test(navigator.userAgent)) d.className+=" dhx_ie6"; d.style.visibility="hidden"; - d.innerHTML=this._lightbox_template; + var html = this._lightbox_template + var buttons = this.config.buttons_left; + scheduler.locale.labels["dhx_save_btn"] = scheduler.locale.labels.icon_save; + scheduler.locale.labels["dhx_cancel_btn"] = scheduler.locale.labels.icon_cancel; + scheduler.locale.labels["dhx_delete_btn"] = scheduler.locale.labels.icon_delete; + for (var i = 0; i < buttons.length; i++) + html+="
"+scheduler.locale.labels[buttons[i]]+"
"; + buttons = this.config.buttons_right; + for (var i = 0; i < buttons.length; i++) + html+="
"+scheduler.locale.labels[buttons[i]]+"
"; + + html+=""; + d.innerHTML=html; + if (scheduler.config.drag_lightbox){ + d.firstChild.onmousedown = scheduler._ready_to_dnd; + d.firstChild.onselectstart = function(){ return false; }; + d.firstChild.style.cursor = "pointer"; + scheduler._init_dnd_events(); + + } document.body.insertBefore(d,document.body.firstChild); this._lightbox=d; var sns=this.config.lightbox.sections; - var html=""; + html=""; for (var i=0; i < sns.length; i++) { var block=this.form_blocks[sns[i].type]; if (!block) continue; //ignore incorrect blocks sns[i].id="area_"+this.uid(); var button = ""; - if (sns[i].button) button = "
"+this.locale.labels["button_"+sns[i].button]+"
"; + if (sns[i].button){ + button = "
"+this.locale.labels["button_"+sns[i].button]+"
"; + } + + if (this.config.wide_form){ + html+="
"; + } html+="
"+button+this.locale.labels["section_"+sns[i].name]+"
"+block.render.call(this,sns[i]); - }; + html+="
" + } - //localization var ds=d.getElementsByTagName("div"); - ds[4].innerHTML=scheduler.locale.labels.icon_save; - ds[7].innerHTML=scheduler.locale.labels.icon_cancel; - ds[10].innerHTML=scheduler.locale.labels.icon_delete; //sections ds[1].innerHTML=html; //sizes @@ -3818,8 +4192,9 @@ scheduler._get_lightbox=function(){ d.style.visibility="visible"; } return this._lightbox; -} -scheduler._lightbox_template="
 
 
 
 
"; +}; +scheduler._lightbox_template="
 
"; + scheduler._dp_init=function(dp){ dp._methods=["setEventTextStyle","","changeEventId","deleteEvent"]; @@ -3827,7 +4202,7 @@ scheduler._dp_init=function(dp){ if (!this._loading && this.validId(id)) dp.setUpdated(id,true,"inserted"); }); - this.attachEvent("onBeforeEventDelete",function(id){ + this.attachEvent("onConfirmedBeforeEventDelete", function(id){ if (!this.validId(id)) return; var z=dp.getState(id); @@ -3897,4 +4272,4 @@ scheduler._update_callback = function(upd,id){ data.end_date = scheduler.templates.xml_date(data.end_date); scheduler.addEvent(data); -}; +}; diff --git a/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/dhtmlxscheduler_glossy.css b/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/dhtmlxscheduler_glossy.css new file mode 100644 index 00000000000..64cf1bc40c5 --- /dev/null +++ b/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/dhtmlxscheduler_glossy.css @@ -0,0 +1,5 @@ +/* +This software is allowed to use under GPL or you need to obtain Commercial or Enterise License +to use it in not GPL project. Please contact sales@dhtmlx.com for details +*/ +.dhx_cal_container{background-color:#C2D5FC;font-family:Tahoma;font-size:8pt;position:relative;overflow:hidden;}.dhx_cal_container div{-moz-user-select:none;-moz-user-select:-moz-none;}.dhx_cal_navline{height:20px;position:absolute;z-index:3;width:750px;color:#2F3A48;}.dhx_cal_navline div{position:absolute;top:2px;white-space:nowrap;}.dhx_cal_navline .dhx_cal_date{font-weight:600;left:210px;}.dhx_cal_button .dhx_left_bg{width:1px;overflow:hidden;height:17px;z-index:20;top:0;}.dhx_cal_prev_button{background-image:url(imgs/buttons.png);background-position:0 0;width:29px;height:17px;left:50px;cursor:pointer;}.dhx_cal_next_button{background-image:url(imgs/buttons.png);background-position:-30px 0;width:29px;height:17px;left:80px;cursor:pointer;}.dhx_cal_today_button{background-image:url(imgs/buttons.png);background-position:-60px 0;width:75px;height:17px;left:112px;cursor:pointer;text-align:center;text-decoration:underline;}.dhx_cal_tab{width:59px;height:19px;text-align:center;text-decoration:underline;padding-top:2px;cursor:pointer;background-color:#D8E1EA;-webkit-border-top-left-radius:4px;-webkit-border-top-right-radius:4px;-moz-border-radius-topleft:4px;-moz-border-radius-topright:4px;border-top-left-radius:4px;border-top-right-radius:4px;}.dhx_cal_tab.active{text-decoration:none;cursor:default;font-weight:bold;border:1px dotted #586A7E;border-bottom:0;background-color:#C2D5FC;}.dhx_cal_header{position:absolute;left:10px;top:23px;width:750px;border-top:1px dotted #8894A3;border-right:1px dotted #8894A3;z-index:2;overflow:hidden;color:#2F3A48;}.dhx_cal_data{border-top:1px dotted #8894A3;position:absolute;top:44px;width:600px;overflow-y:auto;overflow-x:hidden;}.dhx_scale_bar{position:absolute;text-align:center;background-color:#C2D5FC;padding-top:3px;border-left:1px dotted #586A7E;}.dhx_scale_holder{position:absolute;border-right:1px dotted #586A7E;background-image:url(imgs/databg.png);}.dhx_scale_holder_now{position:absolute;border-right:1px dotted #586A7E;background-image:url(imgs/databg_now.png);}.dhx_scale_hour{height:41px;width:50px;border-bottom:1px dotted #8894A3;background-color:#C2D5FC;text-align:center;line-height:40px;color:#586A7E;overflow:hidden;}.dhx_month_head{background-color:#EBEFF4;color:#2F3A48;border-right:1px dotted #586A7E;height:18px;padding-right:5px;padding-top:3px;text-align:right;}.dhx_month_body{border-right:1px dotted #586A7E;border-bottom:1px dotted #586A7E;background-color:#FFF;}.dhx_now .dhx_month_body{background-color:#E2EDFF;}.dhx_after .dhx_month_body,.dhx_before .dhx_month_body{background-color:#ECECEC;}.dhx_after .dhx_month_head,.dhx_before .dhx_month_head{background-color:#E2E3E6;color:#94A6BB;}.dhx_now .dhx_month_head{background-color:#D1DEF4;font-weight:bold;}.dhx_cal_drag{position:absolute;z-index:9999;background-color:#FFE763;border:1px solid #B7A543;opacity:.5;filter:alpha(opacity=50);}.dhx_loading{position:absolute;width:128px;height:15px;background-image:url(imgs/loading.gif);z-index:9999;}.dhx_multi_day_icon,.dhx_multi_day{background-color:#E1E6FF;background-repeat:no-repeat;border-right:1px dotted #8894A3;}.dhx_multi_day{position:absolute;border-top:1px dotted #8894A3;}.dhx_multi_day_icon{background-image:url(imgs/clock_big.gif);}.dhx_multi_day_icon_small{background-image:url(imgs/clock_small.gif);}.dhx_multi_day_icon,.dhx_multi_day_icon_small{background-position:center center;background-color:#E1E6FF;background-repeat:no-repeat;border-bottom:1px dotted #8894A3;border-right:1px dotted #8894A3;}.dhtmlxLayoutPolyContainer_dhx_skyblue .dhx_cal_container{background-color:#d0e5ff;}.dhx_cal_event div{background-color:#FFE763;border:1px solid #B7A543;color:#887A2E;overflow:hidden;width:100%;font-family:Tahoma;font-size:8pt;}.dhx_move_denied .dhx_cal_event .dhx_header,.dhx_move_denied .dhx_cal_event .dhx_title{cursor:default;}.dhx_cal_event .dhx_header{height:1px;margin-left:1px;border-width:1px 1px 0 1px;cursor:pointer;}.dhx_cal_event .dhx_title{height:12px;border-width:0 1px 1px 1px;border-bottom-style:dotted;font-size:7pt;font-weight:bold;text-align:center;background-position:right;background-repeat:no-repeat;cursor:pointer;}.dhx_cal_event .dhx_body{border-width:0 1px 1px 1px;padding:5px;}.dhx_resize_denied .dhx_cal_event .dhx_footer{cursor:default;}.dhx_cal_event .dhx_footer{height:1px;margin-left:2px;border-width:0 1px 1px 1px;cursor:s-resize;}.dhx_cal_event_line{background-color:#FFE763;border:1px solid #B7A543;border-radius:3px;font-family:Tahoma;font-size:8pt;height:13px;padding-left:10px;color:#887A2E;cursor:pointer;overflow:hidden;}.dhx_cal_event_clear{font-family:Tahoma;font-size:8pt;height:13px;padding-left:2px;color:#887A2E;white-space:nowrap;overflow:hidden;cursor:pointer;}.dhx_in_move{background-color:#FFFF80;}div.dhx_cal_editor{background-color:#FFE763;border:1px solid #B7A543;border-top-style:dotted;z-index:999;position:absolute;overflow:hidden;}textarea.dhx_cal_editor{width:100%;height:100%;border:0 solid black;margin:none;padding:none;overflow:auto;}div.dhx_menu_head{background-image:url(imgs/controls.gif);background-position:0 -43px;width:10px;height:10px;margin-left:5px;margin-top:1px;border:none;cursor:default;}div.dhx_menu_icon{background-image:url(imgs/controls.gif);width:20px;height:20px;margin-left:-5px;margin-top:0;border:none;cursor:pointer;}div.icon_details{background-position:0 0;}div.icon_edit{background-position:-22px 0;}div.icon_save{background-position:-84px -1px;}div.icon_cancel{background-position:-62px 0;}div.icon_delete{background-position:-42px 0;}div.dhx_now_time{position:absolute;width:100%;border-bottom:2px dotted red;z-index:1;}div.dhx_time_block{position:absolute;width:100%;background:silver;opacity:.4;filter:alpha(opacity=40);z-index:1;}.dhx_unselectable,.dhx_unselectable div{-webkit-user-select:none;-moz-user-select:none;-moz-user-select:-moz-none;}.dhx_cal_light{background-color:#FFE763;border-radius:5px;font-family:Tahoma;font-size:8pt;border:1px solid #B7A64B;color:#887A2E;position:absolute;z-index:10001;width:580px;height:300px;box-shadow:5px 5px 5px #888;}.dhx_cal_light_wide{width:650px;}.dhx_mark{position:relative;top:3px;background-image:url('./imgs/controls.gif');background-position:0 -43px;padding-left:10px;}.dhx_ie6 .dhx_mark{background-position:6px -41px;}.dhx_cal_light select{font-family:Tahoma;font-size:8pt;color:#887A2E;padding:2px;margin:0;}.dhx_cal_ltitle{padding:2px 0 2px 5px;overflow:hidden;white-space:nowrap;}.dhx_cal_ltitle span{white-space:nowrap;}.dhx_cal_lsection{background-color:#DBCF8C;color:#FFF4B5;font-weight:bold;padding:5px 0 3px 10px;}.dhx_section_time{background-color:#DBCF8C;}.dhx_cal_lsection .dhx_fullday{float:right;margin-right:5px;color:#887A2E;font-size:12px;font-weight:normal;line-height:20px;vertical-align:top;cursor:pointer;}.dhx_cal_lsection{font-size:18px;font-family:Arial;}.dhx_cal_ltext{padding:2px 0 2px 10px;overflow:hidden;}.dhx_cal_ltext textarea{background-color:#FFF4B5;overflow:auto;border:none;color:#887A2E;height:100%;width:100%;outline:none!important;}.dhx_time{font-weight:bold;}.dhx_cal_light .dhx_title{padding-left:10px;}.dhx_cal_larea{border:1px solid #DCC43E;background-color:#FFF4B5;overflow:hidden;margin-left:3px;width:572px;height:1px;}.dhx_btn_set{padding:5px 10px 0 10px;float:left;}.dhx_btn_set div{float:left;height:21px;line-height:21px;vertical-align:middle;cursor:pointer;}.dhx_save_btn{background-image:url('./imgs/controls.gif');background-position:-84px 0;width:21px;}.dhx_cancel_btn{background-image:url('./imgs/controls.gif');background-position:-63px 0;width:20px;}.dhx_delete_btn{background-image:url('./imgs/controls.gif');background-position:-42px 0;width:20px;}.dhx_cal_cover{width:100%;height:100%;position:absolute;z-index:10000;top:0;left:0;background-color:black;opacity:.1;filter:alpha(opacity=10);}.dhx_custom_button{padding:0 3px 0 3px;color:#887A2E;font-family:Tahoma;font-size:8pt;background-color:#FFE763;font-weight:normal;margin-right:5px;margin-top:0;cursor:pointer;}.dhx_custom_button div{cursor:pointer;float:left;height:21px;line-height:21px;vertical-align:middle;}.dhx_cal_light_wide .dhx_cal_larea{border-top-width:0;}.dhx_cal_light_wide .dhx_cal_lsection{border:0;float:left;text-align:right;width:100px;height:20px;font-size:16px;padding:5px 0 0 10px;}.dhx_cal_light_wide .dhx_wrap_section{border-top:1px solid #DBCF8C;position:relative;background-color:#DBCF8C;overflow:hidden;}.dhx_cal_light_wide .dhx_section_time{padding-top:2px!important;height:20px!important;}.dhx_section_time{text-align:center;}.dhx_cal_light_wide .dhx_cal_larea{width:730px;}.dhx_cal_light_wide{width:738px;}.dhx_cal_light_wide .dhx_section_time{background:transparent;}.dhx_cal_light_wide .dhx_cal_checkbox label{padding-left:0;}.dhx_cal_wide_checkbox input{margin-top:8px;margin-left:14px;}.dhx_cal_light input{font-family:Tahoma;font-size:8pt;color:#887A2E;}.dhx_cal_light_wide .dhx_cal_lsection .dhx_fullday{float:none;margin-right:0;color:#FFF4B5;font-weight:bold;font-size:16px;font-family:Arial;cursor:pointer;}.dhx_custom_button{float:right;height:21px;width:90px;-webkit-border-radius:4px;-moz-border-radius:4px;-ms-border-radius:4px;-o-border-radius:4px;border-radius:4px;}.dhx_cal_light_wide .dhx_custom_button{position:absolute;top:0;right:0;margin-top:2px;}.dhx_cal_light_wide .dhx_repeat_right{margin-right:55px;}.dhx_scale_bar_header{position:absolute;border-bottom:1px dotted #8894A3;width:100%;}.dhx_expand_icon{position:absolute;top:0;right:0;background-image:url(./imgs/colapce-expand-icon.gif);width:18px;height:18px;cursor:pointer;background-position:0 18px;z-index:16;}.dhx_agenda_area{width:100%;height:100%;overflow-y:auto;background-image:url(./imgs/databg.png);}.dhx_agenda_line{height:21px;clear:both;overflow:hidden;}.dhx_agenda_line div{float:left;width:188px;border-right:1px dotted #8894A3;text-align:center;line-height:21px;overflow:hidden;}.dhx_agenda_area .dhx_agenda_line div{border-right:0 dotted #8894A3;}.dhx_v_border{position:absolute;left:186px;top:0;border-right:1px dotted #8894A3;width:1px;height:100%;}.dhx_agenda_line .dhx_event_icon{width:20px;border-width:0;background:url(./imgs/icon.png) no-repeat;background-position:5px 4px;cursor:pointer;}.dhx_agenda_line span{padding-left:5px;line-height:21px;}.dhx_year_body{border-left:1px dotted #586A7E;}.dhx_year_week{position:relative;}.dhx_scale_bar_last{border-right:1px dotted #586A7E;}.dhx_year_month{height:18px;padding-top:3px;border:1px dotted #586A7E;text-align:center;vertical-align:middle;}.dhx_year_body .dhx_before .dhx_month_head,.dhx_year_body .dhx_after .dhx_month_head,.dhx_year_body .dhx_before .dhx_month_head a,.dhx_year_body .dhx_after .dhx_month_head a{color:#E2E3E6!important;}.dhx_year_body .dhx_month_body{height:0;overflow:hidden;}.dhx_month_head.dhx_year_event{background-color:#FFE763;}.dhx_year_body .dhx_before .dhx_month_head,.dhx_year_body .dhx_after .dhx_month_head{cursor:default;}.dhx_tooltip{border:1px solid #BBB;background-image:url(./imgs/databg.png);position:absolute;z-index:9998;width:300px;height:auto;font-family:Tahoma;font-size:8pt;overflow:hidden;}.dhx_tooltip_line{line-height:20px;height:20px;overflow:hidden;}.dhx_tooltip_line .dhx_event_icon{width:20px;height:20px;padding-right:10px;float:left;border-width:0;position:relative;background:url(./imgs/icon.png) no-repeat;background-position:5px 4px;cursor:pointer;}.dhx_tooltip_date{float:left;width:auto;padding-left:5px;text-align:center;}.dhx_text_disabled{color:#887A2E;font-family:Tahoma;font-size:8pt;}.dhx_mini_calendar{-moz-box-shadow:5px 5px 5px #888;-khtml-box-shadow:5px 5px 5px #888;}.dhx_mini_calendar .dhx_month_head{cursor:pointer;}.dhx_mini_calendar .dhx_calendar_click{background-color:#C2D5FC;}.dhx_cal_navline div.dhx_minical_icon{width:18px;height:18px;left:190px;top:1px;cursor:pointer;background-image:url(./imgs/calendar.gif);}.dhx_matrix_scell{height:100%;}.dhx_matrix_cell,.dhx_matrix_scell{overflow:hidden;text-align:center;vertical-align:middle;border-bottom:1px dotted #8894A3;border-right:1px dotted #8894A3;}.dhx_matrix_cell{background-color:white;}.dhx_matrix_line{overflow:hidden;}.dhx_matrix_cell div,.dhx_matrix_scell div{overflow:hidden;text-align:center;height:auto;}.dhx_cal_lsection .dhx_readonly{font-size:9pt;font-size:8pt;padding:2px;color:#887A2E;}.dhx_matrix_scell.folder,.dhx_data_table.folder .dhx_matrix_cell{background-color:#969394;cursor:pointer;}.dhx_matrix_scell .dhx_scell_level0{padding-left:5px;}.dhx_matrix_scell .dhx_scell_level1{padding-left:20px;}.dhx_matrix_scell .dhx_scell_level2{padding-left:35px;}.dhx_matrix_scell .dhx_scell_level3{padding-left:50px;}.dhx_matrix_scell .dhx_scell_level4{padding-left:65px;}.dhx_matrix_scell.folder{font-weight:bold;text-align:left;}.dhx_matrix_scell.folder .dhx_scell_expand{float:left;width:10px;padding-right:3px;}.dhx_matrix_scell.folder .dhx_scell_name{float:left;width:auto;}.dhx_matrix_scell.item .dhx_scell_name{padding-left:15px;text-align:left;}.dhx_data_table.folder .dhx_matrix_cell{border-right:0;}.dhx_section_timeline{overflow:hidden;padding:4px 0 2px 10px;}.dhx_section_timeline select{width:552px;}.dhx_map_area{width:100%;height:100%;overflow-y:auto;overflow-x:hidden;background-image:url(./imgs/databg.png);}.dhx_map_line .dhx_event_icon{width:20px;border-width:0;background:url(./imgs/icon.png) no-repeat;background-position:5px 4px;cursor:pointer;}.dhx_map_line{height:21px;clear:both;overflow:hidden;}.dhx_map{position:absolute;}.dhx_map_line div{float:left;border-right:1px dotted #8894A3;text-align:center;line-height:21px;overflow:hidden;}.dhx_map_line .headline_description{float:left;border-right:1px dotted #8894A3;text-align:center;line-height:21px;overflow:hidden;}.dhx_map_line .dhx_map_description{float:left;border-right:0 dotted #8894A3;text-align:center;line-height:21px;overflow:hidden;}.dhx_map_line .line_description{float:left;border-right:1px dotted #8894A3;text-align:left;padding-left:5px;line-height:21px;overflow:hidden;}.dhx_map_line.highlight{background-color:#C4C5CC;}.dhx_map_area .dhx_map_line div{border-right:0 dotted #8894A3;}.dhtmlXTooltip.tooltip{-moz-box-shadow:3px 3px 3px #888;-webkit-box-shadow:3px 3px 3px #888;-o-box-shadow:3px 3px 3px #888;box-shadow:3px 3px 3px #888;filter:progid:DXImageTransform.Microsoft.Shadow(color='#888888',Direction=135,Strength=5);background-color:white;border-left:1px dotted #887A2E;border-top:1px dotted #887A2E;color:#887A2E;cursor:default;padding:10px;position:absolute;z-index:500;}.dhx_cal_checkbox label{padding-left:5px;}.dhx_cal_light .radio{padding:2px 0 2px 10px;}.dhx_cal_light .radio input,.dhx_cal_light .radio label{line-height:15px;}.dhx_cal_light .radio input{vertical-align:middle;margin:0;padding:0;}.dhx_cal_light .radio label{vertical-align:middle;padding-right:10px;}.dhx_cal_light .combo{padding:4px;}.dhx_wa_column{float:left;}.dhx_wa_column_last .dhx_wa_day_cont{border-left:1px dotted #8894A3;}.dhx_wa_scale_bar{font-family:Tahoma;padding-left:10px;font-size:11px;border-top:1px dotted #8894A3;border-bottom:1px dotted #8894A3;}.dhx_wa_day_data{background-color:#FCFEFC;overflow-y:auto;}.dhx_wa_ev_body{border-bottom:1px dotted #789;font-size:12px;padding:5px 0 5px 7px;}.dhx_wa_dnd{font-family:Tahoma;position:absolute;padding-right:7px;color:#887AE2!important;background-color:#FFE763!important;border:1px solid #B7A543;}.dhx_cal_event_selected{background-color:#9cc1db;color:white;}.dhx_second_scale_bar{border-bottom:1px dotted #586A7E;padding-top:2px;}div.dhx_form_repeat input.radio{margin:-4px 0 0 -4px!ie;}div.dhx_form_repeat input.checkbox{margin:0 0 0 -4px!ie;}.dhx_form_repeat,.dhx_form_repeat input{padding:0;margin:0;padding-left:5px;font-family:Tahoma,Verdana;font-size:11px;line-height:24px;}.dhx_form_repeat{overflow:hidden;height:0;background-color:#FFF4B5;}.dhx_cal_light_wide .dhx_form_repeat{background-color:transparent;}.dhx_repeat_center,.dhx_repeat_left{height:115px;padding:10px 0 10px 10px;float:left;}.dhx_repeat_left{width:95px;}.dhx_repeat_center{width:335px;margin-top:12px;}.dhx_repeat_divider{float:left;height:115px;border-left:1px dotted #DCC43E;width:1px;}.dhx_repeat_right{float:right;height:115px;width:160px;padding:10px 3px 10px 10px;margin-top:7px;}input.dhx_repeat_text{height:16px;width:27px;margin:0 4px 0 4px;line-height:18px;padding:0 0 0 2px;}.dhx_form_repeat select{height:20px;width:87px;padding:0 0 0 2px;margin:0 4px 0 4px;}input.dhx_repeat_date{height:18px;width:80px;padding:0 0 0 2px;margin:0 4px 0 4px;background-repeat:no-repeat;background-position:64px 0;border:1px #7f9db9 solid;line-height:18px;}input.dhx_repeat_radio{margin-right:4px;}input.dhx_repeat_checkbox{margin:4px 4px 0 0;}.dhx_repeat_days td{padding-right:5px;}.dhx_repeat_days label{font-size:10px;}.dhx_custom_button{width:90px;-webkit-border-radius:4px;-moz-border-radius:4px;-ms-border-radius:4px;-o-border-radius:4px;border-radius:4px;}.dhx_custom_button_recurring{background-image:url(./imgs/but_repeat.gif);background-position:-5px 20px;width:20px;margin-right:10px;}.dhx_cal_light_rec{width:640px;}.dhx_cal_light_rec .dhx_cal_larea{width:632px;}.dhx_cal_light_rec.dhx_cal_light_wide{width:816px;}.dhx_cal_light_rec.dhx_cal_light_wide .dhx_cal_larea{width:808px;}.dhx_cal_tab.active{border:none;}.dhx_multi_day{border:none;border-top:1px solid #A4BED4;}.dhx_multi_day_icon,.dhx_multi_day_icon_small{border-right:none;}.dhx_cal_container{background-image:url(imgs_glossy/top-days-bg.png);background-position:0 24px;background-repeat:repeat-x;background-color:#EBEBEB;}.dhx_cal_navline{background-color:#EBEBEB;height:23px!important;}.dhx_cal_prev_button{background-image:url(imgs_glossy/buttons.gif);width:30px;height:20px;}.dhx_cal_next_button{background-image:url(imgs_glossy/buttons.gif);width:30px;height:20px;}.dhx_cal_today_button{padding-top:3px;background-image:url(imgs_glossy/buttons.gif);width:67px;left:110px;text-decoration:none;}.dhx_cal_navline .dhx_cal_date{padding-top:4px;left:230px;}.dhx_cal_tab{background-image:url(imgs_glossy/white_tab.png);width:60px;height:15px;text-decoration:none;padding-top:4px;margin-top:4px;}.dhx_cal_tab.active{background-image:url(imgs_glossy/blue_tab.png);height:18px;width:60px;padding-top:4px;margin-top:2px;}.dhx_cal_data{border-top:1px solid #A4BED4;}.dhx_cal_header{background-image:url(imgs_glossy/top-days-bg.png);background-repeat:repeat-x;border-top:0;border-right:0;}.dhx_scale_bar{background-image:url(imgs_glossy/top-separator.gif);background-position:0 0;background-repeat:no-repeat;background-color:transparent;padding-top:3px;border-left:0;}.dhx_scale_holder{border-right:1px solid #A4BED4;}.dhx_scale_holder_now{border-right:1px solid #A4BED4;}.dhx_scale_hour{background-image:url(imgs_glossy/left-time-bg.png);border-bottom:1px solid #A4BED4;color:#2F3A48;}.dhx_multi_day{background-image:url(imgs_glossy/multi-days-bg.png);background-repeat:repeat;border-bottom:1px solid #A4BED4;border-left:0;}.dhx_multi_day_icon,.dhx_multi_day_icon_small{background-image:url(imgs_glossy/multi-days-bg.png);border-bottom:1px solid #A4BED4;border-left:1px solid #fff;background-position:0 0;background-repeat:repeat;}.dhx_month_head{background-color:#FFF;}.dhx_after .dhx_month_head,.dhx_before .dhx_month_head{background-color:#EFEDE2;}.dhx_now .dhx_month_head{background-color:#E4EFFF;}.dhx_after .dhx_month_body,.dhx_before .dhx_month_body{background-color:#EFEDE2;}.dhx_cal_event div{border:1px solid #FFBD51;background-color:#FFE4AB;color:#000;}.dhx_cal_event_clear{color:#000;}.dhx_cal_event_line{background-image:url(imgs_glossy/event-bg.png);border:1px solid #FFBD51;color:#000;}.dhx_in_move{background-image:url(imgs_glossy/move.png);}.dhx_cal_event .dhx_body{background-color:#FFE4AB;}.dhx_cal_event .dhx_title{background-color:#FFE4AB;}.dhx_cal_light{-moz-box-shadow:5px 5px 5px #888;-khtml-box-shadow:5px 5px 5px #888;background-color:#EBEBEB;border:2px solid #A4BED4;color:#000;}.dhx_cal_larea{border:1px solid #A4BED4;border-width:0 1px 1px;background-color:#FFF;}.dhx_cal_lsection{background-image:url(imgs_glossy/lightbox.png);font-size:14px;padding:5px 0 5px 10px;color:#000;}.dhx_cal_light_wide .dhx_cal_lsection{background-image:url(imgs_glossy/multi-days-bg.png);}.dhx_cal_ltext textarea{background-color:#fff;color:#000;}.dhx_cal_light select,.dhx_cal_light input{color:#000;}.dhx_save_btn{background-image:url(imgs_glossy/controlls5.png);}.dhx_cancel_btn{background-image:url(imgs_glossy/controlls5.png);}.dhx_delete_btn{background-image:url(imgs_glossy/controlls5.png);}div.dhx_menu_head{background-image:url(imgs_glossy/controlls5.png);border:1px solid #FFE4AB;}div.dhx_menu_icon{background-image:url(imgs_glossy/controlls5.png);border:medium none;}.dhx_section_time{height:20px!important;padding:7px 0!important;text-align:center;background:white;}div.dhx_cal_editor{background-color:#FFE4AB;}.dhx_year_month{background-image:url(imgs_glossy/top-days-bg.png);border:0;}.dhx_year_week{background-image:url(imgs_glossy/top-days-bg.png);}.dhx_month_head{border-right:1px solid #A4BED4;}.dhx_month_body{border-right:1px solid #A4BED4;border-bottom:1px solid #A4BED4;}.dhx_year_body{border-left:1px solid #A4BED4;}.dhx_scale_bar_last{border-right:none;}.dhx_month_head.dhx_year_event{background-color:#FFE4AB;}.dhx_year_body .dhx_before .dhx_month_head,.dhx_year_body .dhx_after .dhx_month_head,.dhx_year_body .dhx_before .dhx_month_head a,.dhx_year_body .dhx_after .dhx_month_head a{color:#EFEDE2!important;}.dhx_cal_lsection .dhx_readonly{color:#000;}.dhx_tooltip{-moz-box-shadow:2px 2px 2px #888;-khtml-box-shadow:2px 2px 2px #888;}.dhx_custom_button{margin-top:-2px;}.dhx_cal_lsection .dhx_fullday{color:#000;}.dhx_cal_lsection.dhx_cal_checkbox{height:16px;line-height:18px;}.dhx_cal_light_wide .dhx_cal_lsection.dhx_cal_checkbox{height:20px;}.dhx_cal_checkbox label{vertical-align:top;}.dhx_cal_light_wide .dhx_cal_lsection{color:black;}.dhx_cal_light_wide .dhx_wrap_section{border-top:1px solid #A4BED4;background-image:url(imgs_glossy/multi-days-bg.png);}.dhx_cal_light_wide .dhx_cal_ltext{border-left:1px solid #A4BED4;}.dhx_cal_light_wide .dhx_cal_ltext{background-color:white;}.dhx_custom_button{background:white;color:black;}.dhx_form_repeat{background:white;}.dhx_repeat_divider{border-left:1px solid #A4BED4;}.dhx_cal_header.dhx_second_cal_header{background-image:url("imgs_glossy/second-top-days-bg.png");padding-right:20px;}.dhx_scale_bar{padding-top:4px;}.dhx_second_scale_bar{border-bottom:0;padding-top:4px;}.dhx_cal_light_wide .dhx_cal_lsection .dhx_fullday,.dhx_cal_lsection .dhx_fullday{color:#000;font-size:14px;}.dhx_cal_light_wide .dhx_cal_lsection{font-size:14px;padding-right:10px;} \ No newline at end of file diff --git a/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/dhtmlxscheduler_mobile.css b/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/dhtmlxscheduler_mobile.css new file mode 100644 index 00000000000..04fd2dd62b1 --- /dev/null +++ b/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/dhtmlxscheduler_mobile.css @@ -0,0 +1,5 @@ +/* +This software is allowed to use under GPL or you need to obtain Commercial or Enterise License +to use it in not GPL project. Please contact sales@dhtmlx.com for details +*/ +html,body{height:100%;padding:0;margin:0;overflow:auto;}.dhx_view{overflow:hidden;vertical-align:top;background-color:#FFF;}.dhx_layout_wide,.dhx_layout_space,.dhx_layout_head{background-color:#c3dbe3;}.dhx_border_space,.dhx_border_vspace{background-color:#adadad;overflow:hidden;}.dhx_border_space{height:1px;width:100%;}.dhx_border_vspace{width:1px;height:100%;display:table-cell;}.dhx_border_vspace.dhx_border_wide{width:10px;background-color:#c3dbe3;border-left:1px solid #adadad;border-right:1px solid #adadad;}.dhx_border_space.dhx_border_wide{height:10px;background-color:#c3dbe3;border-top:1px solid #adadad;border-bottom:1px solid #adadad;}.dhx_border_vspace.dhx_border_clean{width:10px;background-color:#c3dbe3;}.dhx_border_space.dhx_border_clean{height:4px;border-bottom:1px solid #adadad;}.dhx_loading_overlay{width:100%;height:100%;background-color:#D6D6D6;opacity:.5;background-image:url(./imgs/loading.png);background-repeat:no-repeat;background-position:center;}.dhx_multiview{background-color:#a0a0a0;}.dhx_el_icon div{background-image:url(./imgs/bar_icons_sprite.png);width:22px;height:22px;margin:10px;background-repeat:no-repeat;}.dhx_el_icon_refresh{background-position:0 0;}.dhx_el_icon_save{background-position:-22px 0;}.dhx_el_icon_add{background-position:-44px 0;}.dhx_el_icon_delete{background-position:-66px 0;}.dhx_el_icon_open{background-position:-88px 0;}.dhx_el_icon_run{background-position:-110px 0;}.dhx_el_icon_help{background-position:-132px 0;}.dhx_el_icon_new{background-position:-154px 0;}.dhx_el_icon_edit{background-position:-176px 0;}.dhx_el_icon_search{background-position:-198px 0;}.dhx_el_icon_close{background-position:-220px 0;}.dhx_el_label{text-shadow:0 1px 0 #FFF;height:43px;font-family:"Helvetica World","HelveticaNeue","Helvetica Neue","HelveticaNeueRoman","Helvetica","Tahoma","Geneva","Arial",sans-serif;font-weight:bold;font-size:22px;color:#616161;}.dhx_el_label,.dhx_el_button,.dhx_el_segmented,.dhx_el_roundbutton,.dhx_el_nextbutton,.dhx_el_prevbutton,.dhx_el_defaultbutton{padding:5px 5px 0;box-sizing:border-box;-ms-box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;-webkit-user-select:none;-moz-user-select:none;}.dhx_el_label{padding-top:8px;}.dhx_el_defaultbutton input{font-size:15px;}.dhx_el_button input,.dhx_el_prevbutton input,.dhx_el_nextbutton input,.dhx_el_bigbutton input{height:32px;font-size:15px;font-weight:bold;text-decoration:none;color:#6e6e6e;text-shadow:$inputs_buttons_text_shadow;border:1px solid #93b0ba;-webkit-border-radius:8px;-webkit-border-bottom-right-radius:9px;-webkit-border-bottom-left-radius:9px;-moz-border-radius:8px;-moz-border-radius-bottomright:9px;-moz-border-radius-bottomleft:9px;border-radius:8px;border-bottom-right-radius:9px;border-bottom-left-radius:9px;padding:1px 15px 1px;background:#ebebeb;background:-webkit-gradient(linear,left top,left bottom,from(#fdfdfd),to(#dfdfdf));background:-moz-linear-gradient(top,#fdfdfd,#dfdfdf);-moz-box-shadow:inset 0 1px 1px #FFF,0px 1px #ebebeb;-webkit-box-shadow:inset 0 1px 1px #FFF,0px 1px #ebebeb;box-shadow:inset 0 1px 1px #FFF,0px 1px #ebebeb;}.dhx_el_prevbutton input,.dhx_el_nextbutton input{-moz-box-shadow:inset 0 1px 0 #FFF,0px 1px darken(#FFF(15%));-webkit-box-shadow:inset 0 1px 0 #FFF,0px 1px darken(#FFF(15%));box-shadow:inset 0 1px 0 #FFF,0px 1px darken(#FFF(15%));}.dhx_touch .dhx_el_button input,.dhx_touch .dhx_el_prevbutton input,.dhx_touch .dhx_el_nextbutton input{background:#e5e5e5;background:-webkit-gradient(linear,left top,left bottom,from(#e5e5e5),to(#dfdfdf));background:-moz-linear-gradient(top,#e5e5e5,#dfdfdf);color:#6e6e6e;text-shadow:$inputs_touch_text_shadow;}.dhx_el_prevbutton input{-webkit-border-top-left-radius:0;-webkit-border-bottom-left-radius:0;-moz-border-radius-topleft:26px;-moz-border-radius-bottomleft:26px;text-align:center;padding-right:12px;padding-left:0;border-left-width:0;}.dhx_el_nextbutton input{-webkit-border-top-right-radius:0;-webkit-border-bottom-right-radius:0;-moz-border-radius-topright:26px;-moz-border-radius-bottomright:26px;border-right-width:0;padding-left:12px;padding-right:0;}.dhx_el_prevbutton,.dhx_el_nextbutton{height:32px;}.dhx_el_prevbutton_input_cont,.dhx_el_nextbutton_input_cont{float:left;}.dhx_el_prevbutton .dhx_el_prevbutton_arrow,.dhx_el_nextbutton .dhx_el_nextbutton_arrow{float:left;height:32px;}.dhx_el_prevbutton .dhx_el_prevbutton_arrow{width:18px;background:-webkit-canvas(dhxArrowLeft) no-repeat top left;}.dhx_el_nextbutton .dhx_el_nextbutton_arrow{width:18px;background:-webkit-canvas(dhxArrowRight) no-repeat top left;}.dhx_touch .dhx_el_prevbutton .dhx_el_prevbutton_arrow{background:-webkit-canvas(dhxArrowLeftT) no-repeat top left;}.dhx_touch .dhx_el_nextbutton .dhx_el_nextbutton_arrow{background:-webkit-canvas(dhxArrowRightT) no-repeat top left;}.dhx_el_segmented{margin:5px;padding:0;border-radius:16px;-moz-border-radius:16px;-webkit-border-radius:16px;border-radius:16px;border:1px solid #598b9b;-moz-box-shadow:0 1px #ebebeb;-webkit-box-shadow:0 1px #ebebeb;box-shadow:0 1px #ebebeb;width:auto;display:inline-block;overflow:hidden;height:34px;}.dhx_el_segmented .segment_0,.dhx_el_segmented .segment_1,.dhx_el_segmented .segment_N{background:#ebebeb;background:-webkit-gradient(linear,left top,left bottom,from(#fdfdfd),to(#dfdfdf));background:-moz-linear-gradient(top,#fdfdfd,#dfdfdf);}.dhx_el_segmented .selected.segment_0,.dhx_el_segmented .selected.segment_1,.dhx_el_segmented .selected.segment_N{background:#74c1da;background:-webkit-gradient(linear,left top,left bottom,from(#74c1da),to(#118ab3));background:-moz-linear-gradient(top,#74c1da,#118ab3);-moz-box-shadow:inset 0 1px 1px #bee2ee;-webkit-box-shadow:inset 0 1px 1px #bee2ee;box-shadow:inset 0 1px 1px #bee2ee;}.dhx_el_segmented div,.dhx_el_segmented div.selected{padding:0 12px;text-shadow:0 1px 0 #FFF;color:#747474;border:0;display:inline-block;color:#616161;font-weight:bold;font-size:15px;text-decoration:none;text-align:center;height:32px;line-height:32px;cursor:pointer;}.dhx_el_segmented div.selected{text-shadow:0 -1px 0 rgba(0,0,0,0.6);color:#FFF;}.dhx_el_segmented .segment_0,.dhx_el_segmented .selected.segment_0{-webkit-border-top-left-radius:16px;-webkit-border-bottom-left-radius:17px;-moz-border-radius-topleft:16px;-moz-border-radius-bottomleft:17px;border-top-left-radius:16px;border-bottom-left-radius:17px;padding-left:16px;}.dhx_el_segmented .segment_1,.dhx_el_segmented .selected.segment_1{border-left:1px solid #ababab;}.dhx_el_segmented .segment_N,.dhx_el_segmented .selected.segment_N{-webkit-border-top-right-radius:16px;-webkit-border-bottom-right-radius:17px;-moz-border-radius-topright:16px;-moz-border-radius-bottomright:17px;border-top-right-radius:16px;border-bottom-right-radius:17px;padding-right:15px;border-left:1px solid #ababab;}.dhx_el_roundbutton input,.dhx_el_bigroundbutton input{height:32px;font-weight:bold;font-size:15px;text-decoration:none;color:#FFF;text-shadow:0 -1px 0 rgba(0,0,0,0.6);margin:0;padding:1px 18px 1px;border:1px solid #598b9b;border-bottom:1px solid #0a5f7c;-webkit-border-radius:16px;-moz-border-radius:16px;border-radius:16px;background:#74c1da;background:-webkit-gradient(linear,left top,left bottom,from(#74c1da),to(#118ab3));background:-moz-linear-gradient(top,#74c1da,#118ab3);-moz-box-shadow:inset 0 1px 1px #bee2ee,0px 1px #ebebeb;-webkit-box-shadow:inset 0 1px 1px #bee2ee,0px 1px #ebebeb;box-shadow:inset 0 1px 1px #bee2ee,0px 1px #ebebeb;}.dhx_touch .dhx_el_roundbutton input{margin:0 -1px;background:-webkit-gradient(linear,left top,left bottom,from(#3ba1c3),to(#118ab3));background:-moz-linear-gradient(top,#3ba1c3,#118ab3);}.dhx_el_imagebutton{margin-left:5px;}.dhx_el_imagebutton span{line-height:42px;font-size:20px;}.dhx_el_imagebutton img{vertical-align:middle;margin-top:-4px;}.dhx_el_bigbutton input,.dhx_el_bigroundbutton input{height:46px;line-height:46px;font-size:20px;-webkit-border-radius:22px 22px 22px 22px;-moz-border-radius:22px 22px 22px 22px;-o-border-radiues:22px 22px 22px 22px;border-radius:22px 22px 22px 22px;border-color:#b1b1b0 #b1b1b0 #878787 #b1b1b0;}.dhx_el_bigbutton input{text-shadow:0 1px 0 #FFF;background:#ebebeb;background:-webkit-gradient(linear,left top,left bottom,from(#fcfcfc),color-stop(0.4,#eee),color-stop(0.6,#e0e0e0),to(#c3c3c3));background:-moz-linear-gradient(top,#fcfcfc 0,#eee 40%,#e0e0e0 60%,#c3c3c3 100%);}.dhx_el_select{padding:5px 5px 0;font-size:15px;}.dhx_el_select select{font-size:15px;}.dhx_el_tabbar{height:49px;vertical-align:top;}.dhx_el_tabbar div{display:inline-block;text-align:center;cursor:pointer;height:46px;margin:1px 2px;}.dhx_el_tabbar .selected{-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;background-image:-webkit-gradient(linear,0% 0,0% 100%,from(#6c8e99),to(#395a65));background-image:-moz-linear-gradient(top,#6c8e99,#395a65);background-repeat:repeat-x;}.dhx_el_tabbar img{vertical-align:middle;}.dhx_el_tabbar span{margin-top:1px;line-height:12px;padding:0 10px 2px;color:#FFF;font-size:8px;font-weight:bold;text-shadow:0 -1px 0 rgba(0,0,0,0.6);display:block;}.dhx_el_datepicker,.dhx_el_text,.dhx_el_datepicker,.dhx_el_checkbox,.dhx_el_richselect,.dhx_el_combo,.dhx_el_counter,.dhx_el_toggle{padding:5px 5px 0;font-size:18px;display:inline-block;}.dhx_el_radio{padding:5px 5px 0;font-size:18px;}.dhx_el_toggle input,.dhx_el_combo input{font-size:18px;}.dhx_el_toggle input{padding-top:0;}.dhx_inp_text_border,.dhx_el_input input{height:31px;line-height:31px;width:auto;padding:0 8px;-webkit-border-radius:8px;-moz-border-radius:8px;border-radius:8px;background:-moz-linear-gradient(center bottom,#FFF,#f2f2f2);background:-webkit-linear-gradient(#f2f2f2,#FFF);border:1px solid #adadad;}.dhx_el_input{margin-top:5px;padding:0 5px 0;}.dhx_el_input input{line-height:0;font-size:20px;}.dhx_inp_text_label{float:left;overflow:hidden;font-size:18px;color:#616161;}.dhx_inp_list,.dhx_inp_text,.dhx_inp_combo{display:block;float:left;height:31px;line-height:31px;color:#000;background:#f7f7f7;background-image:-webkit-gradient(linear,left top,left bottom,from(#f7f7f7),to(#fefefe));background-image:-moz-linear-gradient(top,#f7f7f7,#fefefe);border:medium none;padding:0;}.dhx_inp_textarea{border:1px solid #adadad;padding:0 8px;margin:5px 5px 0;-webkit-border-radius:8px;-moz-border-radius:8px;border-radius:8px;font-size:18px;color:#000;background:#f7f7f7;background-image:-webkit-gradient(linear,left top,left bottom,from(#f7f7f7),to(#fefefe));background-image:-moz-linear-gradient(top,#f7f7f7,#fefefe);background-image:-webkit-gradient(linear,left top,left bottom,from(#f7f7f7),to(#fefefe));}::-webkit-input-placeholder{font-size:16px;font-weight:bold;color:#bcbcbc;}.dhx_inp_counter_prev,.dhx_inp_counter_next{width:37px;height:33px;background-repeat:no-repeat;background-color:transparent;cursor:pointer;border:none;float:left;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;background:#74c1da;background:-webkit-gradient(linear,left top,left bottom,from(#74c1da),to(#118ab3));background:-moz-linear-gradient(top,#74c1da,#118ab3);border:1px solid #598b9b;text-shadow:0 -1px 0 rgba(0,0,0,0.6);color:#FFF;font-size:30px;padding-left:10px;line-height:15px;}.dhx_inp_counter_prev{font-size:14px;line-height:10px;}.dhx_inp_counter_prev{border-top-left-radius:16px;border-bottom-left-radius:16px;-moz-border-radius-topleft:16px;-moz-border-radius-bottomleft:16px;-webkit-border-top-left-radius:16px;-webkit-border-bottom-left-radius:16px;}.dhx_inp_counter_next{border-top-right-radius:16px;border-bottom-right-radius:16px;-moz-border-radius-topright:16px;-moz-border-radius-bottomright:16px;-webkit-border-top-right-radius:16px;-webkit-border-bottom-right-radius:16px;}.dhx_inp_counter_value{width:20px;height:23px;background-color:#FFF;border-top:1px solid #598b9b;float:left;text-align:center;padding:4px 8px;overflow:hidden;line-height:24px;}.dhx_inp_counter_prev,.dhx_inp_counter_next,.dhx_inp_counter_value{-moz-box-shadow:inset 0 1px 1px #bee2ee,0px 1px #ebebeb;-webkit-box-shadow:inset 0 1px 1px #bee2ee,0px 1px #ebebeb;box-shadow:inset 0 1px 1px #bee2ee,0px 1px #ebebeb;border-bottom:1px solid #0a5f7c;}.dhx_inp_counter_label,.dhx_inp_toggle_label{float:left;padding:6px 10px;color:#9d9d9d;line-height:24px;}.dhx_el_formbutton{margin:4px 5px;}.dhx_inp_form_button{height:34px;padding-left:14px;padding-right:14px;background:#72a53b;background:-webkit-gradient(linear,left top,left bottom,from(#a0c07c),to(#579418));background:-moz-linear-gradient(top,#a0c07c,#579418);cursor:pointer;outline-style:none;-webkit-appearance:none;-moz-border-radius:17px;-webkit-border-radius:17px;border-radius:17px;border:1px solid #6b8352;border-bottom:1px solid #3a640d;font-weight:bold;font-size:15px;-moz-box-shadow:inset 0 1px 1px #cfdfbd,0px 1px #ebebeb;-webkit-box-shadow:inset 0 1px 1px #cfdfbd,0px 1px #ebebeb;box-shadow:inset 0 1px 1px #cfdfbd,0px 1px #ebebeb;color:#FFF;text-shadow:0 -1px 0 rgba(0,0,0,0.6);}.dhx_touch .dhx_el_formbutton input{background:#579418;background-image:-moz-linear-gradient(linear,left top,left bottom,color-stop(0%,#72a53b),color-stop(100%,#579418));background-image:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#72a53b),color-stop(100%,#579418));margin-left:-1px;margin-right:-1px;border:1px solid #3a640d;color:#f4f4f4;}.dhx_el_toggle{display:inline-block;}.dhx_inp_toggle_left_on,.dhx_inp_toggle_left_off,.dhx_inp_toggle_right_on,.dhx_inp_toggle_right_off{height:31px;line-height:31px;background-color:transparent;border:none;cursor:pointer;display:block;float:left;margin:0;text-align:center;outline:none;background:#ebebeb;background:-webkit-gradient(linear,left top,left bottom,from(#fdfdfd),to(#dfdfdf));background:-moz-linear-gradient(top,#fdfdfd,#dfdfdf);padding:0 14px;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;}.dhx_inp_toggle_left_on,.dhx_inp_toggle_right_on{color:#FFF;text-shadow:0 -1px 0 rgba(0,0,0,0.6);background:#74c1da;background:-webkit-gradient(linear,left top,left bottom,from(#74c1da),to(#118ab3));background:-moz-linear-gradient(top,#74c1da,#118ab3);-moz-box-shadow:inset 0 1px 1px #bee2ee,0px 1px #ebebeb;-webkit-box-shadow:inset 0 1px 1px #bee2ee;box-shadow:inset 0 1px 1px #bee2ee;border:1px solid #598b9b;border-bottom:1px solid #0a5f7c;}.dhx_inp_toggle_left_off,.dhx_inp_toggle_right_off{color:#6e6e6e;background:#ebebeb;background:-webkit-gradient(linear,left top,left bottom,from(#fdfdfd),to(#dfdfdf));background:-moz-linear-gradient(top,#fdfdfd,#dfdfdf);border:1px solid #93b0ba;border-bottom:1px solid #93b0ba;-moz-box-shadow:0 1px #ebebeb;-webkit-box-shadow:0 1px #ebebeb;box-shadow:0 1px #ebebeb;}.dhx_inp_toggle_left_on,.dhx_inp_toggle_left_off{border-top-left-radius:15px;border-bottom-left-radius:15px;-moz-border-radius-topleft:15px;-moz-border-radius-bottomleft:15px;-webkit-border-top-left-radius:15px;-webkit-border-bottom-left-radius:15px;}.dhx_inp_toggle_right_on,.dhx_inp_toggle_right_off{border-top-right-radius:15px;border-bottom-right-radius:15px;-moz-border-radius-topright:15px;-moz-border-radius-bottomright:15px;-webkit-border-top-right-radius:15px;-webkit-border-bottom-right-radius:15px;}.dhx_inp_toggle_left_off{border-right:0;}.dhx_inp_toggle_right_off{border-left:0;}.dhx_inp_checkbox_border{width:24px;height:24px;padding:0;margin-top:5px;border:1px solid #adadad;background-color:#FFF;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;text-align:center;cursor:pointer;float:left;}.dhx_inp_checkbox_on{display:block;width:18px;height:18px;border:none;background-color:transparent;background-image:url(./imgs/images.png);background-position:0 -847px;background-repeat:no-repeat;cursor:pointer;margin:3px 0 0 3px;padding:0;font-size:0!important;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;}.dhx_inp_checkbox_label,.dhx_inp_radio_label{float:left;padding:0 10px;cursor:pointer;height:35px;line-height:35px;}.dhx_inp_radio_border{width:22px;height:22px;margin-top:6px;border:1px solid #adadad;background-color:#FFF;-webkit-border-radius:20px;-moz-border-radius:20px;border-radius:20px;text-align:center;cursor:pointer;float:left;}.dhx_inp_radio_on{width:12px;height:12px;border:none;background-color:transparent;background-image:url(./imgs/images.png);background-position:0 -937px;background-repeat:no-repeat;cursor:pointer;margin:5px 0 0 5px;display:block;font-size:0!important;-webkit-border-radius:10px;-moz-border-radius:10px;border-radius:10px;}.hidden{display:none;}.dhx_inp_toggle_left_on:focus,.dhx_inp_toggle_left_off:focus,.dhx_inp_toggle_right_on:focus,.dhx_inp_toggle_right_off:focus,.dhx_inp_form_button:focus,.dhx_inp_counter_prev:focus,.dhx_inp_counter_next:focus,.dhx_inp_checkbox_on:focus,.dhx_inp_radio_on:focus,.dhx_el_button input:focus,.dhx_el_roundbutton input:focus,.dhx_el_nextbutton:focus,.dhx_el_prevbutton input:focus{outline:none 0;}.dhx_inp_toggle_left_on::-moz-focus-inner,.dhx_inp_toggle_left_off::-moz-focus-inner,.dhx_inp_toggle_right_on::-moz-focus-inner,.dhx_inp_toggle_right_off::-moz-focus-inner,.dhx_inp_form_button::-moz-focus-inner,.dhx_inp_counter_prev::-moz-focus-inner,.dhx_inp_counter_next::-moz-focus-inner,.dhx_inp_checkbox_on::-moz-focus-inner,.dhx_inp_radio_on::-moz-focus-inner,.dhx_el_button input::-moz-focus-inner,.dhx_el_roundbutton input::-moz-focus-inner,.dhx_el_prevbutton input::-moz-focus-inner,.dhx_el_nextbutton input::-moz-focus-inner{border:0;}.invalid,.invalid input,.invalid textarea{color:#F00;}div,input,textarea{font-family:"Helvetica World","HelveticaNeue","Helvetica Neue","HelveticaNeueRoman","Helvetica","Tahoma","Geneva","Arial",sans-serif;}.dhx_form_float,.dhx_form_clear{float:left;width:300px;font-size:18px;padding:5px 0 5px 10px;height:35px;}.dhx_form_float{text-align:center;}.dhx_form_row_delimiter,.dhx_form_clear{clear:both;}.dhx_el_text input{font-size:18px;line-height:28px;}.dhx_toolbar{text-align:center;margin:auto;height:42px;background-image:-webkit-gradient(linear,0% 0,0% 100%,from(#9ecfe0),to(#73bbd4),color-stop(50%,#76a6b7));background-image:-moz-linear-gradient(top,#9ecfe0,#76a6b7,#73bbd4);line-height:normal;}.dhx_toolbar .dhx_view{background-color:transparent;}.dhx_mainbar{background-image:-moz-linear-gradient(top,#FFF,#e1ebee,#cbdce2);background-image:-webkit-gradient(linear,0% 0,0% 100%,from(#FFF),to(#cbdce2),color-stop(50%,#e1ebee));}.dhx_transparentbar{background:transparent!important;font-weight:bold;}.dhx_subbar{background-image:-webkit-gradient(linear,0% 0,0% 100%,from(#FFF),to(#c2c2c2),color-stop(50%,#e8e8e8));background-image:-moz-linear-gradient(top,#FFF,#e8e8e8,#c2c2c2);background-repeat:repeat-x;}.dhx_list_item{cursor:pointer;line-height:22px;font-family:"Helvetica World","HelveticaNeue","Helvetica Neue","HelveticaNeueRoman","Helvetica","Tahoma","Geneva","Arial",sans-serif;font-weight:bold;font-size:16px;text-decoration:none;color:#303030;border-bottom:1px solid #d4d4d4;vertical-align:middle;white-space:nowrap;background:;background:;background:;-moz-user-select:none;-moz-user-select:-moz-none;-webkit-user-select:none;}.dhx_list__item_selected,.dhx_list_item_selected{color:#FFF;text-shadow:0 -1px 0 #2d6072;background:#0986b0;background:-moz-linear-gradient(top,#8dcee3 4%,#0986b0 85%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0.85,#0986b0),color-stop(0.04,#8dcee3));}.dhx_list_group,.dhx_list_group_selected{position:relative;border-bottom:1px solid #d4d4d4;}.dhx_list_group_back,.dhx_list_group_back_selected{position:relative;background-color:#aeaeae;background-image:url(./imgs/arr_top.png),-webkit-gradient(linear,left bottom,left top,color-stop(0.02,#ccc),color-stop(0.06,#e0e0e0),color-stop(0.90,#fdfdfd));background-image:url(./imgs/arr_top.png),-moz-linear-gradient(center bottom,#ccc 2%,#e0e0e0 6%,#fdfdfd 90%,#FFF 95%);background-repeat:no-repeat,repeat-x;background-position:center 37px,0;border-bottom:1px solid transparent;}.dhx_arrow_icon{position:absolute;top:50%;bottom:50%;margin-top:-6px;right:29px;width:7px;height:11px;background-image:url(./imgs/images.png);background-repeat:no-repeat;}.dhx_list_group .dhx_arrow_icon,.dhx_list_group_selected .dhx_arrow_icon{background-position:0 -677px;}.dhx_list_group_back .dhx_arrow_icon,.dhx_list_group_back_selected .dhx_arrow_icon{background-position:0 -664px;}.dhx_arrow_top_icon{position:absolute;bottom:0;left:50%;width:13px;height:7px;margin-left:-7px;margin-bottom:-1px;background-image:url(./imgs/images.png);background-repeat:no-repeat;}.dhx_list_group_back .dhx_arrow_top_icon{background-position:0 -729px;}.dhx_list_count{float:right;width:25px;font-size:14px;text-align:center;margin-right:45px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;background-color:#929292;color:#FFF;-webkit-box-shadow:0 1px 0 #000;-moz-box-shadow:0 1px 0 #000;box-shadow:0 1px 0 #000;-webkit-text-shadow:0 -1px 0 rgba(0,0,0,0.6);-moz-text-shadow:0 -1px 0 rgba(0,0,0,0.6);text-shadow:0 -1px 0 rgba(0,0,0,0.6);}.dhx_pagelist{position:relative;}.dhx_pagelist.hidden_scroll .dhx_scroll_x{background-color:transparent!important;}.dhx_pagelist.hidden_scroll .dhx_scroll_y{background-color:transparent!important;}.dhx_mini_calendar{background-color:#ebebeb;cursor:default;color:#616161;font-family:"Helvetica World","HelveticaNeue","Helvetica Neue","HelveticaNeueRoman","Helvetica","Tahoma","Geneva","Arial",sans-serif;font-size:18px;font-weight:bold;text-shadow:0 1px 0 #FFF;overflow:hidden;position:relative;}.dhx_cal_month{border-bottom:1px solid #d4d4d4;height:39px;line-height:39px;text-align:center;vertical-align:middle;background-image:-webkit-gradient(linear,left bottom,left top,color-stop(0.05,#c7c7c7),color-stop(0.60,#f5f5f5),color-stop(0.84,#FFF));background-image:-moz-linear-gradient(center bottom,#c7c7c7 5%,#f5f5f5 60%,#FFF 84%);position:relative;}.dhx_cal_header{position:relative;}.dhx_cal_week_header,.dhx_cal_day_name,.dhx_cal_day_num,.dhx_next_month,.dhx_prev_month,.dhx_cal_week_num{border-color:#fcfcfc #fcfcfc #ccc #cccccc;border-width:1px;border-style:solid;text-align:center;}.dhx_cal_week_header,.dhx_cal_day_name{line-height:18px;font-size:12px;position:absolute;background-color:#e3e3e3;}.dhx_cal_day_num,.dhx_next_month,.dhx_prev_month,.dhx_cal_week_num{background-color:#ededed;color:#6a6a6a;font-size:16px;}.dhx_week_numbers .dhx_cal_week_num{font-size:12px;font-weight:bold;color:#303030;background-color:#E4E4E4;}.dhx_cal_day_num{cursor:pointer;}.dhx_cal_day_num.dhx_cal_current_day{background:#539300;color:#FFF;text-shadow:0 -1px 0 rgba(0,0,0,0.6);border-color:#828282;}.dhx_cal_day_num.dhx_cal_selected_day{background-image:;background-image:-webkit-gradient(linear,0% 0,0% 100%,from(#9dcedf),to(#0986b0),color-stop(34%,#53aac8),color-stop(85%,#0986b0));background-image:-webkit-gradient(linear,0% 0,0% 100%,from(#9dcedf),to(#0986b0),color-stop(34%,#53aac8),color-stop(85%,#0986b0));background-color:#4169e1;color:#FFF;text-shadow:0 -1px 0 rgba(0,0,0,0.6);border-color:#6c838a;}.dhx_cal_day_num_bborder{border-bottom:0;}.dhx_cal_day_num_rborder{border-right:0;}.dhx_cal_day_name_last{border-right:0;}.dhx_cal_time_select{border-top:1px solid #ccc;height:28px;padding-top:3px;text-align:center;vertical-align:middle;}.dhx_cal_header,.dhx_cal_body{margin-left:-1px;}.dhx_cal_prev_button,.dhx_cal_next_button{cursor:pointer;position:absolute;top:0;width:30px;height:39px;font-size:0;line-height:39px;vertical-align:middle;}.dhx_cal_prev_button{left:10px;}.dhx_cal_next_button{right:10px;}.dhx_cal_prev_button div,.dhx_cal_next_button div{width:7px;height:11px;position:absolute;top:15px;}.dhx_cal_prev_button div{background-image:url(./imgs/images.png);background-repeat:no-repeat;background-position:0 -664px;left:5px;}.dhx_cal_next_button div{background-image:url(./imgs/images.png);background-position:0 -677px;background-repeat:no-repeat;right:5px;}.dhx_window{position:absolute;width:298px;-moz-box-shadow:0 0 20px #878787;-khtml-box-shadow:0 0 20px #878787;}.dhx_win_content{height:auto;width:auto;overflow:hidden;}.dhx_win_body{color:#616161;background-color:#FFF;overflow:hidden;text-align:center;}.dhx_window,.dhx_win_content,.dhx_win_body{-webkit-border-radius:6px;-moz-border-radius:6px;-o-border-radius:6px;border-radius:6px;}.dhx_alert_text{color:#616161;padding:10px;}.dhx_alert_template,.dhx_win_head{line-height:43px;color:#FFF;font-size:16pt;text-align:center;border-bottom:1px solid #adadad;cursor:pointer;}.dhx_alert_template{text-shadow:0 -1px 0 #000;background:#616161;font-weight:bold;background:-webkit-gradient(linear,left top,left bottom,from(#696969),to(#575757));background:-moz-linear-gradient(top,#696969,#575757);}.dhx_modal,.dhx_modal_rich{width:100%;height:100%;position:absolute;top:0;left:0;}.dhx_modal{background-color:#000;opacity:.2;filter:alpha(opacity= 20);}.dhx_modal_rich{background-image:url(./imgs/window/bg.png);background-size:cover;}.dhx_point_top,.dhx_point_right,.dhx_point_bottom,.dhx_point_left{position:absolute;}.dhx_point_top,.dhx_point_bottom{width:13px;height:7px;}.dhx_point_left,.dhx_point_right{width:7px;height:13px;}.dhx_point_top{background-image:url(./imgs/images.png);background-position:0 -729px;}.dhx_point_bottom{background-image:url(./imgs/images.png);background-position:0 -690px;}.dhx_point_right{background-image:url(./imgs/images.png);background-position:0 -714px;}.dhx_point_left{background-image:url(./imgs/images.png);background-position:0 -699px;}.dhx_confirm_message,.dhx_alert_message,.dhx_prompt_message{font-size:18px;padding:14px;}body{-moz-user-select:none;-moz-user-select:-moz-none;-webkit-user-select:none;}.dhx_scroll_x{width:50px;height:4px!important;padding:0!important;margin:0!important;background:rgba(0,0,0,0.4);position:absolute;left:1px;bottom:3px;border:1px solid transparent;-webkit-border-radius:4px;-webkit-transition:-webkit-transform;}.dhx_scroll_y{width:4px!important;padding:0!important;margin:0!important;height:50px;background:rgba(0,0,0,0.4);position:absolute;top:1px;right:3px;border:1px solid transparent;-webkit-border-radius:4px;-webkit-transition:-webkit-transform;}.dhx_scroll_cont{width:100%;height:auto;overflow:hidden;clear:both;}html,body{-webkit-tap-highlight-color:rgba(0,0,0,0);-moz-user-select:none;-moz-user-select:-moz-none;-khtml-select:none;}.dhx_schedulerbar{background:-webkit-gradient(linear,left top,left bottom,from(#d7d7d7),to(#b7b7b7));background:-moz-linear-gradient(top,#d7d7d7,#b7b7b7);}.dhx_el_button input{border-radius:4px;-moz-border-radius:4px;-webkit-border-radius:4px;background:-webkit-gradient(linear,left top,left bottom,from(#9dbcc7),color-stop(0.4,#80a9b8),color-stop(0.6,#6799aa),to(#4f899d));background:-moz-linear-gradient(top,#9dbcc7,#518a9e);text-shadow:0 -1px 0 rgba(0,0,0,0.6);font-size:14px;color:#fff;padding:0 10px;border:1px solid #636363;-moz-box-shadow:0 1px #fff;-webkit-box-shadow:0 1px #fff;box-shadow:0 1px #fff;}.add .dhx_el_button input{background-image:url(./imgs_mobile/add.png),-webkit-gradient(linear,left top,left bottom,from(#9dbcc7),color-stop(0.4,#80a9b8),color-stop(0.6,#6799aa),to(#4f899d));background-image:url(./imgs_mobile/add.png),-moz-linear-gradient(top,#9dbcc7,#518a9e);background-position:center center;background-repeat:no-repeat;width:34px;}.dhx_schedulerbar .dhx_el_segmented{border-radius:4px;-moz-border-radius:4px;-webkit-border-radius:4px;float:none!important;border:1px solid #636363;-moz-box-shadow:0 1px #fff;-webkit-box-shadow:0 1px #fff;height:32px;}.dhx_schedulerbar .dhx_el_segmented .segment_0,.dhx_schedulerbar .dhx_el_segmented .segment_1,.dhx_schedulerbar .dhx_el_segmented .segment_N{background:-webkit-gradient(linear,left top,left bottom,from(#f8f8f8),color-stop(0.3,#eee),color-stop(0.6,#dcdcdc),to(#d5d5d5));background:-moz-linear-gradient(top,#f8f8f8,#d5d5d5);}.dhx_schedulerbar .dhx_el_segmented .selected.segment_0,.dhx_schedulerbar .dhx_el_segmented .selected.segment_1,.dhx_schedulerbar .dhx_el_segmented .selected.segment_N{background:-webkit-gradient(linear,left top,left bottom,from(#9dbcc7),color-stop(0.4,#80a9b8),color-stop(0.6,#6799aa),to(#4f899d));background:-moz-linear-gradient(top,#9dbcc7,#518a9e);}.dhx_el_segmented .segment_N,.dhx_el_segmented .selected.segment_N{border-left:0;}.dhx_schedulerbar .dhx_el_segmented div{text-shadow:0 1px 0 #fff;font-size:14px;color:#757575;border:0;height:30px;}.dhx_schedulerbar .dhx_el_segmented div.selected{text-shadow:0 -1px 0 rgba(0,0,0,0.6);color:#fff;height:30px;}.dhx_schedulerbar .dhx_el_segmented .segment_0{-webkit-border-top-left-radius:4px;-webkit-border-bottom-left-radius:4px;-moz-border-radius-topleft:4px;-moz-border-radius-bottomleft:4px;border-top-left-radius:4px;border-bottom-left-radius:4px;padding:0 11px 0 14px;}.dhx_schedulerbar .dhx_el_segmented .segment_1{border-left:1px solid #ababab;border-right:1px solid #ababab;padding:0 11px;}.dhx_schedulerbar .dhx_el_segmented .segment_N{-webkit-border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-bottomright:4px;border-top-right-radius:4px;border-bottom-right-radius:4px;padding:0 14px 0 11px;}.dhx_dayevents_scale_item{-moz-user-select:-moz-none;border-bottom:1px solid #D4D4D4;color:#303030;font-family:"Helvetica World","HelveticaNeue","Helvetica Neue","HelveticaNeueRoman","Helvetica","Tahoma","Geneva","Arial",sans-serif;white-space:nowrap;}.dhx_dayevents_scale_hour{float:left;text-align:center;font-size:16px;vertical-align:middle;font-weight:bold;}.dhx_dayevents_scale_top,.dhx_dayevents_scale_bottom{font-size:10px;float:left;text-align:center;}.dhx_dayevents_scale_top{border-bottom:1px dotted #D4D4D4;}.dhx_dayevents_scale_minute{background-color:#EEE;border-right:1px dotted #D4D4D4;float:left;}.dhx_dayevents_scale_event{float:left;}.dhx_dayevents_event_item{position:absolute;border-radius:4px;-moz-border-radius:4px;-webkit-border-radius:4px;font-size:12px;background-color:#e6f8ff;border:1px solid #78a5b4;font-family:"Helvetica World","HelveticaNeue","Helvetica Neue","HelveticaNeueRoman","Helvetica","Tahoma","Geneva","Arial",sans-serif;}.dhx_topbar{font-size:18px;background:-webkit-gradient(linear,left top,left bottom,from(#fdfdfd),color-stop(0.5,#ededed),to(#c8c8c8))!important;background:-moz-linear-gradient(top,#fdfdfd,#c8c8c8)!important;}.dhx_list_events_item{position:relative;background-color:#fff;}.dhx_list_events_item .dhx_day_title{height:16px;line-height:16px;width:75px;position:absolute;left:1px;top:0;background:#518A9E;border-radius:2px;text-align:center;-moz-border-radius:2px;-moz-box-shadow:1px 1px 1px #1c2329;-webkit-box-shadow:1px 1px 1px #1c2329;box-shadow:1px 1px 1px #1c2329;-webkit-border-radius:2px;text-shadow:0 -1px 0 rgba(0,0,0,0.6);font-size:14px;color:#fff;}.dhx_list_events_item .dhx_event_marker{display:inline-block;margin-left:5px;margin-top:5px;height:10px;width:10px;border-radius:6px;-moz-border-radius:6px;-webkit-border-radius:6px;background-color:#e6f8ff;border:1px solid #78a5b4;vertical-align:top;}.dhx_list_events_item .dhx_event_time{display:inline-block;width:70px;font-size:16px;padding-top:8px;}.dhx_list_events_item .dhx_event_text{display:inline-block;padding-left:4px;overflow:hidden;height:22px;vertical-align:top;white-space:nowrap;}.dhx_cal_day_num.dhx_cal_selected_day,.dhx_cal_day_num.dhx_cal_current_day.dhx_cal_selected_day{background:-webkit-gradient(linear,left top,left bottom,from(#a0bfc9),to(#4f899d))!important;background:-moz-linear-gradient(top,#a0bfc9,#4f899d);text-shadow:0 1px 0 rgba(0,0,0,0.6);}.dhx_cal_day_num.dhx_cal_current_day{background:-webkit-gradient(linear,left top,left bottom,from(#bababa),to(#eee))!important;background:-moz-linear-gradient(top,#bababa,#eee);border-color:#636363;text-shadow:0 1px 0 rgba(0,0,0,0.6);}.dhx_cal_day_num.dhx_cal_selected_day span{color:#fff;}.dhx_cal_day_num{position:relative;}.dhx_cal_day_num .day_with_events{position:absolute;bottom:0;right:0;background-image:url(./imgs_mobile/event.png);background-repeat:no-repeat;width:12px;height:12px;}.dhx_cal_day_num.dhx_cal_selected_day .day_with_events{background-image:url(./imgs_mobile/event_focus.png);}.dhx_cal_prev_button div{background-image:url("./imgs_mobile/arrow_left.png");background-position:0 0;width:28px;height:29px;top:6px;}.dhx_cal_next_button div{background-image:url("./imgs_mobile/arrow_right.png");background-position:0 0;width:28px;height:29px;top:6px;}.dhx_list_day_events_item{background-color:#fff;}.dhx_list_day_events_item .dhx_event_marker{display:inline-block;margin-top:16px;margin-left:5px;height:10px;width:10px;border-radius:6px;-moz-border-radius:6px;-webkit-border-radius:6px;background-color:#e6f8ff;border:1px solid #78a5b4;}.dhx_list_day_events_item .dhx_event_time{display:inline-block;width:auto;height:42px;line-height:42px;padding-left:5px;}.dhx_list_day_events_item .dhx_event_text{display:inline-block;padding-left:10px;line-height:42px;}.no_events{background-image:url(./imgs_mobile/noevents.png);background-repeat:no-repeat;}.selected_event{width:290px;margin:5px;background-color:#e6f8ff;border:1px solid #78a5b4;border-radius:5px;-moz-border-radius:5px;-webkit-border-radius:5px;padding:3px 6px;}.selected_event .event_title{font-weight:bold;}.selected_event .event_text{font-size:12px;}.dhx_el_formbutton.delete .dhx_inp_form_button{background:-webkit-gradient(linear,left top,left bottom,from(#f8f8f8),to(#d4d4d4));background:-moz-linear-gradient(top,#f8f8f8,#d4d4d4);border-top:1px solid #888;font-size:18px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;border:1px solid #8f8f8f;color:#606060;text-shadow:0 1px 0 #fff;height:40px;}.dhx_el_button.cancel input{background:-webkit-gradient(linear,left top,left bottom,from(#f8f8f8),color-stop(0.3,#eee),color-stop(0.6,#dcdcdc),to(#d5d5d5));background:-moz-linear-gradient(top,#f8f8f8,#d5d5d5);color:#6E6E6E;text-shadow:0 1px 0 #FFF;}.invalid .dhx_inp_text_border{border-color:#c00;}.invalid .dhx_inp_list{color:#c00;}.dhx_win_body{font-weight:bold;color:#3f2317;text-shadow:0 1px #e2d3b6;background:url(../images/confirm_main_bgr.png);}.dhx_win_body .dhx_view{background:transparent;}.dhx_el_bigbutton input,.dhx_el_bigroundbutton input{height:40px;line-height:40px;}.dhx_el_bigroundbutton input,.alert .dhx_el_bigbutton input{background:#83a41f;background:-webkit-gradient(linear,left top,left bottom,from(#9dbcc7),color-stop(0.4,#80a9b8),color-stop(0.6,#6799aa),to(#4f899d));background:-moz-linear-gradient(top,#9dbcc7,#518a9e);}.dhx_el_bigroundbutton{padding-top:0;} \ No newline at end of file diff --git a/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/dhtmlxscheduler_mobile.js b/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/dhtmlxscheduler_mobile.js new file mode 100644 index 00000000000..9ec9bb0dbfa --- /dev/null +++ b/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/dhtmlxscheduler_mobile.js @@ -0,0 +1,318 @@ +/* +This software is allowed to use under GPL or you need to obtain Commercial or Enterise License +to use it in not GPL project. Please contact sales@dhtmlx.com for details +*/ +window.dhx||(dhx={});dhx.version="3.0";dhx.codebase="./";dhx.name="Core";dhx.copy=function(a){var b=dhx.copy.Sd;b.prototype=a;return new b};dhx.copy.Sd=function(){};dhx.extend=function(a,b,c){a.Ya&&(a=a.Ya[0]);for(var d in b)if(!a[d]||c)a[d]=b[d];b.defaults&&dhx.extend(a.defaults,b.defaults);b.$init&&b.$init.call(a);return a}; +dhx.fullCopy=function(a){var b=a.length?[]:{};arguments.length>1&&(b=arguments[0],a=arguments[1]);for(var c in a)typeof a[c]=="object"?(b[c]=a[c].length?[]:{},dhx.fullCopy(b[c],a[c])):b[c]=a[c];return b};dhx.single=function(a){var b=null,c=function(c){b||(b=new a({}));b.Yc&&b.Yc.apply(b,arguments);return b};return c}; +dhx.protoUI=function(){var a=arguments,b=a[0].name,c=function(d){if(a){for(var e=[a[0]],f=1;f0;e--){if(typeof a[e]=="function")a[e]=a[e].prototype;a[e].$init&&d.push(a[e].$init);if(a[e].defaults){var f=a[e].defaults;if(!b.defaults)b.defaults={};for(var g in f)dhx.isNotDefined(b.defaults[g])&&(b.defaults[g]=f[g])}if(a[e].type&&b.type)for(g in a[e].type)b.type[g]||(b.type[g]=a[e].type[g]);for(var h in a[e])b[h]||(b[h]=a[e][h])}c&&d.push(b.$init);b.$init=function(){for(var a=0;a=0&&this.splice(a,b||1)},remove:function(a){this.removeAt(this.find(a))},insertAt:function(a,b){if(!b&&b!==0)this.push(a);else{var c=this.splice(b,this.length-b);this[b]=a;this.push.apply(this,c)}},find:function(a){for(var b=0;b")!=-1)switch(b=b.split("->"),b[0]){case "html":b=dhx.html.getValue(b[1]);break;case "http":b=(new dhx.ajax).sync().get(b[1],{uid:dhx.uid()}).responseText}b=(b||"").toString();b=b.replace(/(\r\n|\n)/g,"\\n");b=b.replace(/(\")/g,'\\"');b=b.replace(/\{obj\.([^}?]+)\?([^:]*):([^}]*)\}/g,'"+(obj.$1?"$2":"$3")+"');b=b.replace(/\{common\.([^}\(]*)\}/g,"\"+(common.$1||'')+\""); +b=b.replace(/\{common\.([^\}\(]*)\(\)\}/g,'"+(common.$1?common.$1(obj,common):"")+"');b=b.replace(/\{obj\.([^}]*)\}/g,"\"+(obj.$1||'')+\"");b=b.replace(/#([$a-z0-9_\[\]]+)#/gi,"\"+(obj.$1||'')+\"");b=b.replace(/\{obj\}/g,'"+obj+"');b=b.replace(/\{-obj/g,"{obj");b=b.replace(/\{-common/g,"{common");b='return "'+b+'";';try{Function("obj","common",b)}catch(c){}return a[b]=Function("obj","common",b)};dhx.Template.empty=function(){return""};dhx.Template.bind=function(a){return dhx.bind(dhx.Template(a), +this)};dhx.Type=function(a,c){if(a.Ya){if(!a.Ga)a.Ga=[];a.Ga.push(c)}else{if(typeof a=="function")a=a.prototype;if(!a.types)a.types={"default":a.type},a.type.name="default";var d=c.name,e=a.type;d&&(e=a.types[d]=dhx.copy(a.type));for(var f in c)e[f]=f.indexOf("template")===0?dhx.Template(c[f]):c[f];return d}}})(); +dhx.AtomRender={xa:function(a){return this.a.template(a,this)},render:function(){if(this.isVisible(this.a.id)){if(!this.callEvent||this.callEvent("onBeforeRender",[this.data])){if(this.data)this.d.innerHTML=this.xa(this.data);this.callEvent&&this.callEvent("onAfterRender",[])}return!0}return!1},template_setter:dhx.Template}; +dhx.SingleRender=dhx.proto({xa:function(a){return this.type.templateStart(a,this.type)+this.type.template(a,this.type)+this.type.templateEnd(a,this.type)},customize:function(a){dhx.Type(this,a)}},dhx.AtomRender); +dhx.Destruction={$init:function(){dhx.destructors.push(this)},destructor:function(){this.destructor=function(){};if(this.c)for(var a=0;ab+1&&this.showItem(this.idByIndex(b+1))})}},loadNext:function(a,b){this.data.feed&&this.data.feed.call(this,b||this.dataCount(),a)},mb:function(a,b){this.data.ue(this.data.driver.toObject(a,b));this.callEvent("onXLE",[]);if(this.Ub)this.data.detachEvent(this.Ub),this.Ub=null},scheme_setter:function(a){this.data.scheme(a)},dataFeed_setter:function(a){this.data.attachEvent("onBeforeFilter",dhx.bind(function(a,c){if(this.a.dataFeed){var d={};if(a||d){if(typeof a=="function"){if(!c)return; +a(c,d)}else d={text:c};this.clearAll();var e=this.a.dataFeed,f=[],g;for(g in d)f.push("dhx_filter["+g+"]="+encodeURIComponent(d[g]));this.load(e+(e.indexOf("?")<0?"?":"&")+f.join("&"),this.a.datatype);return!1}}},this));return a},Ed:function(){if(this.a.ready){var a=dhx.toFunctor(this.a.ready);a&&a.call&&a.apply(this,arguments)}}},dhx.AtomDataLoader).prototype;dhx.DataStore=function(){this.name="DataStore";dhx.extend(this,dhx.EventSystem);this.setDriver("xml");this.pull={};this.order=dhx.toArray()}; +dhx.DataStore.prototype={setDriver:function(a){this.driver=dhx.DataDriver[a]},ue:function(a){this.callEvent("onParse",[this.driver,a]);this.p&&this.filter();var b=this.driver.getInfo(a),c=this.driver.getRecords(a),d=(b.ia||0)*1;if(d===0&&this.order[0])d=this.order.length;for(var e=0,f=0;fb)var c=b,b=a,a=c;return this.getIndexRange(a,b)},getIndexRange:function(a,b){for(var b=Math.min(b||Infinity,this.dataCount()- +1),c=dhx.toArray(),d=a||0;d<=b;d++)c.push(this.item(this.order[d]));return c},dataCount:function(){return this.order.length},exists:function(a){return!!this.pull[a]},move:function(a,b){if(!(a<0||b<0)){var c=this.idByIndex(a),d=this.item(c);this.order.removeAt(a);this.order.insertAt(c,Math.min(this.order.length,b));this.callEvent("onStoreUpdated",[c,d,"move"])}},scheme:function(a){this.sb=a;this.tb=a.$init;this.ta=a.$update;this.ad=a.$serialize;delete a.$init;delete a.$update;delete a.$serialize}, +sync:function(a,b,c){typeof b!="function"&&(c=b,b=null);if(dhx.debug_bind)this.debug_sync_master=a;if(a.name!="DataStore")a=a.data;var d=dhx.bind(function(){this.order=dhx.toArray([].concat(a.order));this.p=null;this.pull=a.pull;b&&this.silent(b);this.Tc&&this.Tc();c?c=!1:this.refresh()},this);a.attachEvent("onStoreUpdated",d);d()},add:function(a,b){if(this.sb){var a=a||{},c;for(c in this.sb)a[c]=a[c]||this.sb[c];this.tb?this.tb(a):this.ta&&this.ta(a)}var d=this.id(a),e=this.dataCount();if(dhx.isNotDefined(b)|| +b<0)b=e;b>e&&(b=Math.min(this.order.length,b));if(this.callEvent("onBeforeAdd",[d,a,b])===!1)return!1;if(this.exists(d))return null;this.pull[d]=a;this.order.insertAt(d,b);if(this.p){var f=this.p.length;!b&&this.order.length&&(f=0);this.p.insertAt(d,f)}this.callEvent("onafterAdd",[d,b]);this.callEvent("onStoreUpdated",[d,a,"add"]);return d},remove:function(a){if(dhx.isArray(a))for(var b=0;bb?1:ab?1:ab?1:a"+a.innerHTML+""}}; +dhx.DataMove={$init:function(){},copy:function(a,b,c,d){var e=this.item(a);if(e)return c&&(e=c.externalData(e)),c=c||this,c.add(c.externalData(e,d),b)},move:function(a,b,c,d){if(dhx.isArray(a))for(var e=0;ethis.c.length)b=this.c.length;var d=(this.c[b]|| +{}).b;dhx.PowerArray.insertAt.call(this.c,a,b);dhx.html.insertBefore(a.b,d,this.d)}else{var e=dhx.ui.get(b),b=dhx.PowerArray.find.call(this.c,e);e.b.parentNode.insertBefore(a.b,e.b);e.destructor();this.c[b]=a}a.b.style.cssFloat=a.b.style.styleFloat=this.wc;this.c[b].D=this}this.resizeChildren()},reconstruct:function(){for(var a=0;a-1)b=this.a.height,d=0;if(this.a.width>-1)a=this.a.width,c=0;this.r?(a&&(c=0),d&&(b=0)):(b&&(d=0),c&&(a=0));return[c,a,d,b]},$setSize:function(a,b){this.hb=[a,b]; +dhx.ui.baseview.prototype.$setSize.call(this,a,b);this.va(a,b)},va:function(a,b){for(var c=a-this.jb[1],d=b-this.jb[3],e=this.jb[0],f=this.jb[2],g=this.c.length-1,h=0;h0&&(j+=d))}else j=b,this.U[h][0]?(i=Math.round(this.U[h][0]*c/e),c-=i,e-=this.U[h][0]):(i=this.U[h][1],h==g&&c>0&&(i+=c));this.c[h].$setSize(i,j)}},ef:function(a,b){var c=this.index(a); +return c==-1?null:this.c[c+b]},first:function(){return this.c[0]}},dhx.ui.baseview); +dhx.protoUI({name:"layout",$init:function(){this.fb=0},T:function(){this.b.className+=" dhx_layout_"+(this.a.type||"");if(this.a.margin)this.S=this.a.margin;if(this.a.padding)this.u=this.a.padding;var a=this.Q;if(!this.a.k)this.a.k={top:!0,left:!0,right:!0,bottom:!0};this.mc(a);dhx.ui.baselayout.prototype.T.call(this,a);this.kc(a)},$getSize:function(){var a=dhx.ui.baselayout.prototype.$getSize.call(this),b=this.S*(this.c.length-this.fb-1);this.r?a[3]&&(a[3]+=b):a[1]&&(a[1]+=b);if(this.u&&(a[1]&&(a[1]+= +this.u*2),a[3]&&(a[3]+=this.u*2),this.S>-1)){var c=this.a.k;if(c){var d=(c.left?0:1)+(c.right?0:1),e=(c.top?0:1)+(c.bottom?0:1);a[1]&&d&&(a[1]+=d);a[3]&&e&&(a[3]+=e)}}return a},$setSize:function(a,b){this.hb=[a,b];this.u&&this.S>0?dhx.ui.view.prototype.$setSize.call(this,a,b):dhx.ui.baseview.prototype.$setSize.call(this,a,b);this.va(this.j,this.m)},va:function(a,b){var c=this.S*(this.c.length-this.fb-1);this.r?(b-=c+this.u*2,a-=this.u*2):(a-=c+this.u*2,b-=this.u*2);return dhx.ui.baselayout.prototype.va.call(this, +a,b)},resizeChildren:function(a){if(a&&this.type!="clean"){for(var b=[],c=0;c1){if(this.a.type!="head")a[0].k.bottom=c;a[a.length-1].k.top=c}}else{for(b=1;b1){if(this.a.type!="head")a[0].k.right=c;a[a.length-1].k.left=c}}}},kc:function(a){for(var b=1,c=0;c0)this.g.style.border="1px solid #AEAEAE";return a},je:{space:10,wide:4, +clean:0,head:4,line:-1},te:{space:10,wide:0,clean:0,head:0,line:0},S:-1,u:0},dhx.ui.baselayout);dhx.ui.layout.call(dhx); +dhx.protoUI({name:"template",$init:function(){this.attachEvent("onXLE",this.render)},setValues:function(a){this.data=a;this.render()},defaults:{template:dhx.Template.empty,loading:!0},Wc:function(){this.Pb||this.render()},src_setter:function(a){this.Pb=!0;this.callEvent("onXLS",[]);dhx.ajax(a,dhx.bind(function(a){this.a.template=dhx.Template(a);this.Pb=!1;this.Wc();this.callEvent("onXLE",[])},this));return a},content_setter:function(a){if(a)this.Pb=!0,this.d.appendChild(dhx.toNode(a))},refresh:function(){this.render()}, +waitMessage_setter:function(a){dhx.extend(this,dhx.ui.overlay);return a},$setSize:function(a,b){dhx.ui.view.prototype.$setSize.call(this,a,b)&&this.Wc()},se:!0},dhx.Scrollable,dhx.AtomDataLoader,dhx.AtomRender,dhx.EventSystem,dhx.ui.view); +dhx.protoUI({name:"iframe",defaults:{loading:!0},$init:function(){this.d=this.g;this.g.innerHTML=""},load:function(a){this.src_setter(a)},src_setter:function(a){this.g.childNodes[0].src=a;this.callEvent("onXLS",[]);dhx.delay(this.Je,this);return a},Je:function(){try{dhx.event(this.getWindow(),"load",dhx.bind(function(){this.callEvent("onXLS",[])},this))}catch(a){this.callEvent("onXLE",[])}},getWindow:function(){return this.g.childNodes[0].contentWindow}, +waitMessage_setter:function(a){dhx.extend(this,dhx.ui.overlay);return a}},dhx.ui.view,dhx.EventSystem); +dhx.ui.overlay={$init:function(){if(dhx.isNotDefined(this.ba)&&this.attachEvent)this.attachEvent("onXLS",this.showOverlay),this.attachEvent("onXLE",this.hideOverlay),this.ba=null},showOverlay:function(){if(!this.ba)this.ba=dhx.html.create("DIV",{"class":"dhx_loading_overlay"},""),dhx.html.insertBefore(this.ba,this.b.firstChild,this.b)},hideOverlay:function(){if(this.ba)dhx.html.remove(this.ba),this.ba=null}}; +dhx.protoUI({name:"scrollview",defaults:{scroll:"x",scrollSpeed:"0ms"},$init:function(){this.b.className+=" dhx_scrollview"},content_setter:function(a){this.ha=dhx.ui.Oa(a);this.ha.D=this;this.d.appendChild(this.ha.b)},body_setter:function(a){return this.content_setter(a)},$getSize:function(){this.ga=this.ha.$getSize();if(this.a.scroll=="x"&&this.ga[3]>0)this.a.height=this.ga[3];else if(this.a.scroll=="y"&&this.ga[1]>0)this.a.width=this.ga[1];return dhx.ui.view.prototype.$getSize.call(this)},$setSize:function(a, +b){if(dhx.ui.view.prototype.$setSize.call(this,a,b))this.ha.$setSize(Math.max(this.ga[1],this.j),Math.max(this.ga[3],this.m)),this.d.style.width=this.ha.j+"px",this.d.style.height=this.ha.m+"px"}},dhx.Scrollable,dhx.ui.view);dhx.CanvasMgr=function(a){var b=dhx.CanvasMgr.prototype.qc;!b[a]&&document.getCSSCanvasContext&&(b[a]=!0,dhx.CanvasMgr.prototype[a](b))}; +dhx.CanvasMgr.prototype={buttonGrd:["#fefefe","#e0e0e0","#e5e5e5","#e0e0e0",32],qc:[],Pa:function(a,b,c,d,e){var f=document.getCSSCanvasContext("2d",d,18,c),g=f.createLinearGradient(0,0,0,c);g.addColorStop(0,a);g.addColorStop(1,b);f.fillStyle=g;f.strokeStyle="#93B0BA";f.lineWidth=2;e?(f.moveTo(0,0.5),f.lineTo(17.5,c/2+0.5),f.lineTo(0,c-0.5),f.lineTo(0,0.5)):(f.moveTo(18,0.5),f.lineTo(0.5,c/2+0.5),f.lineTo(18,c-0.5),f.lineTo(18,0.5));f.stroke();f.fill()},dhxArrowLeftT:function(){this.Pa(this.buttonGrd[2], +this.buttonGrd[3],this.buttonGrd[4],"dhxArrowLeftT")},dhxArrowRightT:function(){this.Pa(this.buttonGrd[2],this.buttonGrd[3],this.buttonGrd[4],"dhxArrowRightT",!0)},dhxArrowLeft:function(){this.Pa(this.buttonGrd[0],this.buttonGrd[1],this.buttonGrd[4],"dhxArrowLeft");dhx.CanvasMgr("dhxArrowLeftT")},dhxArrowRight:function(){this.Pa(this.buttonGrd[0],this.buttonGrd[1],this.buttonGrd[4],"dhxArrowRight",!0);dhx.CanvasMgr("dhxArrowRightT")}}; +dhx.attachEvent("onClick",function(a){var b=dhx.ui.get(a);if(b&&b.touchable){b.getNode(a);var c=a.target||a.srcElement,d="",e=null,f=!1;if(!(c.className&&c.className.indexOf("dhx_view")===0)){for(;c&&c.parentNode;){if(c.getAttribute){if(c.getAttribute("view_id"))break;if(d=c.className)if(d=d.split(" "),d=d[0]||d[1],b.on_click[d]){var g=b.on_click[d].call(b,a,b.a.id,c);if(g===!1)return}}c=c.parentNode}if(b.a.click){var h=dhx.toFunctor(b.a.click);h&&h.call&&h.call(b,b.a.id,a)}if(b.a.multiview){var i= +dhx.ui.get(b.a.multiview);i&&i.show&&i.show()}if(b.a.popup){var j=dhx.ui.get(b.a.popup);j.a.master=b.a.id;j.show(b.getInput()||b.getNode(),j.h.a.align||"bottom",!0)}b.callEvent("onItemClick",[b.a.id,a])}}}); +dhx.protoUI({name:"button",touchable:!0,defaults:{template:"
",height:42,label:"label",s:10},$init:function(a){this.data=this.a;this.d=this.b;dhx.sa&&(dhx.sa.elements[a.name||a.id]=this,this.mapEvent({onbeforetabclick:dhx.sa,onaftertabclick:dhx.sa,onitemclick:dhx.sa}));a.type=="prev"&&dhx.CanvasMgr("dhxArrowLeft");a.type=="next"&&dhx.CanvasMgr("dhxArrowRight")},type_setter:function(a){this.a.template=dhx.Template(this.pd[a][0]); +var b=this.pd[a][1];if(b)this.a.s=b},pd:{round:["
"],"default":["
"],form:[function(a){return"
"}],prev:["
",28],next:["
",28],big:["
",28],biground:["
", +28]},$setSize:function(a,b){dhx.ui.view.prototype.$setSize.call(this,a,b)&&this.render()},K:function(a){this.a.label=a;this.getInput().value=a},getValue:function(){return this.d.childNodes.length>0?this.ab():this.a.value},setValue:function(a){var b=this.a.value;this.a.value=a;if(this.d.childNodes.length>0)this.Md=a,this.K(a),this.callEvent("onChange",[a,b])},focus:function(){this.getInput().focus()},ab:function(){return this.a.label||""},getInput:function(){return this.d.getElementsByTagName("input")[0]}, +J:function(){return this.getInput()},Z:function(){this.a.inputWidth?this.J().style.width=this.a.inputWidth-this.a.s+"px":this.J().style.width=this.j-this.a.s+"px"},render:function(){if(dhx.AtomRender.render.call(this)){this.Z();if(this.a.align)switch(this.a.align){case "right":this.d.firstChild.style.cssFloat=this.d.firstChild.style.styleFloat="right";break;case "center":this.d.firstChild.style.display="inline-block";this.d.firstChild.parentNode.style.textAlign="center";break;case "middle":this.d.firstChild.style.marginTop= +Math.round((this.m-40)/2)+"px";break;case "bottom":this.d.firstChild.style.marginTop=this.m-40+"px";break;case "left":this.d.firstChild.parentNode.style.textAlign="left"}this.Aa&&this.Aa(this.data);this.Md!=this.a.value&&this.setValue(this.a.value)}},refresh:function(){this.render()},on_click:{Ib:function(a,b){var c=dhx.html.locate(a,"button_id");if(c&&this.callEvent("onBeforeTabClick",[b,c])){this.a.selected=c;this.refresh();if(this.a.multiview){var d=dhx.ui.get(c);d&&d.show&&d.show()}this.callEvent("onAfterTabClick", +[b,c])}},dhx_el_segmented:function(a,b){this.on_click.Ib.call(this,a,b)},dhx_el_tabbar:function(a,b){this.on_click.Ib.call(this,a,b)},dhx_inp_counter_next:function(){this.next(this.a.step,this.a.min,this.a.max)},dhx_inp_counter_prev:function(){this.prev(this.a.step,this.a.min,this.a.max)},dhx_inp_toggle_left_off:function(){var a=this.a.options;this.setValue(a[0].value)},dhx_inp_toggle_right_off:function(){var a=this.a.options;this.setValue(a[1].value)},dhx_inp_combo:function(a,b,c){c.focus()},dhx_inp_checkbox_border:function(){this.toggle()}, +dhx_inp_checkbox_label:function(){this.toggle()},dhx_inp_radio_border:function(a){var b=dhx.html.locate(a,"radio_id");this.setValue(b)},dhx_inp_radio_label:function(a,b,c){c=c.parentNode.getElementsByTagName("input")[0];return this.on_click.dhx_inp_radio_border.call(this,c,b,c)}},Ba:function(a){for(var b=0;b #label#",label:""},Z:function(){}},dhx.ui.button);dhx.protoUI({name:"label",defaults:{template:"
#label#
"},focus:function(){return!1},J:function(){return this.d.firstChild},K:function(a){this.a.label=a;this.d.firstChild.innerHTML=a}},dhx.ui.button); +dhx.protoUI({name:"icon",defaults:{template:"
",width:42},Z:function(){}},dhx.ui.button); +dhx.protoUI({name:"segmented",defaults:{template:function(a,b){var c=a.options,d="",e;b.Ba(c);if(!a.selected)a.selected=c[0].value;for(var f=0;f"+c[f].label+"";return"
"+d+"
"},s:28,nb:0},K:function(a){if(this.d&& +this.d.firstChild)for(var b=this.d.firstChild.childNodes,c=0;c";d+=h?""+c[f].label+"":"
"+ +c[f].label+"";d+=""}return"
"+d+"
"},s:4}},dhx.ui.segmented); +dhx.protoUI({name:"text",wd:!0,$b:function(a,b,c){c.labelPosition=="left"?a+=b:a=b+a;return"
"+a+"
"},pb:function(a,b,c,d){var e=a.inputAlign||"left",f=a.labelAlign||"left",g=dhx.uid(),h="
";h+="
";var i=this.a.inputWidth-this.a.labelWidth-18;i<0&&(i= +0);h+=d?"
"+(a.text||a.value||"")+"
":"";h+="
";return"
"+h+"
"},qb:function(a, +b){if(!a.label)return"";var c=a.labelAlign||"left";return"
"+a.label+"
"},defaults:{template:function(a,b){return b.pb(a,"text")},labelWidth:80,s:28,nb:0},type_setter:function(a){return a},Z:function(){this.a.inputWidth?this.J().style.width=this.a.inputWidth-this.a.labelWidth-this.a.s+"px":this.J().style.width=this.j-this.a.labelWidth-this.a.s-this.a.nb+"px"},focus:function(){var a=this.d.getElementsByTagName("input")[0]; +a&&a.focus()},K:function(a){this.getInput().value=a},ab:function(){return this.getInput().value}},dhx.ui.button); +dhx.protoUI({name:"toggle",defaults:{template:function(a,b){var c=a.options;b.Ba(c);var d=b.a.inputWidth/2||"auto",e=[c[0].width||d,c[1].width||d],f=b.qb(a,"toggle"),g="";g+="";return b.$b(f,g,a)},label:"",labelWidth:0,s:20},Z:function(){},Aa:function(a){this.setValue(a.value)},$a:function(){return this.d.getElementsByTagName("input")}, +K:function(a){var b=this.$a(),c=this.a.options;a==c[1].value?(b[0].className="dhx_inp_toggle_left_off",b[1].className="dhx_inp_toggle_right_on"):(b[0].className="dhx_inp_toggle_left_on",b[1].className="dhx_inp_toggle_right_off")},ab:function(){var a=this.$a(),b=this.a.options;return a[0].className=="dhx_inp_toggle_left_on"?b[0].value:b[1].value}},dhx.ui.text); +dhx.protoUI({name:"input",defaults:{attributes:["maxlength","disabled","placeholder"],template:function(a,b){for(var c=""+c+""},s:28,labelWidth:0}},dhx.ui.text); +dhx.protoUI({name:"select",defaults:{template:function(a,b){var c=a.options;b.Ba(c);var d=""+c[e].label+"";d+="";return"
"+d+"
"},labelWidth:0,nb:0,s:10},getInput:function(){return this.d.firstChild.firstChild}},dhx.ui.text); +dhx.protoUI({name:"textarea",defaults:{template:function(a){return"
"},cssContant:28},Z:function(){this.a.inputWidth?this.J().style.width=this.a.inputWidth-this.a.cssContant+"px":this.J().style.width=this.j-this.a.nb-this.a.cssContant+"px";this.a.inputHeight?this.J().style.height=this.a.inputHeight+"px":this.J().style.height=this.m-9+"px"},getInput:function(){return this.d.firstChild.firstChild}, +K:function(a){this.getInput().value=a},ab:function(){return this.getInput().value}},dhx.ui.text); +dhx.protoUI({name:"counter",defaults:{template:function(a,b){var c=a.value||0,d=b.qb(a,"counter"),e="";e+="
"+c+"
";e+="";return b.$b(d,e,a)},min:1,step:1,labelWidth:0,label:"",s:145},J:function(){return this.getInput().parentNode},getLabel:function(){return this.getInput().previousSibling||this.getInput().parentNode.lastChild},Z:function(){if(this.a.label&& +!this.a.labelWidth){var a=this.getLabel();if(a)a.style.width=(this.a.inputWidth||this.j)-this.a.s+"px"}},K:function(a){this.getInput().nextSibling.innerHTML=a},getValue:function(){return(this.a.value||0)*1},next:function(a,b,c){a=a||1;this.kd(a,b,c)},prev:function(a,b,c){a=-1*(a||1);this.kd(a,b,c)},kd:function(a,b,c){var b=typeof b=="undefined"?-Infinity:b,c=typeof c=="undefined"?Infinity:c,d=this.getValue()+a;d>=b&&d<=c&&this.setValue(d)}},dhx.ui.text); +dhx.protoUI({name:"checkbox",defaults:{template:function(a,b){var c=a.value?"dhx_inp_checkbox_on":"dhx_inp_checkbox_on hidden",d="
",e=b.qb(a,"checkbox");return b.$b(e,d,a)}},K:function(a){var b=this.getInput();b.className=a?"dhx_inp_checkbox_on":"dhx_inp_checkbox_on hidden"},toggle:function(){this.setValue(!this.getValue())},getLabel:function(){var a=this.getInput().parentNode;return a.nextSibling||a.previousSibling}, +getValue:function(){return this.a.value?1:0},J:function(){return this.getInput().parentNode.parentNode}},dhx.ui.counter); +dhx.protoUI({name:"radio",defaults:{template:function(a,b){b.Ba(a.options);for(var c=[],d=0;d");var e="
";a.label=a.options[d].label;var f=b.qb(a,"radio");a.labelPosition=="left"?c.push(f+e):c.push(e+f)}return"
"+ +c.join("
")+"
"}},$getSize:function(){var a=dhx.ui.button.prototype.$getSize.call(this);if(this.a.options){for(var b=1,c=0;c]*>/g,""):this.getInput().innerHTML=c},getValue:function(){return this.a.value}},dhx.ui.text); +dhx.protoUI({name:"combo",defaults:{template:function(a,b){return b.pb(a,"combo")},filter:function(a,b){return a.value.toString().toLowerCase().indexOf(b.toLowerCase())===0?!0:!1}},Y:function(a){a.popup||this.Cb("list",a);this.dc();dhx.event(this.d,"keydown",function(b){var b=b||event,c=b.target||b.srcElement,d=dhx.ui.get(a.popup);window.clearTimeout(d.key_timer);var e=this;d.key_timer=window.setTimeout(function(){d.h.filter(function(a){return e.a.filter.apply(e,[a,c.value])});var a=dhx.ui.get(d.a.master); +a.a.value=d.h.dataCount()==1&&d.h.type.template(d.h.item(d.h.first()))==c.value?d.h.first():""},200);d.show(c,d.h.a.align||"bottom",!0)},this);this.Y=function(){}},Aa:function(a){this.Y(a);dhx.isNotDefined(a.value)||this.setValue(a.value)}},dhx.ui.richselect); +dhx.protoUI({name:"datepicker",defaults:{template:function(a,b){return b.pb(a,"list",!0,!0)}},Y:function(a){a.popup||this.Cb("calendar",a);var b=dhx.ui.get(a.popup);b.h.attachEvent("onDateSelect",function(a){var b=dhx.ui.get(this.getParent().a.master);this.getParent().hide();b.setValue(a)});this.Y=function(){}},Aa:function(a){this.Y(a);dhx.isNotDefined(a.value)||this.setValue(a.value)},K:function(a){var b=dhx.ui.get(this.a.popup.toString()),c=b.h;typeof a=="string"&&a&&(a=(this.a.dateFormat||dhx.i18n.dateFormatDate)(a)); +c.selectDate(a,!0);this.a.value=a?c.config.date:"";this.getInput().innerHTML=a?(this.a.dateFormatStr||dhx.i18n.dateFormatStr)(this.a.value):""},dateFormat_setter:function(a){this.a.dateFormatStr=dhx.Date.dateToStr(a);return dhx.Date.strToDate(a)},getValue:function(){return this.a.value||null}},dhx.ui.richselect); +dhx.ValidateData={validate:function(a){var b=!0,c=this.a.rules;if(c){var d=c.$obj;!a&&this.getValues&&(a=this.getValues());if(d&&!d.call(this,a))return!1;var e=c.$all,f;for(f in c)f.indexOf("$")!==0&&(c[f].call(this,a[f],a,f)&&(!e||e.call(this,a[f],a,f))?this.callEvent("onValidationSuccess",[f,a])&&this.tc&&this.tc(f,a):(b=!1,this.callEvent("onValidationError",[f,a])&&this.Lc&&this.Lc(f,a)))}return b}}; +dhx.rules={isNumber:function(a){return parseFloat(a)==a},isNotEmpty:function(a){return a=="0"||a}}; +dhx.RenderStack={$init:function(){this.F=document.createElement("DIV");this.data.attachEvent("onIdChange",dhx.bind(this.Zb,this));this.attachEvent("onItemClick",this.Dd);if(!this.types)this.types={"default":this.type},this.type.name="default";this.type=dhx.copy(this.types[this.type.name])},customize:function(a){dhx.Type(this,a)},type_setter:function(a){this.types[a]?(this.type=dhx.copy(this.types[a]),this.type.css&&(this.g.className+=" "+this.type.css)):this.customize(a);return a},template_setter:function(a){this.type.template= +dhx.Template(a)},xa:function(a){this.callEvent("onItemRender",[a]);return this.type.templateStart(a,this.type)+(a.$template?this.type["template"+a.$template]:this.type.template)(a,this.type)+this.type.templateEnd(a,this.type)},ld:function(a){this.F.innerHTML=this.xa(a);return this.F.firstChild},Zb:function(a,b){var c=this.pa(a);c&&(c.setAttribute(this.ma,b),this.B[b]=this.B[a],delete this.B[a])},Dd:function(){if(this.a.click){var a=dhx.toFunctor(this.a.click);a&&a.call&&a.apply(this,arguments)}}, +pa:function(a){if(this.B)return this.B[a];this.B={};for(var b=this.d.childNodes,c=0;c0&&(!this.r||!this.a.scroll))this.a.height=a[3];if(a[1]>0&&(this.r||!this.a.scroll))this.a.width=a[1];a=dhx.ui.view.prototype.$getSize.call(this);if(a[3]<=0&&this.Db> +0)a[3]=this.Db,a[2]=0;return a},$setSize:function(a,b){dhx.ui.view.prototype.$setSize.apply(this,arguments);dhx.ui.baselayout.prototype.$setSize.call(this,this.j,this.m)},render:function(){if(this.isVisible(this.a.id)&&this.fc)this.setValues(this.fc),this.fc=null},refresh:function(){this.render()},type_setter:function(a){this.g.className+=" dhx_"+a.toLowerCase()}},dhx.Scrollable,dhx.AtomDataLoader,dhx.Values,dhx.ui.baselayout,dhx.EventSystem,dhx.ValidateData); +dhx.protoUI({name:"form",defaults:{scroll:!0},Db:-1,Vc:function(a){this.g.className+=" dhx_form";if(a.elements)this.Q=a.elements,this.r=!0;delete a.elements;dhx.sa=this},type_setter:function(){}},dhx.ui.toolbar); +dhx.MouseEvents={$init:function(){this.on_click&&dhx.event(this.g,"click",this.me,this);this.on_context&&dhx.event(this.g,"contextmenu",this.ne,this);this.on_dblclick&&dhx.event(this.g,"dblclick",this.oe,this);this.on_mouse_move&&(dhx.event(this.g,"mousemove",this.Rc,this),dhx.event(this.g,dhx.env.isIE?"mouseleave":"mouseout",this.Rc,this))},me:function(a){return this.Ja(a,this.on_click,"ItemClick")},oe:function(a){return this.Ja(a,this.on_dblclick,"ItemDblClick")},ne:function(a){if(this.Ja(a,this.on_context, +"BeforeContextMenu"))return this.Ja(a,{},"AfterContextMenu"),dhx.html.preventEvent(a)},Rc:function(a){dhx.env.isIE&&(a=document.createEventObject(event));this.Nc&&window.clearTimeout(this.Nc);this.callEvent("onMouseMoving",[a]);this.Nc=window.setTimeout(dhx.bind(function(){a.type=="mousemove"?this.pe(a):this.qe(a)},this),500)},pe:function(a){this.Ja(a,this.on_mouse_move,"MouseMove")||this.callEvent("onMouseOut",[a||event])},qe:function(a){this.callEvent("onMouseOut",[a||event])},Ja:function(a,b,c){for(var a= +a||event,d=a.target||a.srcElement,e="",f=null,g=!1;d&&d.parentNode;){if(!g&&d.getAttribute&&(f=d.getAttribute(this.ma))){d.getAttribute("userdata")&&this.callEvent("onLocateData",[f,d]);if(!this.callEvent("on"+c,[f,a,d]))return;g=!0}if(e=d.className)if(e=e.split(" "),e=e[0]||e[1],b[e]){var h=b[e].call(this,a,f||dhx.html.locate(a,this.ma),d);if(typeof h!="undefined"&&h!==!0)return}d=d.parentNode}return g}}; +dhx.SelectionModel={$init:function(){this.i=dhx.toArray();this.data.attachEvent("onStoreUpdated",dhx.bind(this.Pd,this));this.data.attachEvent("onStoreLoad",dhx.bind(this.Od,this));this.data.attachEvent("onAfterFilter",dhx.bind(this.Nd,this));this.data.attachEvent("onChangeId",dhx.bind(this.Zd,this))},Zd:function(a,b){for(var c=this.i.length-1;c>=0;c--)this.i[c]==a&&(this.i[c]=b)},Nd:function(){for(var a=this.i.length-1;a>=0;a--){if(this.data.indexById(this.i[a])<0)var b=this.i[a];var c=this.item(b); +c&&delete c.$selected;this.i.splice(a,1);this.callEvent("onSelectChange",[b])}},Pd:function(a,b,c){if(c=="delete")this.i.remove(a);else if(!this.data.dataCount()&&!this.data.p)this.i=dhx.toArray()},Od:function(){this.a.select&&this.data.each(function(a){a.$selected&&this.select(a.id)},this)},ub:function(a,b,c){if(!c&&!this.callEvent("onBeforeSelect",[a,b]))return!1;this.data.item(a).$selected=b;c?c.push(a):(b?this.i.push(a):this.i.remove(a),this.Vb(a));return!0},select:function(a,b,c){if(!a)return this.selectAll(); +if(dhx.isArray(a))for(var d=0;d100||a.length>this.data.dataCount/ +2},Vb:function(a){typeof a!="object"&&(a=[a]);if(a.length){if(this.ee(a))this.data.refresh();else for(var b=0;b=0?b[c]:null},nextSibling:function(a){var b=this.branch[this.item(a).$parent],c=dhx.PowerArray.find.call(b,a)+1;return c0&&this.groupBy(g,f[l],!0,l,e+1)}else{var n= +arguments,g=[];this.branch={0:[]};for(l=n.length-1;l>=0;l--)g.push(n[l]);this.groupBy(g,this.pull,!0,"0",0);this.refresh()}}};dhx.animate=function(a,b){if(dhx.isArray(a))for(var c=0;c1){for(var d=0;d=0;b--)dhx.html.remove(a[b])}}; +dhx.protoUI({name:"list",$init:function(){this.data.provideApi(this,!0)},defaults:{select:!1,scroll:!0},ma:"dhx_l_id",on_click:{dhx_list_item:function(a,b){if(this.a.select)this.ra=!0,this.a.select=="multiselect"?this.select(b,a.ctrlKey,a.shiftKey):this.select(b),this.ra=!1}},$getSize:function(){if(this.type.width!="auto")this.a.width=this.type.width+(this.type.padding+this.type.margin)*2;if(this.a.yCount)this.a.height=(this.type.height+(this.type.padding+this.type.margin)*2+1)*(this.a.yCount=="auto"? +this.dataCount():this.a.yCount);return dhx.ui.view.prototype.$getSize.call(this)},$setSize:function(){dhx.ui.view.prototype.$setSize.apply(this,arguments)},type:{css:"",widthSize:function(a,b){return b.width+(b.width>-1?"px":"")},heightSize:function(a,b){return b.height+(b.height>-1?"px":"")},template:dhx.Template("#value#"),width:"auto",height:22,margin:0,padding:10,border:1,templateStart:dhx.Template("
"), +templateEnd:dhx.Template("
")}},dhx.MouseEvents,dhx.SelectionModel,dhx.Scrollable,dhx.ui.proto); +dhx.protoUI({name:"grouplist",defaults:{animate:{}},$init:function(){dhx.extend(this.data,dhx.TreeStore,!0);this.data.provideApi(this,!0);this.data.attachEvent("onClearAll",dhx.bind(this.Qc,this));this.b.className+=" dhx_grouplist";this.Qc()},Qc:function(){this.aa=[];this.z=[]},on_click:{dhx_list_item:function(a,b){if(this.oa)return!1;for(var c=0;c"), +templateBack:dhx.Template("< #value#"),templateItem:dhx.Template("#value#"),templateGroup:dhx.Template("#value#"),templateEnd:function(a){var b="";a.$count&&(b+="
");b+="";return b}},showItem:function(a){var b,c;if(a&&(b=this.item(a),c=b.$parent,b.$count))c=b.id;this.aa=this.data.branch[c||0];for(this.z=[];c;)this.item(c).$template="Back",this.z.unshift(c),c=this.item(c).$parent;this.ra=!0;this.render();this.ra=!1;dhx.RenderStack.showItem.call(this,a)}},dhx.ui.list); +dhx.Type(dhx.ui.grouplist,{}); +dhx.protoUI({name:"pagelist",defaults:{scroll:"x",panel:!1,scrollOffset:0},Yd:!0,$init:function(a){this.b.className+=" dhx_pagelist";a.scroll=a.scroll=="y"?"y":"x";this.type.layout=a.scroll;this.attachEvent("onAfterRender",this.Ie);this.$ready.push(this.zb);this.l=0},zb:function(){if(this.a.scroll=="x")this.d.style.height="100%";this.type.layout=this.a.scroll;this.attachEvent("onAfterScroll",this.Ld)},Ie:function(){if(this.a.scroll=="x")this.d.style.width=(this.type.width+(this.type.padding+this.type.margin)* +2+this.type.border)*this.dataCount()+"px";this.a.panel&&this.Wb()},panel_setter:function(a){a&&(this.b.className+=" hidden_scroll",a===!0&&(a={}),this.Ia(a,{size:16,itemSize:16,align:"bottom"}));return a},bd:function(a){var b=this.indexById(a);if(typeof b!="undefined"&&this.a.panel)this.l=b,this.Xb()},getActive:function(){return this.l?this.data.order[this.l]:this.first()},Ld:function(a){var b=(this.a.scroll=="y"?this.type.height:this.type.width)+(this.type.padding+this.type.margin)*2+this.type.border, +c=this.a.scroll=="y"?this.d.scrollHeight-this.m:this.d.scrollWidth-this.j,d;this.a.scroll=="y"?(d=Math.round(a.f/b),a.f=d*b,a.f=this.uc(a.f,c)):(d=Math.round(a.e/b),a.e=d*b,a.e=this.uc(a.e,c));this.l=-d;this.a.panel&&this.Xb();return!0},uc:function(a,b){var c=this.a.scrollOffset;if(c&&Math.abs(a)>c){var d=dhx.Touch.A[dhx.Touch.H]>dhx.Touch.w[dhx.Touch.H];a+=d?c:1-c}Math.abs(a)>b&&(a=-b);return a},$getSize:function(){if(this.a.scroll=="y"){if(this.type.width!="auto")this.a.width=this.type.width+(this.type.padding+ +this.type.margin)*2+this.type.border;if(this.a.yCount)this.a.height=(this.type.height+(this.type.padding+this.type.margin)*2+this.type.border)*(this.a.yCount=="auto"?this.dataCount():this.a.yCount)}else if(this.type.height!="auto")this.a.height=this.type.height+(this.type.padding+this.type.margin)*2+this.type.border;return dhx.ui.view.prototype.$getSize.call(this)},$setSize:function(a,b){if(dhx.ui.view.prototype.$setSize.apply(this,arguments)){if(this.type.fullScreen)this.type.width=this.j,this.type.height= +this.m,this.type.padding=0,this.render();this.a.panel&&this.Wb()}},type:{templateStart:function(a,b){var c="dhx_list_item dhx_list_"+b.css+"_item"+(a.$selected?"_selected":""),d="width:"+b.width+"px; height:"+b.height+"px; padding:"+b.padding+"px; margin:"+b.margin+"px; overflow:hidden;"+(b.layout&&b.layout=="x"?"float:left;":"");return"
"}}},dhx.ui.list,dhx.CarouselPanel); +dhx.protoUI({name:"multiview",defaults:{animate:{}},$init:function(){this.l=0;this.r=1;this.b.style.position="relative";this.b.className+=" dhx_multiview";this.M=[]},xd:function(a,b){var c=dhx.ui.get(a);if(!c.La)c.rb=[],c.La={};c.La[b]||(c.La[b]=!0,c.rb.push(b))},Yb:function(a){var b=dhx.ui.get(a);this.M[this.M.length-2]!=a?(this.M.length==10&&this.M.splice(0,1),this.M.push(a)):this.M.splice(this.M.length-1,1);if(b.La){for(var c=0;c-1)a[3]=this.a.height,a[2]= +0;if(this.a.width>-1)a[1]=this.a.width,a[0]=0;a[0]&&(a[1]=0);a[2]&&(a[3]=0);return a},$setSize:function(a,b){dhx.ui.baseview.prototype.$setSize.call(this,a,b);this.c[this.l].$setSize(a,b)},isVisible:function(a,b){return b&&b!=this.getActive()?(a&&this.xd(b,a),!1):dhx.ui.view.prototype.isVisible.call(this,a,this.a.id)},getActive:function(){return this.c.length?this.c[this.l].a.id:null},back:function(a){a=a||1;if(this.callEvent("onBeforeBack",[this.getActive(),a])&&this.M.length>a){var b=this.M[this.M.length- +a-1];dhx.ui.get(b).show();return b}return null}},dhx.ui.baselayout,dhx.EventSystem);dhx.html.addMeta=function(a,b){document.getElementsByTagName("head").item(0).appendChild(dhx.html.create("meta",{name:a,content:b}))}; +(function(){var a=function(){var a=!!(window.orientation%180);if(dhx.ui.orientation!==a)dhx.ui.orientation=a,dhx.callEvent("onRotate",[a])};dhx.ui.orientation=!!((dhx.isNotDefined(window.orientation)?90:window.orientation)%180);dhx.event(window,"onorientationchange"in window?"orientationchange":"resize",a);dhx.ui.fullScreen=function(){dhx.html.addMeta("apple-mobile-web-app-capable","yes");dhx.html.addMeta("viewport","initial-scale = 1.0, maximum-scale = 1.0, user-scalable = no");if(dhx.env.touch){var b= +document.body.offsetHeight,c=navigator.userAgent.indexOf("iPhone")!=-1,d=c&&(b==356||b==208||b==306||b==158),e=function(){if(c)dhx.ui.orientation?(b=480,e=d?268:300):(b=320,e=d?416:460);else{document.body.style.width=document.body.style.height="1px";document.body.style.overflow="hidden";var a=window.outerWidth/window.innerWidth,b=window.outerWidth/a,e=window.outerHeight/a}document.body.style.height=e+"px";document.body.style.width=b+"px";dhx.ui.yc=!1;dhx.ui.resize();dhx.delay(function(){window.scrollTo(0, +1)})},f=function(){dhx.ui.yc=!0;dhx.env.isSafari?e():dhx.delay(e,null,[],500)};dhx.attachEvent("onClick",function(a){a.target.tagName=="INPUT"||a.target.tagName=="TEXTAREA"||a.target.tagName=="SELECT"||(d&&window.innerHeight<416||!d&&window.innerHeight0;)c=this.Ve[a%16]+c,a=Math.floor(a/16);for(;c.length0?c[0].substr(f,e):c[0].substr(0,e+f),d=g+(d?b.groupDelimiter+d:"")}while(f>0);return d+b.decimalDelimeter+c[1]},numToStr:function(a){return function(b){return dhx.Number.format(b,a)}}}; +dhx.Date={Locale:{month_full:"January,February,March,April,May,June,July,August,September,October,November,December".split(","),month_short:"Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec".split(","),day_full:"Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday".split(","),day_short:"Sun,Mon,Tue,Wed,Thu,Fri,Sat".split(",")},weekStart:function(a){var b=a.getDay();this.config.start_on_monday&&(b===0?b=6:b--);return this.date_part(this.add(a,-1*b,"day"))},monthStart:function(a){a.setDate(1);return this.date_part(a)}, +yearStart:function(a){a.setMonth(0);return this.month_start(a)},dayStart:function(a){return this.date_part(a)},dateToStr:function(a,b){a=a.replace(/%[a-zA-Z]/g,function(a){switch(a){case "%d":return'"+dhx.math.toFixed(date.getDate())+"';case "%m":return'"+dhx.math.toFixed((date.getMonth()+1))+"';case "%j":return'"+date.getDate()+"';case "%n":return'"+(date.getMonth()+1)+"';case "%y":return'"+dhx.math.toFixed(date.getFullYear()%100)+"';case "%Y":return'"+date.getFullYear()+"';case "%D":return'"+dhx.Date.Locale.day_short[date.getDay()]+"'; +case "%l":return'"+dhx.Date.Locale.day_full[date.getDay()]+"';case "%M":return'"+dhx.Date.Locale.month_short[date.getMonth()]+"';case "%F":return'"+dhx.Date.Locale.month_full[date.getMonth()]+"';case "%h":return'"+dhx.math.toFixed((date.getHours()+11)%12+1)+"';case "%g":return'"+((date.getHours()+11)%12+1)+"';case "%G":return'"+date.getHours()+"';case "%H":return'"+dhx.math.toFixed(date.getHours())+"';case "%i":return'"+dhx.math.toFixed(date.getMinutes())+"';case "%a":return'"+(date.getHours()>11?"pm":"am")+"'; +case "%A":return'"+(date.getHours()>11?"PM":"AM")+"';case "%s":return'"+dhx.math.toFixed(date.getSeconds())+"';case "%W":return'"+dhx.math.toFixed(dhx.Date.getISOWeek(date))+"';default:return a}});b===!0&&(a=a.replace(/date\.get/g,"date.getUTC"));return new Function("date",'return "'+a+'";')},strToDate:function(a,b){for(var c="var temp=date.split(/[^0-9a-zA-Z]+/g);",d=a.match(/%[a-zA-Z]/g),e=0;e50?1900:2000);";break;case "%g":case "%G":case "%h":case "%H":c+="set[3]=temp["+e+"]||0;";break;case "%i":c+="set[4]=temp["+e+"]||0;";break;case "%Y":c+="set[0]=temp["+e+"]||0;";break;case "%a":case "%A":c+="set[3]=set[3]%12+((temp["+e+"]||'').toLowerCase()=='am'?0:12);";break;case "%s":c+="set[5]=temp["+e+"]||0;"}var f="set[0],set[1],set[2],set[3],set[4],set[5]";b&&(f=" Date.UTC("+f+")");return new Function("date", +"var set=[0,0,1,0,0,0]; "+c+" return new Date("+f+");")},getISOWeek:function(a){if(!a)return!1;var b=a.getDay();b===0&&(b=7);var c=new Date(a.valueOf());c.setDate(a.getDate()+(4-b));var d=c.getFullYear(),e=Math.floor((c.getTime()-(new Date(d,0,1)).getTime())/864E5),f=1+Math.floor(e/7);return f},getUTCISOWeek:function(a){return this.getISOWeek(a)},add:function(a,b,c){var d=new Date(a.valueOf());switch(c){case "day":d.setDate(d.getDate()+b);break;case "week":d.setDate(d.getDate()+7*b);break;case "month":d.setMonth(d.getMonth()+ +b);break;case "year":d.setYear(d.getFullYear()+b);break;case "hour":d.setHours(d.getHours()+b);break;case "minute":d.setMinutes(d.getMinutes()+b)}return d},datePart:function(a){var b=this.copy(a);b.setHours(0);b.setMinutes(0);b.setSeconds(0);b.setMilliseconds(0);return b},timePart:function(a){var b=this.copy(a);return(b.valueOf()/1E3-b.getTimezoneOffset()*60)%86400},copy:function(a){return new Date(a.valueOf())}};dhx.i18n.setLocale("en");dhx.format=function(a){a=a||{};this.$init(a)}; +dhx.format.prototype={$init:function(a){this.a={};this.a.groupDelimiter=a.groupDelimiter||" ";this.a.groupNumber=a.groupNumber||3;this.a.decimalPoint=a.decimalPoint||",";this.a.fractNumber=a.fractNumber||5;this.a.dateFormat=a.dateFormat||"%Y/%m/%d";this.a.stringTemplate=a.stringTemplate||"{value}";this.ff=dhx.Date.str_to_date(this.a.dateFormat);this.Qd=dhx.Date.date_to_str(this.a.dateFormat)},define:function(a,b){this.a[a]=b},format:function(a,b){b=b||this.formatAutoDefine(a);return this["format__"+ +b]?this["format__"+b](a):a},formatAutoDefine:function(a){return typeof a=="number"||a instanceof Number?"number":a instanceof Date?"date":typeof a=="string"||a instanceof String?isNaN(parseFloat(a))?"string":"number":!1},format__number:function(a){var b="";typeof a=="number"||a instanceof Number||(a=parseFloat(a));var c=a.toFixed(this.a.fractNumber).toString(),c=c.split("."),d=this.add_delimiter_to_int(c[0]),e=this.str_reverse(this.add_delimiter_to_int(this.str_reverse(c[1])));return b=d+this.a.decimalPoint+ +e},add_delimiter_to_int:function(a){for(var b=0,c="",d=a.length-1;d>=0;d--)c=a[d]+c,b++,b==this.a.groupNumber&&(c=this.a.groupDelimiter+c,b=0);return c},str_reverse:function(a){for(var b="",c=a.length-1;c>=0;c--)b+=a[c];return b},format__date:function(a){var b=this.Qd(a);return b},attachFormat:function(a,b){this["format__"+a]=b},format__string:function(a){var b=this.a.stringTemplate.replace("{value}",a);return b},format__bold:function(a){return typeof a=="string"||a instanceof String?a.bold():a}}; +dhx.i18n.setLocale(); +dhx.protoUI({name:"calendar",defaults:{date:null,startOnMonday:!0,navigation:!0,weekHeader:!1,weekNumber:!1,timeSelect:!1,skipEmptyWeeks:!0,cellHeight:36,minuteStep:15,hourStart:6,hourEnd:24,hourFormat:"%H",calendarHeader:"%F %Y",calendarDay:"%d",calendarWeekHeader:"W#",calendarWeek:"%W",width:300,height:300,selectedCss:"dhx_cal_selected_day"},skin:{monthHeaderHeight:40,weekHeaderHeight:20,timeSelectHeight:32},hourFormat_setter:dhx.Date.dateToStr,calendarHeader_setter:dhx.Date.dateToStr,calendarDay_setter:dhx.Date.dateToStr, +calendarWeekHeader_setter:dhx.Date.dateToStr,calendarWeek_setter:dhx.Date.dateToStr,date_setter:function(a){typeof a=="string"&&(a=dhx.i18n.fullDateFormatDate(a));this.L=this.L||a;return a},$init:function(){this.fa={};this.ec=[];var a="%Y-%m-%d";this.rc=dhx.Date.dateToStr(a);this.Cd=dhx.Date.strToDate(a)},$getSize:function(){var a=this.a;if(a.cellHeight>0)a.height=this.Xd();return dhx.ui.view.prototype.$getSize.call(this)},cellHeight_setter:function(a){return a=="auto"?0:a},$setSize:function(a,b){dhx.ui.view.prototype.$setSize.call(this, +a,b)&&this.render()},Ac:function(){var a=this.a;if(!this.L)this.L=new Date;var b=new Date(this.L);b.setDate(1);var c=b.getDay();this.ke=new Date(b);this.vd=a.startOnMonday?1:0;this.lb=(c-this.vd+7)%7;this.Nb=32-(new Date(b.getFullYear(),b.getMonth(),32)).getDate();var d=42-this.lb-this.Nb;this.df=new Date(b.setDate(this.Nb));this.G=a.skipEmptyWeeks?6-Math.floor(d/7):6;this.Ob=this.G*7-this.lb-this.Nb;this.cf=new Date(b.setDate(b.getDate()+d));this.Dc=this.skin.monthHeaderHeight+(a.weekHeader?this.skin.weekHeaderHeight: +0)+(a.timeSelect?this.skin.timeSelectHeight:0)},Xd:function(){this.Ac();return this.Dc+this.G*this.a.cellHeight},Td:function(){this.Ac();var a=this.a;this.Da=[];this.W=[];var b=this.j;b+=1;for(var c=this.m,d=a.weekNumber?8:7,e=0;e";a.weekHeader&&(b+="
"+this.Xe()+"
");b+="
"+this.Bd()+"
";a.timeSelect&&(b+="
"+this.Ue()+"
");b+="
";this.g.innerHTML=b;if(a.timeSelect){for(var c=this.g.getElementsByTagName("select"),d=this.ec,e=0;e"+f+"";d+=this.W[0]}for(var g=0;g<7;g++){var h=(c+g)%7,i=dhx.Date.Locale.day_short[h], +j="dhx_cal_day_name",k=this.W[g+e]-1;g==6&&(j+=" dhx_cal_day_name_last",k+=1);h===0&&(j+=" dhx_sunday");h==6&&(j+=" dhx_saturday");b+="
"+i+"
";d+=this.W[g+e]}return b},Bd:function(){var a=this.a,b=0,c=dhx.Date.add(this.ke,-this.lb,"day"),c=dhx.Date.datePart(c),d=0,e="";if(a.weekNumber){var d=1,f=dhx.Date.add(c,(this.vd+1)%2,"day");e+='';for(var g= +0;g=7||g==this.G-2&&this.Ob==14))k="dhx_next_month",j="";g==this.G-1&&(k+=" dhx_cal_day_num_bborder",h+=1);e+="";f=dhx.Date.add(f,7,"day")}e+="
";e+="
"+j+"
";e+="
"}var o=dhx.Date.datePart(new Date);e+='';for(var m= +this.G*7-1,g=0;g";for(var l=0;l<7;l++){var n=a.calendarDay(c),p=this.rc(c),k="dhx_cal_day_num";bm-this.Ob&&(k="dhx_next_month",p=n="");h=this.Da[g]-2;i=this.W[l+d]-2;l==6&&(k+=" dhx_cal_day_num_rborder",i+=1);g==this.G-1&&(k+=" dhx_cal_day_num_bborder",h+=1);e+=""; +c=dhx.Date.add(c,1,"day");b++}e+=""}e+="
";o.valueOf()==c.valueOf()&&(k+=" dhx_cal_current_day");e+="
"+n+"
";e+="
";return e},Ue:function(){for(var a=this.a,b="";b+="";return b},le:function(){var a="
";return a+"prev"+b+a+"next"+b},on_click:{dhx_cal_arrow:function(a,b,c){var d=c.className.match(/prev/i)?-1:1,e=new Date(this.L),f=new Date(e);f.setDate(1);f=dhx.Date.add(f,d,"month");this.callEvent("onBeforeMonthChange",[e,f])&&(this.showCalendar(f),this.selectDate(this.a.date,!1),this.callEvent("onAfterMonthChange",[f,e]))},dhx_cal_day_num:function(a,b,c){var d=c.getAttribute("date"),e=this.Cd(d);if(this.a.timeSelect){var f=this.ec;e.setMinutes(f[0].value*60+f[1].value* +1)}this.selectDate(e);this.callEvent("onDateSelect",[e]);this.callEvent("onChange",[e])}}},dhx.MouseEvents,dhx.Settings,dhx.EventSystem,dhx.Movable,dhx.ui.view);dhx.Modality={modal_setter:function(a){if(a){if(!this.qa)this.qa=dhx.html.create("div",{"class":a=="rich"?"dhx_modal_rich":"dhx_modal"}),this.qa.style.zIndex=dhx.ui.zIndex(),this.b.style.zIndex=dhx.ui.zIndex(),document.body.appendChild(this.qa)}else this.qa&&dhx.html.remove(this.qa),this.qa=null;return a}}; +dhx.protoUI({name:"window",$init:function(a){this.b.innerHTML="
";this.g=this.b.firstChild;this.eb=this.g.childNodes[0];this.pc=this.g.childNodes[1];this.b.className+=" dhx_window";this.R=this.h=null;this.a.k={top:!1,left:!1,right:!1,bottom:!1};if(!a.id)a.id=dhx.uid()},Zc:function(){this.h={destructor:function(){}}},ac:function(a){this.h.destructor();this.h=a;this.h.D=this;this.pc.appendChild(this.h.b); +this.resize()},show:function(a,b,c){this.a.hidden=!1;this.b.style.zIndex=dhx.ui.zIndex();this.a.modal&&this.modal_setter(!0);var d,e,f;if(a){typeof a=="object"&&!a.tagName?(d={x:a.clientX-this.$[0]/2,y:a.clientY},e=document.body.offsetWidth,f=1):a=dhx.toNode(a);var g=document.body.offsetWidth,h=document.body.offsetHeight;e=e||a.offsetWidth;f=f||a.offsetHeight;var i=this.$;d=d||dhx.html.offset(a);var j=6,k=6,o=6,c="top",m=0,l=0,n=0,p=0;b=="right"?(p=d.x+j+e,k=-f,c="left",m=Math.round(d.y+f/2),l=p- +o):b=="left"?(p=d.x-j-i[0]-1,k=-f,c="right",m=Math.round(d.y+f/2),l=p+i[0]+1):(p=g-d.x>i[0]?d.x:g-j-i[0],l=Math.round(d.x+e/2),l>p+i[0]&&(l=p+i[0]/2));h-f-d.y-k>i[1]?(n=f+d.y+k,m||(c="top",m=n-o)):(n=d.y-k-i[1],n<0?(n=0,c=!1):m||(c="bottom",n--,m=n+i[1]+1));this.setPosition(p,n);c&&this.cd&&this.cd(c,l,m)}this.Le=new Date;this.b.style.display="block";if(this.la){for(var q=0;q250&&this.hide()},$getSize:function(){var a=this.h.$getSize();if(a[3])this.a.height=a[3]+this.a.padding*2;if(a[1])this.a.width=a[1]+this.a.padding*2;if(a[0]||a[2])this.a.gravity=Math.max(a[0],a[2]);return dhx.ui.view.prototype.$getSize.call(this)}, +$setSize:function(a,b){if(dhx.ui.view.prototype.$setSize.call(this,a,b))a=this.j-this.a.padding*2,b=this.m-this.a.padding*2,this.g.style.padding=this.a.padding+"px",this.eb.style.display="none",this.h.$setSize(a,b)},body_setter:function(a){a=dhx.ui.window.prototype.body_setter.call(this,a);this.h.a.k={top:!1,left:!1,right:!1,bottom:!1};return a},defaults:{padding:8},head_setter:null,cd:function(a,b,c){this.Fc();document.body.appendChild(this.Ka=dhx.html.create("DIV",{"class":"dhx_point_"+a},"")); +this.Ka.style.zIndex=dhx.ui.zIndex();this.Ka.style.top=c+"px";this.Ka.style.left=b+"px"},Fc:function(){this.Ka=dhx.html.remove(this.Ka)}},dhx.ui.window); +dhx.protoUI({name:"alert",defaults:{position:"center",head:{template:"Info",css:"dhx_alert_template"},height:170,modal:!0,callback:null,body:{type:"clean",rows:[{template:"
#text#
",data:{text:"You have forgot to define the text :) "}},{view:"button",height:60,id:"dhx_alert_ok",type:"big",label:"Ok",click:function(){this.getParent().getParent().Bb(!0)}}]}},$init:function(){(!this.b.parentNode||!this.b.parentNode.tagName)&&document.body.appendChild(this.b);this.$ready.push(this.resize)}, +Yc:function(a){typeof a=="string"&&(a={title:this.defaults.head.template,message:a});dhx.extend(a,this.defaults);delete a.head;delete a.body;this.Rb(a,{});this.resize();this.show()},title_setter:function(a){this.R.define("template",a);this.R.render()},message_setter:function(a){var b=this.h.c[0];b.data={text:a};b.render()},labelOk_setter:function(a){var b=this.h.c[1];b.config.label=a;b.render()},labelCancel_setter:function(a){var b=this.h.c[2];b.config.label=a;b.render()},Bb:function(a){this.hide(); +this.a.callback&&dhx.toFunctor(this.a.callback).call(this,a,this.a.details)}},dhx.ui.window);dhx.alert=dhx.single(dhx.ui.alert); +dhx.protoUI({name:"confirm",defaults:{height:210,body:{type:"clean",rows:[{id:"dhx_confirm_message",template:"
#text#
",data:{text:"You have forgot to define the text :) "}},{height:53,view:"button",type:"big",id:"dhx_confirm_ok",label:"Ok",click:function(){this.getParent().getParent().Bb(!0)}},{height:55,view:"button",type:"biground",id:"dhx_confirm_cancel",label:"Cancel",click:function(){this.getParent().getParent().Bb(!1)}}]}}},dhx.ui.alert);dhx.confirm=dhx.single(dhx.ui.confirm); +dhx.dp=function(a){if(typeof a=="object"&&a.a)a=a.a.id;if(dhx.dp.Tb[a])return dhx.dp.Tb[a];if(typeof a=="string"||typeof a=="number")a={master:dhx.ui.get(a)};var b=new dhx.DataProcessor(a);return dhx.dp.Tb[b.a.master.a.id]=b};dhx.dp.Tb={}; +dhx.DataProcessor=dhx.proto({defaults:{autoupdate:!0,mode:"post"},$init:function(){this.V=[];this.bf=[];this.X=null;this.na=!1;this.name="DataProcessor";this.$ready.push(this.zb)},master_setter:function(a){var b=a;if(a.name!="DataStore")b=a.data;this.a.store=b;return a},zb:function(){this.a.store.attachEvent("onStoreUpdated",dhx.bind(this.Sc,this))},ignore:function(a,b){var c=this.na;this.na=!0;a.call(b||this);this.na=c},off:function(){this.na=!0},on:function(){this.na=!1},Kd:function(a){var b={}, +c;for(c in a)c.indexOf("$")!==0&&(b[c]=a[c]);return b},save:function(a,b){b=b||"update";this.Sc(a,this.a.store.item(a),b)},Sc:function(a,b,c){if(this.na===!0||!c)return!0;var d={id:a,data:this.Kd(b)};switch(c){case "update":d.operation="update";break;case "add":d.operation="insert";break;case "delete":d.operation="delete";break;default:return!0}if(d.operation!="delete"&&!this.validate(d.data))return!1;this.Gd(d)&&this.V.push(d);this.a.autoupdate&&this.send();return!0},Gd:function(a){for(var b=0;b< +this.V.length;b++){var c=this.V[b];if(c.id==a.id){if(a.operation=="delete")c.operation=="insert"?this.V.splice(b,1):c.operation="delete";c.data=a.data;return!1}}return!0},send:function(){this.Ge()},Ge:function(){if(this.a.url){for(var a=this.V,b=[],c=0;c=0&&this.V.splice(i,1),h.tid!=h.sid&&this.a.store.changeId(h.sid,h.tid),this.callEvent("onAfter"+h.type,[h])}this.callEvent("onAfterSync",[f,a,b,c])},escape:function(a){return this.a.escape?this.a.escape(a):encodeURIComponent(a)}},dhx.Settings,dhx.EventSystem,dhx.ValidateData); +(function(){var a=dhx.Touch={config:{longTouchDelay:1E3,scrollDelay:150,gravity:500,deltaStep:30,speed:"0ms",finish:1500},disable:function(){a.Fb=!0},enable:function(){a.Fb=!1},$init:function(){dhx.env.touch?(dhx.event(document.body,"touchstart",a.nd),dhx.event(document.body,"touchmove",a.gc),dhx.event(document.body,"touchend",a.md)):(a.bb=a.Wd,dhx.event(document.body,"mousedown",a.nd),dhx.event(document.body,"mousemove",a.gc),dhx.event(document.body,"mouseup",a.md),document.body.style.overflowX= +document.body.style.overflowY="hidden");dhx.event(document.body,"dragstart",function(a){return dhx.html.preventEvent(a)});dhx.event(document.body,"touchstart",function(b){if(!a.Fb&&dhx.env.isSafari)return b.srcElement.tagName=="SELECT"?!0:dhx.html.preventEvent(b)});a.Ca()},Ca:function(){a.A=a.w=a.ca=null;a.H=a.v=a.n=null;a.I={wb:0,xb:0,Na:0};if(a.Xa)dhx.html.removeCss(a.Xa,"dhx_touch"),a.Xa=null;window.clearTimeout(a.Kc);a.ud=!0;a.Sa=!0;a.Ta=!0;a.ic||a.ua()},md:function(b){if(a.A){if(a.H){var c=a.Hb(a.v), +d=c.e,e=c.f,f=a.config.finish,g=a.Bc(b,!0);if(g.Na){var h=d+a.config.gravity*g.wb/g.Na,i=e+a.config.gravity*g.xb/g.Na,j=a.q[0]?a.Wa(h,!1,!1,a.n.dx,a.n.px):d,k=a.q[1]?a.Wa(i,!1,!1,a.n.dy,a.n.py):e,o=Math.max(Math.abs(j-d),Math.abs(k-e));o<150&&(f=f*o/150);if(j!=d||k!=e)f=Math.round(f*Math.max((j-d)/(h-d),(k-e)/(i-e)));var m={e:j,f:k},l=dhx.ui.get(a.v);l&&l.callEvent&&l.callEvent("onAfterScroll",[m]);f=Math.max(100,f);d!=m.e||e!=m.f?(a.wa(a.v,m.e,m.f,f+"ms"),a.dd(m.e,m.f,f+"ms")):a.ua()}else a.ua()}else if(a.Ta&& +!a.Sa)a.ya("onSwipeX");else if(a.Sa&&!a.Ta)a.ya("onSwipeY");else if(dhx.env.isSafari){var n=a.A.target;dhx.delay(function(){var a=document.createEvent("MouseEvents");a.initEvent("click",!0,!0);n.dispatchEvent(a)})}a.ya("onTouchEnd");a.Ca()}},gc:function(b){if(a.A){var c=a.Bc(b);a.ya("onTouchMove");if(a.H)a.ed(c);else if(a.Sa=a.lc(c.Ye,"x",a.Sa),a.Ta=a.lc(c.Ze,"y",a.Ta),a.H){var d=a.Cc("onBeforeScroll");if(d){var e={};d.callEvent("onBeforeScroll",[e]);if(e.update)a.config.speed=e.speed,a.config.scale= +e.scale}a.ce(c)}return dhx.html.preventEvent(b)}},ed:function(){if(a.v){var b=a.Hb(a.v),c=b.e,d=b.f,e=a.ca||a.A;if(a.q[0])b.e=a.Wa(b.e-e.x+a.w.x,!0,b.e,a.n.dx,a.n.px);if(a.q[1])b.f=a.Wa(b.f-e.y+a.w.y,!0,b.f,a.n.dy,a.n.py);a.wa(a.v,b.e,b.f,"0ms");a.dd(b.e,b.f,"0ms")}},dd:function(b,c,d){var e=a.n.px/a.n.dx*-b,f=a.n.py/a.n.dy*-c;a.q[0]&&a.wa(a.q[0],e,0,d);a.q[1]&&a.wa(a.q[1],0,f,d)},wa:function(b,c,d,e){a.ic=!0;b.style[dhx.env.transformPrefix+"Transform"]=dhx.env.translate+"("+Math.round(c)+"px, "+ +Math.round(d)+"px"+(dhx.env.translate=="translate3d"?", 0":"")+")";b.style[dhx.env.transformPrefix+"TransitionDuration"]=e},Hb:function(a){var c=window.getComputedStyle(a)[dhx.env.transformPrefix+"Transform"];if(c=="none")return{e:0,f:0};else{if(window.WebKitCSSMatrix)return new WebKitCSSMatrix(c);for(var d=c.replace(/(matrix\()(.*)(\))/gi,"$2"),d=d.replace(/\s/gi,""),d=d.split(","),e={},f="a,b,c,d,e,f".split(","),g=0;g0)return c?d+h*Math.sqrt(g):0;var i=e-f;return i+a<0?c?d-Math.sqrt(-(a-d)):-i:a},ce:function(){a.H.indexOf("x")!=-1&&(a.q[0]=a.vc("x",a.n.dx,a.n.px,"width"));a.H.indexOf("y")!=-1&&(a.q[1]=a.vc("y",a.n.dy,a.n.py,"height"));if(!a.v.scroll_enabled){a.v.scroll_enabled=!0;a.v.parentNode.style.position="relative";var b=dhx.env.transformCSSPrefix;a.v.style.cssText+=b+"transition: "+b+"transform; "+b+"user-select:none; "+b+"transform-style:flat;";a.v.addEventListener(dhx.env.transitionEnd, +a.ua,!1)}window.setTimeout(a.ed,1)},vc:function(b,c,d,e){if(c-d<2)return a.H="";var f=dhx.html.create("DIV",{"class":"dhx_scroll_"+b},"");f.style[e]=d*d/c-7+"px";a.v.parentNode.appendChild(f);return f},lc:function(b,c,d){if(b>a.config.deltaStep){if(a.ud&&(a.he(c),(a.H||"").indexOf(c)==-1))a.H="";return!1}return d},ua:function(){if(!a.H)dhx.html.remove(a.q),a.q=[null,null];a.ic=!1},he:function(b){window.clearTimeout(a.Kc);a.ud=!1;a.Jc(b)},nd:function(b){if(!a.Fb){a.A=a.bb(b);a.ya("onTouchStart");a.q[0]|| +a.q[1]?a.Re(b,a.q[0]?"x":"y"):a.Kc=window.setTimeout(a.ie,a.config.longTouchDelay);var c=dhx.ui.get(b);if(c&&c.touchable&&(!b.target.className||b.target.className.indexOf("dhx_view")!==0))a.Xa=c.getNode(b),dhx.html.addCss(a.Xa,"dhx_touch")}},ie:function(){a.ya("onLongTouch");dhx.callEvent("onClick",[a.A]);a.Ca()},Re:function(b,c){a.Jc(c);var d=a.q[0]||a.q[1];if(d&&(!a.v||d.parentNode!=a.v.parentNode))a.Ca(),a.ua(),a.A=a.bb(b);a.gc(b)},Bc:function(b){a.ca=a.w;a.w=a.bb(b);a.I.Ye=Math.abs(a.A.x-a.w.x); +a.I.Ze=Math.abs(a.A.y-a.w.y);if(a.ca)a.w.time-a.ca.time";this.g=this.b.firstChild;this.map=null;this.$ready.push(this.render)},render:function(){var a=this.a,b={zoom:a.zoom,center:a.center,mapTypeId:a.mapType};this.map=new google.maps.Map(this.g,b)},center_setter:function(a){typeof a!="object"&&(a={});this.Ia(a,{x:48.724,y:8.215});a=new google.maps.LatLng(a.x,a.y);this.map&&this.map.setCenter(a);return a}, +mapType_setter:function(a){a=google.maps.MapTypeId[a];this.map&&this.map.setMapTypeId(a);return a},zoom_setter:function(a){this.map&&this.map.setZoom(a);return a},defaults:{zoom:5,center:{},mapType:"ROADMAP"},$setSize:function(){dhx.ui.view.prototype.$setSize.apply(this,arguments);google.maps.event.trigger(this.map,"resize")}},dhx.ui.view);if(!window.scheduler)window.scheduler={config:{},templates:{},xy:{},locale:{}};if(!scheduler.locale)scheduler.locale={}; +scheduler.locale.labels={list_tab:"List",day_tab:"Day",month_tab:"Month",icon_today:"Today",icon_save:"Save",icon_delete:"Delete event",icon_cancel:"Cancel",icon_edit:"Edit",icon_back:"Back",icon_close:"Close form",icon_yes:"Yes",icon_no:"No",confirm_closing:"Your changes will be lost, are your sure ?",confirm_deleting:"Event will be deleted permanently, are you sure?",label_event:"Event",label_start:"Start",label_end:"End",label_details:"Notes",label_from:"from",label_to:"to"}; +scheduler.config={init_date:new Date,form_date:"%d-%m-%Y %H:%i",xml_date:"%Y-%m-%d %H:%i",item_date:"%d.%m.%Y",header_date:"%d.%m.%Y",hour_date:"%H:%i",scale_hour:"%H",calendar_date:"%F %Y"};scheduler.config.form_rules={end_date:function(a,b){return b.start_date.valueOf()";if(dhx.Date.datePart(a.start_date).valueOf()==dhx.Date.datePart(a.end_date).valueOf()){var c=dhx.i18n.dateFormatStr(a.start_date),d=dhx.i18n.timeFormatStr(a.start_date),e=dhx.i18n.timeFormatStr(a.end_date);b+="
"+c+"
";b+="
"+scheduler.locale.labels.label_from+" "+d+" "+scheduler.locale.labels.label_to+ +" "+e+"
"}else{var f=dhx.i18n.longDateFormatStr(a.start_date),g=dhx.i18n.longDateFormatStr(a.end_date),d=dhx.i18n.timeFormatStr(a.start_date),e=dhx.i18n.timeFormatStr(a.end_date);b+="
"+scheduler.locale.labels.label_from+" "+d+" "+f+"
";b+="
"+scheduler.locale.labels.label_to+" "+e+" "+g+"
"}a.details&&a.details!==""&&(b+="
"+scheduler.locale.labels.label_details+"
",b+="
"+a.details+"
"); +b+="";return b},calendar_event:function(a){return a+"
"},event_date:function(a){return dhx.i18n.dateFormatStr(a)},event_long_date:function(a){return dhx.i18n.longDateFormatStr(a)},event_time:function(a){return dhx.i18n.timeFormatStr(a)},event_color:function(a){return a.color?"background-color:"+a.color:""},event_marker:function(a,b){return"
"},event_title:function(a,b){return"
"+ +b.dateStart(a.start_date)+"
"+b.timeStart(a.start_date)+"
"+b.marker(a,b)+"
"+a.text+"
"},month_event_title:function(a,b){return b.marker(a,b)+"
"+b.timeStart(a.start_date)+"
"+a.text+"
"},day_event:function(a){return a.text}};scheduler.config.views=[]; +dhx.ready(function(){if(scheduler.locale&&scheduler.locale.date)dhx.Date.Locale=scheduler.locale.date;if(!scheduler.config.form)scheduler.config.form=[{view:"text",label:scheduler.locale.labels.label_event,name:"text"},{view:"datepicker",label:scheduler.locale.labels.label_start,name:"start_date",timeSelect:1,dateFormat:scheduler.config.form_date},{view:"datepicker",label:scheduler.locale.labels.label_end,name:"end_date",timeSelect:1,dateFormat:scheduler.config.form_date},{view:"textarea",label:scheduler.locale.labels.label_details, +name:"details",width:300,height:150},{view:"button",label:scheduler.locale.labels.icon_delete,id:"delete",type:"form",css:"delete"}];if(!scheduler.config.bottom_toolbar)scheduler.config.bottom_toolbar=[{view:"button",id:"today",label:scheduler.locale.labels.icon_today,inputWidth:scheduler.xy.icon_today,align:"left",width:scheduler.xy.icon_today+6},{view:"segmented",id:"buttons",selected:"list",align:"center",multiview:!0,options:[{value:"list",label:scheduler.locale.labels.list_tab,width:scheduler.xy.list_tab}, +{value:"day",label:scheduler.locale.labels.day_tab,width:scheduler.xy.day_tab},{value:"month",label:scheduler.locale.labels.month_tab,width:scheduler.xy.month_tab}]},{view:"button",css:"add",id:"add",align:"right",label:"",inputWidth:42,width:50},{view:"label",label:"",inputWidth:42,width:50,batch:"readonly"}];if(!scheduler.config.day_toolbar)scheduler.config.day_toolbar=[{view:"label",id:"prev",align:"left",label:"
"},{view:"label",id:"date",align:"center", +width:200},{view:"label",id:"next",align:"right",label:"
"}];if(!scheduler.config.selected_toolbar)scheduler.config.selected_toolbar=[{view:"button",inputWidth:scheduler.xy.icon_back,type:"prev",id:"back",align:"left",label:scheduler.locale.labels.icon_back},{view:"button",inputWidth:scheduler.xy.icon_edit,id:"edit",align:"right",label:scheduler.locale.labels.icon_edit}];if(!scheduler.config.form_toolbar)scheduler.config.form_toolbar=[{view:"button", +inputWidth:scheduler.xy.icon_cancel,id:"cancel",css:"cancel",align:"left",label:scheduler.locale.labels.icon_cancel},{view:"button",inputWidth:scheduler.xy.icon_save,id:"save",align:"right",label:scheduler.locale.labels.icon_save}];scheduler.types={event_list:{name:"EventsList",css:"events",cssNoEvents:"no_events",padding:0,height:scheduler.xy.list_height,width:"auto",dateStart:scheduler.templates.event_date,timeStart:scheduler.templates.event_time,color:scheduler.templates.event_color,marker:scheduler.templates.event_marker, +template:scheduler.templates.event_title},day_event_list:{name:"DayEventsList",css:"day_events",cssNoEvents:"no_events",padding:0,height:scheduler.xy.month_list_height,width:"auto",timeStart:scheduler.templates.event_time,color:scheduler.templates.event_color,marker:scheduler.templates.event_marker,template:scheduler.templates.month_event_title}};dhx.Type(dhx.ui.list,scheduler.types.event_list);dhx.Type(dhx.ui.list,scheduler.types.day_event_list);dhx.DataDriver.scheduler={records:"/*/event"};dhx.extend(dhx.DataDriver.scheduler, +dhx.DataDriver.xml);var a=[{id:"list",view:"list",type:"EventsList",startDate:new Date},{id:"day",rows:[{id:"dayBar",view:"toolbar",css:"dhx_topbar",elements:scheduler.config.day_toolbar},{id:"dayList",view:"dayevents"}]},{id:"month",rows:[{id:"calendar",view:"calendar",dayWithEvents:scheduler.templates.calendar_event,calendarHeader:scheduler.config.calendar_date},{id:"calendarDayEvents",view:"list",type:"DayEventsList"}]},{id:"event",animate:{type:"slide",subtype:"in",direction:"top"},rows:[{id:"eventBar", +view:"toolbar",type:"TopBar",css:"single_event",elements:scheduler.config.selected_toolbar},{id:"eventTemplate",view:"template",template:scheduler.templates.selected_event}]},{id:"form",rows:[{id:"editBar",view:"toolbar",type:"TopBar",elements:scheduler.config.form_toolbar},{id:"editForm",view:"form",elements:scheduler.config.form,rules:scheduler.config.form_rules}]}].concat(scheduler.config.views);dhx.protoUI({name:"scheduler",defaults:{rows:[{view:"multiview",id:"views",cells:a},{view:"toolbar", +id:"bottomBar",type:"SchedulerBar",visibleBatch:"default",elements:scheduler.config.bottom_toolbar}],color:"#color#",textColor:"#textColor#"},$init:function(){this.name="Scheduler";this.b.className+=" dhx_scheduler";dhx.i18n.dateFormat=scheduler.config.item_date;dhx.i18n.timeFormat=scheduler.config.hour_date;dhx.i18n.fullDateFormat=scheduler.config.xml_date;dhx.i18n.headerFormatStr=dhx.Date.dateToStr(scheduler.config.header_date);dhx.i18n.setLocale();this.data.provideApi(this);this.data.extraParser= +dhx.bind(function(a){a.start_date=dhx.i18n.fullDateFormatDate(a.start_date);a.end_date=dhx.i18n.fullDateFormatDate(a.end_date)},this);this.$ready.push(this.$d);this.data.attachEvent("onStoreUpdated",dhx.bind(this.Oe,this))},$d:function(){this.ae();this.de();this.coreData=new dhx.DataValue;this.coreData.setValue(scheduler.config.init_date);this.$$("dayList").define("date",this.coreData);this.selectedEvent=new dhx.DataRecord;this.config.readonly?this.define("readonly",this.config.readonly):scheduler.config.readonly&& +this.define("readonly",!0);if(this.config.save){var a=new dhx.DataProcessor({master:this,url:this.config.save});a.attachEvent("onBeforeDataSend",this.re)}this.$$("date")&&this.$$("date").bind(this.coreData,null,dhx.i18n.headerFormatStr);this.$$("list").sync(this);this.$$("list").bind(this.coreData,function(a,b){return ba.start_date}); +this.$$("calendar").bind(this.coreData);this.$$("calendarDayEvents").sync(this,!0);this.$$("calendarDayEvents").bind(this.coreData,function(a,b){var e=dhx.Date.datePart(b);return ea.start_date});this.$$("eventTemplate").bind(this);this.$$("editForm").bind(this);this.$$("list").attachEvent("onItemClick",dhx.bind(this.Qb,this));this.$$("dayList").attachEvent("onItemClick",dhx.bind(this.Qb,this));this.$$("calendarDayEvents").attachEvent("onItemClick",dhx.bind(this.Qb, +this))},Qb:function(a){this.setCursor(a);this.$$("event").show()},Oe:function(){this.data.blockEvent();this.data.sort(function(a,b){return a.start_date";e+="
"+a+"
";e+="
";e+="
"+c+"
";e+="
"+d+"
";e+="
";e+="
";e+="
";e+="
";e+="
";e+="";return e},type:{templateStart:dhx.Template("
"),template:scheduler.templates.day_event,templateEnd:dhx.Template("
"),templateCss:dhx.Template(""),templateColor:dhx.Template("#color#"), +templateTextColor:dhx.Template("#textColor#"),padding:2},we:function(){var a=this.data.getRange(),b=[],c,d,e,f,g;for(d=0;dg)g=b[e].$sorder;c.$sorder=g+1;c.$inner=!1}else c.$sorder=0;b.push(c);if(b.length>(b.max_count||0))b.max_count=b.length}for(d=0;ddhx.Date.datePart(d).valueOf()&&(d=c);dhx.Date.datePart(c).valueOf()dhx.Date.datePart(b).valueOf()&&(d=dhx.Date.datePart(b),d.setMinutes(0),d.setHours(this.config.lastHour));if(e=this.config.lastHour)e=this.config.lastHour&&(d.setMinutes(0), +d.setHours(this.config.lastHour));var g=Math.floor((this.j-this.config.timeScaleWidth-this.config.eventOffset-8)/a.$count);a.$left=a.$sorder*g+this.config.timeScaleWidth+this.config.eventOffset;a.$inner||(g*=a.$count-a.$sorder);a.$width=g-this.config.eventOffset-this.type.padding*2;var h=c.getHours()*60+c.getMinutes(),i=d.getHours()*60+d.getMinutes()||this.config.lastHour*60;a.$top=Math.round((h-this.config.firstHour/60)*(this.config.timeScaleHeight+1)/60);a.$height=Math.max(10,(i-h)*(this.config.timeScaleHeight+ +1)/60-2)-this.type.padding*2}},dhx.MouseEvents,dhx.SelectionModel,dhx.Scrollable,dhx.RenderStack,dhx.DataLoader,dhx.ui.view,dhx.EventSystem,dhx.Settings); diff --git a/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/ext/dhtmlxscheduler_active_links.js b/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/ext/dhtmlxscheduler_active_links.js index d7889307153..6499338d09b 100644 --- a/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/ext/dhtmlxscheduler_active_links.js +++ b/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/ext/dhtmlxscheduler_active_links.js @@ -1,9 +1,6 @@ -/* -dhtmlxScheduler v.2.3 - +/* This software is allowed to use under GPL or you need to obtain Commercial or Enterise License -to use it in not GPL project. Please contact sales@dhtmlx.com for details - -(c) DHTMLX Ltd. -*/ -scheduler.attachEvent("onTemplatesReady",function(){var B=scheduler.date.str_to_date(scheduler.config.api_date);var C=scheduler.date.date_to_str(scheduler.config.api_date);var D=scheduler.templates.month_day;scheduler.templates.month_day=function(E){return""+D(E)+""};var A=scheduler.templates.week_scale_date;scheduler.templates.week_scale_date=function(E){return""+A(E)+""};dhtmlxEvent(this._obj,"click",function(E){var G=E.target||event.srcElement;var F=G.getAttribute("jump_to");if(F){scheduler.setCurrentView(B(F),"day")}})}); \ No newline at end of file +to use it in not GPL project. Please contact sales@dhtmlx.com for details +*/ +scheduler.attachEvent("onTemplatesReady",function(){var d=scheduler.date.str_to_date(scheduler.config.api_date),b=scheduler.date.date_to_str(scheduler.config.api_date),e=scheduler.templates.month_day;scheduler.templates.month_day=function(a){return""+e(a)+""};var f=scheduler.templates.week_scale_date;scheduler.templates.week_scale_date=function(a){return""+f(a)+""};dhtmlxEvent(this._obj,"click",function(a){var b=a.target||event.srcElement, +c=b.getAttribute("jump_to");if(c)return scheduler.setCurrentView(d(c),"day"),a&&a.preventDefault&&a.preventDefault(),!1})}); diff --git a/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/ext/dhtmlxscheduler_agenda_view.js b/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/ext/dhtmlxscheduler_agenda_view.js index c0293e8a2a8..c0eb363b8d5 100644 --- a/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/ext/dhtmlxscheduler_agenda_view.js +++ b/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/ext/dhtmlxscheduler_agenda_view.js @@ -1,9 +1,10 @@ -/* -dhtmlxScheduler v.2.3 - +/* This software is allowed to use under GPL or you need to obtain Commercial or Enterise License -to use it in not GPL project. Please contact sales@dhtmlx.com for details - -(c) DHTMLX Ltd. -*/ -scheduler.date.add_agenda=function(A){return(new Date(A.valueOf()))};scheduler.dblclick_dhx_agenda_area=function(){if(!this.config.readonly&&this.config.dblclick_create){this.addEventNow()}};scheduler.templates.agenda_time=function(C,A,B){if(B._timed){return this.day_date(B.start_date,B.end_date,B)+" "+this.event_date(C)}else{return scheduler.templates.day_date(C)+" – "+scheduler.templates.day_date(A)}};scheduler.templates.agenda_text=function(A){return A.text};scheduler.date.agenda_start=function(A){return A};scheduler.attachEvent("onTemplatesReady",function(){scheduler.attachEvent("onSchedulerResize",function(){if(this._mode=="agenda"){this.agenda_view(true);return false}return true});var A=scheduler.render_data;scheduler.render_data=function(D){if(this._mode=="agenda"){B()}else{return A.apply(this,arguments)}};function C(E){if(E){var D=scheduler.locale.labels;scheduler._els.dhx_cal_header[0].innerHTML="
"+D.date+"
"+D.description+"
";scheduler._table_view=true;scheduler.set_sizes()}}function B(){var D=scheduler._date;var H=scheduler.get_visible_events();H.sort(function(J,I){return J.start_date>I.start_date?1:-1});var G="
";for(var F=0;F
"+scheduler.templates.agenda_time(H[F].start_date,H[F].end_date,H[F])+"
";G+="
 
";G+=""+scheduler.templates.agenda_text(H[F])+"
"}G+="
";scheduler._els.dhx_cal_data[0].scrollTop=0;scheduler._els.dhx_cal_data[0].innerHTML=G;var E=scheduler._els.dhx_cal_data[0].firstChild.childNodes;scheduler._els.dhx_cal_date[0].innerHTML="";scheduler._rendered=[];for(var F=0;F
"+a.date+"
"+a.description+"";scheduler._table_view=!0;scheduler.set_sizes()}}function d(){var b=scheduler._date,a=scheduler.get_visible_events();a.sort(function(a,b){return a.start_date>b.start_date?1:-1});for(var d="
",e=0;e
"+scheduler.templates.agenda_time(c.start_date,c.end_date,c)+"
";d+="
 
";d+=""+scheduler.templates.agenda_text(c.start_date,c.end_date,c)+"
"}d+="
";scheduler._els.dhx_cal_data[0].innerHTML=d;scheduler._els.dhx_cal_data[0].childNodes[0].scrollTop= +scheduler._agendaScrollTop||0;var g=scheduler._els.dhx_cal_data[0].firstChild.childNodes;scheduler._els.dhx_cal_date[0].innerHTML="";scheduler._rendered=[];for(e=0;escheduler.config.collision_limit){scheduler._drag_event.start_date=D;N[G]=C;P=false}}else{if(Q.length>scheduler.config.collision_limit){P=false}}if(!P){return !scheduler.callEvent("onEventCollision",[N,Q])}return P}})(); \ No newline at end of file +/* +This software is allowed to use under GPL or you need to obtain Commercial or Enterise License +to use it in not GPL project. Please contact sales@dhtmlx.com for details +*/ +(function(){function h(a){var b=scheduler._props?scheduler._props[scheduler._mode]:null,f=scheduler.matrix?scheduler.matrix[scheduler._mode]:null,c=b||f;if(b)var d=c.map_to;if(f)d=c.y_property;c&&a&&(n=scheduler.getEvent(a)[d])}function g(a){var b=[];if(a.rec_type){for(var f=scheduler.getRecDates(a),c=0;c=scheduler.config.collision_limit&&(a[j]=n,k=!1)}else b.length>scheduler.config.collision_limit&&(k=!1);return!k?!scheduler.callEvent("onEventCollision",[a,b]):k}var n,e;scheduler.config.collision_limit=1;scheduler.attachEvent("onBeforeDrag",function(a){h(a); +return!0});scheduler.attachEvent("onBeforeLightbox",function(a){var b=scheduler.getEvent(a);e=[b.start_date,b.end_date];h(a);return!0});scheduler.attachEvent("onEventChanged",function(a){if(!a)return!0;var b=scheduler.getEvent(a);if(!g(b)){if(!e)return!1;b.start_date=e[0];b.end_date=e[1];b._timed=this.is_one_day_event(b)}return!0});scheduler.attachEvent("onBeforeEventChanged",function(a){return g(a)});scheduler.attachEvent("onEventSave",function(a,b){return b.rec_type?(scheduler._roll_back_dates(b), +g(b)):!0})})(); diff --git a/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/ext/dhtmlxscheduler_cookie.js b/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/ext/dhtmlxscheduler_cookie.js index 0e58357f735..ef80ea8e8d0 100644 --- a/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/ext/dhtmlxscheduler_cookie.js +++ b/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/ext/dhtmlxscheduler_cookie.js @@ -1,9 +1,6 @@ -/* -dhtmlxScheduler v.2.3 - +/* This software is allowed to use under GPL or you need to obtain Commercial or Enterise License -to use it in not GPL project. Please contact sales@dhtmlx.com for details - -(c) DHTMLX Ltd. -*/ -(function(){function B(E,D,F){var G=E+"="+F+(D?("; "+D):"");document.cookie=G}function A(E){var F=E+"=";if(document.cookie.length>0){var G=document.cookie.indexOf(F);if(G!=-1){G+=F.length;var D=document.cookie.indexOf(";",G);if(D==-1){D=document.cookie.length}return document.cookie.substring(G,D)}}return""}var C=true;scheduler.attachEvent("onBeforeViewChange",function(F,E,D,I){if(C){C=false;var G=A("scheduler_settings");if(G){G=G.split("@");G[0]=this.templates.xml_date(G[0]);this.setCurrentView(G[0],G[1]);return false}}var H=this.templates.xml_format(I||E)+"@"+(D||F);B("scheduler_settings","expires=Sun, 31 Jan 9999 22:00:00 GMT",H);return true})})(); \ No newline at end of file +to use it in not GPL project. Please contact sales@dhtmlx.com for details +*/ +(function(){function g(e,b,a){var c=e+"="+a+(b?"; "+b:"");document.cookie=c}function h(e){var b=e+"=";if(document.cookie.length>0){var a=document.cookie.indexOf(b);if(a!=-1){a+=b.length;var c=document.cookie.indexOf(";",a);if(c==-1)c=document.cookie.length;return document.cookie.substring(a,c)}}return""}var f=!0;scheduler.attachEvent("onBeforeViewChange",function(e,b,a,c){if(f){f=!1;var d=h("scheduler_settings");if(d)return d=d.split("@"),d[0]=this.templates.xml_date(d[0]),this.setCurrentView(d[0], +d[1]),!1}var i=this.templates.xml_format(c||b)+"@"+(a||e);g("scheduler_settings","expires=Sun, 31 Jan 9999 22:00:00 GMT",i);return!0})})(); diff --git a/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/ext/dhtmlxscheduler_editors.js b/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/ext/dhtmlxscheduler_editors.js index ad4d85b0a8e..38ba960c470 100644 --- a/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/ext/dhtmlxscheduler_editors.js +++ b/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/ext/dhtmlxscheduler_editors.js @@ -1,9 +1,10 @@ -/* -dhtmlxScheduler v.2.3 - +/* This software is allowed to use under GPL or you need to obtain Commercial or Enterise License -to use it in not GPL project. Please contact sales@dhtmlx.com for details - -(c) DHTMLX Ltd. -*/ -scheduler.form_blocks.combo={render:function(B){var A="";A+="
";return A},set_value:function(F,H,E,C){if(F._combo){F._combo.destructor()}window.dhx_globalImgPath=C.image_path||"/";F._combo=new dhtmlXCombo(F,C.name,F.offsetWidth-8);F._combo.enableFilteringMode(!!C.filtering,C.script_path||null,!!C.cache);if(!C.script_path){var G=[];for(var D=0;D";for(var A=0;A";if(C.vertical){B+="
"}}B+="";return B},set_value:function(D,F,C,A){var E=D.getElementsByTagName("input");for(var B=0;B"},get_value:function(C,B,A){var D=C.previousSibling.getElementsByTagName("input")[0];return(D.checked)?(A.checked_value||true):(A.unchecked_value||false)},focus:function(A){}}; \ No newline at end of file +to use it in not GPL project. Please contact sales@dhtmlx.com for details +*/ +scheduler.form_blocks.combo={render:function(a){var d="";d+="
";return d},set_value:function(a,d,c,b){a._combo&&a._combo.destructor();window.dhx_globalImgPath=b.image_path||"/";a._combo=new dhtmlXCombo(a,b.name,a.offsetWidth-8);a._combo.enableFilteringMode(!!b.filtering,b.script_path||null,!!b.cache);if(b.script_path)a._combo.setComboValue(c[b.map_to]||null);else{for(var f=[],e=0;e";for(var c=0;c";a.vertical&&(d+="
")}d+="";return d},set_value:function(a,d,c,b){for(var f=a.getElementsByTagName("input"),e=0;e':""},set_value:function(a,d,c,b){var a=document.getElementById(b.id),f=scheduler.uid(),e=!1;typeof b.checked_value!="undefined"&&c[b.map_to]==b.checked_value&&(e=!0);a.className+=" dhx_cal_checkbox";var g="",h="";scheduler.config.wide_form?(a.innerHTML=h,a.nextSibling.innerHTML=g):a.innerHTML=g+h},get_value:function(a,d,c){var a=document.getElementById(c.id),b=a.getElementsByTagName("input")[0];b||(b=a.nextSibling.getElementsByTagName("input")[0]);return b.checked?c.checked_value||!0:c.unchecked_value||!1},focus:function(){}}; diff --git a/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/ext/dhtmlxscheduler_expand.js b/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/ext/dhtmlxscheduler_expand.js index e05c11401d7..06a1187a723 100644 --- a/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/ext/dhtmlxscheduler_expand.js +++ b/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/ext/dhtmlxscheduler_expand.js @@ -1,9 +1,8 @@ -/* -dhtmlxScheduler v.2.3 - +/* This software is allowed to use under GPL or you need to obtain Commercial or Enterise License -to use it in not GPL project. Please contact sales@dhtmlx.com for details - -(c) DHTMLX Ltd. -*/ -scheduler.expand=function(){var A=scheduler._obj;do{A._position=A.style.position||"";A.style.position="static"}while((A=A.parentNode)&&A.style);A=scheduler._obj;A.style.position="absolute";A._width=A.style.width;A._height=A.style.height;A.style.width=A.style.height="100%";A.style.top=A.style.left="0px";var B=document.body;B.scrollTop=0;B=B.parentNode;if(B){B.scrollTop=0}document.body._overflow=document.body.style.overflow||"";document.body.style.overflow="hidden";scheduler._maximize()};scheduler.collapse=function(){var A=scheduler._obj;do{A.style.position=A._position}while((A=A.parentNode)&&A.style);A=scheduler._obj;A.style.width=A._width;A.style.height=A._height;document.body.style.overflow=document.body._overflow;scheduler._maximize()};scheduler.attachEvent("onTemplatesReady",function(){var A=document.createElement("DIV");A.className="dhx_expand_icon";scheduler.toggleIcon=A;scheduler._obj.appendChild(A);A.onclick=function(){if(!scheduler.expanded){scheduler.expand()}else{scheduler.collapse()}}});scheduler._maximize=function(){this.expanded=!this.expanded;this.toggleIcon.style.backgroundPosition="0px "+(this._expand?"0":"18")+"px";if(scheduler.callEvent("onSchedulerResize",[])){scheduler.update_view()}}; \ No newline at end of file +to use it in not GPL project. Please contact sales@dhtmlx.com for details +*/ +scheduler.expand=function(){var a=scheduler._obj;do a._position=a.style.position||"",a.style.position="static";while((a=a.parentNode)&&a.style);a=scheduler._obj;a.style.position="absolute";a._width=a.style.width;a._height=a.style.height;a.style.width=a.style.height="100%";a.style.top=a.style.left="0px";var b=document.body;b.scrollTop=0;if(b=b.parentNode)b.scrollTop=0;document.body._overflow=document.body.style.overflow||"";document.body.style.overflow="hidden";scheduler._maximize()}; +scheduler.collapse=function(){var a=scheduler._obj;do a.style.position=a._position;while((a=a.parentNode)&&a.style);a=scheduler._obj;a.style.width=a._width;a.style.height=a._height;document.body.style.overflow=document.body._overflow;scheduler._maximize()};scheduler.attachEvent("onTemplatesReady",function(){var a=document.createElement("DIV");a.className="dhx_expand_icon";scheduler.toggleIcon=a;scheduler._obj.appendChild(a);a.onclick=function(){scheduler.expanded?scheduler.collapse():scheduler.expand()}}); +scheduler._maximize=function(){this.expanded=!this.expanded;this.toggleIcon.style.backgroundPosition="0px "+(this.expanded?"0":"18")+"px";for(var a=["left","top"],b=0;bscheduler.config.limit_end.valueOf()||this.date.add(F,1,C)<=scheduler.config.limit_start.valueOf()){setTimeout(function(){scheduler.setCurrentView(scheduler._date,C)},1);return false}}return true});var A=function(D){var E=scheduler.config;var C=(D.start_date.valueOf()>=E.limit_start.valueOf()&&D.end_date.valueOf()<=E.limit_end.valueOf());if(!C){scheduler._drag_id=null;scheduler._drag_mode=null;scheduler.callEvent("onLimitViolation",[D.id,D])}return C};scheduler.attachEvent("onBeforeDrag",function(C){if(!C){return true}return A(scheduler.getEvent(C))});scheduler.attachEvent("onClick",function(D,C){return A(scheduler.getEvent(D))});scheduler.attachEvent("onBeforeLightbox",function(D){var C=scheduler.getEvent(D);B=[C.start_date,C.end_date];return A(C)});scheduler.attachEvent("onEventAdded",function(D){if(!D){return true}var C=scheduler.getEvent(D);if(!A(C)){if(C.start_datescheduler.config.limit_end){C.end_date=new Date(scheduler.config.limit_end);C._timed=this.is_one_day_event(C)}if(C.start_date>C.end_date){C.end_date=this.date.add(C.start_date,(this.config.event_duration||this.config.time_step),"minute")}}return true});scheduler.attachEvent("onEventChanged",function(D){if(!D){return true}var C=scheduler.getEvent(D);if(!A(C)){if(!B){return false}C.start_date=B[0];C.end_date=B[1];C._timed=this.is_one_day_event(C)}return true});scheduler.attachEvent("onBeforeEventChanged",function(D,C,E){return A(D)})})(); \ No newline at end of file +to use it in not GPL project. Please contact sales@dhtmlx.com for details +*/ +scheduler.config.limit_start=new Date(-3999,0,0);scheduler.config.limit_end=new Date(3999,0,0);scheduler.config.limit_view=!1; +(function(){var g=null,k={},l={},m=!1;scheduler.blockTime=function(b,a){var c=this.config.first_hour*60,d=this.config.last_hour*60;a=="fullday"&&(a=[c,d]);typeof b=="object"?k[this.date.date_part(b).valueOf()]=a:l[b]=a;for(var e=0;ed&&(a[e+1]=d);m=!0};scheduler.attachEvent("onScaleAdd",function(b,a){var c=k[a.valueOf()]||l[a.getDay()];if(c)for(var d=0;dscheduler.config.limit_end.valueOf()||this.date.add(d,1,c)<=scheduler.config.limit_start.valueOf())?(setTimeout(function(){scheduler.setCurrentView(scheduler._date, +c)},1),!1):!0});var f=function(b){var a=scheduler.config,c=b.start_date.valueOf()>=a.limit_start.valueOf()&&b.end_date.valueOf()<=a.limit_end.valueOf();if(c&&m&&b._timed){var d=scheduler.date.date_part(new Date(b.start_date.valueOf())),e=k[d.valueOf()]||l[d.getDay()],f=b.start_date.getHours()*60+b.start_date.getMinutes(),h=b.end_date.getHours()*60+b.end_date.getMinutes();if(e)for(var j=0;jf){if(f<=i&&f>=g){if(i==1440||h=g&&h=scheduler.config.limit_end.valueOf())a.start_date=this.date.add(scheduler.config.limit_end,-1,"day");if(a.end_date=scheduler.config.limit_end.valueOf())a.end_date=this.date.add(scheduler.config.limit_end,-1,"day");if(a.start_date.valueOf()>=a.end_date.valueOf())a.end_date=this.date.add(a.start_date,this.config.event_duration||this.config.time_step,"minute");a._timed=this.is_one_day_event(a)}return!0});scheduler.attachEvent("onEventChanged",function(b){if(!b)return!0;var a=scheduler.getEvent(b);if(!f(a)){if(!g)return!1;a.start_date=g[0];a.end_date= +g[1];a._timed=this.is_one_day_event(a)}return!0});scheduler.attachEvent("onBeforeEventChanged",function(b){return f(b)})})(); diff --git a/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/ext/dhtmlxscheduler_map_view.js b/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/ext/dhtmlxscheduler_map_view.js index 4404ea13eb4..57735c07a0e 100644 --- a/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/ext/dhtmlxscheduler_map_view.js +++ b/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/ext/dhtmlxscheduler_map_view.js @@ -1,9 +1,29 @@ -/* -dhtmlxScheduler v.2.3 - +/* This software is allowed to use under GPL or you need to obtain Commercial or Enterise License -to use it in not GPL project. Please contact sales@dhtmlx.com for details - -(c) DHTMLX Ltd. -*/ -scheduler.xy.map_date_width=188;scheduler.xy.map_description_width=400;scheduler.config.map_resolve_event_location=true;scheduler.config.map_resolve_user_location=true;scheduler.config.map_initial_position=new google.maps.LatLng(48.724,8.215);scheduler.config.map_error_position=new google.maps.LatLng(15,15);scheduler.config.map_infowindow_max_width=300;scheduler.config.map_type=google.maps.MapTypeId.ROADMAP;scheduler.config.map_zoom_after_resolve=15;scheduler.locale.labels.marker_geo_success="It seems you are here.";scheduler.locale.labels.marker_geo_fail="Sorry, could not get your current position using geolocation.";scheduler.templates.marker_date=scheduler.date.date_to_str("%Y-%m-%d %H:%i");scheduler.templates.marker_text=function(C,A,B){return"
"+B.text+"

"+(B.event_location||"")+"

"+scheduler.templates.marker_date(C)+" - "+scheduler.templates.marker_date(A)+"
"};scheduler.dblclick_dhx_map_area=function(){if(!this.config.readonly&&this.config.dblclick_create){this.addEventNow()}};scheduler.templates.map_time=function(C,A,B){if(B._timed){return this.day_date(B.start_date,B.end_date,B)+" "+this.event_date(C)}else{return scheduler.templates.day_date(C)+" – "+scheduler.templates.day_date(A)}};scheduler.templates.map_text=function(A){return A.text};scheduler.date.map_start=function(A){return A};scheduler.attachEvent("onTemplatesReady",function(){function D(){_isPositionSet=false;var H=document.createElement("div");H.className="dhx_map";H.id="dhx_gmap";H.style.dispay="none";node=document.getElementById("scheduler_here");node.appendChild(H);scheduler._els.dhx_gmap=[];scheduler._els.dhx_gmap.push(H);C("dhx_gmap");var G={zoom:scheduler.config.map_inital_zoom||10,center:scheduler.config.map_initial_position,mapTypeId:scheduler.config.map_type||google.maps.MapTypeId.ROADMAP};map=new google.maps.Map(document.getElementById("dhx_gmap"),G);map.disableDefaultUI=false;map.disableDoubleClickZoom=true;google.maps.event.addListener(map,"dblclick",function(J){if(!scheduler.config.readonly&&scheduler.config.dblclick_create){point=J.latLng;geocoder.geocode({latLng:point},function(L,K){if(K==google.maps.GeocoderStatus.OK){point=L[0].geometry.location;scheduler.addEventNow({lat:point.lat(),lng:point.lng(),event_location:L[0].formatted_address})}})}});var I={content:""};if(scheduler.config.map_infowindow_max_width){I.maxWidth=scheduler.config.map_infowindow_max_width}scheduler.map={_points:[],_markers:[],_infowindow:new google.maps.InfoWindow(I),_infowindows_content:[],_initialization_count:-1};geocoder=new google.maps.Geocoder();if(scheduler.config.map_resolve_user_location){if(navigator.geolocation){if(!_isPositionSet){navigator.geolocation.getCurrentPosition(function(J){var K=new google.maps.LatLng(J.coords.latitude,J.coords.longitude);map.setCenter(K);map.setZoom(scheduler.config.map_zoom_after_resolve||10);scheduler.map._infowindow.setContent(scheduler.locale.labels.marker_geo_success);scheduler.map._infowindow.position=map.getCenter();scheduler.map._infowindow.open(map);_isPositionSet=true},function(){scheduler.map._infowindow.setContent(scheduler.locale.labels.marker_geo_fail);scheduler.map._infowindow.setPosition(map.getCenter());scheduler.map._infowindow.open(map);_isPositionSet=true})}}}google.maps.event.addListener(map,"resize",function(J){H.style.zIndex="5";map.setZoom(map.getZoom())});google.maps.event.addListener(map,"tilesloaded",function(J){H.style.zIndex="5"})}D();scheduler.attachEvent("onSchedulerResize",function(){if(this._mode=="map"){this.map_view(true)}});var A=scheduler.render_data;scheduler.render_data=function(G,J){if(this._mode=="map"){E();var I=scheduler.get_visible_events();for(var H=0;H
"+G.date+"
"+G.description+"
";scheduler._table_view=true;scheduler.set_sizes()}}function E(){var H=scheduler._date;var L=scheduler.get_visible_events();L.sort(function(N,M){return N.start_date>M.start_date?1:-1});var K="
";for(var J=0;J
"+scheduler.templates.map_time(L[J].start_date,L[J].end_date,L[J])+"
";K+="
 
";K+="
"+scheduler.templates.map_text(L[J])+"
"}K+="
";scheduler._els.dhx_cal_data[0].scrollTop=0;scheduler._els.dhx_cal_data[0].innerHTML=K;scheduler._els.dhx_cal_data[0].style.width=(scheduler.xy.map_date_width+scheduler.xy.map_description_width+1)+"px";var I=scheduler._els.dhx_cal_data[0].firstChild.childNodes;scheduler._els.dhx_cal_date[0].innerHTML="";scheduler._rendered=[];for(var J=0;J"+e.text+"

"+(e.event_location||"")+"

"+scheduler.templates.marker_date(f)+" - "+scheduler.templates.marker_date(g)+""}; +scheduler.dblclick_dhx_map_area=function(){!this.config.readonly&&this.config.dblclick_create&&this.addEventNow({start_date:scheduler._date,end_date:scheduler.date.add(scheduler._date,1,"hour")})};scheduler.templates.map_time=function(f,g,e){return e._timed?this.day_date(e.start_date,e.end_date,e)+" "+this.event_date(f):scheduler.templates.day_date(f)+" – "+scheduler.templates.day_date(g)};scheduler.templates.map_text=function(f,g,e){return e.text};scheduler.date.map_start=function(f){return f}; +scheduler.date.add_map=function(f){return new Date(f.valueOf())};scheduler.templates.map_date=function(){return""};scheduler._latLngUpdate=!1; +scheduler.attachEvent("onSchedulerReady",function(){function f(a){if(a){var c=scheduler.locale.labels;scheduler._els.dhx_cal_header[0].innerHTML="
"+c.date+"
"+c.description+"
";scheduler._table_view=!0;scheduler.set_sizes()}} +function g(){scheduler._selected_event_id=null;scheduler.map._infowindow.close();for(var a in scheduler.map._markers)scheduler.map._markers[a].setMap(null),delete scheduler.map._markers[a],scheduler.map._infowindows_content[a]&&delete scheduler.map._infowindows_content[a]}function e(){var a=scheduler.get_visible_events();a.sort(function(a,b){return a.start_date
"+scheduler.templates.map_time(b.start_date,b.end_date,b)+"
";c+="
 
"; +c+="
"+scheduler.templates.map_text(b.start_date,b.end_date,b)+"
"}c+="
";scheduler._els.dhx_cal_data[0].scrollTop=0;scheduler._els.dhx_cal_data[0].innerHTML=c;scheduler._els.dhx_cal_data[0].style.width=scheduler.xy.map_date_width+scheduler.xy.map_description_width+ +1+"px";var g=scheduler._els.dhx_cal_data[0].firstChild.childNodes;scheduler._els.dhx_cal_date[0].innerHTML=scheduler.templates[scheduler._mode+"_date"](scheduler._min_date,scheduler._max_date,scheduler._mode);scheduler._rendered=[];for(d=0;dscheduler._min_date||c.start_datescheduler._max_date||c.start_date.valueOf()>=scheduler._min_date&&c.end_date.valueOf()<=scheduler._max_date? +(scheduler.map._markers[a]&&scheduler.map._markers[a].setMap(null),j(c)):(scheduler._selected_event_id=null,scheduler.map._infowindow.close(),scheduler.map._markers[a]&&scheduler.map._markers[a].setMap(null))}return!0});scheduler.attachEvent("onEventIdChange",function(a,c){var d=scheduler.getEvent(c);if(d.start_datescheduler._min_date||d.start_datescheduler._max_date||d.start_date.valueOf()>=scheduler._min_date&&d.end_date.valueOf()<= +scheduler._max_date)scheduler.map._markers[a]&&(scheduler.map._markers[a].setMap(null),delete scheduler.map._markers[a]),scheduler.map._infowindows_content[a]&&delete scheduler.map._infowindows_content[a],j(d);return!0});scheduler.attachEvent("onEventAdded",function(a,c){if(!scheduler._dataprocessor&&(c.start_datescheduler._min_date||c.start_datescheduler._max_date||c.start_date.valueOf()>=scheduler._min_date&&c.end_date.valueOf()<= +scheduler._max_date))scheduler.map._markers[a]&&scheduler.map._markers[a].setMap(null),j(c);return!0});scheduler.attachEvent("onBeforeEventDelete",function(a){scheduler.map._markers[a]&&scheduler.map._markers[a].setMap(null);scheduler._selected_event_id=null;scheduler.map._infowindow.close();return!0});scheduler._event_resolve_delay=1500;scheduler.attachEvent("onEventLoading",function(a){scheduler.config.map_resolve_event_location&&a.event_location&&!a.lat&&!a.lng&&(scheduler._event_resolve_delay+= +1500,o(n,this,[a],scheduler._event_resolve_delay));return!0});scheduler.attachEvent("onEventCancel",function(a,c){c&&(scheduler.map._markers[a]&&scheduler.map._markers[a].setMap(null),scheduler.map._infowindow.close());return!0})}); diff --git a/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/ext/dhtmlxscheduler_minical.js b/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/ext/dhtmlxscheduler_minical.js index 99289260210..5bf564980f9 100644 --- a/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/ext/dhtmlxscheduler_minical.js +++ b/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/ext/dhtmlxscheduler_minical.js @@ -1,9 +1,26 @@ -/* -dhtmlxScheduler v.2.3 - +/* This software is allowed to use under GPL or you need to obtain Commercial or Enterise License -to use it in not GPL project. Please contact sales@dhtmlx.com for details - -(c) DHTMLX Ltd. -*/ -scheduler.templates.calendar_month=scheduler.date.date_to_str("%F %Y");scheduler.templates.calendar_scale_date=scheduler.date.date_to_str("%D");scheduler.templates.calendar_date=scheduler.date.date_to_str("%d");scheduler.renderCalendar=function(G,A){var B=null;var D=G.date||(new Date());if(typeof D=="string"){D=this.templates.api_date(D)}if(!A){var M=G.container;var K=G.position;if(typeof M=="string"){M=document.getElementById(M)}if(typeof K=="string"){K=document.getElementById(K)}if(K&&(typeof K.left=="undefined")){var H=getOffset(K);K={top:H.top+K.offsetHeight,left:H.left}}if(!M){M=scheduler._get_def_cont(K)}B=this._render_calendar(M,D,G);B.onclick=function(P){P=P||event;var Q=P.target||P.srcElement;if(Q.className.indexOf("dhx_month_head")!=-1){var O=Q.parentNode.className;if(O.indexOf("dhx_after")==-1&&O.indexOf("dhx_before")==-1){var N=scheduler.templates.xml_date(this.getAttribute("date"));N.setDate(parseInt(Q.innerHTML,10));scheduler.unmarkCalendar(this);scheduler.markCalendar(this,N,"dhx_calendar_click");this._last_date=N;if(this.conf.handler){this.conf.handler.call(scheduler,N,this)}}}}}else{B=this._render_calendar(A.parentNode,D,G,A);scheduler.unmarkCalendar(B)}var C=scheduler.date.month_start(D);var E=scheduler.date.add(C,1,"month");var L=this.getEvents(C,E);for(var F=0;F=E.valueOf()){break}}}B.conf=G;return B};scheduler._get_def_cont=function(A){if(!this._def_count){this._def_count=document.createElement("DIV");this._def_count.style.cssText="position:absolute;z-index:10100;width:251px; height:175px;";this._def_count.onclick=function(B){(B||event).cancelBubble=true};document.body.appendChild(this._def_count)}this._def_count.style.left=A.left+"px";this._def_count.style.top=A.top+"px";this._def_count._created=new Date();return this._def_count};scheduler._locateCalendar=function(C,A){var B=C.childNodes[2].childNodes[0];if(typeof A=="string"){A=scheduler.templates.api_date(A)}var D=C.week_start+A.getDate()-1;return B.rows[Math.floor(D/7)].cells[D%7].firstChild};scheduler.markCalendar=function(C,A,B){this._locateCalendar(C,A).className+=" "+B};scheduler.unmarkCalendar=function(D,A,B){A=A||D._last_date;B=B||"dhx_calendar_click";if(!A){return }var C=this._locateCalendar(D,A);C.className=(C.className||"").replace(RegExp(B,"g"))};scheduler._week_template=function(B){var F=(B||250);var E=0;var C=document.createElement("div");var D=this.date.week_start(new Date());for(var A=0;A<7;A++){this._cols[A]=Math.floor(F/(7-A));this._render_x_header(A,E,D,C);D=this.date.add(D,1,"day");F-=this._cols[A];E+=this._cols[A]}C.lastChild.className+=" dhx_scale_bar_last";return C};scheduler.updateCalendar=function(B,A){B.conf.date=A;this.renderCalendar(B.conf,B)};scheduler._mini_cal_arrows=[" "," "];scheduler._render_calendar=function(G,A,F,D){var B=scheduler.templates;var K=this._cols;this._cols=[];var S=this._mode;this._mode="calendar";var R=this._colsS;this._colsS={height:0};var Q=new Date(this._min_date);var O=new Date(this._max_date);var N=new Date(scheduler._date);var L=B.month_day;B.month_day=B.calendar_date;A=this.date.month_start(A);var E=this._week_template(G.offsetWidth-1);var M;if(D){M=D}else{var M=document.createElement("DIV");M.className="dhx_cal_container dhx_mini_calendar"}M.setAttribute("date",this.templates.xml_format(A));M.innerHTML="
"+E.innerHTML+"
";M.childNodes[0].innerHTML=this.templates.calendar_month(A);if(F.navigation){var C=document.createElement("DIV");C.className="dhx_cal_prev_button";C.style.cssText="left:1px;top:2px;position:absolute;";C.innerHTML=this._mini_cal_arrows[0];M.firstChild.appendChild(C);C.onclick=function(){scheduler.updateCalendar(M,scheduler.date.add(M._date,-1,"month"))};C=document.createElement("DIV");C.className="dhx_cal_next_button";C.style.cssText="left:auto; right:1px;top:2px;position:absolute;";C.innerHTML=this._mini_cal_arrows[1];M.firstChild.appendChild(C);C.onclick=function(){scheduler.updateCalendar(M,scheduler.date.add(M._date,1,"month"))};M._date=new Date(A)}M.week_start=(A.getDay()-(this.config.start_on_monday?1:0)+7)%7;var P=this.date.week_start(A);this._reset_month_scale(M.childNodes[2],A,P);var I=M.childNodes[2].firstChild.rows;for(var J=I.length;J<6;J++){I[0].parentNode.appendChild(I[0].cloneNode(true));for(var H=0;H500){B=this._def_count.firstChild}}if(!B){return }B.onclick=null;B.innerHTML="";if(B.parentNode){B.parentNode.removeChild(B)}if(this._def_count){this._def_count.style.top="-1000px"}};scheduler.isCalendarVisible=function(){if(this._def_count&&parseInt(this._def_count.style.top,10)>0){return this._def_count}return false};scheduler.attachEvent("onTemplatesReady",function(){dhtmlxEvent(document.body,"click",function(){scheduler.destroyCalendar()})});scheduler.templates.calendar_time=scheduler.date.date_to_str("%d-%m-%Y");scheduler.form_blocks.calendar_time={render:function(){var D="";var B=scheduler.config;var E=this.date.date_part(new Date());if(B.first_hour){E.setHours(B.first_hour)}D+=" ";var A=scheduler.config.full_day;return"
"+D+"  –  "+D+"
"},set_value:function(B,K,H){var D=B.getElementsByTagName("input");var F=B.getElementsByTagName("select");var A=function(N,L,M){N.onclick=function(){scheduler.destroyCalendar(null,true);scheduler.renderCalendar({position:N,date:new Date(this._date),navigation:true,handler:function(O){N.value=scheduler.templates.calendar_time(O);N._date=new Date(O);scheduler.destroyCalendar();if(scheduler.config.event_duration&&M==0){J()}}})}};if(scheduler.config.full_day){if(!B._full_day){B.previousSibling.innerHTML+="
";B._full_day=true}var I=B.previousSibling.getElementsByTagName("input")[0];var E=(scheduler.date.time_part(H.start_date)==0&&scheduler.date.time_part(H.end_date)==0&&H.end_date.valueOf()-H.start_date.valueOf()<2*24*60*60*1000);I.checked=E;for(var C in F){F[C].disabled=I.checked}for(var C=0;C0){continue}scheduler.markCalendar(B,F,"dhx_calendar_click");F=scheduler.date.add(F,1,"day")}}}}return true};scheduler.attachEvent("onViewChange",A);scheduler.attachEvent("onXLE",A);scheduler.attachEvent("onEventAdded",A);scheduler.attachEvent("onEventChanged",A);scheduler.attachEvent("onAfterEventDelete",A);A()}; \ No newline at end of file +to use it in not GPL project. Please contact sales@dhtmlx.com for details +*/ +scheduler.templates.calendar_month=scheduler.date.date_to_str("%F %Y");scheduler.templates.calendar_scale_date=scheduler.date.date_to_str("%D");scheduler.templates.calendar_date=scheduler.date.date_to_str("%d"); +scheduler.renderCalendar=function(b,c){var a=null,d=b.date||new Date;typeof d=="string"&&(d=this.templates.api_date(d));if(c)a=this._render_calendar(c.parentNode,d,b,c),scheduler.unmarkCalendar(a);else{var e=b.container,f=b.position;typeof e=="string"&&(e=document.getElementById(e));typeof f=="string"&&(f=document.getElementById(f));if(f&&typeof f.left=="undefined")var n=getOffset(f),f={top:n.top+f.offsetHeight,left:n.left};e||(e=scheduler._get_def_cont(f));a=this._render_calendar(e,d,b);a.onclick= +function(a){var a=a||event,b=a.target||a.srcElement;if(b.className.indexOf("dhx_month_head")!=-1){var c=b.parentNode.className;if(c.indexOf("dhx_after")==-1&&c.indexOf("dhx_before")==-1){var d=scheduler.templates.xml_date(this.getAttribute("date"));d.setDate(parseInt(b.innerHTML,10));scheduler.unmarkCalendar(this);scheduler.markCalendar(this,d,"dhx_calendar_click");this._last_date=d;this.conf.handler&&this.conf.handler.call(scheduler,d,this)}}}}for(var m=scheduler.date.month_start(d),k=scheduler.date.add(m, +1,"month"),p=this.getEvents(m,k),i=0;i=k.valueOf())break}this._markCalendarCurrentDate(a);a.conf=b;return a}; +scheduler._get_def_cont=function(b){if(!this._def_count)this._def_count=document.createElement("DIV"),this._def_count.style.cssText="position:absolute;z-index:10100;width:251px; height:175px;",this._def_count.onclick=function(b){(b||event).cancelBubble=!0},document.body.appendChild(this._def_count);this._def_count.style.left=b.left+"px";this._def_count.style.top=b.top+"px";this._def_count._created=new Date;return this._def_count}; +scheduler._locateCalendar=function(b,c){var a=b.childNodes[2].childNodes[0];typeof c=="string"&&(c=scheduler.templates.api_date(c));var d=b.week_start+c.getDate()-1;return a.rows[Math.floor(d/7)].cells[d%7].firstChild};scheduler.markCalendar=function(b,c,a){this._locateCalendar(b,c).className+=" "+a};scheduler.unmarkCalendar=function(b,c,a){c=c||b._last_date;a=a||"dhx_calendar_click";if(c){var d=this._locateCalendar(b,c);d.className=(d.className||"").replace(RegExp(a,"g"))}}; +scheduler._week_template=function(b){for(var c=b||250,a=0,d=document.createElement("div"),e=this.date.week_start(new Date),f=0;f<7;f++)this._cols[f]=Math.floor(c/(7-f)),this._render_x_header(f,a,e,d),e=this.date.add(e,1,"day"),c-=this._cols[f],a+=this._cols[f];d.lastChild.className+=" dhx_scale_bar_last";return d};scheduler.updateCalendar=function(b,c){b.conf.date=c;this.renderCalendar(b.conf,b)};scheduler._mini_cal_arrows=[" "," "]; +scheduler._render_calendar=function(b,c,a,d){var e=scheduler.templates,f=this._cols;this._cols=[];var n=this._mode;this._mode="calendar";var m=this._colsS;this._colsS={height:0};var k=new Date(this._min_date),p=new Date(this._max_date),i=new Date(scheduler._date),o=e.month_day;e.month_day=e.calendar_date;var c=this.date.month_start(c),l=this._week_template(b.offsetWidth-1),g;d?g=d:(g=document.createElement("DIV"),g.className="dhx_cal_container dhx_mini_calendar");g.setAttribute("date",this.templates.xml_format(c)); +g.innerHTML="
"+l.innerHTML+"
";g.childNodes[0].innerHTML=this.templates.calendar_month(c);if(a.navigation){var h=document.createElement("DIV");h.className="dhx_cal_prev_button";h.style.cssText="left:1px;top:2px;position:absolute;";h.innerHTML=this._mini_cal_arrows[0];g.firstChild.appendChild(h);h.onclick=function(){scheduler.updateCalendar(g,scheduler.date.add(g._date,-1,"month"));scheduler._date.getMonth()== +g._date.getMonth()&&scheduler._date.getFullYear()==g._date.getFullYear()&&scheduler._markCalendarCurrentDate(g)};h=document.createElement("DIV");h.className="dhx_cal_next_button";h.style.cssText="left:auto; right:1px;top:2px;position:absolute;";h.innerHTML=this._mini_cal_arrows[1];g.firstChild.appendChild(h);h.onclick=function(){scheduler.updateCalendar(g,scheduler.date.add(g._date,1,"month"));scheduler._date.getMonth()==g._date.getMonth()&&scheduler._date.getFullYear()==g._date.getFullYear()&&scheduler._markCalendarCurrentDate(g)}}g._date= +new Date(c);g.week_start=(c.getDay()-(this.config.start_on_monday?1:0)+7)%7;var u=this.date.week_start(c);this._reset_month_scale(g.childNodes[2],c,u);for(var j=g.childNodes[2].firstChild.rows,q=j.length;q<6;q++){var t=j[j.length-1];j[0].parentNode.appendChild(t.cloneNode(!0));for(var r=parseInt(t.childNodes[t.childNodes.length-1].childNodes[0].innerHTML),r=r<10?r:0,s=0;s500))b=this._def_count.firstChild;if(b&&(b.onclick=null,b.innerHTML="",b.parentNode&&b.parentNode.removeChild(b),this._def_count))this._def_count.style.top="-1000px"};scheduler.isCalendarVisible=function(){return this._def_count&&parseInt(this._def_count.style.top,10)>0?this._def_count:!1}; +scheduler.attachEvent("onTemplatesReady",function(){dhtmlxEvent(document.body,"click",function(){scheduler.destroyCalendar()})});scheduler.templates.calendar_time=scheduler.date.date_to_str("%d-%m-%Y"); +scheduler.form_blocks.calendar_time={render:function(){var b="",c=scheduler.config,a=this.date.date_part(new Date);c.first_hour&&a.setHours(c.first_hour);b+=" ";var f=scheduler.config.full_day;return"
"+ +b+"  –  "+b+"
"},set_value:function(b,c,a){function d(a,b,c){n(a,b,c);a.value=scheduler.templates.calendar_time(b);a._date=scheduler.date.date_part(new Date(b))}var e=b.getElementsByTagName("input"),f=b.getElementsByTagName("select"),n=function(a,b,c){a.onclick=function(){scheduler.destroyCalendar(null,!0);scheduler.renderCalendar({position:a,date:new Date(this._date),navigation:!0,handler:function(b){a.value=scheduler.templates.calendar_time(b); +a._date=new Date(b);scheduler.destroyCalendar();scheduler.config.event_duration&&scheduler.config.auto_end_date&&c==0&&o()}})}};if(scheduler.config.full_day){if(!b._full_day){var m="";scheduler.config.wide_form||(m=b.previousSibling.innerHTML+m);b.previousSibling.innerHTML=m;b._full_day=!0}var k=b.previousSibling.getElementsByTagName("input")[0],p=scheduler.date.time_part(a.start_date)== +0&&scheduler.date.time_part(a.end_date)==0&&a.end_date.valueOf()-a.start_date.valueOf()<1728E5;k.checked=p;for(var i in f)f[i].disabled=k.checked;for(i=0;i";for(var A=0;A"+C.options[A].label+"";if(convertStringToBoolean(C.vertical)){B+="
"}}B+="";return B},set_value:function(C,J,I,A){var E=C.getElementsByTagName("input");for(var G=0;G",b=0;b"+d.options[b].label+"",convertStringToBoolean(d.vertical)&&(a+="
");a+="";return a},set_value:function(d,a,b,c){function h(b){for(var c=d.getElementsByTagName("input"),a=0;a"}I=U[0].offsetWidth;return T}function G(V,W){var T=parseInt(V.style.left);for(var U=0;UV){return T}}return W}function A(W){var U="";var X=W.firstChild.rows;for(var V=0;V";H=W.firstChild.rows[0].cells[0].offsetHeight}return U}function S(X){var U="";if(scheduler._mode=="agenda"){var T=scheduler._els.dhx_cal_header[0].childNodes[0].childNodes;U+=""+T[0].innerHTML+""+T[1].innerHTML+""}else{if(scheduler._mode=="year"){var T=scheduler._els.dhx_cal_data[0].childNodes;for(var V=0;V";U+=O(T[V].childNodes[1].childNodes);U+=A(T[V].childNodes[2]);U+=""}}else{U+="";var T=scheduler._els.dhx_cal_header[0].childNodes;U+=O(T);U+="";var W=scheduler._els.dhx_cal_data[0];if(W.firstChild.tagName=="TABLE"){U+=A(W)}else{W=W.childNodes[W.childNodes.length-1];while(W.className.indexOf("dhx_scale_holder")==-1){W=W.previousSibling}W=W.childNodes;U+="";for(var V=0;V"}U+="";H=W[0].offsetHeight}}}U+="";return U}function E(U,T){return(window.getComputedStyle?(window.getComputedStyle(U,null)[T]):(U.currentStyle?U.currentStyle[T]:null))||""}function B(){var b="";var j=scheduler._rendered;if(scheduler._mode=="agenda"){for(var Z=0;Z"+j[Z].childNodes[0].innerHTML+""+j[Z].childNodes[2].innerHTML+""}}else{if(scheduler._mode=="year"){var j=scheduler.get_visible_events();for(var Z=0;Z";scheduler._mark_year_date(f);f=scheduler.date.add(f,1,"day");if(f.valueOf()>=scheduler._max_date.valueOf()){break}}}}else{for(var Z=0;Z";if(Y=="event"){b+="
";var W=F?E(j[Z].childNodes[2],"color"):"";var h=F?E(j[Z].childNodes[2],"backgroundColor"):"";b+=""}else{var W=F?E(j[Z],"color"):"";var h=F?E(j[Z],"backgroundColor"):"";b+=""}b+=""}}}return b}function K(){var T="
";return T}var D=(new Date()).valueOf();var R=document.createElement("div");R.style.display="none";document.body.appendChild(R);R.innerHTML='
';document.getElementById(D).firstChild.value=S(J).replace("\u2013","-")+B()+K();document.getElementById(D).submit();R.parentNode.removeChild(R);grid=null}; \ No newline at end of file +to use it in not GPL project. Please contact sales@dhtmlx.com for details +*/ +scheduler.toPDF=function(x,f,m,n){function g(c){return c.replace(html_regexp,"")}function j(c){c=parseFloat(c);return isNaN(c)?"auto":100*c/(o+1)}function t(c){c=parseFloat(c);return isNaN(c)?"auto":100*c/k}function q(c){var a="";if(scheduler.matrix&&scheduler.matrix[scheduler._mode])c=c[0].childNodes;for(var b=0;b";o=c[0].offsetWidth;return a}function y(c,a){for(var b=parseInt(c.style.left),d=0;db)return d;return a}function w(c){for(var a="",b=c.firstChild.rows,d=0;d";k=c.firstChild.rows[0].cells[0].offsetHeight}return a}function A(c){var a= +"";if(scheduler._mode=="agenda"){var b=scheduler._els.dhx_cal_header[0].childNodes[0].childNodes;a+=""+g(b[0].innerHTML)+""+g(b[1].innerHTML)+""}else if(scheduler._mode=="year")for(var b=scheduler._els.dhx_cal_data[0].childNodes,d=0;d",a+=q(b[d].childNodes[1].childNodes),a+=w(b[d].childNodes[2]),a+="";else{a+="";b=scheduler._els.dhx_cal_header[0].childNodes;a+=q(b);a+="";var e=scheduler._els.dhx_cal_data[0];if(scheduler.matrix&&scheduler.matrix[scheduler._mode]){a+="";for(d=0;d";a+="";k=e.firstChild.rows[0].cells[0].offsetHeight}else if(e.firstChild.tagName=="TABLE")a+=w(e);else{for(e=e.childNodes[e.childNodes.length- +1];e.className.indexOf("dhx_scale_holder")==-1;)e=e.previousSibling;e=e.childNodes;a+="";for(d=0;d";a+="";k=e[0].offsetHeight}}a+="";return a}function r(c,a){return(window.getComputedStyle?window.getComputedStyle(c,null)[a]:c.currentStyle?c.currentStyle[a]:null)||""}function B(){var c="",a=scheduler._rendered;if(scheduler._mode=="agenda")for(var b=0;b"+g(a[b].childNodes[0].innerHTML)+""+ +g(a[b].childNodes[2].innerHTML)+"";else if(scheduler._mode=="year"){a=scheduler.get_visible_events();for(b=0;b";d=scheduler.date.add(d,1,"day"); +if(d.valueOf()>=scheduler._max_date.valueOf())break}}}else for(b=0;b";if(n=="event"){c+="
";var u=p?r(a[b].childNodes[2],"color"):"",v=p?r(a[b].childNodes[2],"backgroundColor"): +"";c+=""}else u=p?r(a[b],"color"):"",v=p?r(a[b],"backgroundColor"):"",c+="";c+=""}return c}function C(){var c="
";return c}var o=0,k=0,p=!1;f=="fullcolor"&&(p=!0,f="color");f=f||"color";html_regexp=RegExp("<[^>]*>","g");var l=(new Date).valueOf(),i=document.createElement("div");i.style.display="none";document.body.appendChild(i); +i.innerHTML='
';document.getElementById(l).firstChild.value=A(f).replace("\u2013","-")+B()+C();document.getElementById(l).submit();i.parentNode.removeChild(i);grid=null}; diff --git a/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/ext/dhtmlxscheduler_readonly.js b/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/ext/dhtmlxscheduler_readonly.js index cc182b4b12a..066e5e5a57b 100644 --- a/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/ext/dhtmlxscheduler_readonly.js +++ b/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/ext/dhtmlxscheduler_readonly.js @@ -1,9 +1,9 @@ -/* -dhtmlxScheduler v.2.3 - +/* This software is allowed to use under GPL or you need to obtain Commercial or Enterise License -to use it in not GPL project. Please contact sales@dhtmlx.com for details - -(c) DHTMLX Ltd. -*/ -scheduler.attachEvent("onTemplatesReady",function(){scheduler.attachEvent("onBeforeLightbox",function(F){if(this.config.readonly_form||this.getEvent(F).readonly){this.config.readonly_active=true}else{this.config.readonly_active=false;return true}for(var E=0;E=0;I--){var L=F[I];if(!J){L.disabled=true}else{var H=document.createElement("SPAN");H.className="dhx_text_disabled";H.innerHTML=J(G[I]);L.parentNode.insertBefore(H,L);L.parentNode.removeChild(L)}}}var B=scheduler._fill_lightbox;scheduler._fill_lightbox=function(){var H=this.config.lightbox.sections;if(this.config.readonly_active){for(var F=0;F=0;g--)if(c=a[g],f){var i=document.createElement("SPAN");i.className="dhx_text_disabled";i.innerHTML=f(e[g]);c.parentNode.insertBefore(i,c);c.parentNode.removeChild(c)}else c.disabled=!0}scheduler.attachEvent("onBeforeLightbox",function(d){if(this.config.readonly_form||this.getEvent(d).readonly)this.config.readonly_active=!0;else return this.config.readonly_active= +!1,!0;for(var b=0;bA){return G.setDate(G.getDate()+D[B]*1-A-(C?F:E))}}this.transpose_day_week(G,D,F+C,null,F)};scheduler.transpose_type=function(D){var F="transpose_"+D;if(!this.date[F]){var G=D.split("_");var A=60*60*24*1000;var C="add_"+D;var E=this.transponse_size[G[0]]*G[1];if(G[0]=="day"||G[0]=="week"){var H=null;if(G[4]){H=G[4].split(",");if(scheduler.config.start_on_monday){for(var B=0;B0){I.setDate(I.getDate()+J*E)}if(H){scheduler.transpose_day_week(I,H,1,E)}};this.date[C]=function(K,J){var L=new Date(K.valueOf());if(H){for(var I=0;I=0){I.setMonth(I.getMonth()+J*E)}if(G[3]){scheduler.date.day_week(I,G[2],G[3])}};this.date[C]=function(J,I){var K=new Date(J.valueOf());K.setMonth(K.getMonth()+I*E);if(G[3]){scheduler.date.day_week(K,G[2],G[3])}return K}}}}};scheduler.repeat_date=function(F,G,C,I,J){I=I||this._min_date;J=J||this._max_date;var E=new Date(F.start_date.valueOf());if(!F.rec_pattern&&F.rec_type){F.rec_pattern=F.rec_type.split("#")[0]}this.transpose_type(F.rec_pattern);scheduler.date["transpose_"+F.rec_pattern](E,I);while(E0){B.end_date=new Date(E.valueOf()+F.event_length*1000-D*60*1000)}else{B.end_date=new Date(B.end_date.valueOf()+D*60*1000)}}B._timed=this.is_one_day_event(B);if(!B._timed&&!this._table_view&&!this.config.multi_day){return }G.push(B);if(!C){this._events[B.id]=B;this._rec_temp.push(B)}}else{if(C){G.push(A)}}E=this.date.add(E,1,F.rec_pattern)}};scheduler.getRecDates=function(B,H){var G=typeof B=="object"?B:scheduler.getEvent(B);var E=0;var J=[];H=H||1000;var C=new Date(G.start_date.valueOf());var I=new Date(C.valueOf());if(!G.rec_type){return[{start_date:G.start_date,end_date:G.end_date}]}this.transpose_type(G.rec_pattern);scheduler.date["transpose_"+G.rec_pattern](C,I);while(CG){if(D.rec_pattern){if(D.rec_pattern=="none"){continue}var E=[];this.repeat_date(D,E,true,G,F);for(var C=0;CG){A.push(E[C])}}}else{if(!D.event_pid||D.event_pid==0){A.push(D)}}}}return A};scheduler.config.repeat_date="%m.%d.%Y";scheduler.config.lightbox.sections=[{name:"description",height:130,map_to:"text",type:"textarea",focus:true},{name:"recurring",height:115,type:"recurring",map_to:"rec_type",button:"recurring"},{name:"time",height:72,type:"time",map_to:"auto"}];scheduler._copy_dummy=function(A){this.start_date=new Date(this.start_date);this.end_date=new Date(this.end_date);this.event_length=this.event_pid=this.rec_pattern=this.rec_type=this._timed=null};scheduler.__recurring_template='



day everymonth
everymonth

occurrences

'; \ No newline at end of file +/* +This software is allowed to use under GPL or you need to obtain Commercial or Enterise License +to use it in not GPL project. Please contact sales@dhtmlx.com for details +*/ +scheduler.form_blocks.recurring={render:function(){return scheduler.__recurring_template},_ds:{},_init_set_value:function(a,b,c){function d(a){for(var b=0;be)return a.setDate(a.getDate()+b[h]*1-e-(d?c:f));this.transpose_day_week(a,b,c+d,null,c)}; +scheduler.transpose_type=function(a){var b="transpose_"+a;if(!this.date[b]){var c=a.split("_"),d=864E5,f="add_"+a,e=this.transponse_size[c[0]]*c[1];if(c[0]=="day"||c[0]=="week"){var h=null;if(c[4]&&(h=c[4].split(","),scheduler.config.start_on_monday)){for(var j=0;j0&&a.setDate(a.getDate()+c*e);h&&scheduler.transpose_day_week(a,h,1,e)};this.date[f]=function(a,b){var c=new Date(a.valueOf()); +if(h)for(var d=0;d=0&&a.setMonth(a.getMonth()+d*e);c[3]&&scheduler.date.day_week(a,c[2],c[3])},this.date[f]=function(a,b){var d=new Date(a.valueOf());d.setMonth(d.getMonth()+b*e);c[3]&&scheduler.date.day_week(d,c[2],c[3]);return d}}}; +scheduler.repeat_date=function(a,b,c,d,f){var d=d||this._min_date,f=f||this._max_date,e=new Date(a.start_date.valueOf());if(!a.rec_pattern&&a.rec_type)a.rec_pattern=a.rec_type.split("#")[0];this.transpose_type(a.rec_pattern);for(scheduler.date["transpose_"+a.rec_pattern](e,d);e0?new Date(e.valueOf()+a.event_length*1E3-k*6E4):new Date(i.end_date.valueOf()+k*6E4);i._timed=this.is_one_day_event(i);if(!i._timed&&!this._table_view&&!this.config.multi_day)break;b.push(i);c||(this._events[i.id]=i,this._rec_temp.push(i))}e=this.date.add(e,1,a.rec_pattern)}}; +scheduler.getRecDates=function(a,b){var c=typeof a=="object"?a:scheduler.getEvent(a),d=0,f=[],b=b||1E3,e=new Date(c.start_date.valueOf()),h=new Date(e.valueOf());if(!c.rec_type)return[{start_date:c.start_date,end_date:c.end_date}];this.transpose_type(c.rec_pattern);for(scheduler.date["transpose_"+c.rec_pattern](e,h);ea)if(f.rec_pattern){if(f.rec_pattern!="none"){var e=[];this.repeat_date(f,e,!0,a,b);for(var h=0;ha&&!this._rec_markers[e[h].id]&&c.push(e[h])}}else f.id.toString().indexOf("#")==-1&&c.push(f)}return c};scheduler.config.repeat_date="%m.%d.%Y"; +scheduler.config.lightbox.sections=[{name:"description",height:130,map_to:"text",type:"textarea",focus:!0},{name:"recurring",type:"recurring",map_to:"rec_type",button:"recurring"},{name:"time",height:72,type:"time",map_to:"auto"}];scheduler._copy_dummy=function(){this.start_date=new Date(this.start_date);this.end_date=new Date(this.end_date);this.event_length=this.event_pid=this.rec_pattern=this.rec_type=this._timed=null}; +scheduler.__recurring_template='



day everymonth
everymonth

occurrences

'; diff --git a/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/ext/dhtmlxscheduler_serialize.js b/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/ext/dhtmlxscheduler_serialize.js index 2e041981b10..fd3b34913bb 100644 --- a/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/ext/dhtmlxscheduler_serialize.js +++ b/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/ext/dhtmlxscheduler_serialize.js @@ -1,9 +1,8 @@ -/* -dhtmlxScheduler v.2.3 - +/* This software is allowed to use under GPL or you need to obtain Commercial or Enterise License -to use it in not GPL project. Please contact sales@dhtmlx.com for details - -(c) DHTMLX Ltd. -*/ -scheduler.data_attributes=function(){var C=[];var E=scheduler.templates.xml_format;for(var A in this._events){var D=this._events[A];for(var B in D){if(B.substr(0,1)!="_"){C.push([B,((B=="start_date"||B=="end_date")?E:null)])}}break}return C};scheduler.toXML=function(F){var C=[];var B=this.data_attributes();for(var A in this._events){var E=this._events[A];if(E.id.toString().indexOf("#")!=-1){continue}C.push("");for(var D=0;D")}C.push("")}return(F||"")+""+C.join("\n")+""};scheduler.toJSON=function(){var E=[];var C=this.data_attributes();for(var B in this._events){var F=this._events[B];if(F.id.toString().indexOf("#")!=-1){continue}var F=this._events[B];var A=[];for(var D=0;D");for(var b=0;b");d.push("")}}return(f||"")+""+d.join("\n")+""}; +scheduler.toJSON=function(){var f=[],d=this.data_attributes(),c;for(c in this._events){var e=this._events[c];if(e.id.toString().indexOf("#")==-1){for(var e=this._events[c],a=[],b=0;bU.x){break}}T=0;for(Q;QU.y){break}}U.fields={};U.fields[O.y_property]=P[O.y_property]=O.y_unit[Q].key;U.x=Q/10000000;if(this._drag_mode=="new-size"&&P.start_date*1==this._drag_start*1){S++}if(S>=O._trace_x.length){var R=scheduler.date.add(O._trace_x[O._trace_x.length-1],O.x_step,O.x_unit)}else{var R=O._trace_x[S]}U.y=Math.round((R-this._min_date)/(1000*60*this.config.time_step));U.custom=true;U.shift=M;return U}}};scheduler.render_timeline_event=function(U,V,R){var N=E(U,false,this._step);var L=E(U,true,this._step);var P=scheduler.xy.bar_height;var T=2+V*P;var Q=scheduler.templates.event_class(U.start_date,U.end_date,U);Q="dhx_cal_event_line "+(Q||"");var O='
'+scheduler.templates.event_bar_text(U.start_date,U.end_date,U)+"
";if(!R){return O}else{var S=document.createElement("DIV");S.innerHTML=O;var M=this.order[U[this.y_property]];var W=scheduler._els.dhx_cal_data[0].firstChild.rows[M].cells[1].firstChild;scheduler._rendered.push(S.firstChild);W.appendChild(S.firstChild)}};function K(){var N=scheduler.getEvents(scheduler._min_date,scheduler._max_date);var M=[];for(var O=0;O=this._trace_x[L+1]){L++}while(this._trace_x[L]&&N[O].end_date>this._trace_x[L]){if(!M[P][L]){M[P][L]=[]}M[P][L].push(N[O]);L++}}return M}function E(S,Q,L){var T=0;var O=(Q)?S.end_date:S.start_date;if(O.valueOf()>scheduler._max_date.valueOf()){O=scheduler._max_date}var U=O-scheduler._min_date_timeline;if(U<0){M=0}else{var R=Math.round(U/(L*scheduler._cols[0]));if(R>scheduler._cols.length){R=scheduler._cols.length}for(var P=0;P"+Q.td_content+"";if(this.render=="cell"){for(var O=0;O
"+scheduler.templates[this.name+"_cell_value"](Z[P][O])+"
"}}else{R+="
";if(Z[P]){Z[P].sort(function(d,c){return d.start_date>c.start_date?1:-1});var X=[];for(var O=0;OW.start_date){L++}X[L]=W;R+=scheduler.render_timeline_event.call(this,W,L)}}R+="";for(var O=0;O
"}R+="
";R+="
"}R+=""}R+="";this._matrix=Z;S.scrollTop=0;S.innerHTML=R;scheduler._rendered=[];var U=document.getElementsByTagName("DIV");for(var P=0;PT.start_date?1:-1});if(scheduler._tooltip){if(scheduler._tooltip.date==R){return }scheduler._tooltip.innerHTML=""}else{var O=scheduler._tooltip=document.createElement("DIV");O.className="dhx_tooltip";document.body.appendChild(O);O.onclick=scheduler._click.dhx_cal_data}var N="";for(var M=0;M";N+="
"+(L[M]._timed?scheduler.templates.event_date(L[M].start_date):"")+"
";N+="
 
";N+=scheduler.templates[P.name+"_tooltip"](L[M].start_date,L[M].end_date,L[M])+"
"}scheduler._tooltip.style.display="";scheduler._tooltip.style.top="0px";if(document.body.offsetWidth-Q.left-scheduler._tooltip.offsetWidth<0){scheduler._tooltip.style.left=Q.left-scheduler._tooltip.offsetWidth+"px"}else{scheduler._tooltip.style.left=Q.left+S.src.offsetWidth+"px"}scheduler._tooltip.date=R;scheduler._tooltip.innerHTML=N;if(document.body.offsetHeight-Q.top-scheduler._tooltip.offsetHeight<0){scheduler._tooltip.style.top=Q.top-scheduler._tooltip.offsetHeight+S.src.offsetHeight+"px"}else{scheduler._tooltip.style.top=Q.top+"px"}}function F(){dhtmlxEvent(scheduler._els.dhx_cal_data[0],"mouseover",function(M){var L=scheduler.matrix[scheduler._mode];if(L){var O=scheduler._locate_cell_timeline(M);var M=M||event;var N=M.target||M.srcElement;if(O){return J(L,O,getOffset(O.src))}}H()});F=function(){}}scheduler.renderMatrix=function(M){var L=scheduler.date[this.name+"_start"](scheduler._date);scheduler._min_date=scheduler.date.add(L,this.x_start*this.x_step,this.x_unit);scheduler._max_date=scheduler.date.add(scheduler._min_date,this.x_size*this.x_step,this.x_unit);scheduler._table_view=true;C.call(this,M)};function G(M){var N=M.parentNode.childNodes;for(var L=0;L=this._trace_x[d+1];)d++;for(;this._trace_x[d]&&a[c].end_date>this._trace_x[d];)b[f][d]||(b[f][d]=[]),b[f][d].push(a[c]),d++}return b}function v(a,b,c){var f=0,d=b?a.end_date:a.start_date;if(d.valueOf()>scheduler._max_date.valueOf())d=scheduler._max_date;var i=d-scheduler._min_date_timeline; +if(i<0)k=0;else{var g=Math.round(i/(c*scheduler._cols[0]));if(g>scheduler._cols.length)g=scheduler._cols.length;for(var e=0;ed.start_date?1:-1});for(var l=[],d=0;dm.start_date;)n++;l[n]=m;o+=scheduler.render_timeline_event.call(this,m,n)}}if(this.fit_events){var w=this._events_height[this.y_unit[e].key]||0;h.height=w>h.height?w:h.height;h.style_height="height:"+ +h.height+"px;"}b+=""+h.td_content+"";if(this.render=="cell")for(d=0;d
"+scheduler.templates[this.name+"_cell_value"](c[e][d])+ +"
";else{b+="
";b+=o;b+="";for(d=0;d
"; +b+="
";b+="
"}b+=""}b+="";this._matrix=c;a.innerHTML=b;scheduler._rendered=[];for(var q=document.getElementsByTagName("DIV"),e=0;e
";if(this.second_scale){for(var j=this.second_scale.x_unit,k=[this._trace_x[0]],h=[],o=[this.dx,this.dx],l=0,m=0;m
";var p=a.firstChild;p.style.height=c+"px";var v=a.lastChild;v.style.position="relative";for(var r=0;rd.start_date?1:-1});if(scheduler._tooltip){if(scheduler._tooltip.date== +f)return;scheduler._tooltip.innerHTML=""}else{var i=scheduler._tooltip=document.createElement("DIV");i.className="dhx_tooltip";document.body.appendChild(i);i.onclick=scheduler._click.dhx_cal_data}for(var g="",e=0;e";g+="
"+(d[e]._timed?scheduler.templates.event_date(d[e].start_date): +"")+"
";g+="
 
";g+=scheduler.templates[a.name+"_tooltip"](d[e].start_date,d[e].end_date,d[e])+""}scheduler._tooltip.style.display="";scheduler._tooltip.style.top="0px";scheduler._tooltip.style.left=document.body.offsetWidth-c.left-scheduler._tooltip.offsetWidth<0?c.left-scheduler._tooltip.offsetWidth+"px":c.left+b.src.offsetWidth+"px";scheduler._tooltip.date=f;scheduler._tooltip.innerHTML=g;scheduler._tooltip.style.top=document.body.offsetHeight- +c.top-scheduler._tooltip.offsetHeight<0?c.top-scheduler._tooltip.offsetHeight+b.src.offsetHeight+"px":c.top+"px"}}function t(){dhtmlxEvent(scheduler._els.dhx_cal_data[0],"mouseover",function(a){var b=scheduler.matrix[scheduler._mode];if(b){var c=scheduler._locate_cell_timeline(a),a=a||event,f=a.target||a.srcElement;if(c)return F(b,c,getOffset(c.src))}u()});t=function(){}}function G(a){for(var b=a.parentNode.childNodes,c=0;cb.x)break;for(g=0;jb.y)break;b.fields={};a.y_unit[j]||(j=a.y_unit.length-1);b.fields[a.y_property]=c[a.y_property]=a.y_unit[j].key;b.x=0;this._drag_mode=="new-size"&&c.start_date*1==this._drag_start*1&&e++;var k=e>=a._trace_x.length?scheduler.date.add(a._trace_x[a._trace_x.length-1],a.x_step,a.x_unit):a._trace_x[e];b.y=Math.round((k-this._min_date)/(6E4*this.config.time_step));b.custom=!0;b.shift=f;return b}}};scheduler.render_timeline_event=function(a,b,c){var f=v(a,!1,this._step),d=v(a,!0, +this._step),i=scheduler.xy.bar_height,g=2+b*i,e=i+g-2,j=a[this.y_property];if(!this._events_height[j]||this._events_height[j]'+scheduler.templates.event_bar_text(a.start_date, +a.end_date,a)+"";if(c){var m=document.createElement("DIV");m.innerHTML=l;var n=this.order[j],p=scheduler._els.dhx_cal_data[0].firstChild.rows[n].cells[1].firstChild;scheduler._rendered.push(m.firstChild);p.appendChild(m.firstChild)}else return l};scheduler.renderMatrix=function(a){scheduler._els.dhx_cal_data[0].scrollTop=0;var b=scheduler.date[this.name+"_start"](scheduler._date);scheduler._min_date=scheduler.date.add(b,this.x_start*this.x_step,this.x_unit);scheduler._max_date=scheduler.date.add(scheduler._min_date, +this.x_size*this.x_step,this.x_unit);scheduler._table_view=!0;if(this.second_scale){if(a&&!this._header_resized)this._header_resized=scheduler.xy.scale_height,scheduler.xy.scale_height*=2,scheduler._els.dhx_cal_header[0].className+=" dhx_second_cal_header";if(!a&&this._header_resized){scheduler.xy.scale_height/=2;this._header_resized=!1;var c=scheduler._els.dhx_cal_header[0];c.className=c.className.replace(/ dhx_second_cal_header/gi,"")}}p.call(this,a)};scheduler._locate_cell_timeline=function(a){for(var a= +a||event,b=a.target?a.target:a.srcElement;b&&b.tagName!="TD";)b=b.parentNode;if(b&&b.tagName=="TD"){var c=b.className.split(" ")[0];if(c=="dhx_matrix_cell")if(scheduler._isRender("cell"))return{x:b.cellIndex-1,y:b.parentNode.rowIndex,src:b};else{for(var f=b.parentNode;f&&f.tagName!="TD";)f=f.parentNode;return{x:b.cellIndex,y:f.parentNode.rowIndex,src:b}}else if(c=="dhx_matrix_scell")return{x:-1,y:b.parentNode.rowIndex,src:b,scale:!0}}return!1};var H=scheduler._click.dhx_cal_data;scheduler._click.dhx_cal_data= +function(a){var b=H.apply(this,arguments),c=scheduler.matrix[scheduler._mode];if(c){var f=scheduler._locate_cell_timeline(a);f&&(f.scale?scheduler.callEvent("onYScaleClick",[f.y,c.y_unit[f.y],a||event]):scheduler.callEvent("onCellClick",[f.x,f.y,c._trace_x[f.x],(c._matrix[f.y]||{})[f.x]||[],a||event]))}return b};scheduler.dblclick_dhx_matrix_cell=function(a){var b=scheduler.matrix[scheduler._mode];if(b){var c=scheduler._locate_cell_timeline(a);c&&(c.scale?scheduler.callEvent("onYScaleDblClick",[c.y, +b.y_unit[c.y],a||event]):scheduler.callEvent("onCellDblClick",[c.x,c.y,b._trace_x[c.x],(b._matrix[c.y]||{})[c.x]||[],a||event]))}};scheduler.dblclick_dhx_matrix_scell=function(a){return scheduler.dblclick_dhx_matrix_cell(a)};scheduler._isRender=function(a){return scheduler.matrix[scheduler._mode]&&scheduler.matrix[scheduler._mode].render==a};scheduler.attachEvent("onCellDblClick",function(a,b,c,f,d){if(!(this.config.readonly||d.type=="dblclick"&&!this.config.dblclick_create)){var i=scheduler.matrix[scheduler._mode], +g={};g.start_date=i._trace_x[a];g.end_date=i._trace_x[a+1]?i._trace_x[a+1]:scheduler.date.add(i._trace_x[a],i.x_step,i.x_unit);g[scheduler.matrix[scheduler._mode].y_property]=i.y_unit[b].key;scheduler.addEventNow(g,null,d)}});scheduler.attachEvent("onBeforeDrag",function(){return scheduler._isRender("cell")?!1:!0})})(); diff --git a/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/ext/dhtmlxscheduler_tooltip.js b/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/ext/dhtmlxscheduler_tooltip.js index e24ad910174..2458d37e841 100644 --- a/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/ext/dhtmlxscheduler_tooltip.js +++ b/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/ext/dhtmlxscheduler_tooltip.js @@ -1 +1,11 @@ -window.dhtmlXTooltip={version:0.1};dhtmlXTooltip.config={className:"dhtmlXTooltip tooltip",timeout_to_display:50,delta_x:15,delta_y:-20};dhtmlXTooltip.tooltip=document.createElement("div");dhtmlXTooltip.tooltip.className=dhtmlXTooltip.config.className;dhtmlXTooltip.show=function(D,G){dhtmlXTooltip.tooltip.className=dhtmlXTooltip.config.className;var H=this.position(D);var E=D.target||D.srcElement;if(this.isTooltip(E)){return }var C=H.x+dhtmlXTooltip.config.delta_x||0;var B=H.y-dhtmlXTooltip.config.delta_y||0;this.tooltip.style.visibility="hidden";if(this.tooltip.style.removeAttribute){this.tooltip.style.removeAttribute("right");this.tooltip.style.removeAttribute("bottom")}else{this.tooltip.style.removeProperty("right");this.tooltip.style.removeProperty("bottom")}this.tooltip.style.left="0px";this.tooltip.style.top="0px";this.tooltip.innerHTML=G;scheduler._obj.appendChild(this.tooltip);var A=this.tooltip.offsetWidth;var F=this.tooltip.offsetHeight;if(document.body.offsetWidth-C-A<0){if(this.tooltip.style.removeAttribute){this.tooltip.style.removeAttribute("left")}else{this.tooltip.style.removeProperty("left")}this.tooltip.style.right=(document.body.offsetWidth-C+2*dhtmlXTooltip.config.delta_x||0)+"px"}else{if(C<0){this.tooltip.style.left=(H.x+Math.abs(dhtmlXTooltip.config.delta_x||0))+"px"}else{this.tooltip.style.left=C+"px"}}if(document.body.offsetHeight-B-F<0){if(this.tooltip.style.removeAttribute){this.tooltip.style.removeAttribute("top")}else{this.tooltip.style.removeProperty("top")}this.tooltip.style.bottom=(document.body.offsetHeight-B-2*dhtmlXTooltip.config.delta_y||0)+"px"}else{if(B<0){this.tooltip.style.top=(H.y+Math.abs(dhtmlXTooltip.config.delta_y||0))+"px"}else{this.tooltip.style.top=B+"px"}}this.tooltip.style.visibility="visible"};dhtmlXTooltip.hide=function(){if(this.tooltip.parentNode){this.tooltip.parentNode.removeChild(this.tooltip)}};dhtmlXTooltip.delay=function(D,B,C,A){if(this.tooltip._timeout_id){window.clearTimeout(this.tooltip._timeout_id)}this.tooltip._timeout_id=setTimeout(function(){var E=D.apply(B,C);D=obj=C=null;return E},A||this.config.timeout_to_display)};dhtmlXTooltip.isTooltip=function(B){var A=false;while(B&&!A){A=(B.className==this.tooltip.className);B=B.parentNode}return A};dhtmlXTooltip.position=function(A){var A=A||window.event;if(A.pageX||A.pageY){return{x:A.pageX,y:A.pageY}}var B=((dhtmlx._isIE)&&(document.compatMode!="BackCompat"))?document.documentElement:document.body;return{x:A.clientX+B.scrollLeft-B.clientLeft,y:A.clientY+B.scrollTop-B.clientTop}};scheduler.attachEvent("onMouseMove",function(D,F){var C=F||window.event;var E=C.target||C.srcElement;if(D||dhtmlXTooltip.isTooltip(E)){var B=scheduler.getEvent(D)||scheduler.getEvent(dhtmlXTooltip.tooltip.event_id);dhtmlXTooltip.tooltip.event_id=B.id;var G=scheduler.templates.tooltip_text(B.start_date,B.end_date,B);if(_isIE){var A=document.createEventObject(C)}dhtmlXTooltip.delay(dhtmlXTooltip.show,dhtmlXTooltip,[A||C,G])}else{dhtmlXTooltip.delay(dhtmlXTooltip.hide,dhtmlXTooltip,[])}});scheduler.templates.tooltip_text=function(C,A,B){return"Event: "+B.text+"
Start date: "+scheduler.templates.tooltip_date_format(C)+"
End date: "+scheduler.templates.tooltip_date_format(A)}; \ No newline at end of file +/* +This software is allowed to use under GPL or you need to obtain Commercial or Enterise License +to use it in not GPL project. Please contact sales@dhtmlx.com for details +*/ +window.dhtmlXTooltip={};dhtmlXTooltip.config={className:"dhtmlXTooltip tooltip",timeout_to_display:50,delta_x:15,delta_y:-20};dhtmlXTooltip.tooltip=document.createElement("div");dhtmlXTooltip.tooltip.className=dhtmlXTooltip.config.className; +dhtmlXTooltip.show=function(b,d){var c=dhtmlXTooltip,f=this.tooltip,a=f.style;c.tooltip.className=c.config.className;var e=this.position(b),k=b.target||b.srcElement;if(!this.isTooltip(k)){var g=0,l=0,h=scheduler._obj;if(h.offsetParent){do g+=h.offsetLeft,l+=h.offsetTop;while(h=h.offsetParent)}var i=e.x+(c.config.delta_x||0)-g,j=e.y-(c.config.delta_y||0)-l;a.visibility="hidden";a.removeAttribute?(a.removeAttribute("right"),a.removeAttribute("bottom")):(a.removeProperty("right"),a.removeProperty("bottom")); +a.left="0";a.top="0";this.tooltip.innerHTML=d;scheduler._obj.appendChild(this.tooltip);var m=this.tooltip.offsetWidth,n=this.tooltip.offsetHeight;scheduler._obj.offsetWidth-i-(scheduler.xy.margin_left||0)-m<0?(a.removeAttribute?a.removeAttribute("left"):a.removeProperty("left"),a.right=scheduler._obj.offsetWidth-i+2*(c.config.delta_x||0)+"px"):a.left=i<0?e.x+Math.abs(c.config.delta_x||0)+"px":i+"px";scheduler._obj.offsetHeight-j-(scheduler.xy.margin_top||0)-n<0?(a.removeAttribute?a.removeAttribute("top"): +a.removeProperty("top"),a.bottom=scheduler._obj.offsetHeight-j-2*(c.config.delta_y||0)+"px"):a.top=j<0?e.y+Math.abs(c.config.delta_y||0)+"px":j+"px";a.visibility="visible"}};dhtmlXTooltip.hide=function(){this.tooltip.parentNode&&this.tooltip.parentNode.removeChild(this.tooltip)};dhtmlXTooltip.delay=function(b,d,c,f){this.tooltip._timeout_id&&window.clearTimeout(this.tooltip._timeout_id);this.tooltip._timeout_id=setTimeout(function(){var a=b.apply(d,c);b=d=c=null;return a},f||this.config.timeout_to_display)}; +dhtmlXTooltip.isTooltip=function(b){for(var d=!1;b&&!d;)d=b.className==this.tooltip.className,b=b.parentNode;return d};dhtmlXTooltip.position=function(b){b=b||window.event;if(b.pageX||b.pageY)return{x:b.pageX,y:b.pageY};var d=dhtmlx._isIE&&document.compatMode!="BackCompat"?document.documentElement:document.body;return{x:b.clientX+d.scrollLeft-d.clientLeft,y:b.clientY+d.scrollTop-d.clientTop}}; +scheduler.attachEvent("onMouseMove",function(b,d){var c=window.event||d,f=c.target||c.srcElement,a=dhtmlXTooltip;if(b||a.isTooltip(f)){var e=scheduler.getEvent(b)||scheduler.getEvent(a.tooltip.event_id);if(e){a.tooltip.event_id=e.id;var k=scheduler.templates.tooltip_text(e.start_date,e.end_date,e),g=void 0;_isIE&&(g=document.createEventObject(c));a.delay(a.show,a,[g||c,k])}}else a.delay(a.hide,a,[])});scheduler.attachEvent("onBeforeDrag",function(){dhtmlXTooltip.hide();return!0}); +scheduler.templates.tooltip_date_format=scheduler.date.date_to_str("%Y-%m-%d %H:%i");scheduler.templates.tooltip_text=function(b,d,c){return"Event: "+c.text+"
Start date: "+scheduler.templates.tooltip_date_format(b)+"
End date: "+scheduler.templates.tooltip_date_format(d)}; diff --git a/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/ext/dhtmlxscheduler_touch.css b/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/ext/dhtmlxscheduler_touch.css index e72e38213d0..212423da5d1 100644 --- a/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/ext/dhtmlxscheduler_touch.css +++ b/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/ext/dhtmlxscheduler_touch.css @@ -1,9 +1,5 @@ -/* -dhtmlxScheduler v.2.3 - +/* This software is allowed to use under GPL or you need to obtain Commercial or Enterise License -to use it in not GPL project. Please contact sales@dhtmlx.com for details - -(c) DHTMLX Ltd. -*/ +to use it in not GPL project. Please contact sales@dhtmlx.com for details +*/ .dhx_cal_prev_button,.dhx_cal_next_button,.dhx_cal_today_button,.dhx_cal_add_button{top:6px!important;left:10px;border:1px solid #575D65;border-top:1px solid #4E5052;color:#FFF;text-shadow:0 -1px 0 #65696E;background-image:-webkit-gradient(linear,left top,left bottom,from(#B2B6BC),to(#6B737E));background-color:#989B9F;background-position:0 1px;background-repeat:repeat-x;-webkit-border-radius:5px;padding:3px;text-align:center;text-decoration:none;}.dhx_cal_today_button{left:55px;}.dhx_cal_next_button{left:146px;}.dhx_cal_add_button{right:9px;left:auto;width:20px;font-size:20px;padding:1px 2px 2px 2px;}.dhx_cal_navline .dhx_cal_date{top:7px;left:160px;right:350px;padding-top:4px;width:auto;text-align:center;color:#4F5459;}.dhx_cal_navline{background:-webkit-gradient(linear,0% 0,0% 100%,color-stop(0,#F4F5F8),color-stop(0.3,#F1F2F4),color-stop(0.7,#C4C7D0),color-stop(1,#A6AAB7));border-bottom:1px solid #797F90;height:40px!important;font-family:Helvetica;font-weight:bold;font-size:13px;}.dhx_cal_tab{top:6px!important;color:#4F5459;text-align:center;padding:5px 10px;width:80px;background-image:-webkit-gradient(linear,0% 0,0% 100%,from(#F7F7F7),to(#B9BDC7));background-color:#CFD0D1;background-position:0 1px;background-repeat:repeat-x;text-decoration:none;border:1px solid #95989F;border-top:1px solid #686A6A;height:16px;}.dhx_cal_tab.active{background-image:-webkit-gradient(linear,0% 0,0% 100%,from(#B0B2B6),to(#666D74));background-color:#949799;background-position:0 1px;background-repeat:repeat-x;border:1px solid #4C4D4F;border-top:1px solid #52585C;color:#F8F8F8;text-shadow:0 -1px 0 #5E6063;text-decoration:none;height:16px;padding:5px 10px;z-index:100;}.dhx_cal_light{-webkit-transition:-webkit-transform;-webkit-transform-style:preserve-3d;}.dhx_cal_cover{opacity:.5;}.dhx_cal_ltext{padding-top:0;padding-bottom:0;}.dhx_cal_ltext textarea{-webkit-background-size:0;-webkit-border-radius:0;height:94%;}.dhx_mini_calendar .dhx_month_head{height:35px;line-height:35px;text-align:center;padding-right:0;padding-left:0;}.dhx_mini_calendar .dhx_year_month{height:35px;line-height:30px;background:-webkit-gradient(linear,0% 0,0% 100%,from(#F4F5F8),to(#8A8E9A));font-family:Helvetica;font-weight:bold;font-size:13px;}.dhx_mini_calendar .dhx_year_month .dhx_cal_prev_button,.dhx_mini_calendar .dhx_year_month .dhx_cal_next_button{line-height:normal;} \ No newline at end of file diff --git a/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/ext/dhtmlxscheduler_touch.js b/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/ext/dhtmlxscheduler_touch.js index 9004dfcee68..70b4abeda7c 100644 --- a/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/ext/dhtmlxscheduler_touch.js +++ b/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/ext/dhtmlxscheduler_touch.js @@ -1,9 +1,26 @@ -/* -dhtmlxScheduler v.2.3 - +/* This software is allowed to use under GPL or you need to obtain Commercial or Enterise License -to use it in not GPL project. Please contact sales@dhtmlx.com for details - -(c) DHTMLX Ltd. -*/ -TouchScroll=function(D,E,A,B){this.debug=!!E;this.compat=!!B;this.rough=!!A;this.axisX=this.axisY=true;if(typeof D!="object"){D=document.getElementById(D)}this._init();D.addEventListener("touchstart",this,false);D.addEventListener("webkitTransitionEnd",this,false);if(this.debug){D.addEventListener("mousedown",this,false)}this.node=D;for(var C=0;C50){this.scroll_x=true}if(Math.abs(A)>50){this.scroll_y=true}if(this.scroll_x||this.scroll_y){this.x=G.pageX;this.y=G.pageY;this.scroll=true;var C=this.get_matrix();D=D+(this.target_x-C.e);A=A+(this.target_y-C.f);var F="2000ms";var B="500ms";this.target_x=D+C.e;this.target_y=A+C.f;if(this.target_x>0){this.target_x=0;F=B}if(this.target_y>0){this.target_y=0;F=B}if(this.mx-this.dx+this.target_x<0){this.target_x=-this.mx+this.dx;F=B}if(this.my-this.dy+this.target_y<0){this.target_y=-this.my+this.dy;F=B}this.set_matrix({e:this.target_x,f:this.target_y},F);this._add_scroll(C.e,C.f);this._correct_scroll(this.target_x,this.target_y,F);this.onscroll(this.target_x,this.target_y)}return false},_correct_scroll:function(A,F,B){if(this.scrolls.x){var E=this.get_matrix(this.scrolls.x);var D=this.dx*A/this.mx;this.set_matrix({e:-1*D,f:0},B,this.scrolls.x)}if(this.scrolls.y){var E=this.get_matrix(this.scrolls.y);var C=this.dy*F/this.my;this.set_matrix({e:0,f:-1*C},B,this.scrolls.y)}},_remove_scroll:function(){if(this.scrolls.x){this.scrolls.x.parentNode.removeChild(this.scrolls.x)}if(this.scrolls.y){this.scrolls.y.parentNode.removeChild(this.scrolls.y)}this.scrolls={}},_add_scroll:function(){if(this.scrolls.ready){return }var C;if(this.my>5&&this.axisY){var B=this.dy*this.dy/this.my-1;this.scrolls.y=C=document.createElement("DIV");C.className="dhx_scroll_y";C.style.height=B+"px";this.node.appendChild(C)}if(this.mx>5&&this.axisX){var B=this.dx*this.dx/this.mx;this.scrolls.x=C=document.createElement("DIV");C.className="dhx_scroll_x";C.style.width=B+"px";this.node.appendChild(C)}var A=this.get_matrix();this._correct_scroll(A.e,A.f,0);this.scrolls.ready=true},_init_events:function(){document.addEventListener("touchmove",this,false);document.addEventListener("touchend",this,false);if(this.debug){document.addEventListener("mousemove",this,false);document.addEventListener("mouseup",this,false)}},_deinit_events:function(){document.removeEventListener("touchmove",this,false);document.removeEventListener("touchend",this,false);if(this.debug){document.removeEventListener("mousemove",this,false);document.removeEventListener("mouseup",this,false)}},_init:function(){document.styleSheets[0].insertRule(".dhx_scroll_x { width:50px;height:4px;background:rgba(0, 0, 0, 0.4);position:absolute; left:0px; bottom:3px; border:1px solid transparent; -webkit-border-radius:4px;-webkit-transition: -webkit-transform;}",0);document.styleSheets[0].insertRule(".dhx_scroll_y { width:4px;height:50px;background:rgba(0, 0, 0, 0.4);position:absolute; top:0px; right:3px; border:1px solid transparent; -webkit-border-radius:4px;-webkit-transition: -webkit-transform;}",0);this._init=function(){}}};scheduler._ipad_before_init=function(){scheduler._ipad_before_init=function(){};scheduler.xy.scroll_width=0;var C=scheduler._els.dhx_cal_tab;var B=42;for(var A=C.length-1;A>=0;A--){C[A].style.cssText+="top:4px;";C[A].style.left="auto";C[A].style.right=B+"px";if(A==0){C[A].style.cssText+=";-webkit-border-top-left-radius: 5px; -webkit-border-bottom-left-radius: 5px;"}if(A==C.length-1){C[A].style.cssText+=";-webkit-border-top-right-radius: 5px; -webkit-border-bottom-right-radius: 5px;"}B+=100}scheduler._els.dhx_cal_prev_button[0].innerHTML="<";scheduler._els.dhx_cal_next_button[0].innerHTML=">";var F=document.createElement("div");F.className="dhx_cal_add_button";F.innerHTML="+ ";F.onclick=function(){var G=new Date();if(G>scheduler._min_date&&G50||G>50){D=window.clearTimeout(D)}}if(scheduler.config.touch_actions){scheduler._on_mouse_move(I.touches[0])}};this._obj.ontouchstart=function(G){if(scheduler._lightbox_id){return }D=window.setTimeout(function(){scheduler._on_dbl_click(G.touches[0],(G.target.className?G.target:G.target.parentNode))},400);E=[G.touches[0].pageX,G.touches[0].pageY];if(scheduler.config.touch_actions){scheduler._on_mouse_down(G.touches[0])}};this._obj.ontouchend=function(G){if(D){D=window.clearTimeout(D)}if(scheduler.config.touch_actions){scheduler._on_mouse_up(G.touches[0])}}};scheduler._ipad_init=function(){var C=document.createElement("DIV");var B=scheduler._els.dhx_cal_data[0];C.appendChild(B);C.style.cssText="overflow:hidden; width:100%; overflow:hidden;position:relative;";this._obj.appendChild(C);B.style.overflowY="hidden";var A=new TouchScroll(C);A.axisX=false;scheduler._ipad_init=function(){B.parentNode.style.height=B.style.height;B.parentNode.style.top=B.style.top;B.style.height=B.scrollHeight+"px";B.style.top="0px";if(Math.abs(B.parentNode.offsetHeight-B.offsetHeight)<5){A.axisY=false;A.scrollTo(0,0,0)}else{A.axisY=true}A.refresh()};scheduler.attachEvent("onSchedulerResize",function(){setTimeout(function(){scheduler._ipad_init()});return true});scheduler._ipad_init()};scheduler.attachEvent("onViewChange",function(){scheduler._ipad_init()});scheduler.attachEvent("onBeforeViewChange",function(){scheduler._ipad_before_init();return true});scheduler.showCover=function(B){this.show_cover();if(B){B.style.display="block";var C=getOffset(this._obj);B.style.top=B.offsetHeight*-1+"px";B.style.left=Math.round(C.left+(this._obj.offsetWidth-B.offsetWidth)/2)+"px"}var A=this._get_lightbox();A.style.webkitTransform="translate(0px,"+(B.offsetHeight+41)+"px)";A.style.webkitTransitionDuration="500ms"};scheduler.hideCover=function(A){if(A){A.style.webkitTransform="translate(0px,"+(A.offsetHeight+41)*-1+"px)";A.style.webkitTransitionDuration="500ms"}this.hide_cover()};scheduler.config.lightbox.sections[0].height=100;if(scheduler.form_blocks.calendar_time){scheduler.config.lightbox.sections[1].type="calendar_time";scheduler._mini_cal_arrows=["<",">"]}scheduler.xy.menu_width=0;scheduler.attachEvent("onClick",function(){return false});scheduler.locale.labels.new_event="";scheduler._mouse_coords=function(C){var F;var A=document.body;var E=document.documentElement;if(C.pageX||C.pageY){F={x:C.pageX,y:C.pageY}}else{F={x:C.clientX+(A.scrollLeft||E.scrollLeft||0)-A.clientLeft,y:C.clientY+(A.scrollTop||E.scrollTop||0)-A.clientTop}}F.x-=getAbsoluteLeft(this._obj)+(this._table_view?0:this.xy.scale_width);var D=F.y-=getAbsoluteTop(this._obj)+this.xy.nav_height+this._dy_shift+this.xy.scale_height-(this._els.dhx_cal_data[0]._scrollTop||0);if(!this._table_view){F.x=Math.max(0,Math.ceil(F.x/this._cols[0])-1);F.y=Math.max(0,Math.ceil(F.y*60/(this.config.time_step*this.config.hour_size_px))-1)+this.config.first_hour*(60/this.config.time_step)}else{var B=0;for(B=1;BF.y){break}}F.y=(Math.max(0,Math.ceil(F.x/this._cols[0])-1)+Math.max(0,B-1)*7)*24*60/this.config.time_step;F.x=0}return F}; \ No newline at end of file +to use it in not GPL project. Please contact sales@dhtmlx.com for details +*/ +TouchScroll=function(a,b,c,e){this.debug=!!b;this.compat=!!e;this.rough=!!c;this.axisX=this.axisY=!0;typeof a!="object"&&(a=document.getElementById(a));this._init();a.addEventListener("touchstart",this,!1);a.addEventListener("webkitTransitionEnd",this,!1);this.debug&&a.addEventListener("mousedown",this,!1);this.node=a;for(var d=0;d50)this.scroll_x=!0;if(Math.abs(e)>50)this.scroll_y=!0;if(this.scroll_x|| +this.scroll_y){this.x=b.pageX;this.y=b.pageY;this.scroll=!0;var d=this.get_matrix();c+=this.target_x-d.e;e+=this.target_y-d.f;var f="2000ms",g="500ms";this.target_x=c+d.e;this.target_y=e+d.f;if(this.target_x>0)this.target_x=0,f=g;if(this.target_y>0)this.target_y=0,f=g;if(this.mx-this.dx+this.target_x<0)this.target_x=-this.mx+this.dx,f=g;if(this.my-this.dy+this.target_y<0)this.target_y=-this.my+this.dy,f=g;this.set_matrix({e:this.target_x,f:this.target_y},f);this._add_scroll(d.e,d.f);this._correct_scroll(this.target_x, +this.target_y,f);this.onscroll(this.target_x,this.target_y)}return!1}}},_correct_scroll:function(a,b,c){if(this.scrolls.x){var e=this.get_matrix(this.scrolls.x),d=this.dx*a/this.mx;this.set_matrix({e:-1*d,f:0},c,this.scrolls.x)}if(this.scrolls.y){var e=this.get_matrix(this.scrolls.y),f=this.dy*b/this.my;this.set_matrix({e:0,f:-1*f},c,this.scrolls.y)}},_remove_scroll:function(){this.scrolls.x&&this.scrolls.x.parentNode.removeChild(this.scrolls.x);this.scrolls.y&&this.scrolls.y.parentNode.removeChild(this.scrolls.y); +this.scrolls={}},_add_scroll:function(){if(!this.scrolls.ready){var a;if(this.my>5&&this.axisY){var b=this.dy*this.dy/this.my-1;this.scrolls.y=a=document.createElement("DIV");a.className="dhx_scroll_y";a.style.height=b+"px";this.node.appendChild(a)}if(this.mx>5&&this.axisX)b=this.dx*this.dx/this.mx,this.scrolls.x=a=document.createElement("DIV"),a.className="dhx_scroll_x",a.style.width=b+"px",this.node.appendChild(a);var c=this.get_matrix();this._correct_scroll(c.e,c.f,0);this.scrolls.ready=!0}},_init_events:function(){document.addEventListener("touchmove", +this,!1);document.addEventListener("touchend",this,!1);this.debug&&(document.addEventListener("mousemove",this,!1),document.addEventListener("mouseup",this,!1))},_deinit_events:function(){document.removeEventListener("touchmove",this,!1);document.removeEventListener("touchend",this,!1);this.debug&&(document.removeEventListener("mousemove",this,!1),document.removeEventListener("mouseup",this,!1))},_init:function(){document.styleSheets[0].insertRule(".dhx_scroll_x { width:50px;height:4px;background:rgba(0, 0, 0, 0.4);position:absolute; left:0px; bottom:3px; border:1px solid transparent; -webkit-border-radius:4px;-webkit-transition: -webkit-transform;}", +0);document.styleSheets[0].insertRule(".dhx_scroll_y { width:4px;height:50px;background:rgba(0, 0, 0, 0.4);position:absolute; top:0px; right:3px; border:1px solid transparent; -webkit-border-radius:4px;-webkit-transition: -webkit-transform;}",0);this._init=function(){}}}; +scheduler._ipad_before_init=function(){scheduler._ipad_before_init=function(){};scheduler.xy.scroll_width=0;for(var a=scheduler._els.dhx_cal_tab,b=42,c=a.length-1;c>=0;c--)a[c].style.cssText+="top:4px;",a[c].style.left="auto",a[c].style.right=b+"px",c==0&&(a[c].style.cssText+=";-webkit-border-top-left-radius: 5px; -webkit-border-bottom-left-radius: 5px;"),c==a.length-1&&(a[c].style.cssText+=";-webkit-border-top-right-radius: 5px; -webkit-border-bottom-right-radius: 5px;"),b+=100;scheduler._els.dhx_cal_prev_button[0].innerHTML= +"<";scheduler._els.dhx_cal_next_button[0].innerHTML=">";var e=document.createElement("div");e.className="dhx_cal_add_button";e.innerHTML="+ ";e.onclick=function(){var a=new Date;a>scheduler._min_date&&a50||c>50)d=window.clearTimeout(d)}scheduler.config.touch_actions&&scheduler._on_mouse_move(a.touches[0])};this._obj.ontouchstart=function(a){scheduler._lightbox_id||(d=window.setTimeout(function(){scheduler._on_dbl_click(a.touches[0],a.target.className?a.target:a.target.parentNode)},400),f=[a.touches[0].pageX,a.touches[0].pageY],scheduler.config.touch_actions&&scheduler._on_mouse_down(a.touches[0]))};this._obj.ontouchend=function(a){d&&(d=window.clearTimeout(d)); +scheduler.config.touch_actions&&scheduler._on_mouse_up(a.touches[0])}}; +scheduler._ipad_init=function(){var a=document.createElement("DIV"),b=scheduler._els.dhx_cal_data[0];a.appendChild(b);a.style.cssText="overflow:hidden; width:100%; overflow:hidden;position:relative;";this._obj.appendChild(a);b.style.overflowY="hidden";var c=new TouchScroll(a);c.axisX=!1;scheduler._ipad_init=function(){b.parentNode.style.height=b.style.height;b.parentNode.style.top=b.style.top;b.style.height=b.scrollHeight+"px";b.style.top="0px";Math.abs(b.parentNode.offsetHeight-b.offsetHeight)<5? +(c.axisY=!1,c.scrollTo(0,0,0)):c.axisY=!0;c.refresh()};scheduler.attachEvent("onSchedulerResize",function(){setTimeout(function(){scheduler._ipad_init()});return!0});scheduler._ipad_init()};scheduler.attachEvent("onViewChange",function(){scheduler._ipad_init()});scheduler.attachEvent("onBeforeViewChange",function(){scheduler._ipad_before_init();return!0}); +scheduler.showCover=function(a){this.show_cover();if(a){a.style.display="block";var b=getOffset(this._obj);a.style.top=a.offsetHeight*-1+"px";a.style.left=Math.round(b.left+(this._obj.offsetWidth-a.offsetWidth)/2)+"px"}var c=this._get_lightbox(),e=c.addEventListener("webkitTransitionEnd",function(){c.style.top="41px";c.style.webkitTransform="";c.style.webkitTransition="";c.removeEventListener(e)},!1);c.style.webkitTransform="translate(0px,"+(a.offsetHeight+41)+"px)";c.style.webkitTransitionDuration= +"500ms"};scheduler.hideCover=function(a){if(a){var b=a.addEventListener("webkitTransitionEnd",function(){a.style.top=(a.offsetHeight+41)*-1+"px";a.style.webkitTransform="";a.style.webkitTransition="";a.removeEventListener(b)},!1);a.style.webkitTransform="translate(0px,"+(a.offsetHeight+41)*-1+"px)";a.style.webkitTransitionDuration="500ms"}this.hide_cover()};scheduler.config.lightbox.sections[0].height=100; +if(scheduler.form_blocks.calendar_time)scheduler.config.lightbox.sections[1].type="calendar_time",scheduler._mini_cal_arrows=["<",">"];scheduler.xy.menu_width=0;scheduler.attachEvent("onClick",function(){return!1});scheduler.locale.labels.new_event=""; +scheduler._mouse_coords=function(a){var b,c=document.body,e=document.documentElement;b=a.pageX||a.pageY?{x:a.pageX,y:a.pageY}:{x:a.clientX+(c.scrollLeft||e.scrollLeft||0)-c.clientLeft,y:a.clientY+(c.scrollTop||e.scrollTop||0)-c.clientTop};b.x-=getAbsoluteLeft(this._obj)+(this._table_view?0:this.xy.scale_width);var d=b.y-=getAbsoluteTop(this._obj)+this.xy.nav_height+this._dy_shift+this.xy.scale_height-(this._els.dhx_cal_data[0]._scrollTop||0);if(this._table_view){for(var f=0,f=1;f +b.y)break;b.y=(Math.max(0,Math.ceil(b.x/this._cols[0])-1)+Math.max(0,f-1)*7)*1440/this.config.time_step;b.x=0}else b.x=Math.max(0,Math.ceil(b.x/this._cols[0])-1),b.y=Math.max(0,Math.ceil(b.y*60/(this.config.time_step*this.config.hour_size_px))-1)+this.config.first_hour*(60/this.config.time_step);return b}; diff --git a/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/ext/dhtmlxscheduler_treetimeline.js b/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/ext/dhtmlxscheduler_treetimeline.js index ecd08cc8cdd..c131cb1eb13 100644 --- a/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/ext/dhtmlxscheduler_treetimeline.js +++ b/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/ext/dhtmlxscheduler_treetimeline.js @@ -1 +1,19 @@ -scheduler.attachEvent("onTimelineCreated",function(A){if(A.render=="tree"){A.y_unit_original=A.y_unit;A.y_unit=scheduler._getArrayToDisplay(A.y_unit_original);scheduler.form_blocks[A.name]={render:function(C){var B="
";return B},set_value:function(D,I,G,C){var J=scheduler._getArrayForSelect(scheduler.matrix[C.type].y_unit_original,C.type);D.innerHTML="";var F=document.createElement("select");D.appendChild(F);var H=D.getElementsByTagName("select")[0];for(var E=0;E";G=(H.folder_events_available)?"dhx_data_table folder_events":"dhx_data_table folder"}else{I=H.dy;D="dhx_row_item";B="dhx_matrix_scell item";C="";G="dhx_data_table"}td_content="
"+C+"
"+(scheduler.templates[H.name+"_scale_label"](E.key,E.label,H)||E.label)+"
";F={height:I,style_height:A,tr_className:D,td_className:B,td_content:td_content,table_className:G}}return F});var section_id_before;scheduler.attachEvent("onBeforeEventChanged",function(D,A,C){if(scheduler._isRender("tree")){var B=scheduler.getSection(D.section_id);if(typeof B.children!="undefined"&&!scheduler.matrix[scheduler._mode].folder_events_available){if(!C){D[scheduler.matrix[scheduler._mode].y_property]=section_id_before}return false}}return true});scheduler.attachEvent("onBeforeDrag",function(D,E,C){var A=scheduler._locate_cell_timeline(C);if(A){var B=scheduler.matrix[scheduler._mode].y_unit[A.y].key;if(typeof scheduler.matrix[scheduler._mode].y_unit[A.y].children!="undefined"&&!scheduler.matrix[scheduler._mode].folder_events_available){return false}}if(scheduler._isRender("tree")){ev=scheduler.getEvent(D);section_id_before=B||ev[scheduler.matrix[scheduler._mode].y_property]}return true});scheduler._getArrayToDisplay=function(C){var A=[];var B=function(G,D){var F=D||0;for(var E=0;E";return c},set_value:function(b,c,g,e){var d=scheduler._getArrayForSelect(scheduler.matrix[e.type].y_unit_original, +e.type);b.innerHTML="";var a=document.createElement("select");b.appendChild(a);for(var i=b.getElementsByTagName("select")[0],j=0;j",h=c.folder_events_available?"dhx_data_table folder_events":"dhx_data_table folder"):(e=c.dy,d="dhx_row_item",i="dhx_matrix_scell item",j="",h="dhx_data_table");td_content="
"+j+"
"+(scheduler.templates[c.name+"_scale_label"](b.key,b.label,b)||b.label)+"
";g={height:e,style_height:f,tr_className:d,td_className:i,td_content:td_content,table_className:h}}return g});var section_id_before; +scheduler.attachEvent("onBeforeEventChanged",function(a,b,c){if(scheduler._isRender("tree")){var g=scheduler.getSection(a[scheduler.matrix[scheduler._mode].y_property]);if(typeof g.children!="undefined"&&!scheduler.matrix[scheduler._mode].folder_events_available)return c||(a[scheduler.matrix[scheduler._mode].y_property]=section_id_before),!1}return!0}); +scheduler.attachEvent("onBeforeDrag",function(a,b,c){var g=scheduler._locate_cell_timeline(c);if(g){var e=scheduler.matrix[scheduler._mode].y_unit[g.y].key;if(typeof scheduler.matrix[scheduler._mode].y_unit[g.y].children!="undefined"&&!scheduler.matrix[scheduler._mode].folder_events_available)return!1}scheduler._isRender("tree")&&(ev=scheduler.getEvent(a),section_id_before=e||ev[scheduler.matrix[scheduler._mode].y_property]);return!0}); +scheduler._getArrayToDisplay=function(a){var b=[],c=function(a,e){for(var d=e||0,f=0;f"+D[F].label+""}else{return D[F].label}};scheduler.date["add_"+A]=function(F,G){return scheduler.date.add(F,G,"day")};scheduler.date["get_"+A+"_end"]=function(F){return scheduler.date.add(F,B||D.length,"day")};scheduler._props[A]={map_to:E,options:D,size:B,step:C,position:0};scheduler.attachEvent("onOptionsLoad",function(){var F=scheduler._props[A].order={};for(var G=0;G=K.size+K.position){return false}}}return H};scheduler._reset_scale=function(){var M=scheduler._props[this._mode];var H=B.apply(this,arguments);if(M){this._max_date=this.date.add(this._min_date,1,"day");var L=this._els.dhx_cal_data[0].childNodes;for(var I=0;II.order[J[I.map_to]]?1:-1})}else{G.apply(this,arguments)}};scheduler.attachEvent("onEventAdded",function(K,I){if(this._loading){return true}for(var H in scheduler._props){var J=scheduler._props[H];if(typeof I[J.map_to]=="undefined"){I[J.map_to]=J.options[0].key}}return true});scheduler.attachEvent("onEventCreated",function(K,H){var J=scheduler._props[this._mode];if(J){var I=this.getEvent(K);this._mouse_coords(H);D(J,I);this.event_updated(I)}return true})})(); \ No newline at end of file +to use it in not GPL project. Please contact sales@dhtmlx.com for details +*/ +scheduler._props={}; +scheduler.createUnitsView=function(a,f,j,g,k,l){if(typeof a=="object")j=a.list,f=a.property,g=a.size||0,k=a.step||1,l=a.skip_incorrect,a=a.name;scheduler._props[a]={map_to:f,options:j,step:k,position:0};if(g>scheduler._props[a].options.length)scheduler._props[a]._original_size=g,g=0;scheduler._props[a].size=g;scheduler._props[a].skip_incorrect=l||!1;scheduler.date[a+"_start"]=scheduler.date.day_start;scheduler.templates[a+"_date"]=function(a){return scheduler.templates.day_date(a)};scheduler.templates[a+ +"_scale_date"]=function(c){var h=scheduler._props[a].options;if(!h.length)return"";var f=(scheduler._props[a].position||0)+Math.floor((scheduler._correct_shift(c.valueOf(),1)-scheduler._min_date.valueOf())/864E5);return h[f].css?""+h[f].label+"":h[f].label};scheduler.date["add_"+a]=function(a,f){return scheduler.date.add(a,f,"day")};scheduler.date["get_"+a+"_end"]=function(c){return scheduler.date.add(c,scheduler._props[a].size||scheduler._props[a].options.length, +"day")};scheduler.attachEvent("onOptionsLoad",function(){for(var c=scheduler._props[a],f=c.order={},g=c.options,i=0;ig.length?(c._original_size=c.size,c.size=0):c.size=c._original_size||c.size;scheduler._date&&scheduler._mode==a&&scheduler.setCurrentView(scheduler._date,scheduler._mode)});scheduler.callEvent("onOptionsLoad",[])}; +scheduler.scrollUnit=function(a){var f=scheduler._props[this._mode];if(f)f.position=Math.min(Math.max(0,f.position+a),f.options.length-f.size),this.update_view()}; +(function(){var a=function(b){var d=scheduler._props[scheduler._mode];if(d&&d.order&&d.skip_incorrect){for(var a=[],e=0;e=a.size+a.position)return!1}}return d};scheduler._reset_scale=function(){var b= +scheduler._props[this._mode],a=k.apply(this,arguments);if(b){this._max_date=this.date.add(this._min_date,1,"day");for(var c=this._els.dhx_cal_data[0].childNodes,e=0;ed.order[b[d.map_to]]?1:-1}):i.apply(this,arguments)};scheduler.attachEvent("onEventAdded",function(a,d){if(this._loading)return!0;for(var c in scheduler._props){var e=scheduler._props[c];if(typeof d[e.map_to]=="undefined")d[e.map_to]=e.options[0].key}return!0});scheduler.attachEvent("onEventCreated",function(a,c){var f=scheduler._props[this._mode]; +if(f){var e=this.getEvent(a);this._mouse_coords(c);g(f,e);this.event_updated(e)}return!0})})(); diff --git a/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/ext/dhtmlxscheduler_url.js b/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/ext/dhtmlxscheduler_url.js index 8992c37f373..bb342e484e0 100644 --- a/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/ext/dhtmlxscheduler_url.js +++ b/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/ext/dhtmlxscheduler_url.js @@ -1,9 +1,6 @@ -/* -dhtmlxScheduler v.2.3 - +/* This software is allowed to use under GPL or you need to obtain Commercial or Enterise License -to use it in not GPL project. Please contact sales@dhtmlx.com for details - -(c) DHTMLX Ltd. -*/ -scheduler.attachEvent("onTemplatesReady",function(){var C=true;var A=scheduler.date.str_to_date("%Y-%m-%d");var B=scheduler.date.date_to_str("%Y-%m-%d");scheduler.attachEvent("onBeforeViewChange",function(K,D,F,J){if(C){C=false;var E={};var G=(document.location.hash||"").replace("#","").split(",");for(var H=0;H";for(var h=0;h
"}b+=""}scheduler._els.dhx_cal_date[0].innerHTML=scheduler.templates[scheduler._mode+ +"_date"](scheduler._min_date,scheduler._max_date,scheduler._mode);scheduler._els.dhx_cal_data[0].innerHTML=b;for(var i=scheduler._els.dhx_cal_data[0].getElementsByTagName("div"),l=[],a=0;aj&&o.push(r)}o.sort(function(a,b){return a.start_date.valueOf()==b.start_date.valueOf()?a.id>b.id?1:-1:a.start_date>b.start_date?1:-1});for(h=0;h=j.valueOf()&&d.start_date.valueOf()<=n.valueOf()&&(p="start"),d.end_date.valueOf()>=j.valueOf()&&d.end_date.valueOf()<=n.valueOf()&&(p="end"));g.innerHTML=scheduler.templates.week_agenda_event_text(d.start_date,d.end_date,d,j,p);g.setAttribute("event_id",d.id);t.appendChild(g)}j=scheduler.date.add(j,1,"day");n=scheduler.date.add(n,1,"day")}};scheduler.week_agenda_view= +function(b){scheduler._min_date=scheduler.date.week_start(scheduler._date);scheduler._max_date=scheduler.date.add(scheduler._min_date,1,"week");scheduler.set_sizes();if(b)scheduler._table_view=!0,scheduler._wa._prev_data_border=scheduler._els.dhx_cal_data[0].style.borderTop,scheduler._els.dhx_cal_data[0].style.borderTop=0,scheduler._els.dhx_cal_data[0].style.overflowY="hidden",scheduler._els.dhx_cal_date[0].innerHTML="",scheduler._els.dhx_cal_data[0].style.top=parseInt(scheduler._els.dhx_cal_data[0].style.top)- +scheduler.xy.bar_height-1+"px",scheduler._els.dhx_cal_data[0].style.height=parseInt(scheduler._els.dhx_cal_data[0].style.height)+scheduler.xy.bar_height+1+"px",scheduler._els.dhx_cal_header[0].style.display="none",e(),f();else{scheduler._table_view=!1;if(scheduler._wa._prev_data_border)scheduler._els.dhx_cal_data[0].style.borderTop=scheduler._wa._prev_data_border;scheduler._els.dhx_cal_data[0].style.overflowY="auto";scheduler._els.dhx_cal_data[0].style.top=parseInt(scheduler._els.dhx_cal_data[0].style.top)+ +scheduler.xy.bar_height+"px";scheduler._els.dhx_cal_data[0].style.height=parseInt(scheduler._els.dhx_cal_data[0].style.height)-scheduler.xy.bar_height+"px";scheduler._els.dhx_cal_header[0].style.display="block"}};scheduler.mouse_week_agenda=function(b){for(var a=b.ev,c=a.srcElement||a.target;c.parentNode;){if(c._date)var e=c._date;c=c.parentNode}if(!e)return b;b.x=0;var h=e.valueOf()-scheduler._min_date.valueOf();b.y=Math.ceil(h/6E4/this.config.time_step);if(this._drag_mode=="move"){this._drag_event._dhx_changed= +!0;this._select_id=this._drag_id;for(var k=0;k";K+="
"+(H[J]._timed?this.templates.event_date(H[J].start_date):"")+"
";K+="
 
";K+=this.templates.year_tooltip(H[J].start_date,H[J].end_date,H[J])+""}this._tooltip.style.display="";this._tooltip.style.top="0px";if(document.body.offsetWidth-O.left-this._tooltip.offsetWidth<0){this._tooltip.style.left=O.left-this._tooltip.offsetWidth+"px"}else{this._tooltip.style.left=O.left+N.offsetWidth+"px"}this._tooltip.date=I;this._tooltip.innerHTML=K;if(document.body.offsetHeight-O.top-this._tooltip.offsetHeight<0){this._tooltip.style.top=O.top-this._tooltip.offsetHeight+N.offsetHeight+"px"}else{this._tooltip.style.top=O.top+"px"}};scheduler._init_year_tooltip=function(){dhtmlxEvent(scheduler._els.dhx_cal_data[0],"mouseover",function(H){if(!F()){return }var H=H||event;var I=H.target||H.srcElement;if((I.className||"").indexOf("dhx_year_event")!=-1){scheduler.showToolTip(E(I.getAttribute("date")),getOffset(I),H,I)}else{scheduler.hideToolTip()}});this._init_year_tooltip=function(){}};scheduler.attachEvent("onSchedulerResize",function(){if(F()){this.year_view(true);return false}return true});scheduler._get_year_cell=function(J){var H=J.getMonth()+12*(J.getFullYear()-this._min_date.getFullYear())-this.week_starts._month;var I=this._els.dhx_cal_data[0].childNodes[H];var J=this.week_starts[H]+J.getDate()-1;return I.childNodes[2].firstChild.rows[Math.floor(J/7)].cells[J%7].firstChild};var D=[];scheduler._mark_year_date=function(I,H){var J=this._get_year_cell(I);J.className="dhx_month_head dhx_year_event "+this.templates.event_class(H.start_date,H.end_date,H);J.setAttribute("date",G(I));D.push(J)};scheduler._unmark_year_date=function(H){this._get_year_cell(H).className="dhx_month_head"};scheduler._year_render_event=function(H){var I=H.start_date;if(I.valueOf()=this._max_date.valueOf()){return }}};scheduler.year_view=function(I){if(I){var H=scheduler.xy.scale_height;scheduler.xy.scale_height=-1}scheduler._els.dhx_cal_header[0].style.display=I?"none":"";scheduler.set_sizes();if(I){scheduler.xy.scale_height=H}scheduler._table_view=I;if(this._load_mode&&this._load()){return }if(I){scheduler._init_year_tooltip();scheduler._reset_year_scale();scheduler.render_view_data()}else{scheduler.hideToolTip()}};scheduler._reset_year_scale=function(){this._cols=[];this._colsS={};var T=[];var Z=this._els.dhx_cal_data[0];var X=this.config;Z.scrollTop=0;Z.innerHTML="";var M=Math.floor(parseInt(Z.style.width)/X.year_x);var L=Math.floor((parseInt(Z.style.height)-scheduler.xy.year_top)/X.year_y);if(L<190){L=190;M=Math.floor((parseInt(Z.style.width)-scheduler.xy.scroll_width)/X.year_x)}var Q=M-11;var I=0;var K=document.createElement("div");var a=this.date.week_start(new Date());for(var V=0;V<7;V++){this._cols[V]=Math.floor(Q/(7-V));this._render_x_header(V,I,a,K);a=this.date.add(a,1,"day");Q-=this._cols[V];I+=this._cols[V]}K.lastChild.className+=" dhx_scale_bar_last";var H=this.date[this._mode+"_start"](this.date.copy(this._date));var R=H;for(var V=0;V
"+K.innerHTML+"
";W.childNodes[0].innerHTML=this.templates.year_month(H);var Y=this.date.week_start(H);var J=this._reset_month_scale(W.childNodes[2],H,Y);var P=W.childNodes[2].firstChild.rows;for(var S=P.length;S<6;S++){P[0].parentNode.appendChild(P[0].cloneNode(true));for(var O=0;O";l+="
"+(h[f]._timed?this.templates.event_date(h[f].start_date):"")+"
";l+="
 
";l+=this.templates.year_tooltip(h[f].start_date,h[f].end_date,h[f])+""}this._tooltip.style.display= +"";this._tooltip.style.top="0px";this._tooltip.style.left=document.body.offsetWidth-b.left-this._tooltip.offsetWidth<0?b.left-this._tooltip.offsetWidth+"px":b.left+c.offsetWidth+"px";this._tooltip.date=a;this._tooltip.innerHTML=l;this._tooltip.style.top=document.body.offsetHeight-b.top-this._tooltip.offsetHeight<0?b.top-this._tooltip.offsetHeight+c.offsetHeight+"px":b.top+"px"};scheduler._init_year_tooltip=function(){dhtmlxEvent(scheduler._els.dhx_cal_data[0],"mouseover",function(a){if(c()){var a= +a||event,b=a.target||a.srcElement;if(b.tagName.toLowerCase()=="a")b=b.parentNode;(b.className||"").indexOf("dhx_year_event")!=-1?scheduler.showToolTip(w(b.getAttribute("date")),getOffset(b),a,b):scheduler.hideToolTip()}});this._init_year_tooltip=function(){}};scheduler.attachEvent("onSchedulerResize",function(){return c()?(this.year_view(!0),!1):!0});scheduler._get_year_cell=function(a){var b=a.getMonth()+12*(a.getFullYear()-this._min_date.getFullYear())-this.week_starts._month,d=this._els.dhx_cal_data[0].childNodes[b], +a=this.week_starts[b]+a.getDate()-1;return d.childNodes[2].firstChild.rows[Math.floor(a/7)].cells[a%7].firstChild};var j=[];scheduler._mark_year_date=function(a,b){var d=this._get_year_cell(a);d.className="dhx_month_head dhx_year_event "+this.templates.event_class(b.start_date,b.end_date,b);d.setAttribute("date",v(a));j.push(d)};scheduler._unmark_year_date=function(a){this._get_year_cell(a).className="dhx_month_head"};scheduler._year_render_event=function(a){for(var b=a.start_date,b=b.valueOf()=this._max_date.valueOf())break};scheduler.year_view=function(a){if(a){var b=scheduler.xy.scale_height;scheduler.xy.scale_height=-1}scheduler._els.dhx_cal_header[0].style.display=a?"none":"";scheduler.set_sizes();if(a)scheduler.xy.scale_height=b;scheduler._table_view=a;if(!this._load_mode||!this._load())a?(scheduler._init_year_tooltip(),scheduler._reset_year_scale(),scheduler.render_view_data()): +scheduler.hideToolTip()};scheduler._reset_year_scale=function(){this._cols=[];this._colsS={};var a=[],b=this._els.dhx_cal_data[0],d=this.config;b.scrollTop=0;b.innerHTML="";var c=Math.floor(parseInt(b.style.width)/d.year_x),k=Math.floor((parseInt(b.style.height)-scheduler.xy.year_top)/d.year_y);k<190&&(k=190,c=Math.floor((parseInt(b.style.width)-scheduler.xy.scroll_width)/d.year_x));for(var h=c-11,l=0,f=document.createElement("div"),m=this.date.week_start(new Date),e=0;e<7;e++)this._cols[e]=Math.floor(h/ +(7-e)),this._render_x_header(e,l,m,f),m=this.date.add(m,1,"day"),h-=this._cols[e],l+=this._cols[e];f.lastChild.className+=" dhx_scale_bar_last";for(var g=this.date[this._mode+"_start"](this.date.copy(this._date)),j=g,e=0;e
"+f.innerHTML+"
"; +i.childNodes[0].innerHTML=this.templates.year_month(g);for(var p=this.date.week_start(g),t=this._reset_month_scale(i.childNodes[2],g,p),n=i.childNodes[2].firstChild.rows,q=n.length;q<6;q++){n[0].parentNode.appendChild(n[0].cloneNode(!0));for(var s=0;sY#!2~4#WHWmMDajJoh?3y^w370~qErUQl>DSr z1<%~X^wgl##FWaylc_d9MPZ&Ujv*Ddl59%8@-s`w+}?lZlwr|_$pY7nnC|wTk^jT+ zD9Wv(f?xLlOUb_p#U>ZdE`De$bq^Y#!2~4#WHWmMDb50q$YKTtZeb8+WSBKaf`Nfi z!PCVtq~g}wu!CNQ9RzCggFB`yyW#yZUF4T;o#X$b@t>AytoXugQ~5O|lY5y*&?Z^_ zOFMSo49&1n*-(6HcIE6nGv~5DJnYTd!ND+r;Rd$_!-D=SqdV#1OYPKDc4>yNbY7~Q z_|DF~Q;0QT*3-zSu&9Ym>)14>hArMQr`Mk0!`EEltS{DC7bKW7@A&<#X?i|6+v&mX z<+g^qnG}*Zx6k^ZDzhmz&$aC;YvcS+2aa>yox*+AXLFU=&65>hHNF_zd=_imdtc6p z!zw*`QoZEP#nC;fpXAKmI^DMYqrd6=bc5-;S6crvLV}<2&^>LliG7K>pl(rSzno3KoOa=R6OQ;>i`)H-Zq+|- rem;NCMy?*i15f`I>27?rBbrhEz?;bOtEaj?aro^_LoO#n0oLiZ?RyuPUpS?GqslgVeZo@nfDPL>Z59ly6Z$XQd?Wp%_+|rv zAin+&({_B_Y(4LETD{imw~SIs%Zs#+$MK)Oc_XY_)5OIud&1wMy*F!&Hls+*7R9w&bR`KG0FOwjF-VBE?4X&3fUtYA4 zZOCxh+_YJ5b5rp9hAQ(dF0b>sFK%4)^arb~S3yWRWAq}R%Naaf{an^LB{Ts5d(dK@ literal 0 HcmV?d00001 diff --git a/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/but_repeat.gif b/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/but_repeat.gif new file mode 100644 index 0000000000000000000000000000000000000000..dd6595e5d9ef43bd03c486ff87079f398267e085 GIT binary patch literal 1149 zcmZ?wbhEHblw#0e_|Cu(?klqTfBEyoYklCmVoqenVS|Pe!)>e59cFWsU9>AW zZP8U{yyh;8RlNr303RUE2#_d#_^)>0%x$Xs10t-?UO*$CP9jc$w;rijn>#HZ* ziuOA9HrlOUoN#1EY26vWko7W`kGGuIQyH^LXXo0ihgT<^dANV+jn?#K4u`fCUwwP* z-M5!ZXNH}5yl>s2_-m)ym(2>l`}us|%dq{M3y$q7@2KifR>Y}Mw6)3c8m-~M#w=7-a1 z2lYB02kd$=@8hpG|NsAI7zM*O1QdU=FfuSCFzA512+9-e9RC>(a>#gWSa7hJLs%<@ z!>y62jYpg%f??u==`spD872Y>4UJt1VGkBu+W4e}lTpRt$^pd#JWK}3LKB3T9*Ht> z{5N>MH5zv}sFyVmL)JDz@z9|n~A2ze=aoMTfc#?RCTa!a?fk(jUuvRNSo+m#7 zABgF&Eo)ezv2bzAcA+K}&I`<}M+6xCroGv*gqxjLp!QVD$^#6OloTdwc^t4{g{)f>K6CCawk>Cl{7Cw?#BK3K$BV zSs5kRIOOdXxUhBTvni|)Xl*QJN-QjLPzCavSUfPI0sfDy@jpkeH{?dy!N3 zhQbX7(}VJFMYr8B{IE5rQKCY`;NikW%s2R0UNrDKaC~s&6i8KY$lHF<>b{ktD z&gisyeO}}wWwu=IPQcysynfG5*AoY441ID30dRqYbB2hDj*oeU0SAKw43?OemjIca zmy8XQ2$l?`rlkO-{A0vp~mdytYTbG?msW^U zr#j6lvq09dT+^yuJJf1X0dM0fC;-4L+`9_kQoUzXuU`e6%*y?X_HW+7hz~0^%s6r5 zqF(Vz#(P-uVW*ZU-_3lP;(^MbIg1WWdbDW)xdf)NP2)85Uy zx9{J;VH*OpAUN;?ZyFFc{+kM-;>@E-IQ3E2UV#jV2dz}|K7IbH;;QNrz*VAWT z&%M2R_w3)xkI!-mk0eEOoX77&KNJ1{1{YYw5-_xof)G1|V4wyF7P#Pp5RRZj1OPka Cm_4ij literal 0 HcmV?d00001 diff --git a/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/calendar.gif b/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/calendar.gif new file mode 100644 index 0000000000000000000000000000000000000000..67257083540f7ea06881718da65d749f7284e165 GIT binary patch literal 622 zcmZ?wbhEHb6k-r!c*ek>prLT)%o*dfGgj$`HW)Az6cjY9_^@!{!iEJG{{Q%I;E^z4 z!G;SD{sW1G2@e`(9Qfam@FBrq!iozH0SOHY9(?%lzo28ogbn{4Djqzr5a{jgov`A= zh65M&@85s>_U->O8UiXVBt#?>EcoD1aG_wvg9k7EH#9UXSaD#%jt2)U1ZK{h8PM>c zVZn$0|NmdSa?Qab;lPOt4J-aPEI9Dt$A5={2S5dnpFCc$;lTAP*C%YaV3lz(dCI*9 z4g$qf)-Kp_;lhmv7j9e#Xtg?cw=gYN-LX^L zkc~}ezmnDRmHU*|uGiL?1^(|-fE8lblbd4od4L*O>-Nnixo_MTBMAhPt^YXsC%yN=J0u$6;9q86(1O;^YnlA`!OMrv9(1`BVyeag@*_CuyPgcJ8^Pz`Z*T|W<~~U06^u> AiU0rr literal 0 HcmV?d00001 diff --git a/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/clock_big.gif b/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/clock_big.gif new file mode 100644 index 0000000000000000000000000000000000000000..61f7dc2e5ac32fc064ffb4e231f344df03d07baf GIT binary patch literal 1321 zcmeH``!m}I0KmVIhu6+xXQh>06V%F?qh)EkZW3)hs&#ZarWvxNoo;QVXEiO_5K$#2 z#3Qb$#AB(~2ueM&NkRnmh*v}-2#b)=1sRIUu7ARQ-{<$wFQ2=Qf1ux~)A*ynQDB=1 z7>!1;SX|9t2@eksi-{YQYbGWpD%+Ooy0mdgS<1zCJfSY5{B?FQxA1qBY<91EWb?-a zY8rbwzjh9PJ6SZWBoGLOt+$f#1qQo*dVaraXydP?75Us=W`#mAuhFjQXBQ7zgwj7H zW17`X{rYA`ei^f}d1T@>wM?E_P*GGfRK%{yd9KW5)d%C^N}J`67;V{XQ8rguRaM1p z=*(bL)_3$%*i-#7jbe7Os&koL+aZu@cm^7wXN@X-Xe8PN?$>z29$mX=EIjrQ&;<*L&i(WN_EhjyG@vvlM zVrG|C$maLSMy7XEnzc#gZu(Qn+TR;gmL!W=PhrdQN*g*QvP4=#R@q>yX!J>8Wo_F) zgFwd@_T@dRlT5CZ)^lYoT|sVFFT;WtZ~AVk=f!jOFMXfDCf7J;?tQP z5%C`}U?5*ByZ}z^p*jFrIHdJ;4H9K?#)Xs)cZ{N1@4aZ2nl#MPhsy56Hr+^JoodF;gB)*blVN`(U9opG zg#^RL$q+kY!O!_tBK$bY7vcjlyJm!XVe*uEfFDFU_%yX* zBpYUP0@)s#hIx?ggB9V?0Qis;U5pAiJBn~N^+G`r2k&g>aq$78=Sj?4a6hoO*D{Cv z^`sPI*MctxtcXOw_a`=p`S@ET5d*XO*gT#5!C_1p3doCqUVxp5`J8S`X!C$rpo6I* zxI0Y+y%=3Z&#dh{Q3Xy-~T6X|NCUj z-+AKAj$^O4oc%v(-P4P=e*FLcf6~g^o6r1jUwo^5;nm*dx0CC)-F@*tt7XTEoe$67 z_;%s`|Hp6s*U!GR{=kbx`@T+Hb}p-J@5KlIx1IZ+(X#u*#rLa^|4XUcG-vJAQ(#*m&j9|EU{aOxyJG*p2@MJ%=AY`_F&_DE?$& zWMD97&;iMV{KUYv@WAW>4;`s~kH?3FUzRA%b1$-r3GorDP~irs!TK&W1KgS zYyNz(**XTyD^~EWWH!*5t)a)Vc?;hbJ&oC#61;5t_V44B(41|qt0=^I>a>ue?olUw ebzx;08D(L0{R_^j3Wi)SnAsUe&p%Yv$JM$_W8+`K+vL zQy1@KV`DF|zZPaRp-Va7Es`fWH{!n_taqfi)L%}l+!NRT_gf~c5vTfPAO=yP@zY`zB-u?Ry@*U>$I(GcT$y28*)fmoQIDhHFx$tYDF7dZ+ zoj;d(|GrD{K0OuZ-`~Uy| literal 0 HcmV?d00001 diff --git a/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/controlls5.png b/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/controlls5.png new file mode 100644 index 0000000000000000000000000000000000000000..24957208fdcb6ec0fdc02a6468100c686eb9ecf2 GIT binary patch literal 2835 zcmV+u3+(iXP)eI3b~U|9Lw@OaL0=-?F-$J$v?G>(;HhdOLUSWc=Euekkkj zGgZlDI8+qDuC{u3+`a+m3yDN;_(BX$^LuRIm$j6!GEEs)2Cme-LmKTkZ2s~N3k?kw zASsnfkq8{(bdQJt85|rGpb)1-_sYx5@#!1EHg`TPEsZTnOaS}q-w?ETj#;4c^Yd9| zW+oOaSU`ERJTWnm@@D&|x{}SDa=(UhsxzeN(*X~U;RhNG*u#eyZ0kaI+zRx*94|c% zfIcbyMC6af9g_@N5(&Jzy4og7qPi0Ws9Dp3te_wye0m)I@o$-|)7I8z)jKRH?~tF# z9Mk^=#q-ZY^ZoZ|K6w(Yw{MGQZv39-3opQZ)(kkFIReIpSl@!gNdu}>Q_6M}?!eNe zOL6w>S>w|k34Z@O5jMT#%{{p`)oaUrj&0a*7bu*K6Ir`)@7_K5r>C18Jhu!fH8quy zm5f-HNj`ciH0VJ+sA2Z$$Dj-dK>f9A(6sizC3zG4Ut1;WHGTMN=ER8Y~`kY;3Hsa0dqmoyAikWut!e z_V$WoN#CTaxsdD?Xs@kBd)E*=x9x+{*I)F-Ir}T-t>^|45>U8h3+60e4izs;b&#~y zWV>Hfe8IxJ!w}{bW^i0Lnr^U&_ELyi z@R;xb!Q)>J#gc{dME=LGMBpcJQKHV+hOGstun>s*puuXbB%t#0@(>Xbfph21AtWRO zIXO894-W@rPpyfZG#*XjY}oRg*l$UAAZC_`nbjyXC~dIX!#Z$?Q& z2^;&2?$I*>sI|3~8)zR+pFWLUKip*+q<${^o8M`mQUb-5^(d&QLw?zPaecn1Qt*t+ zr8tvUBJ%&vEfjUE0co-TB5N_kZK3``_JD?4UdXIzx@UA9 zJ%5hiu~GAM_Yz{FtO9AW0MgSm#l-jI{al!QzJbcw8O8u||IHsnKSdc{mg*?YwaevF zQ&WTFtk#lzyodJ& zln?Mz3m!5%;88h#9UT#_cWus+yubdKd9R;*fJR%AF^jSUL`7r_+OyN(>Ei|tDT^$thKR4U%zSs6)!>J93i;F{9S(yMw?1^}uC^t732a*mTQXMH-bap2; zseC*S8a0B~)YYT6{(xqZ^XgB+D}SwQ=NNd?H% znxwt9WID9}(d%gG89)zhTDcoe0L}f~BY+$V&ok%ad*M`9CCX4)s$-6#XGBW`LPkc0 zP~_{^uZu)^x<}8bjK#-7S{K}d@3M(cn>M^AQ9dBxktNYJc~8Wn_`ZR-x#{j8{d{nc zYf{vtThOGOkNF2ns^oWB?Y`|$a{)$?S9q%cP9ML?Ml_hF3v_UR>i9-i_3jQ)$C9=Q zgwI!e&eon-D=bQDK}UXZ#4JGLK#G{9#ILp=f~&I%Q(c_k<~p2Qom6mC*$*FN_VSK) z_oB6ve(fQrQix>4avZFV%Jv}`l z9}^Q}(Yc*&jjgI+otY=motJ^WiW|d6Mj>Hvid_Pi#Gk=FFyw!Fx-Q9IW}kkNKl;fa z$s~g$gCvs-l1!HG;hvR&$bl$wAc`D_LL>*G$bl$wAPSKjh+;d*fhckyiX4byj%*1; zIhAxuG6|9#i1K6uQPNkWn~rgi15uuAAj*X`7tF^v$bl$NE)XUE?R?3i&Fqs1MBxHv zBxG$Os~Fh=NY+}?(-??C!jJrCBr_F=Qnay1vgquNBhDroh(c``d(qfHlsT)5$kbUa z_onLjfGN@3+|tq_zNqr{m`Tka_1uy`6jBCL?K!Ray<{j5Mft{WX;Ei}0#T@rB}zmf z7z;!(2auj6k#{lCK$Pa@X83ST9827_WTOL7YSsV1J>EfgiXm`y#gr*ibX<}oOQsOk z(a~YmT14(Gw*aP8DviFthh#8v$|LE4L|Qk|KoqT?KbALit;cB!ljA3T9$ zYLF%z1x6FMcWVKx_tLPUEJnhmttX~;6EE#f2xYJc(B&-4OOG85Ke=FFKwvB>JD z^1TvqE>y|bluY1LAKKg7g`yB(Bu_UtHz5ZCWb|37c1<2F7ad46aP2u9B?3UV8y^8@ z^tIkba0EDdp*0KsM2M7%)-wX0-aod_x)W_aa8d}eA}$o8!XyujKq46sCxGdmaK}g7 zavGynfRsqvN&78PGOdH8wR}U$V)Qgbjuv|QN&Ye`gCx^q1&O|rdS@SEvWT8M8C;Xh zeI>nGrD4q-edFqRx;h{_(8K1kGFfmeqyuP4BHxE-jD960p~pr3U|eIlMYqQ9XL#9H zBgU6KSA0vBzAe+;@K@4A1UAn`R#ukDucSQ#3e0d<>TzSlBnA9DlzLny8!XA%ucW;L zK-mL^+1`@iy(SL9X%|u3%HZoJ2`-ZjmP9Ai)_y`DQ0DqbD8A1GHwBU%e+vOr-#!eK zooqGrPwWzF2 lR=D6Y$tMmnSxNsDU;ytXnYZ<(0)+qo002ovPDHLkV1l_%QG@^h literal 0 HcmV?d00001 diff --git a/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/databg.png b/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/databg.png new file mode 100644 index 0000000000000000000000000000000000000000..f0ffbdabc108e650383ef3df89eacc043db5d9b8 GIT binary patch literal 89 zcmeAS@N?(olHy`uVBq!ia0vp^j6kf#$P6SsHY~OWQfvV}A+B%Uefj_Yf7JdxSwIm! mPZ!4!j+x0B2?}CDybM!6aWy6%oWKf{VeoYIb6Mw<&;$Uo3K%*7 literal 0 HcmV?d00001 diff --git a/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/databg_now.png b/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/databg_now.png new file mode 100644 index 0000000000000000000000000000000000000000..9f371b4df716915175019c9422df7c12c27f64ba GIT binary patch literal 89 zcmeAS@N?(olHy`uVBq!ia0vp^j6kf#$P6SsHY~OWQfvV}A+C3xefj_Yf8N#)Y(Nn{ mPZ!4!j+x0B2?}CDybM!6aWy6%oWKf{VeoYIb6Mw<&;$UeBp3Vu literal 0 HcmV?d00001 diff --git a/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/event-bg.png b/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/event-bg.png new file mode 100644 index 0000000000000000000000000000000000000000..a3bae3e018613bfa0c160ea6a36723d641e3a415 GIT binary patch literal 148 zcmeAS@N?(olHy`uVBq!ia0vp^j371(GmxD1Q}Q5?(hcwlasB`Q|B`)I{(pP)|LfiV zpKt#Ebmjkt3;*Ar{{Qy)|2K#JzuNo%<<9@lxBP#$;s2A>$=A-j2WnLEba4#fn3)`q yV31Idz>(mQpplS~Fyp|6hD7GWjBVUJ{0z3Y*cxAN?N9-#X7F_Nb6Mw<&;$TzL__TW literal 0 HcmV?d00001 diff --git a/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/icon.png b/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..31d6626cdd40848c6d900eeb8e8d4057f6dfd553 GIT binary patch literal 230 zcmVsi?L4DSwy6=Gyw9+ zFovGaHzsTy&(`(mA|C-TpGSSX^ClSheK+Y%@EY4KGI}?S^dBdHlI7}ny*~iZxu7XL g^hQK^3Fvj(FC=_u*5-+h;{X5v07*qoM6N<$f}pKl{{R30 literal 0 HcmV?d00001 diff --git a/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/left-separator.png b/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/left-separator.png new file mode 100644 index 0000000000000000000000000000000000000000..22d630927f32a8d4c66b4cbb851f20002aad0e9c GIT binary patch literal 230 zcmeAS@N?(olHy`uVBq!ia0vp^#z4%(!2~3$o)(t^DajJoh?3y^w370~qErUQl>DSr z1<%~X^wgl##FWaylc_d9MID|ljv*DdZ2WHv9#-I)EPr>QcFBix7yH*t@Vh9Pq$SxT zu<3%V-R-{5>$oF!%xaa|x+_&9hR3^f$)(@tYA>xRzwqPwv(VfP!nqvDPIKS5)_mcq ep0}TYnc VW}y=sH5X_cgQu&X%Q~loCII&SCFTGC literal 0 HcmV?d00001 diff --git a/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/lightbox.png b/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/lightbox.png new file mode 100644 index 0000000000000000000000000000000000000000..f0314fa609946421251eeafe1bd88b61216e671d GIT binary patch literal 207 zcmeAS@N?(olHy`uVBq!ia0vp^j6f{S!3-q3+C<%eR8)XZi0hJlSN;RRw?{v|y!`n2 z!>f?N^}pM%{@r@@@5al2*I)d*`uyLO=l?E0`*-o_ zzY9v zum3Ng%&d+z7H&;jaY@O1TaS?83{1OTQT Bb#(v$ literal 0 HcmV?d00001 diff --git a/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/loading.gif b/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/loading.gif new file mode 100644 index 0000000000000000000000000000000000000000..f5e71df6aa432e63b71dc708a929027822689ba0 GIT binary patch literal 3951 zcmc(iXH*l|w#Oqe7GM&`C^Co&I;dm2%rFjeMX#u+IM_x-utcd!QIMgFv=BOkE;T^t z1VTwjC8Sq+Cxiq-3rH_g6&}u7_rt7r%Y1q3?N4W&bOz5mxuuAMWm3;;j? za{$1`W{CCHKeepSG1muPZmt1;g!YEYZQ}>`uNd7m{^^V^aLeYV_PWLuS6fRrTN^D; zd$(6wmJXI)PR^D#XYAkDIRms;w(eBkJay{p^{d4ahOC7h>j}W4MdA!TRX4TF37~VV5toY{8&jyL>s7Khd zXWlB|uVA z!Ra58vf^`+(^7I{3o`)esQhd!x*{*LpsI*aQid<5R?={o(i$e4!l~smcy-luVk5ah z$SUq2bvAdmwQyVOSt8khbV$%QGB`Ti-=mO^H%TVPraz+Dbd6=xX&U^RpXar9X~l3JCkRd2i=$ z=N)M8>FWN*B`Q4nTSP#7P)L|Z1Uys&l#vPA1I$4KvvYIu3yN|}(4~ctf^u+WUPUFg z8dr(RB-Ij%85mX>rwV|lQL~+v~d(}VP_k@B}+ac>*^mJ=onY@ z_EB3V#2;tICYKf@i(lqy)+l4|6y>nmpwD2LQkb?x4+16|^)6Ou8;7fb%xpkfTekdL zDy0{WIb^mgt1j>k?h8sYk55iTKjN5T6Qk!X%9lQQ`K+%%W#w#@IjgPa^*4_Ef-p_L zuPohL)`Wo+yBWW|@3J>6-+_H$!KHNMaa8pZ&I`w%?8ngU-MwAmfu24Zettn= z!O|!n9XcHgj3Mf-rCtwCvO;R8g6Nmc1d_evM~jHcDlcBU~y=9 zWEC^fBc5*uX$tPZjC_{*_bw;`It{eg*$E;kmnkj+|U5wL& zZffd(tLBf)*;I|t?XW^+p%%qJ)wGCozc zN>d}VXb`847<5?-$2BhTWGk-ocj@6p4g)jH+GJG|EK;J5RixGhE5I(ChDWB|`ZvUNdi z()1;HfSK=AS3`Fnn=rcwPdF^tImj>8KR)DLly_)o;M3$RRE~p5N_u`uW-c0$U4lIT zs;mM*aaGj>JcLXE1L+JPl*wRoSP;ITme1ofGMgDSBti$SizsZ6G)Y_fxN>^y&|n=v z)J`RfE2n56dKlo}Nc1IIPDZq;?krvJXN`|wl2^mC@iM5!@{cNcaca!Gfj zjf6aDP4_-{=;odsaYHwd%KOa>i>h=)2}k>$1(?L5fBt6Qth~Nx{_^eU^N~9LjbDi` zVyS1lhn0DJRx0|1j%CNt z;E_NYbsYTuO2cnQ9!7Umk*7}96gr{CtseW0uMuc({eE|JJ?QnyIyAyE=zSnEATBss zDbhCCGb%PA-9ID#aEkpqkK8byMBgjUG1+j`VNewg1jXYB#A*nI3Z_AUEH;qIVe$Av z&Ss$!K=>?14TVhX!iz~Qtxa61NM1kKINS_w1-8>WJG!TPW_!nEivCXnD?@7|Uq%7# zl|bE!Y^ul1x?JVe9XT;{srEb58#6DABY+)7Zt9h%k6cGUhqd>3$Jy{gR6pep5nG@C z8lZ9HH_b6eR7k3h<6>L3s{(;K?OoNI`rip+)U=inEcLVjES!~*Cr1NuGVnQ+EaC#C?f=#wC&Ns?Zwmg z7E(`1_bM(ry9EXMyDNF!_xAO%wu=b~Hj1}!Nel>!MB0Yir#ZysIHBK|WEDmfqxAEV z%i!f&ARHb9t;Q2c1PHYTTuUKAfm|Mt!{-V`_54O&GnYxDvZ}kt9c)QAL{!(;-zper z7-<^iwKF=UJ(In&viTW6|1fxY=<`SUYJc~ZT{oJa(JaKfR_i>Sds%*fCSyahyRu90 zeW%Uxy6);(@!g=g7c{?f)!;=h-aTQsJf16vS6zy8TR|TEDe}|L{q>}|%-b>AXT4N? zEQ@~4Y1;i4I4*wBis-o!VwZ{@+-6l?$Hdi}CSC1AiWe_3zdycpHH4V~if5lq{V`u} z)ooYY^+AyaCoQj8!>bUN#2?Yor^=MDJ z-}zZ|Ao8L|#LJNI)X0Q4?=xJpVy-5oeMoljvP?&n#zqDFS;?ECW#InIkxnJEh;7U+ zwz#vl{SS`Ka&W(3K-4Pjp6HqC1&q(hW-5n9M+V25KJ%96l{#~~V*1a+XGb#G{O0Ed z0L50dM6XyYR-np(5jg42ndf@ZYSXWw_T~F7#~-_OVnQ&R%lG@+hW*u|9IcwP?ar_Y zllh=u{Wbh}s;j5|Q-9qj{O82A^ZVkY5rpzFN}&4Z2tB=rznKoI1tU*(9y#u|EAXUj zQjzdO`uT#!ZTTAT8(q7ow{AKbxHxP0#q$U9C%QXekHql?&rbU*me)Rf@c=IS8+qUM z2@bgzY8L47TIcN#?_CjLi4pK5567o*v5|gPKO`rh!&6gU1r(>FbU@g05VWGa3Rejs z5W(bX9Ib+mhX6TTAe6@y2>I;#O{Pq28wJozZEdNQFdBt*{e3(+ue+;9-1|{B!J2B9 zPLGZQ>KnjI!=gd1VqbDZ&T{!>_)K*hH{^LPI$DQ*(T8A|qlj%ih zK|-R=xmwYp4sz`uq{ctJ;Hd%I9c8d<1eE%d1=fjl2T1z&6WiCm`%iX(2`|!m!eJ#9 zapmfI*0x3--$?Wc3S_59+YN*;%sdsoX7J(Cp*?1&c9xwkNbJn;AwMx8=|evVJFHbO zt*E4aPyH$E^47|qhZ#^OT0;D>@p%s=4 z-#NzKBj;XN{v&cj^F+HKcK@@haHvkJ^@rO)q32O)QjJSh{!M`PxP3~>Uy3(^~ z@sfN89m^p#s@hQU{A)#xupr@3M2OzEp4SeX5?k-dyis)J_zq>{uf=5l86CM?25s~;9 z{_-E7>>Lmjos*ZJ3n?lFV+!-j(Uk=yMYwDzkU|BLYbe<23RV>dUq;}OM5O?xfZfam z(-*uuPgg)*6^6g_UGatCWjc-K2{h$!!``~ayT$mNq4V0D+f@Y+nvN9p)TyTC) zR&fR`2uVUjV%o;(hh*3=<@BuAtta?r-ucNi6T_}+? zHTMq6q;-9Yk%o_5qYZNM(AeDg!sLW_co9FdjN9M>te~S)vf7<9z4kLaCpkG}pZbZY pWf!ZHp$(dbz}SD8G>Wgb=uaa1zqEv)*f`MtlO;U=)dv3&{{wX{9B%*s literal 0 HcmV?d00001 diff --git a/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/move.png b/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/move.png new file mode 100644 index 0000000000000000000000000000000000000000..15681b311e095bcf71a016c10b98215d2f62fdeb GIT binary patch literal 145 zcmeAS@N?(olHy`uVBq!ia0vp^j371(GmxD1Q}Q5?(hBeias3Yj{~rDSclZCloB#h^ z`TzIA|G%gI|2_Wy@1g&H_x}I8^Z%bM|Nm_G|7SJho#WC#T}qxVjv*W~lLZn25)2Xw s5;zh(5;PJr5@sCO(2&S{n6ZtU!Ptv+qi^c>nLyPHp00i_>zopr08)lQEdT%j literal 0 HcmV?d00001 diff --git a/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/multi-days-bg.png b/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/multi-days-bg.png new file mode 100644 index 0000000000000000000000000000000000000000..f43a46357b2b8a44c62bb6955413ca6c422397b1 GIT binary patch literal 350 zcmeAS@N?(olHy`uVBq!ia0vp^j6n2-gBi#={doIQAhj#NC&cyt|NoEQ|GW3*->p~w zu0H>F@#()akD%!6<9|SO4vfw}`3FH4p8UJ;6r>D-E%CiATwRVHQB_&GBsJyf6H$?=Q$jla?0-X33{vuFPP+`eJUrfnOyZZ0n`!f@W=oF literal 0 HcmV?d00001 diff --git a/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/second-top-days-bg.png b/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/second-top-days-bg.png new file mode 100644 index 0000000000000000000000000000000000000000..8f9a4f6da021cb45908bfe9e8d904e042b2f047a GIT binary patch literal 138 zcmeAS@N?(olHy`uVBq!ia0vp^j6kf#!3HFY>I`du6lZ})WHAE+-w_aIoT|+y4HUHT zba4#fxSkxb>HVqtw*L+XN*+8aW?NSO|37nQJx{^4`Zq~BXM7Zz1ZN)Ya^*R*tKh#R ivt*e81LI3EMh3oTj_Eal|F_ZNmx0r(h1H*=|U3OfpzvHi}DR`OfUbAABv-upo?U|K(>>jf7 X&0u(ba8}zzpe_baS3j3^P6`1px&CF4n_O8yr)Fq>iQ?Oe~R- ZJN}%psYOZYWQNhg04>pOR|ysdYXG(YZ0G<0 literal 0 HcmV?d00001 diff --git a/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/white_tab.png b/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/white_tab.png new file mode 100644 index 0000000000000000000000000000000000000000..7ee9285229449c6b3361135be958566c494f600b GIT binary patch literal 290 zcmeAS@N?(olHy`uVBq!ia0vp^HbAVx!2~3uq|aRjQfwtbe!)N*2=bP(PXtoeJzX3_ zB3j>G-OY8#K%(uTzJx$wVG#S=qhjd?Up>&>QB}RGinHtkLtax@;ku5}S3yfIH9KFl zY%=}#!9Mud^!^DP4Bp4T{&^th_9K7kqBWtXYBy_6>*GFPB(-bulr??_@=7O=S3O<*T-G@yGywp3=X(MG literal 0 HcmV?d00001 diff --git a/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/white_tab_wide.png b/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/white_tab_wide.png new file mode 100644 index 0000000000000000000000000000000000000000..6e5ffb852f02941eeb6e6b7bf27e6509c93ad44f GIT binary patch literal 300 zcmeAS@N?(olHy`uVBq!ia0vp^Q9!K1!3HEb8+12=r~;43Vg?4jBOuH;Rhv&5D0t7) z#W5t~-rMWD`3@$?w0*2!+}Uxor7<$&j8OYQ-H5w#tGzEARNUyPVJLhsMNrZ9#q!Mc z2d+!ZyMO8Mk0)oRUz>2@jwRdm-_G;&!#`N>T%)K=Dy9 z8UiCN1S$f&%o!LM8A^iug8wrB^T7xPYptJY1LL2wz$3Dlfr0M`2s2LA=92~rvX^-J zy0YJ9;TPmqcHKEq1uWzmQQ}xyl96A;uyWlQ51tBm$KdF>F7ur5`BF0TK>REXvEwOJ_JB{j41*#tzY6T9lm1@b!Q5 zYnU?U{M_8syb^|QXQu53im`!|g=CiGq%y2{cS#*6qVMVA7$Pw>IpGMG1P7@BN BaBTnp literal 0 HcmV?d00001 diff --git a/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/imgs_mobile/arrow_left.png b/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/imgs_mobile/arrow_left.png new file mode 100644 index 0000000000000000000000000000000000000000..651215a15ae456fa3036d74224e7eddb127d51de GIT binary patch literal 1955 zcmaJ?Yfuws6paBQW5HUB2vX`2Dqw}Ykc6Z}3~T}nCcH8V29%I2BuaKeb|DeP2M)m( zTD1jfttbMmyiAe$2m+=ff{Kbr!BTA%N)>D|AjYB-+l>|NkJ6pl{a)vsd+&G8%2JgaK(#h7#tIA2+p<0i~Qv zUKJ#y3Dx0{LK&H>ff8~>Vp;Bb8Cy;cT?T~cIJkfc!lZysl?kI99hdw{mxIr3+f*{} z3WBZYlK)96Q5Xw^BN_+@qR;|lG$svT(kb-7r7RZ9A7IevG%Afjr85HPEKVSUL!$w& zA2J?IBTwhVgM!zw@D-P=z%Vt3O4Vw$6m1{{(PU8RY&P4b!C(a7hyZj0j7fC?FzP*} z079rtqf}!`1O{x1(ljI+KbefvAD-gdkv* z5|$%c^c7ktZBHcxHg-my*Jm=<5Wu{{LiUf1BJzB%_u9D!i(9tHBmy8hadwJUC|a%qp* zV$F_S+?C(xvZK*2i}(hM?Hr`rL)Afr(^W~_6mLpHjJ-CC8vV$t(7k5jn zR_lw&L6@spu7OvNO~h%|0!?l#Ju_QAJ^5^e$;eVBsjjmc4f_< zTsNn9^8TZ3ZT#`vW|vt7Ys`HmM~#bs?KxxZDf-5qo*u_oMyX4_)!lQu2>|0U9fQcn8$`+p`n@OX=LcRhC#m>~&0 zmhy?pm}^K8i^cCb+H=H|ku_gl^Kp@Ea->@5=hI<6*vOQE!bo zI;%77+lPAd@I|NWHO<0;Vo%ICN$@K4UY)$7bKce&#S4lAU!|Yga4W&*z+$82iR}5< zkLbv{{+QFmK)(Cl-) zwy}Lq;lS;dy90s78HyzrI>XD=#(00%pA7osPwKFtOkdBtk6bTY1FO5ZbjdspsiZ!#L6hj4pPCt8_eCF( z8Tqr)M(pS%g4P>$j=#^Zb0`i8J7mf<(S~Smay2tt&+y``2lKm9^6Q>I2SS0Uy%Zk7qpmoM1=zVJxRP Tx#+8xw%=wHUj){NrRM()d4nQp literal 0 HcmV?d00001 diff --git a/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/imgs_mobile/arrow_right.png b/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/imgs_mobile/arrow_right.png new file mode 100644 index 0000000000000000000000000000000000000000..901b5b7fb79f2623717d8673f12eb26e2ca35e55 GIT binary patch literal 1975 zcmaJ?YfuyC8V=>A2-Q}Of(2cpsYr9(++a;WAkqYr2qZ|FgG$IQ5J|EjSs>g7VPqIA zMFjK+Eyt=EDbOlsEK)!UUXZ4c0#+;tXg!wE3XT*wV7=hkSh4+aIJ>j^UFLb7_kF+j znfZz%r5}2@t#cy~2p%G#AQ~Ti@XvRd3;u73a%bR!H?~88$8i0SQQwM$accZtEZd z8kkRvWlQK1Ll}~*5oQ??S(a3;&Pq`S!o=VpfM0S<%8V6wPeE*Svn3_6Vt(ik9x!G)M0M5hC< zA0i&j2q!|(g7DX|@D-n!j9~_dM$5>^pk^?ss4O#diBXLuv4H@!Y4{J>~tm4U{f((NTJ0wt3F57p`3 zpiNjb@@KyPQ`jWWG$6ES#Du09)p+9)H`zlOpfDq%!ce0eMYW5k7@3S>s3{pW0AVsV z5UbI{Xol$(S|Wi&dK0G7s}YfaPsI6DjRuA|V4#2%4zk(d0Rarg4tgj9WQ5=^$YF%i z!`b1BTmh<1(;<3nkqiIHSlGZ)}g~ajzS3Q$M{~9!VfLQAC0ex%rkQcBfdT@eFDo zRr*sXK&6}V&?%>fr@y=6deHCE6Jg2W2!pzWajo!L;RmbNR)~pzPhwl)(c|KTGm>lK zL`Ja{7Jk+X69)u}-uV8hmw%prCMud# z@w;!?_9u>Y%swYgxZbS&vg1k4x3S9YE*_y}v%}g8V=*x?@~Ef~XJ==)d8F&`p;M7i z&6&Eot<}emf36_UZ3zCh`)Yp9^5*kFiREEUO-%)U71m{Y;^I90OFUdomTz9}QFMg` zf}!{B-OHQlYZvqCiyA9J{>kESZcRLVn5`}VR|EO~O=&^tA8R}f))#>K+R?U0wv<8xQDV53+1VJvJ*Luyw487&3 z=!B!^lMa679?WI2hJH&3+B-hIM$zdsrwrYP%Iaa75@Z>mpHy4F0s_Og;(`001D zNBukYgH?X(K2f^5xGYqD^Tj#l$+J_I0B`?CyIWJA)A?C*1!r>}Zy_y&{DTtENlL9v zZdQ<6rPYyZ51#VxYkov(K$vNF@`Nwl5AVNK;238FtFUTYVyYWO1P(_GkCV3)*&?_b zUWBi$e(%8#b?N?P?h|(0)T*XaACNy<8C!4llRbWi_Tt(5!u#u=3(zYAX}U`eRPRai zfeRLrU-2iF%x+G(*QWE8RVk#A^@ucfpmeGV6~=xawad3=?xsv!d`NnJw>;)=KH$DH zP;f9xrc!Ut8GM0;VZl$OzMEr<3(wps;%aAm^RGrB(!u`8$;ov1$T7=}+4_$8)(h7M zPg5$Ty|T^kS~WdBejk^~mCC0juC+fv;uT%|J-mx2^y`C#sie@~%yB=i@rnC5PsC=k zgMW5nGMUv)mTBx<<3|rhZdcscJ7J0R``rb;kmHe!-xqp=D!Z+JYQw{RvV~ o=Y}NKLi3ZOY1>y!oF+IDTK_c`b0jYRw*4vDX4gA6@@CTake(qgK=SYet7SF@B8MPv5xjV zwW~L-rYNd55tmbB_PC>_n*4k62R@Ri0Y@{q3*~S@u^|=KP!@uOq4dENRJ5TZ&tWS? zRRKMn!I|VjxEI^yAa)vu_dx> zp-^B7%?z^pSY8kWSHtJ?5`@7Ugk>CQg5+U|7qt zrn6KgQZTltSS-(QZc1ffGWma~VJxE^oPvM+{!`dV4_S~+K?mh+m0VnIvm441B^xRj z*=d9hm#f&(k1%rjkp-kKKj_s>4HcY4bTTO>Ob08b3KMdOCVWQMH8JRyq-Z22`D4K# z&quk46pjf&UW)hvd^8dcl({le^9D3=nXCQb$`!e8BN!HmEJIsA3bmMx46vB6s8{w9 zuBf-f)hc_5ROGV64C`L&U)NkdBE91-mz$PsmfIehq}OfI)GxlzKOzs}aY7EKi*K@X zrBYkf{h%N`xH>i(pO~C{&D=(*r;(e}Ok&fGl(OEaZp^Mbt2bQwvVDM?pZj)Y^z=kF zoL@+_3*BdCrb;8vGP6w|I$t%xi#^%7H7yO*8LKJR`*H`o(6PJoTz6HRKYwTcr-QuU zc~-x1Wc*kuackW|-6iGFlk4@-s`zJi)%)vjBddZIJeA|v* zq&i8L@KOh(f}l%S5lGRG6?E`Y5FwG8mr4*tjF6&o`(|~uL)*YN-w)68ywCf7?>E{R zKT%tAw1yyv+Gs>f;Ca6@_EzKnseJDuo{peU3U$E@Do7?E+7*}vWK@%~AOR$0XmA>| z5=0fLCQ~RCJ1NLeb4w1!ZEFT*6GUs9ZAfxIKx7(ZRXsqhKAxgTRS8hto){A|f*_|x zhE32l98b!_{W7mmZO6%0TfhPuKoV(d1G**H0ji`c;I(s1Q)CH(`UBLasZ^|!3_=r- z9yjBX881V6SvT9<;`8~MNRD9{n&D`cbFn_5nG+a>-1;aS%~Uc%LJV)k!n**KL&y+l zx=<*%3(an5W@(n^c}IieTo~c9hIAy^F5PMxL50$4C_%J||k4NfRS2%11b z&`d%&P_ANU4kBpfpg{(^JY=`3E3jad(6N{h)h#6HGKh)+3iI8nstA0jBkT<|cX+~n zKg)&~p7V#q4v`H9InL{C;mTYQ%6SdwsLWM%xWS5Crx7#*M;3vpo&!qQgc?~&SWqi_ z;VbHGah1wm+ADHtY=(BO^{;C#AK~6{mfKB>H`{FwblmGEZfctS`Wioo@u=9Iv_GW3 z7mICG_x(Ko=-TM{$mOxIw|X|)-F|2K%%ysIW8~-hO0h}2I`?^bxwlVM_kDR#msnm} z>gm(8+IsoL?f3KZPv6bV914x^xss;oyNMge*iWf@jq7V`jd{a(u6ufN-}JeMYsJMk z*9X%FUY(vC_)%P$^*uQ}Vb4x##gUC)(YlKV;li`u#npwW(U-)oY9jJ+cQF&cdCPgZ M(NJ8R=s0`f4|MHo@c;k- literal 0 HcmV?d00001 diff --git a/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/imgs_mobile/noevents.png b/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/imgs_mobile/noevents.png new file mode 100644 index 0000000000000000000000000000000000000000..05da890fe1cf4b98f8c955cfedeb53be9cba4462 GIT binary patch literal 1687 zcma)+c~sI_6vuyAxsaliCrivNCoFTxG)4EhJfHhXo8l|ZQjqe%C-O!{(^9W)90K84*Yi?P=kr31XJ%2u;F|Zb{=WM`n zem(LX9l?WcOpr{a1Ep1+9uU$7A%rC{&eAC~kV1_HHffn{hd4~d4^wFgbV@iG1S)hp zT_6hoPU)mjmDCiZM3Df;1zjyDqNR!iP|t&Lp>z^JpslLp8@?x}FwRDXLQ*w z<_!t})`xjw-Ei>*(}QB~fKVfiFGN{!mm||!|2K3~{CM5IJiioJ_GQaPJ#)Tu90B}X z%YJUd_v2;GOrLi`?78ldX~Ey`Jh9QF*3;_fmdb)eMC{yO=_w3Z@mk&91;(C2*;GHZ zJ-1ra(Q+1zMy~^|J;q6Z7PgMoI$y0H^in^$&XU-_RNrYvB9Od(?I%8HZ_gX5EATDF zVJ?2F;q#NE@2qch%r)mAY0 zD=y>WCvjXZxBZ4mwWDc~sJgN;D5tlt&maSPq6k9}gkXw@c)Xtbmb93aB_-M6)v{D7 zySx_H)TbnjNa&L$!D(? zqK*pfYzU1tvw>^mP!pe|(nq_!H4&N5=8e95lS}jRwnm@MAqBm=WffROcyg*d#D%-r zopxH&EESK(KaQIW2lyEt7Nvq~tKBB}%yD=Ioj3=SUO7yjNDhc?5y zaO;RLvnlraAeExjNyH>{{5hGq* zUH$l5e$0qELdz^ZDInl&17qSUnaQj@W3$Px;Y=`r@Dq>h@S&%thPwVqh#fh9yo=+c zyqO)DUt$!Jzk~QnkynziFhhuDkcVIVekdFSL0Xl>>nLt^A&Xu zAGZFAHNPWGq*85($xDhXWWgcxZ%fKYNfzcpJ2>7AmM(0p>L}%8S4bO;{*<~9FXTUW zB?^+KCnxRM1B+-ijg*u3_8KCQn=;y_rlxv&aPqRq*w`E-|8VwVP2@h-L^pTxf=nhG z+=4_tS`Z}2#wUBrv7<8OXrq%6Tm~9sJ{#Q#N?`sG5mt!a{${VHrlx0MSy%0$Bgt+^ zUQV>wIGiiY3WbBmSuFG_U2t)+?%nOQG(2%K*9QzMc?AQ(CTVBP&=I!sHB-cB}uChvDYVsKepkD zdskOidKnF0in{=U{|pP$FC7}1>VGu2)2V>waCACi}TZ1 z^QUMZb3+r8Tp@I`;CQ|H)O9YM)3LgpO@|KwEG z%F0SzU7devTjtAi_Wfe<#mSzXi*^EuX#XDV?RuI^~J@-r=lnt~IW6I)=tan0ou6VSU#UK$c12R?jIbTT3$B3LXA zS{%KQu?cm+*k`#~ZSt_%8eFTV_Ag!@ra$Hapi6;W-`XXmLjNz|dE^AP%01-rzn2#b AcK`qY literal 0 HcmV?d00001 diff --git a/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/readme.txt b/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/readme.txt new file mode 100644 index 00000000000..67cb13ff468 --- /dev/null +++ b/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/readme.txt @@ -0,0 +1,16 @@ +There are a lot of files here, but you need only part of them + +Desctop scheduler, default skin + dhtmlxscheduler.js + dhtmlxscheduler.css + imgs\ + +Desctop scheduler, glossy skin + dhtmlxscheduler.js + dhtmlxscheduler_glossy.css + imgs_glossy\ + +Mobile scheduler + dhtmlxscheduler_mobile.js + dhtmlxscheduler_mobile.css + imgs_mobile\ \ No newline at end of file diff --git a/addons/base_calendar/static/lib/dhtmlxScheduler/license.txt b/addons/base_calendar/static/lib/dhtmlxScheduler/license.txt new file mode 100644 index 00000000000..4a7d08c91e4 --- /dev/null +++ b/addons/base_calendar/static/lib/dhtmlxScheduler/license.txt @@ -0,0 +1,228 @@ + + GNU GENERAL PUBLIC LICENSE + +Version 2, June 1991 + +Copyright (C) 1989, 1991 Free Software Foundation, Inc. + +59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + +Everyone is permitted to copy and distribute verbatim copies + +of this license document, but changing it is not allowed. + +TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + +0. This License applies to any program or other work which contains a +notice placed by the copyright holder saying it may be distributed under +the terms of this General Public License. The "Program", below, refers +to any such program or work, and a "work based on the Program" means +either the Program or any derivative work under copyright law: that is +to say, a work containing the Program or a portion of it, either +verbatim or with modifications and/or translated into another language. +(Hereinafter, translation is included without limitation in the term +"modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of running +the Program is not restricted, and the output from the Program is +covered only if its contents constitute a work based on the Program +(independent of having been made by running the Program). Whether that +is true depends on what the Program does. + +1. You may copy and distribute 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 +and disclaimer of warranty; keep intact all the notices that refer to +this License and to the absence of any warranty; and give any other +recipients of the Program a copy of this License along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + +2. You may modify your copy or copies of the Program or any portion of +it, thus forming a work based on the Program, and copy and distribute +such modifications or work under the terms of Section 1 above, provided +that you also meet all of these conditions: + +a) You must cause the modified files to carry prominent notices stating +that you changed the files and the date of any change. + +b) You must cause any work that you distribute or publish, that in whole +or in part contains or is derived from the Program or any part thereof, +to be licensed as a whole at no charge to all third parties under the +terms of this License. + +c) If the modified program normally reads commands interactively when +run, you must cause it, when started running for such interactive use in +the most ordinary way, to print or display an announcement including an +appropriate copyright notice and a notice that there is no warranty (or +else, saying that you provide a warranty) and that users may +redistribute the program under these conditions, and telling the user +how to view a copy of this License. (Exception: if the Program itself is +interactive but does not normally print such an announcement, your work +based on the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, and +can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based on +the Program, the distribution of the whole must be on the terms of this +License, whose permissions for other licensees extend to the entire +whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of a +storage or distribution medium does not bring the other work under the +scope of this License. + +3. You may copy and distribute the Program (or a work based on it, under +Section 2) in object code or executable form under the terms of Sections +1 and 2 above provided that you also do one of the following: + +a) Accompany it with the complete corresponding machine-readable source +code, which must be distributed under the terms of Sections 1 and 2 +above on a medium customarily used for software interchange; or, + +b) Accompany it with a written offer, valid for at least three years, to +give any third party, for a charge no more than your cost of physically +performing source distribution, a complete machine-readable copy of the +corresponding source code, to be distributed under the terms of Sections +1 and 2 above on a medium customarily used for software interchange; or, + +c) Accompany it with the information you received as to the offer to +distribute corresponding source code. (This alternative is allowed only +for noncommercial distribution and only if you received the program in +object code or executable form with such an offer, in accord with +Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source code +means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to control +compilation and installation of the executable. However, as a special +exception, the source code distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies the +executable. + +If distribution of executable or object code is made by offering access +to copy from a designated place, then offering equivalent access to copy +the source code from the same place counts as distribution of the source +code, even though third parties are not compelled to copy the source +along with the object code. + +4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt otherwise +to copy, modify, sublicense or distribute the Program is void, and will +automatically terminate your rights under this License. However, parties +who have received copies, or rights, from you under this License will +not have their licenses terminated so long as such parties remain in +full compliance. + +5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and all +its terms and conditions for copying, distributing or modifying the +Program or works based on it. + +6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further restrictions +on the recipients' exercise of the rights granted herein. You are not +responsible for enforcing compliance by third parties to this License. + +7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +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 distribute +so as to satisfy simultaneously your obligations under this License and +any other pertinent obligations, then as a consequence you may not +distribute the Program at all. For example, if a patent license would +not permit royalty-free redistribution of the Program by all those who +receive copies directly or indirectly through you, then the only way you +could satisfy both it and this License would be to refrain entirely from +distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is implemented +by public license practices. Many people have made generous +contributions to the wide range of software distributed through that +system in reliance on consistent application of that system; it is up to +the author/donor to decide if he or she is willing to distribute +software through any other system and a licensee cannot impose that choice. + +This section is intended to make thoroughly clear what is believed to be +a consequence of the rest of this License. + +8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License may +add an explicit geographical distribution limitation excluding those +countries, so that distribution is permitted only in or among countries +not thus excluded. In such case, this License incorporates the +limitation as if written in the body of this License. + +9. The Free Software Foundation may publish revised and/or new versions +of the 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 a version number of this License which applies to it and "any +later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Program does not specify a version +number of this License, you may choose any version ever published by the +Free Software Foundation. + +10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the +author to ask for permission. For software which is copyrighted by the +Free Software Foundation, write to the Free Software Foundation; we +sometimes make exceptions for this. Our decision will be guided by the +two goals of preserving the free status of all derivatives of our free +software and of promoting the sharing and reuse of software generally. + +NO WARRANTY + +11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, 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. + +12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE 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. + diff --git a/addons/base_calendar/static/lib/dhtmlxScheduler/readme.txt b/addons/base_calendar/static/lib/dhtmlxScheduler/readme.txt index 647f03a9958..ccda9adb09a 100644 --- a/addons/base_calendar/static/lib/dhtmlxScheduler/readme.txt +++ b/addons/base_calendar/static/lib/dhtmlxScheduler/readme.txt @@ -1,7 +1,6 @@ -dhtmlxScheduler v.2.3 +dhtmlxScheduler v.3.0 build 110727 This software is allowed to use under GPL or you need to obtain Commercial or Enterise License -to use it in not GPL project. Please contact sales@dhtmlx.com for details - +to use it in non-GPL project. Please contact sales@dhtmlx.com for details (c) DHTMLX Ltd. \ No newline at end of file diff --git a/addons/base_calendar/static/lib/dhtmlxScheduler/sources/base.js b/addons/base_calendar/static/lib/dhtmlxScheduler/sources/base.js index 350f83198a1..45a6dc0c820 100644 --- a/addons/base_calendar/static/lib/dhtmlxScheduler/sources/base.js +++ b/addons/base_calendar/static/lib/dhtmlxScheduler/sources/base.js @@ -1,4 +1,19 @@ +/* +This software is allowed to use under GPL or you need to obtain Commercial or Enterise License +to use it in not GPL project. Please contact sales@dhtmlx.com for details +*/ scheduler.date={ + init:function(){ + var s = scheduler.locale.date.month_short; + var t = scheduler.locale.date.month_short_hash = {}; + for (var i = 0; i < s.length; i++) + t[s[i]]=i; + + var s = scheduler.locale.date.month_full; + var t = scheduler.locale.date.month_full_hash = {}; + for (var i = 0; i < s.length; i++) + t[s[i]]=i; + }, date_part:function(date){ date.setHours(0); date.setMinutes(0); @@ -12,7 +27,7 @@ scheduler.date={ week_start:function(date){ var shift=date.getDay(); if (scheduler.config.start_on_monday){ - if (shift==0) shift=6 + if (shift===0) shift=6; else shift--; } return this.date_part(this.add(date,-1*shift,"day")); @@ -31,7 +46,14 @@ scheduler.date={ add:function(date,inc,mode){ var ndate=new Date(date.valueOf()); switch(mode){ - case "day": ndate.setDate(ndate.getDate()+inc); break; + case "day": + ndate.setDate(ndate.getDate()+inc); + if(date.getDate()==ndate.getDate() && !!inc) { + do { + ndate.setTime(ndate.getTime()+60*60*1000); + } while (date.getDate() == ndate.getDate()) + } + break; case "week": ndate.setDate(ndate.getDate()+7*inc); break; case "month": ndate.setMonth(ndate.getMonth()+inc); break; case "year": ndate.setYear(ndate.getFullYear()+inc); break; @@ -73,7 +95,7 @@ scheduler.date={ case "%W": return "\"+scheduler.date.to_fixed(scheduler.date.getISOWeek(date))+\""; default: return a; } - }) + }); if (utc) format=format.replace(/date\.get/g,"date.getUTC"); return new Function("date","return \""+format+"\";"); }, @@ -106,6 +128,12 @@ scheduler.date={ break; case "%s": splt+="set[5]=temp["+i+"]||0;"; break; + case "%M": splt+="set[1]=scheduler.locale.date.month_short_hash[temp["+i+"]]||0;"; + break; + case "%F": splt+="set[1]=scheduler.locale.date.month_full_hash[temp["+i+"]]||0;"; + break; + default: + break; } } var code ="set[0],set[1],set[2],set[3],set[4],set[5]"; @@ -116,18 +144,18 @@ scheduler.date={ getISOWeek: function(ndate) { if(!ndate) return false; var nday = ndate.getDay(); - if (nday == 0) { + if (nday === 0) { nday = 7; } var first_thursday = new Date(ndate.valueOf()); first_thursday.setDate(ndate.getDate() + (4 - nday)); var year_number = first_thursday.getFullYear(); // year of the first Thursday - var ordinal_date = Math.floor( (first_thursday.getTime() - new Date(year_number, 0, 1).getTime()) / 86400000); //ordinal date of the first Thursday - 1 (so not really ordinal date) + var ordinal_date = Math.round( (first_thursday.getTime() - new Date(year_number, 0, 1).getTime()) / 86400000); //ordinal date of the first Thursday - 1 (so not really ordinal date) var week_number = 1 + Math.floor( ordinal_date / 7); return week_number; }, getUTCISOWeek: function(ndate){ - return this.getISOWeek(ndate); - } -} + return this.getISOWeek(ndate); + } +}; \ No newline at end of file diff --git a/addons/base_calendar/static/lib/dhtmlxScheduler/sources/clear.css b/addons/base_calendar/static/lib/dhtmlxScheduler/sources/clear.css index 728af2d65bd..3a3217e940a 100644 --- a/addons/base_calendar/static/lib/dhtmlxScheduler/sources/clear.css +++ b/addons/base_calendar/static/lib/dhtmlxScheduler/sources/clear.css @@ -1,3 +1,7 @@ +/* +This software is allowed to use under GPL or you need to obtain Commercial or Enterise License +to use it in not GPL project. Please contact sales@dhtmlx.com for details +*/ .dhx_cal_ltext{ text-align:left; } diff --git a/addons/base_calendar/static/lib/dhtmlxScheduler/sources/config.js b/addons/base_calendar/static/lib/dhtmlxScheduler/sources/config.js index d9e5685a132..460b6771c00 100644 --- a/addons/base_calendar/static/lib/dhtmlxScheduler/sources/config.js +++ b/addons/base_calendar/static/lib/dhtmlxScheduler/sources/config.js @@ -1,3 +1,7 @@ +/* +This software is allowed to use under GPL or you need to obtain Commercial or Enterise License +to use it in not GPL project. Please contact sales@dhtmlx.com for details +*/ /* %e Day of the month without leading zeros (01..31) %d Day of the month, 2 digits with leading zeros (01..31) @@ -39,27 +43,35 @@ scheduler.config={ edit_on_create:1, details_on_create:0, click_form_details:0, - + cascade_event_display: false, + cascade_event_count:4, + cascade_event_margin: 30, + drag_lightbox:true, + preserve_scroll:true, + server_utc:false, positive_closing:false, icons_edit:["icon_save","icon_cancel"], icons_select:["icon_details","icon_edit","icon_delete"], - + buttons_left:["dhx_save_btn","dhx_cancel_btn"], + buttons_right:["dhx_delete_btn"], lightbox:{ sections:[ {name:"description", height:200, map_to:"text", type:"textarea" , focus:true}, {name:"time", height:72, type:"time", map_to:"auto"} ] - } + }, + + repeat_date_of_end: "01.01.2010" }; -scheduler.templates={} +scheduler.templates={}; scheduler.init_templates=function(){ var d=scheduler.date.date_to_str; var c=scheduler.config; var f = function(a,b){ for (var c in b) if (!a[c]) a[c]=b[c]; - } + }; f(scheduler.templates,{ day_date:d(c.default_date), month_date:d(c.month_date), @@ -99,7 +111,7 @@ scheduler.init_templates=function(){ return ev.text; } }); - this.callEvent("onTemplatesReady",[]) -} + this.callEvent("onTemplatesReady",[]); +}; diff --git a/addons/base_calendar/static/lib/dhtmlxScheduler/sources/connector.js b/addons/base_calendar/static/lib/dhtmlxScheduler/sources/connector.js index 45afbf6d089..72462172908 100644 --- a/addons/base_calendar/static/lib/dhtmlxScheduler/sources/connector.js +++ b/addons/base_calendar/static/lib/dhtmlxScheduler/sources/connector.js @@ -1,3 +1,7 @@ +/* +This software is allowed to use under GPL or you need to obtain Commercial or Enterise License +to use it in not GPL project. Please contact sales@dhtmlx.com for details +*/ /* dhx_sort[index]=direction dhx_filter[index]=mask @@ -7,10 +11,10 @@ if (window.dhtmlXGridObject){ dhtmlXGridObject.prototype._init_point=function(){ var clear_url=function(url){ url=url.replace(/(\?|\&)connector[^\f]*/g,""); - return url+(url.indexOf("?")!=-1?"&":"?")+"connector=true"+(mygrid.hdr.rows.length > 0 ? "&dhx_no_header=1":""); + return url+(url.indexOf("?")!=-1?"&":"?")+"connector=true"+(this.hdr.rows.length > 0 ? "&dhx_no_header=1":""); }; var combine_urls=function(url){ - return clear_url(url)+(this._connector_sorting||"")+(this._connector_filter||""); + return clear_url.call(this,url)+(this._connector_sorting||"")+(this._connector_filter||""); }; var sorting_url=function(url,ind,dir){ this._connector_sorting="&dhx_sort["+ind+"]="+dir; @@ -112,14 +116,10 @@ if (window.dhtmlXGridObject){ } if (this._con_f_used[f*1]) this._con_f_used[f*1]=v; - }; + } this._colls_loaded=true; } - }; - - - - + }; } if (window.dataProcessor){ @@ -131,7 +131,9 @@ if (window.dataProcessor){ this.setTransactionMode("POST",true); this.serverProcessor+=(this.serverProcessor.indexOf("?")!=-1?"&":"?")+"editing=true"; }; -}; +} dhtmlxError.catchError("LoadXML",function(a,b,c){ - alert(c[0].responseText); + if (c[0].status != 0) { + alert(c[0].responseText); + } }); diff --git a/addons/base_calendar/static/lib/dhtmlxScheduler/sources/dataprocessor_hook.js b/addons/base_calendar/static/lib/dhtmlxScheduler/sources/dataprocessor_hook.js index 1fdfc17bb68..27741b6d147 100644 --- a/addons/base_calendar/static/lib/dhtmlxScheduler/sources/dataprocessor_hook.js +++ b/addons/base_calendar/static/lib/dhtmlxScheduler/sources/dataprocessor_hook.js @@ -1,3 +1,7 @@ +/* +This software is allowed to use under GPL or you need to obtain Commercial or Enterise License +to use it in not GPL project. Please contact sales@dhtmlx.com for details +*/ scheduler._dp_init=function(dp){ dp._methods=["setEventTextStyle","","changeEventId","deleteEvent"]; @@ -5,7 +9,7 @@ scheduler._dp_init=function(dp){ if (!this._loading && this.validId(id)) dp.setUpdated(id,true,"inserted"); }); - this.attachEvent("onBeforeEventDelete",function(id){ + this.attachEvent("onConfirmedBeforeEventDelete", function(id){ if (!this.validId(id)) return; var z=dp.getState(id); diff --git a/addons/base_calendar/static/lib/dhtmlxScheduler/sources/dayevents.js b/addons/base_calendar/static/lib/dhtmlxScheduler/sources/dayevents.js new file mode 100644 index 00000000000..4717fe2858b --- /dev/null +++ b/addons/base_calendar/static/lib/dhtmlxScheduler/sources/dayevents.js @@ -0,0 +1,200 @@ +/* +This software is allowed to use under GPL or you need to obtain Commercial or Enterise License +to use it in not GPL project. Please contact sales@dhtmlx.com for details +*/ +dhx.protoUI({ + name:"dayevents", + defaults:{ + hourFormat:"%H", + hourClock:12, + firstHour:0, + lastHour:24, + timeScaleWidth:45, + timeScaleHeight: 30, + scroll:true, + scaleBorder:1, + eventOffset:5, + width:"auto", + date: new Date() + }, + $init:function(config){ + this.name = "DayEvents"; + + this._dataobj.style.position = "relative"; + this.data.provideApi(this,true); + this.data.attachEvent("onStoreUpdated",dhx.bind(this.render,this)); + + this.attachEvent("onBeforeRender", function(){ + this._renderScale(); + this.type.color = this.config.color; + this.type.textColor = this.config.textColor; + this._renderobj = this._dataobj.firstChild; + this._prepareEvents(); + if(window.scheduler) + this.type.template = scheduler.templates.day_event; + }); + if(window.scheduler){ + config.hourFormat = scheduler.config.scale_hour; + config.timeScaleWidth = scheduler.xy.scale_width; + config.timeScaleHeight = scheduler.xy.scale_height*2; + } + }, + _renderScale:function(){ + var html = "
"; + for(var h = this.config.firstHour; h"; + html += "
"+hour+"
"; + html += "
"; + html += "
"+top+"
"; + html += "
"+bottom+"
"; + html += "
"; + html += "
"; + html += "
"; + html += "
"; + html += "
"; + html += ""; + return html; + }, + type:{ + templateStart:dhx.Template("
"), + template:scheduler.templates.day_event, + templateEnd:dhx.Template("
"), + templateCss:dhx.Template(""), + templateColor:dhx.Template("#color#"), + templateTextColor:dhx.Template("#textColor#"), + padding:2 + }, + _prepareEvents:function(){ + var evs = this.data.getRange(); + var stack = []; + var ev,i,j,k,_is_sorder,_max_sorder,_sorder_set; + for(i=0; i< evs.length;i++){ + ev=evs[i]; + ev.$inner=false; + while (stack.length && stack[stack.length-1].end_date.valueOf()<=ev.start_date.valueOf()){ + stack.splice(stack.length-1,1); + } + _sorder_set = false; + + for(j=0;j< stack.length;j++){ + if(stack[j].end_date.valueOf()<=ev.start_date.valueOf()){ + _sorder_set = true; + ev.$sorder=stack[j].$sorder; + stack.splice(j,1); + ev.$inner=true; + break; + } + } + + if (stack.length) stack[stack.length-1].$inner=true; + + if(!_sorder_set){ + if(stack.length){ + if(stack.length<=stack[stack.length-1].$sorder){ + if(!stack[stack.length-1].$sorder) + ev.$sorder = 0; + else + for(j=0;j_max_sorder) + _max_sorder = stack[j].$sorder; + ev.$sorder = _max_sorder+1; + ev.$inner = false; + } + } + else + ev.$sorder = 0; + } + stack.push(ev); + if (stack.length>(stack.max_count||0)) stack.max_count=stack.length; + } + + for (var i=0; i < evs.length; i++){ + evs[i].$count=stack.max_count; + this._setPosition(evs[i]); + } + }, + _setPosition:function(ev){ + + var date = this.config.date.getValue?this.config.date.getValue():this.config.date; + + var start = dhx.Date.copy(ev.start_date); + var end = dhx.Date.copy(ev.end_date); + var sh = start.getHours(); + var eh = end.getHours(); + if(dhx.Date.datePart(start).valueOf()>dhx.Date.datePart(end).valueOf()){ + end = start; + } + + if(dhx.Date.datePart(start).valueOf()dhx.Date.datePart(date).valueOf()){ + end = dhx.Date.datePart(date); + end.setMinutes(0); + end.setHours(this.config.lastHour); + } + if (sh < this.config.firstHour || eh >= this.config.lastHour){ + if (sh < this.config.firstHour){ + end.setHours(this.config.firstHour); + ev.start_date.setMinutes(0); + } + if (eh >= this.config.lastHour){ + end.setMinutes(0); + end.setHours(this.config.lastHour); + } + } + var temp_width = Math.floor((this._content_width-this.config.timeScaleWidth-this.config.eventOffset-8)/ev.$count); + ev.$left=ev.$sorder*(temp_width)+this.config.timeScaleWidth+this.config.eventOffset; + if (!ev.$inner) temp_width=temp_width*(ev.$count-ev.$sorder); + ev.$width = temp_width-this.config.eventOffset-this.type.padding*2; + + var sm = start.getHours()*60+start.getMinutes(); + var em = (end.getHours()*60+end.getMinutes())||(this.config.lastHour*60); + ev.$top = Math.round((sm-this.config.firstHour/60)*(this.config.timeScaleHeight+1)/60); //42px/hour + ev.$height = Math.max(10,(em-sm)*(this.config.timeScaleHeight+1)/60-2)-this.type.padding*2; + } +}, dhx.MouseEvents, dhx.SelectionModel, dhx.Scrollable, dhx.RenderStack, dhx.DataLoader, dhx.ui.view, dhx.EventSystem, dhx.Settings); diff --git a/addons/base_calendar/static/lib/dhtmlxScheduler/sources/dhtmlxcommon.js b/addons/base_calendar/static/lib/dhtmlxScheduler/sources/dhtmlxcommon.js index 0dcaa7a070c..ce3c3891f0f 100644 --- a/addons/base_calendar/static/lib/dhtmlxScheduler/sources/dhtmlxcommon.js +++ b/addons/base_calendar/static/lib/dhtmlxScheduler/sources/dhtmlxcommon.js @@ -1,3 +1,37 @@ +/* +This software is allowed to use under GPL or you need to obtain Commercial or Enterise License +to use it in not GPL project. Please contact sales@dhtmlx.com for details +*/ +dhtmlx=function(obj){ + for (var a in obj) dhtmlx[a]=obj[a]; + return dhtmlx; //simple singleton +}; +dhtmlx.extend_api=function(name,map,ext){ + var t = window[name]; + if (!t) return; //component not defined + window[name]=function(obj){ + if (obj && typeof obj == "object" && !obj.tagName && !(obj instanceof Array)){ + var that = t.apply(this,(map._init?map._init(obj):arguments)); + //global settings + for (var a in dhtmlx) + if (map[a]) this[map[a]](dhtmlx[a]); + //local settings + for (var a in obj){ + if (map[a]) this[map[a]](obj[a]); + else if (a.indexOf("on")==0){ + this.attachEvent(a,obj[a]); + } + } + } else + var that = t.apply(this,arguments); + if (map._patch) map._patch(this); + return that||this; + }; + window[name].prototype=t.prototype; + if (ext) + dhtmlXHeir(window[name].prototype,ext); +}; + dhtmlxAjax={ get:function(url,callback){ var t=new dtmlXMLLoaderObject(true); @@ -546,12 +580,15 @@ dhtmlDragAndDropObject.prototype.initFrameRoute=function(win, mode){ } } -var _isFF = false; -var _isIE = false; -var _isOpera = false; -var _isKHTML = false; -var _isMacOS = false; -var _isChrome = false; +_isFF = false; +_isIE = false; +_isOpera = false; +_isKHTML = false; +_isMacOS = false; +_isChrome = false; +_KHTMLrv = false; +_OperaRv = false; +_FFrv = false; if (navigator.userAgent.indexOf('Macintosh') != -1) _isMacOS=true; @@ -868,4 +905,10 @@ dhtmlxEventable=function(obj){ this[list[0]].removeEvent(list[1]); //remove event } } + obj.detachAllEvents = function(){ + for (var name in this){ + if (name.indexOf("ev_")==0) + delete this[name]; + } + } } diff --git a/addons/base_calendar/static/lib/dhtmlxScheduler/sources/dhtmlxdataprocessor.js b/addons/base_calendar/static/lib/dhtmlxScheduler/sources/dhtmlxdataprocessor.js index 8dfc1cb0dd1..4a4143f947f 100644 --- a/addons/base_calendar/static/lib/dhtmlxScheduler/sources/dhtmlxdataprocessor.js +++ b/addons/base_calendar/static/lib/dhtmlxScheduler/sources/dhtmlxdataprocessor.js @@ -1,3 +1,7 @@ +/* +This software is allowed to use under GPL or you need to obtain Commercial or Enterise License +to use it in not GPL project. Please contact sales@dhtmlx.com for details +*/ /** * @desc: constructor, data processor object * @param: serverProcessorURL - url used for update @@ -362,6 +366,8 @@ dataProcessor.prototype={ var soid = sid; switch (action) { + case "update": + case "updated": case "inserted": case "insert": if (tid != sid) { diff --git a/addons/base_calendar/static/lib/dhtmlxScheduler/sources/dhtmlxdataprocessor_debug.js b/addons/base_calendar/static/lib/dhtmlxScheduler/sources/dhtmlxdataprocessor_debug.js index 2b251515166..e26776e533a 100644 --- a/addons/base_calendar/static/lib/dhtmlxScheduler/sources/dhtmlxdataprocessor_debug.js +++ b/addons/base_calendar/static/lib/dhtmlxScheduler/sources/dhtmlxdataprocessor_debug.js @@ -1,3 +1,7 @@ +/* +This software is allowed to use under GPL or you need to obtain Commercial or Enterise License +to use it in not GPL project. Please contact sales@dhtmlx.com for details +*/ dataProcessor.prototype._o_init = dataProcessor.prototype.init; dataProcessor.prototype.init=function(obj){ this._console=this._console||this._createConsole(); @@ -86,7 +90,7 @@ dataProcessor.wrap("sendData",function(rowId){ if (!this.obj._idpull[rowId]) this._log(" Error! item with such ID not exists "+rowId+""); } else { - if (!this.obj.rowsAr[rowId]) + if (this.rowsAr && !this.obj.rowsAr[rowId]) this._log(" Error! row with such ID not exists "+rowId+""); } } @@ -150,7 +154,7 @@ dataProcessor.wrap("afterUpdateCallback",function(sid,tid,action){ if (this.obj.mytype=="tree"){ if (!this.obj._idpull[sid]) this._log("Incorrect SID, item with such ID not exists in grid"); } else { - if (!this.obj.rowsAr[sid]) this._log("Incorrect SID, row with such ID not exists in grid"); + if (this.obj.rowsAr && !this.obj.rowsAr[sid]) this._log("Incorrect SID, row with such ID not exists in grid"); } this._log(" Action: "+action+" SID:"+sid+" TID:"+tid); },function(){ diff --git a/addons/base_calendar/static/lib/dhtmlxScheduler/sources/dhtmlxdataprocessor_jsonp.js b/addons/base_calendar/static/lib/dhtmlxScheduler/sources/dhtmlxdataprocessor_jsonp.js new file mode 100644 index 00000000000..19779666494 --- /dev/null +++ b/addons/base_calendar/static/lib/dhtmlxScheduler/sources/dhtmlxdataprocessor_jsonp.js @@ -0,0 +1,57 @@ +/* +This software is allowed to use under GPL or you need to obtain Commercial or Enterise License +to use it in not GPL project. Please contact sales@dhtmlx.com for details +*/ +if(dataProcessor) { + dataProcessor.prototype.enableJSONP = function(mode) { + if(mode) { + this._jsonp_attach_id = this.attachEvent("onBeforeDataSending", function(rowId,rowIdState,a1){ + if (rowId) + this._in_progress[rowId]=(new Date()).valueOf(); + + var url = this.serverProcessor+(this._user?(getUrlSymbol(this.serverProcessor)+["dhx_user="+this._user,"dhx_version="+this.obj.getUserData(0,"version")].join("&")):""); + url += ((url.indexOf("?")!=-1)?"&":"?")+this.serialize(a1,rowId); + + this._jsonp(url, [], function(data){ + var xml = new dtmlXMLLoaderObject(this.afterUpdate,this,true); + xml.loadXMLString(data); + this.afterUpdate(this, null, null, null, xml); + }, this); + + this._waitMode++; + return false; + }); + } + else { + if(this._jsonp_attach_id) + this.detachEvent(this._jsonp_attach_id); + } + }; + dataProcessor.prototype._jsonp = function(url, params, callback, master){ + var global_obj = "dataProcessor"; + var id = "dp_jsonp_"+new Date().valueOf(); + var script = document.createElement('script'); + script.id = id; + script.type = 'text/javascript'; + + var head = document.getElementsByTagName("head")[0]; + + if (!params) + params = {}; + params.jsonp = global_obj+"."+id; // would be called as dataProcessor.dp_jsonp_1938948394 + dataProcessor[id]=function(){ + callback.apply(master||window, arguments); + script.parentNode.removeChild(script); + callback = head = master = script = null; + delete dataProcessor[id]; + }; + + var vals = []; + for (var key in params) vals.push(key+"="+encodeURIComponent(params[key])); + + url += (url.indexOf("?") == -1 ? "?" : "&")+vals.join("&"); + + script.src = url ; + head.appendChild(script); + }; +} diff --git a/addons/base_calendar/static/lib/dhtmlxScheduler/sources/event.js b/addons/base_calendar/static/lib/dhtmlxScheduler/sources/event.js index 202a6e5fcb9..18542ecbe3b 100644 --- a/addons/base_calendar/static/lib/dhtmlxScheduler/sources/event.js +++ b/addons/base_calendar/static/lib/dhtmlxScheduler/sources/event.js @@ -1,3 +1,7 @@ +/* +This software is allowed to use under GPL or you need to obtain Commercial or Enterise License +to use it in not GPL project. Please contact sales@dhtmlx.com for details +*/ scheduler.uid=function(){ if (!this._seed) this._seed=(new Date).valueOf(); return this._seed++; @@ -9,6 +13,8 @@ scheduler.clearAll=function(){ this.clear_view(); }; scheduler.addEvent=function(start_date,end_date,text,id,extra_data){ + if(!arguments.length) + return this.addEventNow(); var ev=start_date; if (arguments.length!=1){ ev=extra_data||{}; @@ -16,12 +22,17 @@ scheduler.addEvent=function(start_date,end_date,text,id,extra_data){ ev.end_date=end_date; ev.text=text; ev.id=id; - }; + } ev.id = ev.id||scheduler.uid(); ev.text = ev.text||""; - + if (typeof ev.start_date == "string") ev.start_date=this.templates.api_date(ev.start_date); if (typeof ev.end_date == "string") ev.end_date=this.templates.api_date(ev.end_date); + + var d = (this.config.event_duration||this.config.time_step)*60000; + if(ev.start_date.valueOf() == ev.end_date.valueOf()) + ev.end_date.setTime(ev.end_date.valueOf()+d); + ev._timed=this.is_one_day_event(ev); var is_new=!this._events[ev.id]; @@ -30,15 +41,17 @@ scheduler.addEvent=function(start_date,end_date,text,id,extra_data){ if (!this._loading) this.callEvent(is_new?"onEventAdded":"onEventChanged",[ev.id,ev]); }; -scheduler.deleteEvent=function(id,silent){ +scheduler.deleteEvent=function(id,silent){ var ev=this._events[id]; - if (!silent && !this.callEvent("onBeforeEventDelete",[id,ev])) return; - + if (!silent && (!this.callEvent("onBeforeEventDelete",[id,ev]) || !this.callEvent("onConfirmedBeforeEventDelete", [id,ev]))) + return; if (ev){ delete this._events[id]; this.unselect(id); this.event_updated(ev); } + + this.callEvent("onEventDeleted", [id]); }; scheduler.getEvent=function(id){ return this._events[id]; @@ -64,6 +77,7 @@ scheduler.changeEventId=function(id,new_id){ }); if (this._select_id==id) this._select_id=new_id; if (this._edit_id==id) this._edit_id=new_id; + //if (this._drag_id==id) this._drag_id=new_id; this.callEvent("onEventIdChange",[id,new_id]); }; @@ -92,8 +106,7 @@ scheduler.event_updated=function(ev,force){ else this.clear_event(ev.id); }; scheduler.is_visible_events=function(ev){ - if (ev.start_dateb.start_date?1:-1; }); + evs.sort(function(a,b){ + if(a.start_date.valueOf()==b.start_date.valueOf()) + return a.id>b.id?1:-1; + return a.start_date>b.start_date?1:-1; + }); var days=[]; //events by weeks var evs_originals = []; for (var i=0; i < evs.length; i++) { @@ -239,12 +268,70 @@ scheduler._pre_render_events_line=function(evs,hold){ if (!hold){ ev._inner=false; + var stack=days[ev._sday]; while (stack.length && stack[stack.length-1].end_date<=ev.start_date) stack.splice(stack.length-1,1); - if (stack.length) stack[stack.length-1]._inner=true; - ev._sorder=stack.length; stack.push(ev); - if (stack.length>(stack.max_count||0)) stack.max_count=stack.length; + + var sorderSet = false; + for(var j=0; j _max_sorder) + _max_sorder = stack[j]._sorder; + ev._sorder = _max_sorder + 1; + ev._inner = false; + } + + } + else + ev._sorder = 0; + } + + stack.push(ev); + + if (stack.length>(stack.max_count||0)) { + stack.max_count=stack.length; + ev._count=stack.length; + } + else { + ev._count=(ev._count)?ev._count:1; + } } if (sh < this.config.first_hour || eh >= this.config.last_hour){ @@ -262,23 +349,23 @@ scheduler._pre_render_events_line=function(evs,hold){ evs.splice(i,1); i--; continue; } } - } if (!hold){ - for (var i=0; i < evs.length; i++) - evs[i]._count=days[evs[i]._sday].max_count; - for (var i=0; i < evs_originals.length; i++) + for (var i=0; i < evs.length; i++) { + evs[i]._count = days[evs[i]._sday].max_count; + } + for (var i=0; i < evs_originals.length; i++) evs_originals[i]._count=days[evs_originals[i]._sday].max_count; } return evs; }; scheduler._time_order=function(evs){ - evs.sort(function(a,b){ + evs.sort(function(a,b){ if (a.start_date.valueOf()==b.start_date.valueOf()){ if (a._timed && !b._timed) return 1; if (!a._timed && b._timed) return -1; - return 0; + return a.id>b.id?1:-1; } return a.start_date>b.start_date?1:-1; }); @@ -317,8 +404,10 @@ scheduler._pre_render_events_table=function(evs,hold){ // max - max height of we for (stack_line=0; stack_line"; - var obj = this._render_v_bar(ev.id,left-menu+1,top,menu,icons.length*20+26,"","
",icons_str,true); + icons_str+="
"; + var obj = this._render_v_bar(ev.id,left-menu+1,top,menu,icons.length*20+26,"","
",icons_str,true); obj.style.left=left-menu+1; this._els["dhx_cal_data"][0].appendChild(obj); this._rendered.push(obj); @@ -445,17 +542,19 @@ scheduler.render_event=function(ev){ }; scheduler._render_v_bar=function(id,x,y,w,h,style,contentA,contentB,bottom){ var d=document.createElement("DIV"); - var ev = this.getEvent(id); var cs = "dhx_cal_event"; var cse = scheduler.templates.event_class(ev.start_date,ev.end_date,ev); if (cse) cs=cs+" "+cse; + + var bg_color = (ev.color?("background-color:"+ev.color+";"):""); + var color = (ev.textColor?("color:"+ev.textColor+";"):""); var html='
'; - html+='
 
'; - html+='
'+contentA+'
'; - html+='
'+contentB+'
'; - html+='
'; + html+='
 
'; + html+='
'+contentA+'
'; + html+='
'+contentB+'
'; + html+=''; d.innerHTML=html; return d.firstChild; @@ -471,22 +570,25 @@ scheduler.locate_holder_day=function(date,past){ return day; }; scheduler.render_event_bar=function(ev){ - var parent=this._els["dhx_cal_data"][0]; + var parent=this._rendered_location; var x=this._colsS[ev._sday]; var x2=this._colsS[ev._eday]; if (x2==x) x2=this._colsS[ev._eday+1]; var hb = this.xy.bar_height; - var y=this._colsS.heights[ev._sweek]+(this._colsS.height?(this.xy.month_scale_height+2):2)+ev._sorder*hb; + var y=this._colsS.heights[ev._sweek]+(this._colsS.height?(this.xy.month_scale_height+2):2)+(ev._sorder*hb); var d=document.createElement("DIV"); var cs = ev._timed?"dhx_cal_event_clear":"dhx_cal_event_line"; var cse = scheduler.templates.event_class(ev.start_date,ev.end_date,ev); - if (cse) cs=cs+" "+cse; + if (cse) cs=cs+" "+cse; + + var bg_color = (ev.color?("background-color:"+ev.color+";"):""); + var color = (ev.textColor?("color:"+ev.textColor+";"):""); + + var html='
'; - var html='
'; - if (ev._timed) html+=scheduler.templates.event_bar_date(ev.start_date,ev.end_date,ev); html+=scheduler.templates.event_bar_text(ev.start_date,ev.end_date,ev)+'
'; @@ -542,4 +644,4 @@ scheduler.getEvents = function(from,to){ result.push(ev); } return result; -}; \ No newline at end of file +}; diff --git a/addons/base_calendar/static/lib/dhtmlxScheduler/sources/ext.css b/addons/base_calendar/static/lib/dhtmlxScheduler/sources/ext.css index 402c5b38271..de19bca63ed 100644 --- a/addons/base_calendar/static/lib/dhtmlxScheduler/sources/ext.css +++ b/addons/base_calendar/static/lib/dhtmlxScheduler/sources/ext.css @@ -1,6 +1,15 @@ +/* +This software is allowed to use under GPL or you need to obtain Commercial or Enterise License +to use it in not GPL project. Please contact sales@dhtmlx.com for details +*/ +.dhx_scale_bar_header { + position: absolute; + border-bottom: 1px dotted #8894A3; + width: 100%; +} .dhx_expand_icon { position:absolute; top:0px; right:0px; - background-image:url(../codebase/imgs/colapce-expand-icon.gif); + background-image:url(./imgs/colapce-expand-icon.gif); width:18px; height:18px; cursor:pointer; background-position:0px 18px; @@ -10,7 +19,7 @@ width:100%; height:100%; overflow-y:auto; - background-image:url(../codebase/imgs/databg.png); + background-image:url(./imgs/databg.png); } .dhx_agenda_line{ height:21px; @@ -37,7 +46,7 @@ .dhx_agenda_line .dhx_event_icon{ width:20px; border-width:0px; - background:url(../codebase/imgs/icon.png) no-repeat; + background:url(./imgs/icon.png) no-repeat; background-position: 5px 4px; cursor:pointer; } @@ -51,7 +60,6 @@ border-left:1px dotted #586A7E; } .dhx_year_week{ - height:20px; position:relative; } .dhx_scale_bar_last{ @@ -79,7 +87,7 @@ } .dhx_tooltip{ border:1px solid #BBBBBB; - background-image:url(../codebase/imgs/databg.png); + background-image:url(./imgs/databg.png); position:absolute; z-index:9998; width:300px; @@ -101,7 +109,7 @@ float:left; border-width:0px; position:relative; - background:url(../codebase/imgs/icon.png) no-repeat; + background:url(./imgs/icon.png) no-repeat; background-position: 5px 4px; cursor:pointer; } @@ -136,10 +144,12 @@ left:190px; top:1px; cursor:pointer; - background-image:url(../imgs/calendar.gif); + background-image:url(./imgs/calendar.gif); } - +.dhx_matrix_scell { + height: 100%; +} .dhx_matrix_cell, .dhx_matrix_scell{ overflow:hidden; @@ -151,10 +161,12 @@ .dhx_matrix_cell{ background-color:white; } +.dhx_matrix_line{ + overflow: hidden; +} .dhx_matrix_cell div, .dhx_matrix_scell div{ overflow:hidden; text-align:center; - width:100%; height:auto; } @@ -179,12 +191,17 @@ .dhx_matrix_scell .dhx_scell_level2{ padding-left: 35px; } +.dhx_matrix_scell .dhx_scell_level3{ + padding-left: 50px; +} +.dhx_matrix_scell .dhx_scell_level4{ + padding-left: 65px; +} .dhx_matrix_scell.folder{ font-weight: bold; text-align: left; } - .dhx_matrix_scell.folder .dhx_scell_expand{ float: left; width: 10px; @@ -198,13 +215,17 @@ padding-left:15px; text-align: left; } -.dhx_section_timeline, .dhx_section_timeline2{ - overflow: hidden; - padding: 2px 0 2px 10px; +.dhx_data_table.folder .dhx_matrix_cell{ + border-right: 0; } -.dhx_section_timeline select, .dhx_section_timeline2 select{ +.dhx_section_timeline { + overflow: hidden; + padding: 4px 0 2px 10px; +} +.dhx_section_timeline select{ width: 552px; } + /* Tree view end*/ /* Map view */ @@ -213,12 +234,12 @@ height:100%; overflow-y: auto; overflow-x: hidden; - background-image:url(../codebase/imgs/databg.png); + background-image:url(./imgs/databg.png); } .dhx_map_line .dhx_event_icon{ width:20px; border-width:0px; - background:url(../codebase/imgs/icon.png) no-repeat; + background:url(./imgs/icon.png) no-repeat; background-position: 5px 4px; cursor:pointer; } @@ -247,7 +268,7 @@ } .dhx_map_line .dhx_map_description{ float:left; - border-right: 0px dotted #8894A3; + border-right: 0 dotted #8894A3; text-align:center; line-height:21px; overflow:hidden; @@ -271,8 +292,12 @@ /* dhtmlXTooltip start */ .dhtmlXTooltip.tooltip{ -moz-box-shadow:3px 3px 3px #888888; - -khtml-box-shadow:3px 3px 3px #888888; - + -webkit-box-shadow:3px 3px 3px #888888; + -o-box-shadow:3px 3px 3px #888888; + box-shadow:3px 3px 3px #888888; + filter: + progid:DXImageTransform.Microsoft.Shadow(color='#888888', Direction=135, Strength=5) + ; background-color:white; border-left:1px dotted #887A2E; border-top:1px dotted #887A2E; @@ -315,3 +340,47 @@ padding: 4px; } /* Lightbox dhtmlx combo section end */ + +/* Agenda week start */ +.dhx_wa_column { + float: left; +} +.dhx_wa_column_last .dhx_wa_day_cont{ + border-left: 1px dotted #8894A3; +} +.dhx_wa_scale_bar { + font-family: Tahoma; + padding-left: 10px; + font-size: 11px; + border-top: 1px dotted #8894A3; + border-bottom: 1px dotted #8894A3; +} +.dhx_wa_day_data { + background-color: #FCFEFC; + overflow-y: auto; +} +.dhx_wa_ev_body { + border-bottom: 1px dotted #778899; + font-size: 12px; + padding: 5px 0 5px 7px; +} +.dhx_wa_dnd { + font-family: Tahoma; + position: absolute; + padding-right: 7px; + color: #887AE2 !important; + background-color: #FFE763 !important; + border: 1px solid #B7A543; +} +.dhx_cal_event_selected{ + background-color: #9cc1db; + color: white; +} +/* Agenda week end */ + +/* timeline second scale start */ +.dhx_second_scale_bar { + border-bottom: 1px dotted #586A7E; + padding-top: 2px; +} +/* timeline second scale end */ \ No newline at end of file diff --git a/addons/base_calendar/static/lib/dhtmlxScheduler/sources/ext/ext_active_links.js b/addons/base_calendar/static/lib/dhtmlxScheduler/sources/ext/ext_active_links.js index 79ebce494bb..46bc624c1ea 100644 --- a/addons/base_calendar/static/lib/dhtmlxScheduler/sources/ext/ext_active_links.js +++ b/addons/base_calendar/static/lib/dhtmlxScheduler/sources/ext/ext_active_links.js @@ -1,3 +1,7 @@ +/* +This software is allowed to use under GPL or you need to obtain Commercial or Enterise License +to use it in not GPL project. Please contact sales@dhtmlx.com for details +*/ scheduler.attachEvent("onTemplatesReady",function(){ var s_d = scheduler.date.str_to_date(scheduler.config.api_date); var d_s = scheduler.date.date_to_str(scheduler.config.api_date); @@ -5,17 +9,18 @@ scheduler.attachEvent("onTemplatesReady",function(){ var month_x = scheduler.templates.month_day; scheduler.templates.month_day=function(date){ return ""+month_x(date)+""; - } + }; var week_x = scheduler.templates.week_scale_date; scheduler.templates.week_scale_date=function(date){ return ""+week_x(date)+""; - } - - + }; dhtmlxEvent(this._obj,"click",function(e){ var start = e.target || event.srcElement; var to = start.getAttribute("jump_to"); - if (to) + if (to) { scheduler.setCurrentView(s_d(to),"day"); + if (e && e.preventDefault) e.preventDefault(); + return false; + } }) -}) \ No newline at end of file +}); \ No newline at end of file diff --git a/addons/base_calendar/static/lib/dhtmlxScheduler/sources/ext/ext_agenda_view.js b/addons/base_calendar/static/lib/dhtmlxScheduler/sources/ext/ext_agenda_view.js index 6fcdd5cc106..08d06e0e644 100644 --- a/addons/base_calendar/static/lib/dhtmlxScheduler/sources/ext/ext_agenda_view.js +++ b/addons/base_calendar/static/lib/dhtmlxScheduler/sources/ext/ext_agenda_view.js @@ -1,20 +1,24 @@ +/* +This software is allowed to use under GPL or you need to obtain Commercial or Enterise License +to use it in not GPL project. Please contact sales@dhtmlx.com for details +*/ scheduler.date.add_agenda = function(date){ return (new Date(date.valueOf())); -} +}; scheduler.dblclick_dhx_agenda_area=function(){ if (!this.config.readonly && this.config.dblclick_create) this.addEventNow(); -} +}; scheduler.templates.agenda_time = function(start,end,ev){ if (ev._timed) return this.day_date(ev.start_date, ev.end_date, ev)+" "+this.event_date(start); else return scheduler.templates.day_date(start)+" – "+scheduler.templates.day_date(end); -} -scheduler.templates.agenda_text = function(ev){ - return ev.text; -} +}; +scheduler.templates.agenda_text = function(start,end,event){ + return event.text; +}; scheduler.date.agenda_start=function(d){ return d; }; scheduler.attachEvent("onTemplatesReady",function(){ @@ -37,6 +41,19 @@ scheduler.attachEvent("onTemplatesReady",function(){ else return old.apply(this,arguments); } + + var old_render_view_data = scheduler.render_view_data; + scheduler.render_view_data=function(){ + if(this._mode == "agenda") { + scheduler._agendaScrollTop = scheduler._els["dhx_cal_data"][0].childNodes[0].scrollTop; + scheduler._els["dhx_cal_data"][0].childNodes[0].scrollTop = 0; + scheduler._els["dhx_cal_data"][0].style.overflowY = 'hidden'; + } + else { + scheduler._els["dhx_cal_data"][0].style.overflowY = 'auto'; + } + return old_render_view_data.apply(this,arguments); + } function set_full_view(mode){ @@ -59,15 +76,18 @@ scheduler.attachEvent("onTemplatesReady",function(){ //generate html for the view var html="
"; for (var i=0; i
"+scheduler.templates.agenda_time(events[i].start_date, events[i].end_date,events[i])+"
"; + var ev = events[i]; + var bg_color = (ev.color?("background-color:"+ev.color+";"):""); + var color = (ev.textColor?("color:"+ev.textColor+";"):""); + html+="
"+scheduler.templates.agenda_time(ev.start_date, ev.end_date,ev)+"
"; html+="
 
"; - html+=""+scheduler.templates.agenda_text(events[i])+"
"; + html+=""+scheduler.templates.agenda_text(ev.start_date, ev.end_date, ev)+"
"; } html+="
"; //render html - scheduler._els["dhx_cal_data"][0].scrollTop = 0; //fix flickering in FF scheduler._els["dhx_cal_data"][0].innerHTML = html; + scheduler._els["dhx_cal_data"][0].childNodes[0].scrollTop = scheduler._agendaScrollTop||0; var t=scheduler._els["dhx_cal_data"][0].firstChild.childNodes; scheduler._els["dhx_cal_date"][0].innerHTML=""; @@ -90,4 +110,4 @@ scheduler.attachEvent("onTemplatesReady",function(){ //agenda tab de-activated } } -}) \ No newline at end of file +}) diff --git a/addons/base_calendar/static/lib/dhtmlxScheduler/sources/ext/ext_collision.js b/addons/base_calendar/static/lib/dhtmlxScheduler/sources/ext/ext_collision.js index d2582a05926..e1e5d0fb52f 100644 --- a/addons/base_calendar/static/lib/dhtmlxScheduler/sources/ext/ext_collision.js +++ b/addons/base_calendar/static/lib/dhtmlxScheduler/sources/ext/ext_collision.js @@ -1,27 +1,35 @@ +/* +This software is allowed to use under GPL or you need to obtain Commercial or Enterise License +to use it in not GPL project. Please contact sales@dhtmlx.com for details +*/ (function(){ -var temp_section,temp_time; +var temp_section; var before; scheduler.config.collision_limit = 1; -scheduler.attachEvent("onBeforeDrag",function(id){ - var pr = scheduler._props?scheduler._props[this._mode]:null; - var matrix = scheduler.matrix?scheduler.matrix[this._mode]:null; - var checked_mode = pr||matrix; + +function _setTempSection(event_id) { // for custom views (matrix, timeline, units) + var pr = scheduler._props?scheduler._props[scheduler._mode]:null; + var matrix = scheduler.matrix?scheduler.matrix[scheduler._mode]:null; + var checked_mode = pr||matrix; // units or matrix mode if(pr) var map_to = checked_mode.map_to; if(matrix) var map_to = checked_mode.y_property; + if ((checked_mode) && event_id){ + temp_section = scheduler.getEvent(event_id)[map_to]; + } +} - if ((checked_mode) && id){ - temp_section = this.getEvent(id)[map_to]; - temp_time = this.getEvent(id).start_date; - } +scheduler.attachEvent("onBeforeDrag",function(id){ + _setTempSection(id); return true; }); scheduler.attachEvent("onBeforeLightbox",function(id){ var ev = scheduler.getEvent(id); before = [ev.start_date, ev.end_date]; + _setTempSection(id); return true; }); scheduler.attachEvent("onEventChanged",function(id){ @@ -39,17 +47,16 @@ scheduler.attachEvent("onBeforeEventChanged",function(ev,e,is_new){ return collision_check(ev); }); scheduler.attachEvent("onEventSave",function(id, edited_ev){ - //var ev = scheduler.getEvent(id); - if(edited_ev.rec_type) + if(edited_ev.rec_type){ scheduler._roll_back_dates(edited_ev); - - return collision_check(edited_ev); + return collision_check(edited_ev); + } + return true; + //return collision_check(edited_ev); }); - function collision_check(ev){ var evs = []; - if (ev.rec_type) { var evs_dates = scheduler.getRecDates(ev); for(var k=0; k scheduler.config.collision_limit) { - scheduler._drag_event.start_date = temp_time; - ev[map_to] = temp_section; + if (count >= scheduler.config.collision_limit) { + ev[map_to] = temp_section; // from _setTempSection for custom views single = false; } } else { - if (evs.length > scheduler.config.collision_limit) + if (evs.length > scheduler.config.collision_limit) single = false; } - if (!single) return !scheduler.callEvent("onEventCollision",[ev,evs]); return single; -}; +} -})(); \ No newline at end of file +})(); diff --git a/addons/base_calendar/static/lib/dhtmlxScheduler/sources/ext/ext_cookie.js b/addons/base_calendar/static/lib/dhtmlxScheduler/sources/ext/ext_cookie.js index 0df4852ccdc..71f1d5e6794 100644 --- a/addons/base_calendar/static/lib/dhtmlxScheduler/sources/ext/ext_cookie.js +++ b/addons/base_calendar/static/lib/dhtmlxScheduler/sources/ext/ext_cookie.js @@ -1,3 +1,7 @@ +/* +This software is allowed to use under GPL or you need to obtain Commercial or Enterise License +to use it in not GPL project. Please contact sales@dhtmlx.com for details +*/ (function(){ function setCookie(name,cookie_param,value) { var str = name + "=" + value + (cookie_param?("; "+cookie_param):""); diff --git a/addons/base_calendar/static/lib/dhtmlxScheduler/sources/ext/ext_editors.js b/addons/base_calendar/static/lib/dhtmlxScheduler/sources/ext/ext_editors.js index 8c64d13eddc..e76eff631f4 100644 --- a/addons/base_calendar/static/lib/dhtmlxScheduler/sources/ext/ext_editors.js +++ b/addons/base_calendar/static/lib/dhtmlxScheduler/sources/ext/ext_editors.js @@ -1,3 +1,7 @@ +/* +This software is allowed to use under GPL or you need to obtain Commercial or Enterise License +to use it in not GPL project. Please contact sales@dhtmlx.com for details +*/ scheduler.form_blocks['combo']={ render:function(sns) { var res = ''; @@ -40,7 +44,7 @@ scheduler.form_blocks['combo']={ scheduler.form_blocks['radio']={ render:function(sns) { var res = ''; - res += "
"; + res += "
"; for (var i=0; i"; @@ -74,20 +78,32 @@ scheduler.form_blocks['radio']={ scheduler.form_blocks['checkbox']={ render:function(sns) { - return ''; + if (scheduler.config.wide_form) + return '
'; + else + return ''; }, set_value:function(node,value,ev,config){ + node=document.getElementById(config.id); var id = scheduler.uid(); var isChecked = false; if (typeof config.checked_value != 'undefined' && ev[config.map_to] == config.checked_value) { isChecked = true; } - node.previousSibling.className += " dhx_cal_checkbox"; - node.previousSibling.innerHTML=""; - + node.className += " dhx_cal_checkbox"; + var check_html = ""; + var label_html = ""; + if (scheduler.config.wide_form){ + node.innerHTML = label_html; + node.nextSibling.innerHTML=check_html; + } else + node.innerHTML=check_html+label_html; }, get_value:function(node,ev,config){ - var checkbox = node.previousSibling.getElementsByTagName('input')[0]; // moved to the header + node=document.getElementById(config.id); + var checkbox = node.getElementsByTagName('input')[0]; // moved to the header + if (!checkbox) + checkbox = node.nextSibling.getElementsByTagName('input')[0]; return (checkbox.checked)?(config.checked_value||true):(config.unchecked_value||false); }, focus:function(node){ diff --git a/addons/base_calendar/static/lib/dhtmlxScheduler/sources/ext/ext_expand.js b/addons/base_calendar/static/lib/dhtmlxScheduler/sources/ext/ext_expand.js index 9224bef1af5..5e916128cf9 100644 --- a/addons/base_calendar/static/lib/dhtmlxScheduler/sources/ext/ext_expand.js +++ b/addons/base_calendar/static/lib/dhtmlxScheduler/sources/ext/ext_expand.js @@ -1,27 +1,30 @@ +/* +This software is allowed to use under GPL or you need to obtain Commercial or Enterise License +to use it in not GPL project. Please contact sales@dhtmlx.com for details +*/ scheduler.expand = function(){ - var t = scheduler._obj; - do { - t._position = t.style.position||""; - t.style.position = "static"; - } while ((t = t.parentNode) && t.style ); - t = scheduler._obj; - t.style.position="absolute"; - t._width = t.style.width; - t._height = t.style.height; - t.style.width = t.style.height = "100%"; - t.style.top = t.style.left = "0px"; - - var top =document.body; - top.scrollTop = 0; - - top = top.parentNode; - if (top) - top.scrollTop = 0; - document.body._overflow=document.body.style.overflow||""; - document.body.style.overflow = "hidden"; - scheduler._maximize() -} - + var t = scheduler._obj; + do { + t._position = t.style.position||""; + t.style.position = "static"; + } while ((t = t.parentNode) && t.style ); + t = scheduler._obj; + t.style.position="absolute"; + t._width = t.style.width; + t._height = t.style.height; + t.style.width = t.style.height = "100%"; + t.style.top = t.style.left = "0px"; + + var top = document.body; + top.scrollTop = 0; + + top = top.parentNode; + if (top) + top.scrollTop = 0; + document.body._overflow=document.body.style.overflow||""; + document.body.style.overflow = "hidden"; + scheduler._maximize(); +}; scheduler.collapse = function(){ var t = scheduler._obj; do { @@ -31,9 +34,8 @@ scheduler.collapse = function(){ t.style.width = t._width; t.style.height = t._height; document.body.style.overflow=document.body._overflow; - scheduler._maximize() -} - + scheduler._maximize(); +}; scheduler.attachEvent("onTemplatesReady",function(){ var t = document.createElement("DIV"); t.className="dhx_expand_icon"; @@ -46,9 +48,27 @@ scheduler.attachEvent("onTemplatesReady",function(){ scheduler.collapse(); } }); + scheduler._maximize = function(){ - this.expanded = !this.expanded; - this.toggleIcon.style.backgroundPosition="0px "+(this._expand?"0":"18")+"px"; - if (scheduler.callEvent("onSchedulerResize",[])) - scheduler.update_view(); -} + this.expanded = !this.expanded; + this.toggleIcon.style.backgroundPosition="0px "+(this.expanded?"0":"18")+"px"; + + var directions = ['left', 'top']; + for(var i=0; i= scheduler.config.collision_limit); + }); + + scheduler.addEvent=function(start_date,end_date,text,id,extra_data){ + var ev=start_date; + if (arguments.length!=1){ + ev=extra_data||{}; + ev.start_date=start_date; + ev.end_date=end_date; + ev.text=text; + ev.id=id; + ev.layer = this.defaultLayer; + }; + ev.id = ev.id||scheduler.uid(); + ev.text = ev.text||""; + + + if (typeof ev.start_date == "string") ev.start_date=this.templates.api_date(ev.start_date); + if (typeof ev.end_date == "string") ev.end_date=this.templates.api_date(ev.end_date); + ev._timed=this.is_one_day_event(ev); + + var is_new=!this._events[ev.id]; + this._events[ev.id]=ev; + this.event_updated(ev); + if (!this._loading) + this.callEvent(is_new?"onEventAdded":"onEventChanged",[ev.id,ev]); + }; + + this._evs_layer = {}; + for (var i = 0; i < this.layers.length; i++) { // array in object for each layer + this._evs_layer[this.layers[i].name] = []; + } + + scheduler.addEventNow=function(start,end,e){ + var base = {}; + if (typeof start == "object"){ + base = start; + start = null; + } + + var d = (this.config.event_duration||this.config.time_step)*60000; + if (!start) start = Math.round((new Date()).valueOf()/d)*d; + var start_date = new Date(start); + if (!end){ + var start_hour = this.config.first_hour; + if (start_hour > start_date.getHours()){ + start_date.setHours(start_hour); + start = start_date.valueOf(); + } + end = start+d; + } + + + base.start_date = base.start_date||start_date; + base.end_date = base.end_date||new Date(end); + base.text = base.text||this.locale.labels.new_event; + base.id = this._drag_id = this.uid(); + base.layer = this.defaultLayer; + this._drag_mode="new-size"; + + this._loading=true; + this.addEvent(base); + this.callEvent("onEventCreated",[this._drag_id,e]); + this._loading=false; + + this._drag_event={}; //dummy , to trigger correct event updating logic + this._on_mouse_up(e); + } + + scheduler._t_render_view_data = function(events) { // helper + if (this.config.multi_day && !this._table_view) { + var tvs = []; + var tvd = []; + for (var k = 0; k < events.length; k++) { + if (events[k]._timed) + tvs.push(events[k]); + else + tvd.push(events[k]); + } + this._table_view = true; + this.render_data(tvd); + this._table_view = false; + this.render_data(tvs); + } + else + this.render_data(events); + }; + + scheduler.render_view_data = function(){ + if (this._not_render) { + this._render_wait = true; + return; + } + this._render_wait = false; + + this.clear_view(); + + this._evs_layer = {}; + for (var i = 0; i < this.layers.length; i++) { // array in object for each layer + this._evs_layer[this.layers[i].name] = []; + } + + var evs = this.get_visible_events(); + for (var i = 0; i < evs.length; i++) { // filling layer arrays with events + if(this._evs_layer[evs[i].layer]) + this._evs_layer[evs[i].layer].push(evs[i]); + } + + if(this._mode == 'month') { // old logic is used + var tevs = []; + for (var i = 0; i < this.layers.length; i++) { + if (this.layers[i].visible) + tevs = tevs.concat(this._evs_layer[this.layers[i].name]); + } + this._t_render_view_data(tevs); + } + else { // week, day; should use new logic + for (var i = 0; i < this.layers.length; i++) { + if (this.layers[i].visible) { + var evs_layer = this._evs_layer[this.layers[i].name]; + this._t_render_view_data(evs_layer); + } + } + } + }; + + scheduler._render_v_bar=function(id,x,y,w,h,style,contentA,contentB,bottom){ + var ev = this.getEvent(id); + if(contentA.indexOf('
'; + html+='
 
'; + html+='
'+contentA+'
'; + html+='
'+contentB+'
'; + html+='
'; + + d.innerHTML=html; + d.style.zIndex = 100; + return d.firstChild; + }; + + scheduler.render_event_bar=function(ev){ + var parent=this._els["dhx_cal_data"][0]; + + var x=this._colsS[ev._sday]; + var x2=this._colsS[ev._eday]; + if (x2==x) x2=this._colsS[ev._eday+1]; + var hb = this.xy.bar_height; + + var y=this._colsS.heights[ev._sweek]+(this._colsS.height?(this.xy.month_scale_height+2):2)+ev._sorder*hb; + + var d=document.createElement("DIV"); + var cs = ev._timed?"dhx_cal_event_clear":"dhx_cal_event_line"; + var cse = (scheduler.templates['event_class_'+ev.layer])?scheduler.templates['event_class_'+ev.layer](ev.start_date,ev.end_date,ev):scheduler.templates.event_class(ev.start_date,ev.end_date,ev); + if (cse) cs=cs+" "+cse; + + var html='
'; + + if (ev._timed) + html+=(scheduler.templates['event_bar_date_'+ev.layer])?scheduler.templates['event_bar_date_'+ev.layer](ev.start_date,ev.end_date,ev):scheduler.templates.event_bar_date(ev.start_date,ev.end_date,ev); + html+=( (scheduler.templates['event_bar_text_'+ev.layer])?scheduler.templates['event_bar_text_'+ev.layer](ev.start_date,ev.end_date,ev):scheduler.templates.event_bar_text(ev.start_date,ev.end_date,ev) + '
)'); + html+='
'; + + d.innerHTML=html; + + this._rendered.push(d.firstChild); + parent.appendChild(d.firstChild); + }; + + scheduler.render_event=function(ev){ + var menu = scheduler.xy.menu_width; + if(scheduler.getLayer(ev.layer).noMenu) + menu = 0; + + if (ev._sday<0) return; //can occur in case of recurring event during time shift + var parent=scheduler.locate_holder(ev._sday); + if (!parent) return; //attempt to render non-visible event + var sm = ev.start_date.getHours()*60+ev.start_date.getMinutes(); + var em = (ev.end_date.getHours()*60+ev.end_date.getMinutes())||(scheduler.config.last_hour*60); + + var top = (Math.round((sm*60*1000-this.config.first_hour*60*60*1000)*this.config.hour_size_px/(60*60*1000)))%(this.config.hour_size_px*24)+1; //42px/hour + var height = Math.max(scheduler.xy.min_event_height,(em-sm)*this.config.hour_size_px/60)+1; //42px/hour + //var height = Math.max(25,Math.round((ev.end_date.valueOf()-ev.start_date.valueOf())*(this.config.hour_size_px+(this._quirks?1:0))/(60*60*1000))); //42px/hour + var width=Math.floor((parent.clientWidth-menu)/ev._count); + var left=ev._sorder*width+1; + if (!ev._inner) width=width*(ev._count-ev._sorder); + + + + var d=this._render_v_bar(ev.id,menu+left,top,width,height,ev._text_style,scheduler.templates.event_header(ev.start_date,ev.end_date,ev),scheduler.templates.event_text(ev.start_date,ev.end_date,ev)); + + this._rendered.push(d); + parent.appendChild(d); + + left=left+parseInt(parent.style.left,10)+menu; + + top+=this._dy_shift; //corrupt top, to include possible multi-day shift + d.style.zIndex = this._layers_zindex[ev.layer]; + + if (this._edit_id==ev.id){ + d.style.zIndex = parseInt(d.style.zIndex)+1; //fix overlapping issue + var new_zIndex = d.style.zIndex; + width=Math.max(width-4,scheduler.xy.editor_width); + var d=document.createElement("DIV"); + d.setAttribute("event_id",ev.id); + this.set_xy(d,width,height-20,left,top+14); + d.className="dhx_cal_editor"; + d.style.zIndex = new_zIndex; + var d2=document.createElement("DIV"); + this.set_xy(d2,width-6,height-26); + d2.style.cssText+=";margin:2px 2px 2px 2px;overflow:hidden;"; + + + d2.style.zIndex = new_zIndex; + d.appendChild(d2); + this._els["dhx_cal_data"][0].appendChild(d); + this._rendered.push(d); + + d2.innerHTML=""; + if (this._quirks7) d2.firstChild.style.height=height-12+"px"; //IEFIX + this._editor=d2.firstChild; + this._editor.onkeypress=function(e){ + if ((e||event).shiftKey) return true; + var code=(e||event).keyCode; + if (code==scheduler.keys.edit_save) scheduler.editStop(true); + if (code==scheduler.keys.edit_cancel) scheduler.editStop(false); + }; + this._editor.onselectstart=function(e){ return (e||event).cancelBubble=true; }; + d2.firstChild.focus(); + //IE and opera can add x-scroll during focusing + this._els["dhx_cal_data"][0].scrollLeft=0; + d2.firstChild.select(); + } + if (this._select_id==ev.id){ + d.style.zIndex = parseInt(d.style.zIndex)+1; //fix overlapping issue + var icons=this.config["icons_"+((this._edit_id==ev.id)?"edit":"select")]; + var icons_str=""; + for (var i=0; i
"; + var obj = this._render_v_bar(ev.id,left-menu+1,top,menu,icons.length*20+26,"","
",icons_str,true); + obj.style.left=left-menu+1; + obj.style.zIndex = d.style.zIndex; + this._els["dhx_cal_data"][0].appendChild(obj); + this._rendered.push(obj); + } + + }; + + scheduler.filter_agenda = function(id, event) { + var layer = scheduler.getLayer(event.layer); + return (layer && layer.visible); + }; +}); diff --git a/addons/base_calendar/static/lib/dhtmlxScheduler/sources/ext/ext_limit.js b/addons/base_calendar/static/lib/dhtmlxScheduler/sources/ext/ext_limit.js index 4a8ad2fed6d..ad790cf3ea9 100644 --- a/addons/base_calendar/static/lib/dhtmlxScheduler/sources/ext/ext_limit.js +++ b/addons/base_calendar/static/lib/dhtmlxScheduler/sources/ext/ext_limit.js @@ -1,3 +1,7 @@ +/* +This software is allowed to use under GPL or you need to obtain Commercial or Enterise License +to use it in not GPL project. Please contact sales@dhtmlx.com for details +*/ scheduler.config.limit_start = new Date(-3999,0,0); scheduler.config.limit_end = new Date( 3999,0,0); scheduler.config.limit_view = false; @@ -5,6 +9,48 @@ scheduler.config.limit_view = false; (function(){ var before = null; + var block_days = {}; + var block_weeks = {}; + var time_block_set = false; + scheduler.blockTime = function(day, zones){ + var bottom = this.config.first_hour*60 + var top = this.config.last_hour*60 + if (zones == "fullday") + zones = [bottom,top]; + + if (typeof day == "object") + block_days[this.date.date_part(day).valueOf()] = zones; + else + block_weeks[day] = zones; + + for (var i=0; itop) + zones[i+1] = top; + } + + time_block_set = true; + }; + + scheduler.attachEvent("onScaleAdd", function(area, day){ + var zones = block_days[day.valueOf()] || block_weeks[day.getDay()]; + if (zones){ + for (var i = 0; i < zones.length; i+=2){ + var start = zones[i]; + var end = zones[i+1]; + var block = document.createElement("DIV"); + block.className = "dhx_time_block"; + + var h_px // FIXME + block.style.top = (Math.round((start*60*1000-this.config.first_hour*60*60*1000)*this.config.hour_size_px/(60*60*1000)))%(this.config.hour_size_px*24)+"px"; + block.style.height = (Math.round(((end-start-1)*60*1000)*this.config.hour_size_px/(60*60*1000)))%(this.config.hour_size_px*24)+"px"; + + area.appendChild(block); + } + } + }); + scheduler.attachEvent("onBeforeViewChange",function(om,od,nm,nd){ nd = nd||od; nm = nm||om; if (scheduler.config.limit_view){ @@ -20,6 +66,44 @@ scheduler.config.limit_view = false; var blocker = function(ev){ var c = scheduler.config; var res = (ev.start_date.valueOf() >= c.limit_start.valueOf() && ev.end_date.valueOf() <= c.limit_end.valueOf()); + if (res && time_block_set && ev._timed){ + var day = scheduler.date.date_part(new Date(ev.start_date.valueOf())); + var zones = block_days[day.valueOf()] || block_weeks[day.getDay()]; + var sm = ev.start_date.getHours()*60+ev.start_date.getMinutes(); + var em = ev.end_date.getHours()*60+ev.end_date.getMinutes(); + if (zones){ + for (var i = 0; i < zones.length; i+=2){ + var sz = zones[i]; + var ez = zones[i+1]; + if (szsm) { + if (sm<=ez && sm >=sz){ + if (ez == 24*60 || em=sz && em scheduler.config.limit_end) { - ev.end_date = new Date(scheduler.config.limit_end); - // as end date was changed need to recheck if event occuring during one day - ev._timed = this.is_one_day_event(ev); + if (ev.start_date.valueOf() >= scheduler.config.limit_end.valueOf()) { + ev.start_date = this.date.add(scheduler.config.limit_end, -1, "day"); + } + if (ev.end_date < scheduler.config.limit_start) { + ev.end_date = new Date(scheduler.config.limit_start); + } + if (ev.end_date.valueOf() >= scheduler.config.limit_end.valueOf()) { + ev.end_date = this.date.add(scheduler.config.limit_end, -1, "day"); } - // in case if both start and end date were specified < scheduler.config.limit_star - if (ev.start_date > ev.end_date) { + if (ev.start_date.valueOf() >= ev.end_date.valueOf()) { ev.end_date = this.date.add(ev.start_date, (this.config.event_duration||this.config.time_step), "minute"); } + ev._timed=this.is_one_day_event(ev); } return true; }); @@ -74,5 +163,4 @@ scheduler.config.limit_view = false; return blocker(ev); }); -})(); - +})(); \ No newline at end of file diff --git a/addons/base_calendar/static/lib/dhtmlxScheduler/sources/ext/ext_map_view.js b/addons/base_calendar/static/lib/dhtmlxScheduler/sources/ext/ext_map_view.js index 05845b9c468..e2e17d14e03 100644 --- a/addons/base_calendar/static/lib/dhtmlxScheduler/sources/ext/ext_map_view.js +++ b/addons/base_calendar/static/lib/dhtmlxScheduler/sources/ext/ext_map_view.js @@ -1,5 +1,7 @@ - - +/* +This software is allowed to use under GPL or you need to obtain Commercial or Enterise License +to use it in not GPL project. Please contact sales@dhtmlx.com for details +*/ scheduler.xy.map_date_width = 188; // date column width scheduler.xy.map_description_width = 400; // description column width @@ -18,74 +20,90 @@ scheduler.config.map_zoom_after_resolve = 15; scheduler.locale.labels.marker_geo_success = "It seems you are here."; scheduler.locale.labels.marker_geo_fail = "Sorry, could not get your current position using geolocation."; -scheduler.templates.marker_date=scheduler.date.date_to_str("%Y-%m-%d %H:%i"); // date for map's infowindow will be formated following way +scheduler.templates.marker_date = scheduler.date.date_to_str("%Y-%m-%d %H:%i"); // date for map's infowindow will be formated following way -scheduler.templates.marker_text=function(start, end, ev){ - return "
"+ev.text+"

"+(ev.event_location||'')+"

"+scheduler.templates.marker_date(start)+" - "+scheduler.templates.marker_date(end)+"
"; +scheduler.templates.marker_text = function(start, end, ev) { + return "
" + ev.text + "

" + (ev.event_location || '') + "

" + scheduler.templates.marker_date(start) + " - " + scheduler.templates.marker_date(end) + "
"; }; -scheduler.dblclick_dhx_map_area=function(){ +scheduler.dblclick_dhx_map_area = function() { if (!this.config.readonly && this.config.dblclick_create) - this.addEventNow(); + this.addEventNow({ + start_date: scheduler._date, + end_date: scheduler.date.add(scheduler._date, 1, "hour") + }); }; -scheduler.templates.map_time = function(start,end,ev){ - if (ev._timed) - return this.day_date(ev.start_date, ev.end_date, ev)+" "+this.event_date(start); +scheduler.templates.map_time = function(start, end, ev) { + if (ev._timed) + return this.day_date(ev.start_date, ev.end_date, ev) + " " + this.event_date(start); else - return scheduler.templates.day_date(start)+" – "+scheduler.templates.day_date(end); + return scheduler.templates.day_date(start) + " – " + scheduler.templates.day_date(end); }; -scheduler.templates.map_text = function(ev){ +scheduler.templates.map_text = function(start, end, ev) { return ev.text; }; -scheduler.date.map_start=function(d){ return d; }; - -scheduler.attachEvent("onTemplatesReady",function(){ +scheduler.date.map_start = function(d) { + return d; +}; +scheduler.date.add_map = function(date, inc, mode) { + return (new Date(date.valueOf())); +}; + +scheduler.templates.map_date = function(dd, ed, mode) { + return ''; +}; + +scheduler._latLngUpdate = false; // flag for not displaying event second time in case of coordinates update + +scheduler.attachEvent("onSchedulerReady", function() { + + (function() { + scheduler._isMapPositionSet = false; // if user actual (geolocation) position was set on the map - function _append_map() { - _isPositionSet = false; // if user actual (geolocation) position was set on the map - var gmap = document.createElement('div'); - gmap.className='dhx_map'; - gmap.id='dhx_gmap'; + gmap.className = 'dhx_map'; + gmap.id = 'dhx_gmap'; gmap.style.dispay = "none"; - - node = document.getElementById('scheduler_here'); + + var node = scheduler._obj; node.appendChild(gmap); - + scheduler._els.dhx_gmap = []; scheduler._els.dhx_gmap.push(gmap); - + _setMapSize('dhx_gmap'); var mapOptions = { zoom: scheduler.config.map_inital_zoom || 10, center: scheduler.config.map_initial_position, - mapTypeId: scheduler.config.map_type||google.maps.MapTypeId.ROADMAP + mapTypeId: scheduler.config.map_type || google.maps.MapTypeId.ROADMAP }; - map = new google.maps.Map(document.getElementById('dhx_gmap'), mapOptions); + var map = new google.maps.Map(document.getElementById('dhx_gmap'), mapOptions); map.disableDefaultUI = false; - map.disableDoubleClickZoom = true; - + map.disableDoubleClickZoom = !scheduler.config.readonly; + google.maps.event.addListener(map, "dblclick", function(event) { if (!scheduler.config.readonly && scheduler.config.dblclick_create) { - point = event.latLng; + var point = event.latLng; geocoder.geocode( - { 'latLng': point }, - function(results, status) { - if (status == google.maps.GeocoderStatus.OK) { - point = results[0].geometry.location; - scheduler.addEventNow({ - lat: point.lat(), - lng: point.lng(), - event_location: results[0].formatted_address - }); + { 'latLng': point }, + function(results, status) { + if (status == google.maps.GeocoderStatus.OK) { + point = results[0].geometry.location; + scheduler.addEventNow({ + lat: point.lat(), + lng: point.lng(), + event_location: results[0].formatted_address, + start_date: scheduler._date, + end_date: scheduler.date.add(scheduler._date, 1, "hour") + }); + } } - } - ); - } + ); + } }); - + var infoWindowOptions = { content: '' }; @@ -93,304 +111,389 @@ scheduler.attachEvent("onTemplatesReady",function(){ if (scheduler.config.map_infowindow_max_width) { infoWindowOptions.maxWidth = scheduler.config.map_infowindow_max_width; } - + scheduler.map = { _points: [], _markers: [], _infowindow: new google.maps.InfoWindow(infoWindowOptions), _infowindows_content: [], - _initialization_count: -1 + _initialization_count: -1, + _obj: map }; - + geocoder = new google.maps.Geocoder(); - - if(scheduler.config.map_resolve_user_location) { - if(navigator.geolocation) { - if(!_isPositionSet) { + + if (scheduler.config.map_resolve_user_location) { + if (navigator.geolocation) { + if (!scheduler._isMapPositionSet) { navigator.geolocation.getCurrentPosition(function(position) { - var _userLocation = new google.maps.LatLng(position.coords.latitude,position.coords.longitude); + var _userLocation = new google.maps.LatLng(position.coords.latitude, position.coords.longitude); map.setCenter(_userLocation); - map.setZoom(scheduler.config.map_zoom_after_resolve||10); + map.setZoom(scheduler.config.map_zoom_after_resolve || 10); scheduler.map._infowindow.setContent(scheduler.locale.labels.marker_geo_success); scheduler.map._infowindow.position = map.getCenter(); scheduler.map._infowindow.open(map); - _isPositionSet = true; - }, - function() { - scheduler.map._infowindow.setContent(scheduler.locale.labels.marker_geo_fail); - scheduler.map._infowindow.setPosition(map.getCenter()); - scheduler.map._infowindow.open(map); - _isPositionSet = true; - }); + scheduler._isMapPositionSet = true; + }, + function() { + scheduler.map._infowindow.setContent(scheduler.locale.labels.marker_geo_fail); + scheduler.map._infowindow.setPosition(map.getCenter()); + scheduler.map._infowindow.open(map); + scheduler._isMapPositionSet = true; + }); } } } google.maps.event.addListener(map, "resize", function(event) { - gmap.style.zIndex='5'; - map.setZoom( map.getZoom() ); + gmap.style.zIndex = '5'; + map.setZoom(map.getZoom()); + }); google.maps.event.addListener(map, "tilesloaded", function(event) { - gmap.style.zIndex='5'; + gmap.style.zIndex = '5'; }); - } - _append_map(); - scheduler.attachEvent("onSchedulerResize",function(){ - if (this._mode == "map"){ - this.map_view(true); - } - }); - - var old = scheduler.render_data; - scheduler.render_data=function(evs,hold){ + gmap.style.display = 'none'; // property was changed after attaching map + })(); + + scheduler.attachEvent("onSchedulerResize", function() { if (this._mode == "map") { - fill_map_tab(); + this.map_view(true); + return false + } + return true; + }); + + var old = scheduler.render_data; + scheduler.render_data = function(evs, hold) { + if (this._mode == "map") { + fill_map_tab(); var events = scheduler.get_visible_events(); - for(var i=0; i
"+l.date+"
"+l.description+"
"; - scheduler._table_view=true; + scheduler._els["dhx_cal_header"][0].innerHTML = "
" + l.date + "
" + l.description + "
"; + scheduler._table_view = true; scheduler.set_sizes(); } } - function fill_map_tab(){ - //get current date - var date = scheduler._date; + function clear_map_tab() { + scheduler._selected_event_id = null; + scheduler.map._infowindow.close(); + for (var key in scheduler.map._markers) { + scheduler.map._markers[key].setMap(null); + delete scheduler.map._markers[key]; + if (scheduler.map._infowindows_content[key]) + delete scheduler.map._infowindows_content[key]; + } + } + + function fill_map_tab() { //select events for which data need to be printed var events = scheduler.get_visible_events(); - events.sort(function(a,b){ return a.start_date>b.start_date?1:-1; }); - + events.sort(function(a, b) { + if (a.start_date < b.start_date) + return -1; + if (a.start_date.valueOf() == b.start_date.valueOf()) { + if (a.text < b.text) + return -1 + else { + if (a.text == b.text) + return 0; + else + return 1; + } + } + else + return 1; + }); + //generate html for the view - var html="
"; - for (var i=0; i
"+scheduler.templates.map_time(events[i].start_date, events[i].end_date,events[i])+"
"; - html+="
 
"; - html+="
"+scheduler.templates.map_text(events[i])+"
"; // -25 = icon size 20 and padding 5 + var html = "
"; + for (var i = 0; i < events.length; i++) { + var ev = events[i]; + var event_class = (ev.id == scheduler._selected_event_id) ? 'dhx_map_line highlight' : 'dhx_map_line'; + var bg_color = (ev.color ? ("background-color:" + ev.color + ";") : ""); + var color = (ev.textColor ? ("color:" + ev.textColor + ";") : ""); + html += "
" + scheduler.templates.map_time(ev.start_date, ev.end_date, ev) + "
"; + html += "
 
"; + html += "
" + scheduler.templates.map_text(ev.start_date, ev.end_date, ev) + "
"; // -25 = icon size 20 and padding 5 } - html+="
"; - + html += "
"; + //render html scheduler._els["dhx_cal_data"][0].scrollTop = 0; //fix flickering in FF scheduler._els["dhx_cal_data"][0].innerHTML = html; scheduler._els["dhx_cal_data"][0].style.width = (scheduler.xy.map_date_width + scheduler.xy.map_description_width + 1) + 'px'; - - var t=scheduler._els["dhx_cal_data"][0].firstChild.childNodes; - scheduler._els["dhx_cal_date"][0].innerHTML=""; - - scheduler._rendered=[]; - for (var i=0; i < t.length-2; i++) { - scheduler._rendered[i]=t[i]; + + var t = scheduler._els["dhx_cal_data"][0].firstChild.childNodes; + scheduler._els["dhx_cal_date"][0].innerHTML = scheduler.templates[scheduler._mode + "_date"](scheduler._min_date, scheduler._max_date, scheduler._mode); + + scheduler._rendered = []; + for (var i = 0; i < t.length - 2; i++) { + scheduler._rendered[i] = t[i]; } - + } - + function _setMapSize(elem_id) { //input - map's div id var map = document.getElementById(elem_id); - map.style.height = (scheduler._y - scheduler.xy.nav_height) + 'px'; - map.style.width = (scheduler._x - scheduler.xy.map_date_width - scheduler.xy.map_description_width - 1) + 'px'; + var height = scheduler._y - scheduler.xy.nav_height; + if (height < 0) + height = 0; + var width = scheduler._x - scheduler.xy.map_date_width - scheduler.xy.map_description_width - 1; + if (width < 0) + width = 0; + map.style.height = height + 'px'; + map.style.width = width + 'px'; map.style.marginLeft = (scheduler.xy.map_date_width + scheduler.xy.map_description_width + 1) + 'px'; map.style.marginTop = (scheduler.xy.nav_height + 2) + 'px'; } - scheduler.map_view=function(mode){ + scheduler.map_view = function(mode) { scheduler.map._initialization_count++; var gmap = scheduler._els.dhx_gmap[0]; - scheduler._els.dhx_cal_data[0].style.width = (scheduler.xy.map_date_width + scheduler.xy.map_description_width + 1) + 'px'; - - scheduler._min_date = scheduler.config.map_start||(new Date()); - scheduler._max_date = scheduler.config.map_end||(new Date(9999,1,1)); + + scheduler._min_date = scheduler.config.map_start || (new Date()); + scheduler._max_date = scheduler.config.map_end || (new Date(9999, 1, 1)); + scheduler._table_view = true; set_full_view(mode); - - if (mode){ //map tab activated + + if (mode) { //map tab activated + clear_map_tab(); fill_map_tab(); gmap.style.display = 'block'; - + // need to resize block everytime window is resized _setMapSize('dhx_gmap'); - + var temp_center = scheduler.map._obj.getCenter(); + var events = scheduler.get_visible_events(); - for(var i=0; i scheduler._min_date) || (event.start_date < scheduler._max_date && event.end_date > scheduler._max_date) || (event.start_date.valueOf() >= scheduler._min_date && event.end_date.valueOf() <= scheduler._max_date)) { + if (scheduler.map._markers[event_id]) + scheduler.map._markers[event_id].setMap(null); + _displayEventOnMap(event); + } else { // event no longer should be displayed on the map view + scheduler._selected_event_id = null; + scheduler.map._infowindow.close(); + if (scheduler.map._markers[event_id]) + scheduler.map._markers[event_id].setMap(null); + } } + else + this._latLngUpdate = false; return true; - }); - - scheduler.attachEvent("onEventIdChange", function(old_event_id,new_event_id){ - if(scheduler.is_visible_events(scheduler.getEvent(new_event_id))) { - if(scheduler.map._markers[old_event_id]) scheduler.map._markers[old_event_id].setMap(null); - var event = scheduler.getEvent(new_event_id); + }); + + + scheduler.attachEvent("onEventIdChange", function(old_event_id, new_event_id) { + var event = scheduler.getEvent(new_event_id); + if ((event.start_date < scheduler._min_date && event.end_date > scheduler._min_date) || (event.start_date < scheduler._max_date && event.end_date > scheduler._max_date) || (event.start_date.valueOf() >= scheduler._min_date && event.end_date.valueOf() <= scheduler._max_date)) { + if (scheduler.map._markers[old_event_id]) { + scheduler.map._markers[old_event_id].setMap(null); + delete scheduler.map._markers[old_event_id]; + } + if (scheduler.map._infowindows_content[old_event_id]) + delete scheduler.map._infowindows_content[old_event_id]; _displayEventOnMap(event); } return true; }); - - /* Test/example - scheduler.attachEvent("onLocationError", function(event_id,event_object){ - return new google.maps.LatLng(8, 8); - }); - */ - - scheduler.attachEvent("onBeforeEventDelete", function(event_id,event_object){ - if (scheduler.map._markers[event_id]) { - scheduler.map._markers[event_id].setMap(null); // if new event is deleted tab != map then it doesn't have marker yet + + scheduler.attachEvent("onEventAdded", function(event_id, event_object) { + if (!scheduler._dataprocessor) { + if ((event_object.start_date < scheduler._min_date && event_object.end_date > scheduler._min_date) || (event_object.start_date < scheduler._max_date && event_object.end_date > scheduler._max_date) || (event_object.start_date.valueOf() >= scheduler._min_date && event_object.end_date.valueOf() <= scheduler._max_date)) { + if (scheduler.map._markers[event_id]) + scheduler.map._markers[event_id].setMap(null); + _displayEventOnMap(event_object); } - scheduler.map._infowindow.close(); - return true; - }); - - scheduler._event_resolve_delay = 500; - scheduler.attachEvent("onEventLoading", function(event){ - if(scheduler.config.map_resolve_event_location && event.event_location && !event.lat && !event.lng) { // don't delete !event.lat && !event.lng as location could change - scheduler._event_resolve_delay += 500; - _delay(_updateEventLocation,this,[event], scheduler._event_resolve_delay); } return true; - }); - - scheduler.attachEvent("onEventCancel", function(event_id, is_new){ - if(is_new) { - if(scheduler.map._markers[event_id]) + }); + + /* Test/example + scheduler.attachEvent("onLocationError", function(event_id,event_object){ + return new google.maps.LatLng(8, 8); + }); + */ + + scheduler.attachEvent("onBeforeEventDelete", function(event_id, event_object) { + if (scheduler.map._markers[event_id]) { + scheduler.map._markers[event_id].setMap(null); // if new event is deleted tab != map then it doesn't have marker yet + } + scheduler._selected_event_id = null; + scheduler.map._infowindow.close(); + return true; + }); + + scheduler._event_resolve_delay = 1500; + scheduler.attachEvent("onEventLoading", function(event) { + if (scheduler.config.map_resolve_event_location && event.event_location && !event.lat && !event.lng) { // don't delete !event.lat && !event.lng as location could change + scheduler._event_resolve_delay += 1500; + _delay(_updateEventLocation, this, [event], scheduler._event_resolve_delay); + } + return true; + }); + + scheduler.attachEvent("onEventCancel", function(event_id, is_new) { + if (is_new) { + if (scheduler.map._markers[event_id]) scheduler.map._markers[event_id].setMap(null); scheduler.map._infowindow.close(); } return true; - }); -}); \ No newline at end of file + }); +}); diff --git a/addons/base_calendar/static/lib/dhtmlxScheduler/sources/ext/ext_matrix.js b/addons/base_calendar/static/lib/dhtmlxScheduler/sources/ext/ext_matrix.js index e36c6d68e75..07ea857c13f 100644 --- a/addons/base_calendar/static/lib/dhtmlxScheduler/sources/ext/ext_matrix.js +++ b/addons/base_calendar/static/lib/dhtmlxScheduler/sources/ext/ext_matrix.js @@ -1,3 +1,7 @@ +/* +This software is allowed to use under GPL or you need to obtain Commercial or Enterise License +to use it in not GPL project. Please contact sales@dhtmlx.com for details +*/ (function(){ scheduler.matrix = {}; scheduler._merge=function(a,b){ @@ -24,6 +28,8 @@ scheduler.createTimelineView=function(obj){ render:"cell", dx:200, dy:50, + fit_events: true, + second_scale: false, _logic: function(render_name, y_unit, timeline) { var res = {}; if(scheduler.checkEvent("onBeforeViewRender")) { @@ -36,14 +42,10 @@ scheduler.createTimelineView=function(obj){ if (scheduler.checkEvent("onTimelineCreated")) { scheduler.callEvent("onTimelineCreated", [obj]); } - - //init custom wrappers - scheduler[obj.name+"_view"]=function(){ - scheduler.renderMatrix.apply(obj, arguments); - }; var old = scheduler.render_data; scheduler.render_data=function(evs, mode){ + if (this._mode == obj.name){ if (mode) //repaint single event, precision is not necessary for (var i=0; i < evs.length; i++) { @@ -58,20 +60,22 @@ scheduler.createTimelineView=function(obj){ scheduler.matrix[obj.name]=obj; scheduler.templates[obj.name+"_cell_value"] = function(ar){ return ar?ar.length:""; }; - scheduler.templates[obj.name+"_cell_class"] = function(ar){ return ""; }; - scheduler.templates[obj.name+"_scalex_class"] = function(ar){ return ""; }; + scheduler.templates[obj.name+"_cell_class"] = function(arr){ return ""; }; + scheduler.templates[obj.name+"_scalex_class"] = function(date){ return ""; }; + scheduler.templates[obj.name+"_second_scalex_class"] = function(date){ return ""; }; - scheduler.templates[obj.name+"_scaley_class"] = function(section_id, section_label, section_options){ return "class"; }; + scheduler.templates[obj.name+"_scaley_class"] = function(section_id, section_label, section_options){ return ""; }; scheduler.templates[obj.name+"_scale_label"] = function(section_id, section_label, section_options){ return section_label; }; scheduler.templates[obj.name+"_tooltip"] = function(a,b,e){ return e.text; }; scheduler.templates[obj.name+"_date"] = function(datea, dateb){ - if (datea.getDay()==dateb.getDay() && datea-dateb<(24*60*60*1000)) + if (datea.getDay()==dateb.getDay() && dateb-datea<(24*60*60*1000)) return scheduler.templates.day_date(datea); return scheduler.templates.week_date(datea, dateb); }; scheduler.templates[obj.name+"_scale_date"] = scheduler.date.date_to_str(obj.x_date||scheduler.config.hour_date); + scheduler.templates[obj.name+"_second_scale_date"] = scheduler.date.date_to_str((obj.second_scale && obj.second_scale.x_date)?obj.second_scale.x_date:scheduler.config.hour_date); scheduler.date["add_"+obj.name]=function(a,b,c){ return scheduler.date.add(a,(obj.x_length||obj.x_size)*b*obj.x_step,obj.x_unit); @@ -87,22 +91,27 @@ scheduler.createTimelineView=function(obj){ } return true; }); - + scheduler.attachEvent("onOptionsLoad",function(){ - obj.order = {}; - for(var i=0; i'+scheduler.templates.event_bar_text(ev.start_date,ev.end_date,ev)+''; + var html='
'+scheduler.templates.event_bar_text(ev.start_date,ev.end_date,ev)+'
'; if (!attach) return html; else { var d = document.createElement("DIV"); d.innerHTML = html; - - var ind = this.order[ev[this.y_property]]; + var ind = this.order[section]; var parent = scheduler._els["dhx_cal_data"][0].firstChild.rows[ind].cells[1].firstChild; scheduler._rendered.push(d.firstChild); @@ -181,15 +198,13 @@ scheduler.render_timeline_event = function(ev, stack, attach){ } }; - function trace_events(){ //minimize event set - var evs = scheduler.getEvents(scheduler._min_date, scheduler._max_date); + var evs = scheduler.get_visible_events(); var matrix =[]; for (var i=0; i < this.y_unit.length; i++) matrix[i]=[]; - //next code defines row for undefined key //most possible it is an artifact of incorrect configuration if (!matrix[y]) @@ -233,15 +248,15 @@ function _getX(ev, isEndPoint, step) { } -function y_scale(d){ - +function y_scale(d){ var html = ""; var evs=[]; - if (scheduler._load_mode && scheduler._load()) return; + if(scheduler._load_mode) + scheduler._load(); if (this.render == "cell") evs = trace_events.call(this); else { - var tevs = scheduler.getEvents(scheduler._min_date, scheduler._max_date); + var tevs = scheduler.get_visible_events(); for (var j=0; jb.start_date?1:-1; }); + var stack=[]; + for (var j=0; j ev.start_date) + stack_pointer++; + stack[stack_pointer]=ev; + //render line + + events_html+=scheduler.render_timeline_event.call(this, ev, stack_pointer); + } + } + + if(this.fit_events){ + var rendered_height = this._events_height[this.y_unit[i].key]||0; + stats.height = (rendered_height>stats.height)?rendered_height:stats.height; + stats.style_height = "height:"+stats.height+"px;"; + } // section 1 - html+=""; + html+=""; if (this.render == "cell"){ for (var j=0; j < scheduler._cols.length; j++) { - html+=""; + html+=""; } } else { //section 2 html+=""; } @@ -329,7 +356,7 @@ function y_scale(d){ } html += "
"+stats.td_content+"
"+stats.td_content+"
"+scheduler.templates[this.name+"_cell_value"](evs[i][j])+"
"+scheduler.templates[this.name+"_cell_value"](evs[i][j])+"
"; - if (evs[i]){ - evs[i].sort(function(a,b){ return a.start_date>b.start_date?1:-1; }); - var stack=[]; - for (var j=0; j ev.start_date) - stack_pointer++; - stack[stack_pointer]=ev; - //render line - - html+=scheduler.render_timeline_event.call(this, ev, stack_pointer); - } - } //section 3 html+=""; for (var j=0; j < scheduler._cols.length; j++) - html+=""; + html+=""; html+="
"; html+="
"; this._matrix = evs; - d.scrollTop = 0; //fix flickering in FF + //d.scrollTop = 0; //fix flickering in FF; disabled as it was impossible to create dnd event if scroll was used (window jumped to the top) d.innerHTML = html; scheduler._rendered = []; @@ -343,35 +370,82 @@ function y_scale(d){ } function x_scale(h){ - h.innerHTML = "
"; h=h.firstChild; - - scheduler._cols=[]; //store for data section - scheduler._colsS={height:0}; - this._trace_x =[]; - - scheduler._min_date_timeline = scheduler._min_date; - - var start = scheduler._min_date; - var summ = scheduler._x-this.dx-18; //border delta + var current_sh = scheduler.xy.scale_height; + var original_sh = this._header_resized||scheduler.xy.scale_height; + scheduler._cols=[]; //store for data section, each column width + scheduler._colsS={height:0}; // heights of the y sections + this._trace_x =[]; // list of dates per cells + var summ = scheduler._x-this.dx-18; //border delta, whole width + var left = [this.dx]; // left margins, initial left margin + var header = scheduler._els['dhx_cal_header'][0]; + header.style.width = (left[0]+summ)+'px'; + + scheduler._min_date_timeline = scheduler._min_date; - var left = this.dx; - - for (var i=0; i"; + var bg_color = (evs[i].color?("background-color:"+evs[i].color+";"):""); + var color = (evs[i].textColor?("color:"+evs[i].textColor+";"):""); + html+="
"; html+="
"+(evs[i]._timed?scheduler.templates.event_date(evs[i].start_date):"")+"
"; html+="
 
"; html+=scheduler.templates[obj.name+"_tooltip"](evs[i].start_date, evs[i].end_date,evs[i])+"
"; @@ -467,10 +557,24 @@ function _init_matrix_tooltip(){ } scheduler.renderMatrix = function(mode){ + scheduler._els['dhx_cal_data'][0].scrollTop=0; var start_date = scheduler.date[this.name+"_start"](scheduler._date); scheduler._min_date = scheduler.date.add(start_date, this.x_start*this.x_step, this.x_unit); scheduler._max_date = scheduler.date.add(scheduler._min_date, this.x_size*this.x_step, this.x_unit); scheduler._table_view = true; + if(this.second_scale) { + if(mode && !this._header_resized) { + this._header_resized = scheduler.xy.scale_height; + scheduler.xy.scale_height *= 2; + scheduler._els['dhx_cal_header'][0].className += " dhx_second_cal_header"; + } + if(!mode && this._header_resized) { + scheduler.xy.scale_height /= 2; + this._header_resized = false; + var header = scheduler._els['dhx_cal_header'][0]; + header.className = header.className.replace(/ dhx_second_cal_header/gi,""); + } + } set_full_view.call(this,mode); }; diff --git a/addons/base_calendar/static/lib/dhtmlxScheduler/sources/ext/ext_minical.js b/addons/base_calendar/static/lib/dhtmlxScheduler/sources/ext/ext_minical.js index d978ec53bb8..a6a02b96445 100644 --- a/addons/base_calendar/static/lib/dhtmlxScheduler/sources/ext/ext_minical.js +++ b/addons/base_calendar/static/lib/dhtmlxScheduler/sources/ext/ext_minical.js @@ -1,3 +1,7 @@ +/* +This software is allowed to use under GPL or you need to obtain Commercial or Enterise License +to use it in not GPL project. Please contact sales@dhtmlx.com for details +*/ scheduler.templates.calendar_month = scheduler.date.date_to_str("%F %Y"); scheduler.templates.calendar_scale_date = scheduler.date.date_to_str("%D"); scheduler.templates.calendar_date = scheduler.date.date_to_str("%d"); @@ -25,7 +29,7 @@ scheduler.renderCalendar=function(obj, _prev){ top:tpos.top + pos.offsetHeight, left:tpos.left }; - }; + } if (!cont) cont = scheduler._get_def_cont(pos); @@ -50,7 +54,7 @@ scheduler.renderCalendar=function(obj, _prev){ cal = this._render_calendar(_prev.parentNode, date, obj, _prev); scheduler.unmarkCalendar(cal); } - + var start = scheduler.date.month_start(date); var end = scheduler.date.add(start,1,"month"); @@ -60,7 +64,8 @@ scheduler.renderCalendar=function(obj, _prev){ var d = ev.start_date; if (d.valueOf()=end.valueOf()) @@ -68,6 +73,8 @@ scheduler.renderCalendar=function(obj, _prev){ } } + + this._markCalendarCurrentDate(cal); cal.conf = obj; @@ -145,7 +152,7 @@ scheduler._render_calendar=function(obj,sd,conf, previous){ if (previous) d = previous; else { - var d = document.createElement("DIV"); + d = document.createElement("DIV"); d.className="dhx_cal_container dhx_mini_calendar"; } d.setAttribute("date",this.templates.xml_format(sd)); @@ -160,6 +167,9 @@ scheduler._render_calendar=function(obj,sd,conf, previous){ d.firstChild.appendChild(arrow); arrow.onclick=function(){ scheduler.updateCalendar(d, scheduler.date.add(d._date, -1, "month")); + if(scheduler._date.getMonth() == d._date.getMonth() && scheduler._date.getFullYear() == d._date.getFullYear()) { + scheduler._markCalendarCurrentDate(d); + } }; arrow = document.createElement("DIV"); @@ -169,10 +179,14 @@ scheduler._render_calendar=function(obj,sd,conf, previous){ d.firstChild.appendChild(arrow); arrow.onclick=function(){ scheduler.updateCalendar(d, scheduler.date.add(d._date, 1, "month")); + if(scheduler._date.getMonth() == d._date.getMonth() && scheduler._date.getFullYear() == d._date.getFullYear()) { + scheduler._markCalendarCurrentDate(d); + } }; - d._date = new Date(sd); + } - + d._date = new Date(sd); + d.week_start = (sd.getDay()-(this.config.start_on_monday?1:0)+7)%7; var dd = this.date.week_start(sd); @@ -180,14 +194,20 @@ scheduler._render_calendar=function(obj,sd,conf, previous){ var r=d.childNodes[2].firstChild.rows; for (var k=r.length; k<6; k++) { - r[0].parentNode.appendChild(r[0].cloneNode(true)); + var last_row = r[r.length-1]; + r[0].parentNode.appendChild(last_row.cloneNode(true)); + var last_day_number = parseInt(last_row.childNodes[last_row.childNodes.length-1].childNodes[0].innerHTML); + last_day_number = (last_day_number<10)?last_day_number:0; // previous week could end on 28-31, so we should start with 0 for (var ri=0; ri < r[k].childNodes.length; ri++) { r[k].childNodes[ri].className = "dhx_after"; - }; + r[k].childNodes[ri].childNodes[0].innerHTML = scheduler.date.to_fixed(++last_day_number); + } } if (!previous) obj.appendChild(d); + + d.childNodes[1].style.height = (d.childNodes[1].childNodes[0].offsetHeight-1)+"px"; // dhx_year_week should have height property so that day dates would get correct position. dhx_year_week height = height of it's child (with the day name) /*restore*/ this._cols=temp; this._mode = temp2; this._colsS = temp3; this._min_date=temp4; this._max_date=temp5; scheduler._date = temp6; ts.month_day=temp7; return d; @@ -235,7 +255,7 @@ scheduler.form_blocks.calendar_time={ var full_day = scheduler.config.full_day; - return "
"+html+"  –  "+html+"
"; + return "
"+html+"  –  "+html+"
"; }, set_value:function(node,value,ev){ @@ -253,7 +273,7 @@ scheduler.form_blocks.calendar_time={ inp.value = scheduler.templates.calendar_time(new_date); inp._date = new Date(new_date); scheduler.destroyCalendar(); - if(scheduler.config.event_duration && number == 0) { //first element = start date + if(scheduler.config.event_duration && scheduler.config.auto_end_date && number == 0) { //first element = start date _update_minical_select(); } } @@ -263,7 +283,10 @@ scheduler.form_blocks.calendar_time={ if(scheduler.config.full_day) { if (!node._full_day){ - node.previousSibling.innerHTML+="
"; + var html = ""; + if (!scheduler.config.wide_form) + html = node.previousSibling.innerHTML+html; + node.previousSibling.innerHTML=html; node._full_day=true; } var input=node.previousSibling.getElementsByTagName("input")[0]; @@ -272,7 +295,7 @@ scheduler.form_blocks.calendar_time={ input.checked = isFulldayEvent; for(var i in selects) selects[i].disabled=input.checked; - for(var i=0; i0) - continue; - scheduler.markCalendar(calendar, dateNew, "dhx_calendar_click"); - dateNew = scheduler.date.add(dateNew,1,"day"); - } - } - } return true; }; @@ -375,4 +380,23 @@ scheduler.linkCalendar=function(calendar, datediff){ scheduler.attachEvent("onEventChanged", action); scheduler.attachEvent("onAfterEventDelete", action); action(); -}; \ No newline at end of file +}; + +scheduler._markCalendarCurrentDate = function(calendar) { + var date = scheduler._date; + var mode = scheduler._mode; + + if(calendar._date.getMonth() == date.getMonth() && calendar._date.getFullYear() == date.getFullYear()) { + if (mode == 'day' || (this._props && !!this._props[mode])) { + scheduler.markCalendar(calendar,date, "dhx_calendar_click"); + } else if (mode == 'week') { + var dateNew = scheduler.date.week_start(new Date(date.valueOf())); + for (var i = 0; i < 7; i++) { + var diff = dateNew.getMonth() + dateNew.getYear()*12 - date.getMonth() - date.getYear()*12; + if (!diff) + scheduler.markCalendar(calendar, dateNew, "dhx_calendar_click"); + dateNew = scheduler.date.add(dateNew,1,"day"); + } + } + } +}; diff --git a/addons/base_calendar/static/lib/dhtmlxScheduler/sources/ext/ext_monthheight.js b/addons/base_calendar/static/lib/dhtmlxScheduler/sources/ext/ext_monthheight.js index 52060ffdde4..6b86b7524d2 100644 --- a/addons/base_calendar/static/lib/dhtmlxScheduler/sources/ext/ext_monthheight.js +++ b/addons/base_calendar/static/lib/dhtmlxScheduler/sources/ext/ext_monthheight.js @@ -1,3 +1,7 @@ +/* +This software is allowed to use under GPL or you need to obtain Commercial or Enterise License +to use it in not GPL project. Please contact sales@dhtmlx.com for details +*/ scheduler.attachEvent("onTemplatesReady",function(){ scheduler.xy.scroll_width = 0; diff --git a/addons/base_calendar/static/lib/dhtmlxScheduler/sources/ext/ext_multiselect.js b/addons/base_calendar/static/lib/dhtmlxScheduler/sources/ext/ext_multiselect.js index 98b14168996..2890d0180a6 100644 --- a/addons/base_calendar/static/lib/dhtmlxScheduler/sources/ext/ext_multiselect.js +++ b/addons/base_calendar/static/lib/dhtmlxScheduler/sources/ext/ext_multiselect.js @@ -1,3 +1,7 @@ +/* +This software is allowed to use under GPL or you need to obtain Commercial or Enterise License +to use it in not GPL project. Please contact sales@dhtmlx.com for details +*/ scheduler.form_blocks["multiselect"]={ render:function(sns) { var _result = "
"; diff --git a/addons/base_calendar/static/lib/dhtmlxScheduler/sources/ext/ext_multisource.js b/addons/base_calendar/static/lib/dhtmlxScheduler/sources/ext/ext_multisource.js index 0773d264e2c..2205f0553a0 100644 --- a/addons/base_calendar/static/lib/dhtmlxScheduler/sources/ext/ext_multisource.js +++ b/addons/base_calendar/static/lib/dhtmlxScheduler/sources/ext/ext_multisource.js @@ -1,3 +1,7 @@ +/* +This software is allowed to use under GPL or you need to obtain Commercial or Enterise License +to use it in not GPL project. Please contact sales@dhtmlx.com for details +*/ (function(){ function backup(obj){ diff --git a/addons/base_calendar/static/lib/dhtmlxScheduler/sources/ext/ext_offline.js b/addons/base_calendar/static/lib/dhtmlxScheduler/sources/ext/ext_offline.js new file mode 100644 index 00000000000..f9e5f946476 --- /dev/null +++ b/addons/base_calendar/static/lib/dhtmlxScheduler/sources/ext/ext_offline.js @@ -0,0 +1,102 @@ +/* +This software is allowed to use under GPL or you need to obtain Commercial or Enterise License +to use it in not GPL project. Please contact sales@dhtmlx.com for details +*/ +scheduler._extra_xle = false; // flag if we are calling xle once again (we don't want to get into loop with scheduler.parse) +scheduler.attachEvent("onXLE", function(){ + if(!scheduler._extra_xle){ + var isEventsLoaded = false; + for(var key in scheduler._events){ + if(scheduler._events[key].text) { + isEventsLoaded = true; + break; + } + } + if((localStorage._updated_events || !isEventsLoaded) && localStorage._events) { + scheduler._extra_xle = true; + scheduler.parse(localStorage._events, "json"); + scheduler._extra_xle = false; + var dp = scheduler._dataprocessor; + var updatedEvents = JSON.parse(localStorage._updated_events); + dp.setUpdateMode("off"); + for(var id in updatedEvents) + dp.setUpdated(id,true,updatedEvents[id]); + dp.sendData(); + dp.setUpdateMode("cell"); + } + } +}); +scheduler.attachEvent("onBeforeEventDelete", function(id, object){ + var status = scheduler._dataprocessor.getState(id); + if(status == 'inserted' && localStorage._updated_events) { + var updated_events = JSON.parse(localStorage._updated_events); + delete updated_events[id]; + for(var id in updated_events){ + localStorage._updated_events = JSON.stringify(updated_events); + break; + } + } + return true; +}); + +var old_delete_event = scheduler.deleteEvent; +scheduler.deleteEvent = function(id, silent){ + old_delete_event.apply(this, arguments); + localStorage._events = scheduler.toJSON(); +}; + +scheduler._offline = {}; +scheduler._offline._after_update_events = []; + +var old_dp_init = scheduler._dp_init; +scheduler._dp_init = function(dp){ + old_dp_init.apply(this, arguments); + + dp.attachEvent("onAfterUpdate",function(sid,action,tid,xml_node){ + scheduler._offline._after_update_events.push(sid); + return true; + }); + dp.attachEvent("onAfterUpdateFinish",function(sid,action,tid,xml_node){ + localStorage._events = scheduler.toJSON(); + var updated_events = JSON.parse(localStorage._updated_events); + for(var i=0; i]*>","g"); + function clean_html(val){ + return val.replace(html_regexp,""); + } function x_norm(x) { x = parseFloat(x); if (isNaN(x)) return "auto"; - return 100 * x / dx; + return 100 * x / (dx + 1); } function y_norm(y) { y = parseFloat(y); @@ -21,8 +28,10 @@ scheduler.toPDF=function(url,mode,header,footer){ } function xml_month_scale(xh){ var xml=""; + if (scheduler.matrix && scheduler.matrix[scheduler._mode]) + xh = xh[0].childNodes; for (var i = 0; i < xh.length; i++) - xml += "\n"; + xml += "\n"; dx = xh[0].offsetWidth; return xml; } @@ -56,7 +65,7 @@ scheduler.toPDF=function(url,mode,header,footer){ days.push(r[i].cells[j].firstChild.innerHTML); } - xml += "\n"; + xml += "\n"; dy = yh.firstChild.rows[0].cells[0].offsetHeight; } return xml; @@ -73,11 +82,11 @@ scheduler.toPDF=function(url,mode,header,footer){ if (scheduler._mode == "agenda"){ var xh = scheduler._els.dhx_cal_header[0].childNodes[0].childNodes; - xml+=""+xh[0].innerHTML+""+xh[1].innerHTML+"" + xml+=""+clean_html(xh[0].innerHTML)+""+clean_html(xh[1].innerHTML)+"" } else if (scheduler._mode == "year"){ var xh = scheduler._els.dhx_cal_data[0].childNodes; for (var i=0; i < xh.length; i++) { - xml+=""; + xml+=""; xml+=xml_month_scale(xh[i].childNodes[1].childNodes); xml+=xml_month(xh[i].childNodes[2]); xml+=""; @@ -89,7 +98,14 @@ scheduler.toPDF=function(url,mode,header,footer){ xml += ""; var yh = scheduler._els.dhx_cal_data[0]; - if (yh.firstChild.tagName == "TABLE") { + if (scheduler.matrix && scheduler.matrix[scheduler._mode]) { + xml += "" + for (var i=0; i < yh.firstChild.rows.length; i++) { + xml+=""; + }; + xml+=""; + dy = yh.firstChild.rows[0].cells[0].offsetHeight; + } else if (yh.firstChild.tagName == "TABLE") { xml += xml_month(yh); } else { yh = yh.childNodes[yh.childNodes.length - 1]; @@ -99,7 +115,7 @@ scheduler.toPDF=function(url,mode,header,footer){ xml += ""; for (var i = 0; i < yh.length; i++) - xml += "\n"; + xml += "\n"; xml += ""; dy = yh[0].offsetHeight; } @@ -117,7 +133,7 @@ scheduler.toPDF=function(url,mode,header,footer){ if (scheduler._mode == "agenda"){ for (var i=0; i < evs.length; i++) - xml+=""+evs[i].childNodes[0].innerHTML+""+evs[i].childNodes[2].innerHTML+""; + xml+=""+clean_html(evs[i].childNodes[0].innerHTML)+""+clean_html(evs[i].childNodes[2].innerHTML)+""; } else if (scheduler._mode == "year"){ var evs = scheduler.get_visible_events(); for (var i=0; i < evs.length; i++) { @@ -129,7 +145,6 @@ scheduler.toPDF=function(url,mode,header,footer){ var day = scheduler.week_starts[m]+d.getDate()-1; xml+=""; - scheduler._mark_year_date(d); d = scheduler.date.add(d,1,"day"); if (d.valueOf()>=scheduler._max_date.valueOf()) break; @@ -138,21 +153,32 @@ scheduler.toPDF=function(url,mode,header,footer){ } else { for (var i = 0; i < evs.length; i++) { var zx = x_norm(evs[i].style.left); - var zy = y_norm(evs[i].style.top); var zdx = x_norm(evs[i].style.width); + var zy = y_norm(evs[i].style.top); var zdy = y_norm(evs[i].style.height); var e_type = evs[i].className.split(" ")[0].replace("dhx_cal_", ""); var dets = scheduler.getEvent(evs[i].getAttribute("event_id")) var day = dets._sday; var week = dets._sweek; if (scheduler._mode != "month") { - if (parseInt(evs[i].style.left) <= 26) { - zx = 2; - zdx += x_norm(evs[i].style.left)-1; - } - if (evs[i].parentNode == scheduler._els.dhx_cal_data[0]) continue; - zx += x_norm(evs[i].parentNode.style.left); - zx -= x_norm(51); + if (scheduler.matrix && scheduler.matrix[scheduler._mode]){ + day = 0; + week = evs[i].parentNode.parentNode.parentNode.rowIndex; + zdx += x_norm(10); + } else { + zdx+=x_norm(zdx*20/100); + zx-=x_norm(20-zx*20/100); + + if (evs[i].parentNode == scheduler._els.dhx_cal_data[0]) continue; + zx += x_norm(evs[i].parentNode.style.left); + zx -= x_norm(51); + } + if (scheduler._mode == "timeline") { + var dy_copy = dy; + dy = 180; + zy = y_norm(evs[i].style.top); + dy = dy_copy; + } } else { zdy = parseInt(evs[i].offsetHeight); zy = parseInt(evs[i].style.top) - 22; @@ -165,14 +191,14 @@ scheduler.toPDF=function(url,mode,header,footer){ if (e_type == "event") { - xml += "
"; + xml += "
"; var text_color = colors?get_style(evs[i].childNodes[2],"color"):""; var bg_color = colors?get_style(evs[i].childNodes[2],"backgroundColor"):""; - xml += ""; + xml += ""; } else { var text_color = colors?get_style(evs[i],"color"):""; var bg_color = colors?get_style(evs[i],"backgroundColor"):""; - xml += ""; + xml += ""; } xml += ""; } @@ -189,7 +215,7 @@ scheduler.toPDF=function(url,mode,header,footer){ d.style.display="none"; document.body.appendChild(d); - d.innerHTML = '
'; + d.innerHTML = '
'; document.getElementById(uid).firstChild.value = xml_top(mode).replace("\u2013", "-") + xml_body() + xml_end(); document.getElementById(uid).submit(); d.parentNode.removeChild(d);grid = null; diff --git a/addons/base_calendar/static/lib/dhtmlxScheduler/sources/ext/ext_readonly.js b/addons/base_calendar/static/lib/dhtmlxScheduler/sources/ext/ext_readonly.js index b11c4fe8048..9bd1df9d859 100644 --- a/addons/base_calendar/static/lib/dhtmlxScheduler/sources/ext/ext_readonly.js +++ b/addons/base_calendar/static/lib/dhtmlxScheduler/sources/ext/ext_readonly.js @@ -1,100 +1,111 @@ -scheduler.attachEvent("onTemplatesReady",function(){ - scheduler.attachEvent("onBeforeLightbox",function(id){ - if (this.config.readonly_form || this.getEvent(id).readonly) - this.config.readonly_active = true; - else { - this.config.readonly_active = false; - return true; - } - - for (var i=0; i < this.config.lightbox.sections.length; i++) { - this.config.lightbox.sections[i].focus = false; - }; - - return true; - }); - - function txt_replace(tag,d,n,text){ +/* +This software is allowed to use under GPL or you need to obtain Commercial or Enterise License +to use it in not GPL project. Please contact sales@dhtmlx.com for details +*/ +scheduler.attachEvent("onTemplatesReady", function() { + scheduler.attachEvent("onBeforeLightbox", function(id) { + if (this.config.readonly_form || this.getEvent(id).readonly) + this.config.readonly_active = true; + else { + this.config.readonly_active = false; + return true; + } + + for (var i = 0; i < this.config.lightbox.sections.length; i++) { + this.config.lightbox.sections[i].focus = false; + } + + return true; + }); + + function txt_replace(tag, d, n, text) { var txts = d.getElementsByTagName(tag); var txtt = n.getElementsByTagName(tag); - for (var i=txtt.length-1; i>=0; i--){ + for (var i = txtt.length - 1; i >= 0; i--) { var n = txtt[i]; if (!text) n.disabled = true; else { var t = document.createElement("SPAN"); t.className = "dhx_text_disabled"; - t.innerHTML=text(txts[i]); - n.parentNode.insertBefore(t,n); - n.parentNode.removeChild(n); + t.innerHTML = text(txts[i]); + n.parentNode.insertBefore(t, n); + n.parentNode.removeChild(n); } } } - - var old = scheduler._fill_lightbox; - scheduler._fill_lightbox=function(){ - var sns = this.config.lightbox.sections; - if (this.config.readonly_active){ - for (var i=0; i < sns.length; i++) { - if (sns[i].type == 'recurring') { - var s = document.getElementById(sns[i].id); - s.style.display=s.nextSibling.style.display='none'; - sns.splice(i,1); - i--; - } - }; - } - - var res = old.apply(this,arguments); - if (this.config.readonly_active){ - - var d = this._get_lightbox(); - var n = this._lightbox_r = d.cloneNode(true); - - txt_replace("textarea",d,n,function(a){ return a.value; }); - txt_replace("input",d,n,false); - txt_replace("select",d,n,function(a){ return a.options[Math.max((a.selectedIndex||0),0)].text; }); - - n.removeChild(n.childNodes[2]); - n.removeChild(n.childNodes[3]); - - d.parentNode.insertBefore(n,d); - - olds.call(this,n); - this._lightbox = n; - this.setLightboxSize(); - this._lightbox = null; - n.onclick=function(e){ - var src=e?e.target:event.srcElement; - if (!src.className) src=src.previousSibling; - if (src && src.className) - switch(src.className){ - case "dhx_cancel_btn": - scheduler.callEvent("onEventCancel",[scheduler._lightbox_id]); - scheduler._edit_stop_event(scheduler.getEvent(scheduler._lightbox_id),false); - scheduler.hide_lightbox(); - break; - } - }; - } - return res; - }; - - var olds = scheduler.showCover; - scheduler.showCover=function(){ - if (!this.config.readonly_active) - olds.apply(this,arguments); + + var old = scheduler._fill_lightbox; + scheduler._fill_lightbox = function() { + var sns = this.config.lightbox.sections; + if (this.config.readonly_active) { + for (var i = 0; i < sns.length; i++) { + if (sns[i].type == 'recurring') { + var s = document.getElementById(sns[i].id); + s.style.display = s.nextSibling.style.display = 'none'; + sns.splice(i, 1); + i--; + } + } + } + + var res = old.apply(this, arguments); + + if (this.config.readonly_active) { + + var d = this._get_lightbox(); + var n = this._lightbox_r = d.cloneNode(true); + n.id = scheduler.uid(); + n.style.color = "red"; + + txt_replace("textarea", d, n, function(a) { + return a.value; + }); + txt_replace("input", d, n, false); + txt_replace("select", d, n, function(a) { + return a.options[Math.max((a.selectedIndex || 0), 0)].text; + }); + + n.removeChild(n.childNodes[2]); + n.removeChild(n.childNodes[3]); + + d.parentNode.insertBefore(n, d); + + olds.call(this, n); + if (scheduler._lightbox) + scheduler._lightbox.parentNode.removeChild(scheduler._lightbox); + this._lightbox = n; + this.setLightboxSize(); + this._lightbox = null; + n.onclick = function(e) { + var src = e ? e.target : event.srcElement; + if (!src.className) src = src.previousSibling; + if (src && src.className) + switch (src.className) { + case "dhx_cancel_btn": + scheduler.callEvent("onEventCancel", [scheduler._lightbox_id]); + scheduler._edit_stop_event(scheduler.getEvent(scheduler._lightbox_id), false); + scheduler.hide_lightbox(); + break; + } + }; + } + return res; }; - - var hold = scheduler.hide_lightbox; - scheduler.hide_lightbox=function(){ - if (this._lightbox_r){ - this._lightbox_r.parentNode.removeChild(this._lightbox_r); - this._lightbox_r = null; - } - - return hold.apply(this,arguments); - }; - - -}); \ No newline at end of file + + var olds = scheduler.showCover; + scheduler.showCover = function() { + if (!this.config.readonly_active) + olds.apply(this, arguments); + }; + + var hold = scheduler.hide_lightbox; + scheduler.hide_lightbox = function() { + if (this._lightbox_r) { + this._lightbox_r.parentNode.removeChild(this._lightbox_r); + this._lightbox_r = null; + } + + return hold.apply(this, arguments); + }; +}); diff --git a/addons/base_calendar/static/lib/dhtmlxScheduler/sources/ext/ext_serialize.js b/addons/base_calendar/static/lib/dhtmlxScheduler/sources/ext/ext_serialize.js index 879ab661c62..9d19f520861 100644 --- a/addons/base_calendar/static/lib/dhtmlxScheduler/sources/ext/ext_serialize.js +++ b/addons/base_calendar/static/lib/dhtmlxScheduler/sources/ext/ext_serialize.js @@ -1,3 +1,7 @@ +/* +This software is allowed to use under GPL or you need to obtain Commercial or Enterise License +to use it in not GPL project. Please contact sales@dhtmlx.com for details +*/ //redefine this method, if you want to provide a custom set of attributes for serialization scheduler.data_attributes=function(){ var attrs = []; diff --git a/addons/base_calendar/static/lib/dhtmlxScheduler/sources/ext/ext_tooltip.js b/addons/base_calendar/static/lib/dhtmlxScheduler/sources/ext/ext_tooltip.js index 2146c8f9414..512cafebd5f 100644 --- a/addons/base_calendar/static/lib/dhtmlxScheduler/sources/ext/ext_tooltip.js +++ b/addons/base_calendar/static/lib/dhtmlxScheduler/sources/ext/ext_tooltip.js @@ -1,4 +1,8 @@ -window.dhtmlXTooltip={version:0.1}; +/* +This software is allowed to use under GPL or you need to obtain Commercial or Enterise License +to use it in not GPL project. Please contact sales@dhtmlx.com for details +*/ +window.dhtmlXTooltip={}; dhtmlXTooltip.config = { className: 'dhtmlXTooltip tooltip', @@ -11,64 +15,77 @@ dhtmlXTooltip.tooltip = document.createElement('div'); dhtmlXTooltip.tooltip.className = dhtmlXTooltip.config.className; dhtmlXTooltip.show = function(event, text) { //browser event, text to display - dhtmlXTooltip.tooltip.className = dhtmlXTooltip.config.className; + var dhxTooltip = dhtmlXTooltip; + var tooltip_div = this.tooltip; + var tooltip_div_style = tooltip_div.style; + dhxTooltip.tooltip.className = dhxTooltip.config.className; var pos=this.position(event); - + var target = event.target||event.srcElement; if (this.isTooltip(target)) {return;} // if we are over tooltip -- do nothing, just return (so tooltip won't move) - var actual_x = pos.x+dhtmlXTooltip.config.delta_x||0; - var actual_y = pos.y-dhtmlXTooltip.config.delta_y||0; + var offsetleft = 0; + var offsettop = 0; + var pobj = scheduler._obj; + if(pobj.offsetParent) { + do { + offsetleft += pobj.offsetLeft; + offsettop += pobj.offsetTop; + } while (pobj = pobj.offsetParent); + } - this.tooltip.style.visibility = "hidden"; + var actual_x = pos.x + (dhxTooltip.config.delta_x||0) - offsetleft; + var actual_y = pos.y - (dhxTooltip.config.delta_y||0) - offsettop; - if(this.tooltip.style.removeAttribute) { - this.tooltip.style.removeAttribute("right"); - this.tooltip.style.removeAttribute("bottom"); + tooltip_div_style.visibility = "hidden"; + + if(tooltip_div_style.removeAttribute) { + tooltip_div_style.removeAttribute("right"); + tooltip_div_style.removeAttribute("bottom"); } else { - this.tooltip.style.removeProperty("right"); - this.tooltip.style.removeProperty("bottom"); + tooltip_div_style.removeProperty("right"); + tooltip_div_style.removeProperty("bottom"); } - this.tooltip.style.left = "0px"; - this.tooltip.style.top = "0px"; + tooltip_div_style.left = "0"; + tooltip_div_style.top = "0"; this.tooltip.innerHTML = text; scheduler._obj.appendChild(this.tooltip); var tooltip_width = this.tooltip.offsetWidth; var tooltip_height = this.tooltip.offsetHeight; - - if (document.body.offsetWidth - actual_x - tooltip_width < 0) { // tooltip is out of the right page bound - if(this.tooltip.style.removeAttribute) - this.tooltip.style.removeAttribute("left"); + + if ((scheduler._obj.offsetWidth - actual_x - (scheduler.xy.margin_left||0) - tooltip_width) < 0) { // tooltip is out of the right page bound + if(tooltip_div_style.removeAttribute) + tooltip_div_style.removeAttribute("left"); else - this.tooltip.style.removeProperty("left"); - this.tooltip.style.right = (document.body.offsetWidth - actual_x + 2 * dhtmlXTooltip.config.delta_x||0) + "px"; + tooltip_div_style.removeProperty("left"); + tooltip_div_style.right = (scheduler._obj.offsetWidth - actual_x + 2 * (dhxTooltip.config.delta_x||0)) + "px"; } else { if (actual_x < 0) { // tooltips is out of the left page bound - this.tooltip.style.left = (pos.x + Math.abs(dhtmlXTooltip.config.delta_x||0)) + "px"; + tooltip_div_style.left = (pos.x + Math.abs(dhxTooltip.config.delta_x||0)) + "px"; } else { // normal situation - this.tooltip.style.left = actual_x + "px"; + tooltip_div_style.left = actual_x + "px"; } } - - if (document.body.offsetHeight - actual_y - tooltip_height < 0) { // tooltip is below bottom of the page - if(this.tooltip.style.removeAttribute) - this.tooltip.style.removeAttribute("top"); + + if ((scheduler._obj.offsetHeight - actual_y - (scheduler.xy.margin_top||0) - tooltip_height) < 0) { // tooltip is below bottom of the page + if(tooltip_div_style.removeAttribute) + tooltip_div_style.removeAttribute("top"); else - this.tooltip.style.removeProperty("top"); - this.tooltip.style.bottom = (document.body.offsetHeight - actual_y - 2 * dhtmlXTooltip.config.delta_y||0) + "px"; + tooltip_div_style.removeProperty("top"); + tooltip_div_style.bottom = (scheduler._obj.offsetHeight - actual_y - 2 * (dhxTooltip.config.delta_y||0)) + "px"; } else { if (actual_y < 0) { // tooltip is higher then top of the page - this.tooltip.style.top = (pos.y + Math.abs(dhtmlXTooltip.config.delta_y||0)) + "px"; + tooltip_div_style.top = (pos.y + Math.abs(dhxTooltip.config.delta_y||0)) + "px"; } else { // normal situation - this.tooltip.style.top = actual_y + "px"; + tooltip_div_style.top = actual_y + "px"; } } - this.tooltip.style.visibility = "visible"; + tooltip_div_style.visibility = "visible"; }; dhtmlXTooltip.hide = function() { @@ -82,7 +99,7 @@ dhtmlXTooltip.delay = function(method, object, params, delay) { } this.tooltip._timeout_id = setTimeout(function(){ var ret = method.apply(object,params); - method = obj = params = null; + method = object = params = null; return ret; },delay||this.config.timeout_to_display); }; @@ -97,7 +114,7 @@ dhtmlXTooltip.isTooltip = function(node){ }; dhtmlXTooltip.position = function(ev) { - var ev = ev || window.event; + ev = ev || window.event; if(ev.pageX || ev.pageY) //FF, KHTML return {x:ev.pageX, y:ev.pageY}; //IE @@ -109,25 +126,35 @@ dhtmlXTooltip.position = function(ev) { }; scheduler.attachEvent("onMouseMove", function(event_id, e){ // (scheduler event_id, browser event) - var ev = e||window.event; + var ev = window.event||e; var target = ev.target||ev.srcElement; + var dhxTooltip = dhtmlXTooltip; - if (event_id || dhtmlXTooltip.isTooltip(target)) { // if we are over event or tooltip - var event = scheduler.getEvent(event_id) || scheduler.getEvent(dhtmlXTooltip.tooltip.event_id); - dhtmlXTooltip.tooltip.event_id = event.id; + if (event_id || dhxTooltip.isTooltip(target)) { // if we are over event or tooltip + var event = scheduler.getEvent(event_id) || scheduler.getEvent(dhxTooltip.tooltip.event_id); + if(!event) + return; + dhxTooltip.tooltip.event_id = event.id; var text = scheduler.templates.tooltip_text(event.start_date, event.end_date, event); - if (_isIE) { //make a copy of event, will be used in timed call - var evt = document.createEventObject(ev); + var evt = undefined; + if (_isIE) { //make a copy of event, will be used in timed call + evt = document.createEventObject(ev); } - - dhtmlXTooltip.delay(dhtmlXTooltip.show, dhtmlXTooltip, [ evt||ev , text]); // showing tooltip + + dhxTooltip.delay(dhxTooltip.show, dhxTooltip, [(evt||ev), text]); // showing tooltip } else { - dhtmlXTooltip.delay(dhtmlXTooltip.hide, dhtmlXTooltip, []); + dhxTooltip.delay(dhxTooltip.hide, dhxTooltip, []); } }); +scheduler.attachEvent("onBeforeDrag", function(){ + dhtmlXTooltip.hide(); + return true; +}); /* Could be redifined */ +scheduler.templates.tooltip_date_format=scheduler.date.date_to_str("%Y-%m-%d %H:%i"); + scheduler.templates.tooltip_text = function(start,end,event) { return "Event: "+event.text+"
Start date: "+scheduler.templates.tooltip_date_format(start)+"
End date: "+scheduler.templates.tooltip_date_format(end); -}; \ No newline at end of file +}; diff --git a/addons/base_calendar/static/lib/dhtmlxScheduler/sources/ext/ext_touch.js b/addons/base_calendar/static/lib/dhtmlxScheduler/sources/ext/ext_touch.js deleted file mode 100644 index 9dde6fd89b4..00000000000 --- a/addons/base_calendar/static/lib/dhtmlxScheduler/sources/ext/ext_touch.js +++ /dev/null @@ -1,411 +0,0 @@ -TouchScroll=function(node, nontouch, scroll, compat){ - this.debug = !!nontouch; - this.compat = !!compat; - this.rough = !!scroll; - - - this.axisX = this.axisY = true; - - if (typeof node!= "object") - node = document.getElementById(node); - - this._init(); - node.addEventListener("touchstart",this,false); - node.addEventListener("webkitTransitionEnd",this,false); - if (this.debug) - node.addEventListener("mousedown",this,false); - - - this.node = node; - for (var i=0; i < node.childNodes.length; i++) - if (node.childNodes[i].nodeType == 1){ - this.area = node.childNodes[i]; - break; - } - - if (window.getComputedStyle(this.node).position == "static") - this.node.style.position = "relative" - this.area.style.cssText += "-webkit-transition: -webkit-transform; -webkit-user-select:none; -webkit-transform-style:preserve-3d;"; - this.scrolls={}; -}; - -TouchScroll.prototype = { - refresh:function(){ - this.node.style.webkitTransformStyle="flat"; - this.node.style.webkitTransformStyle="preserve-3d"; - }, - scrollTo:function(x,y,speed){ - this.set_matrix({e:x,f:y}, (speed||0)); - }, - onscroll:function(x,y){}, - handleEvent:function(ev){ - return this["ev_"+ev.type](ev); - }, - get_matrix:function(node){ - return new WebKitCSSMatrix(window.getComputedStyle(node||this.area).webkitTransform); - }, - set_matrix:function(value,speed,node){ - (node||this.area).style.webkitTransform = "translate("+Math.round(value.e)+"px,"+Math.round(value.f)+"px)"; - (node||this.area).style.webkitTransitionDuration= speed; - }, - ev_touchstart:function(ev){ - this.ev_mousedown(ev.touches[0]); - ev.preventDefault(); - return false; - }, - ev_mousedown:function(ev){ - var touch = ev; - - this.x = touch.pageX; - this.y = touch.pageY; - this.dx = this.node.offsetWidth; - this.dy = this.node.offsetHeight; - this.mx = this.area.scrollWidth; - this.my = this.area.scrollHeight; - this.target = touch.target; - - if (!this.rough){ - var temp = this.get_matrix(); - this.target_x = temp.e; - this.target_y = temp.f; - if (!this.scroll && this.compat){ - temp.e = this.node.scrollLeft*-1; - temp.f = this.node.scrollTop*-1; - this.node.scrollTop = this.node.scrollLeft = 0; - } - - this.set_matrix(temp,0); - this._correct_scroll(this.target_x, this.target_y); - } - this.scroll_x = this.scroll_y = this.scroll = false; - - - this._init_events(); - }, - ev_touchend:function(){ - return this.ev_mouseup(); - }, - ev_mouseup:function(){ - this._deinit_events(); - if (!this.scroll){ - this._remove_scroll(); - var ev = document.createEvent("MouseEvent"); - ev.initMouseEvent("click",true, true); - this.target.dispatchEvent(ev); - } - this.target = null; - }, - ev_webkitTransitionEnd:function(){ - if (this.target || !this.scroll) return; - - this._remove_scroll(); - var temp = this.get_matrix(); - this.node.firstChild._scrollTop = -1*temp.f; - - if (this.compat && (temp.e||temp.f)){ - var y = temp.f; var x = temp.e; - temp.e = temp.f = 0; - this.set_matrix(temp,0); - - this.node.scrollTop = -1*y; - this.node.scrollLeft = -1*x; - } - - this.scroll = false; - }, - ev_touchmove:function(ev){ - return this.ev_mousemove(ev.touches[0]); - }, - ev_mousemove:function(ev){ - if (!this.target) return; - var touch = ev; - - var dx = (touch.pageX - this.x)*(this.axisX?5:0);//Math.min(3,this.mx/this.dx); - var dy = (touch.pageY - this.y)*(this.axisY?5:0);//Math.min(3,this.my/this.dy); - - if (Math.abs(dx)<10 && Math.abs(dy)<10) return; - - if (Math.abs(dx)>50) - this.scroll_x=true; - if (Math.abs(dy)>50) - this.scroll_y=true; - - - if (this.scroll_x || this.scroll_y){ - this.x = touch.pageX; this.y = touch.pageY; - this.scroll = true; - var temp = this.get_matrix(); - dx = dx + (this.target_x - temp.e); - dy = dy + (this.target_y - temp.f); - - var speed = "2000ms"; - var fast = "500ms"; - this.target_x = dx+temp.e; - this.target_y = dy+temp.f; - - if (this.target_x > 0) { - this.target_x = 0; - speed = fast; - } - if (this.target_y > 0) { - this.target_y = 0; - speed = fast; - } - if (this.mx - this.dx + this.target_x < 0){ - this.target_x = - this.mx + this.dx; - speed = fast; - } - if (this.my - this.dy + this.target_y < 0){ - this.target_y = - this.my + this.dy; - speed = fast; - } - - - this.set_matrix({e:this.target_x,f:this.target_y},speed); - this._add_scroll(temp.e, temp.f); - this._correct_scroll(this.target_x, this.target_y, speed); - this.onscroll(this.target_x, this.target_y); - } - return false; - }, - _correct_scroll:function(x,y,speed){ - if (this.scrolls.x){ - var stemp = this.get_matrix(this.scrolls.x); - var sx = this.dx*x/this.mx; - this.set_matrix({e:-1*sx,f:0}, speed, this.scrolls.x); - } - if (this.scrolls.y){ - var stemp = this.get_matrix(this.scrolls.y); - var sy = this.dy*y/this.my; - this.set_matrix({e:0,f:-1*sy}, speed, this.scrolls.y); - } - }, - _remove_scroll:function(){ - if (this.scrolls.x) - this.scrolls.x.parentNode.removeChild(this.scrolls.x); - if (this.scrolls.y) - this.scrolls.y.parentNode.removeChild(this.scrolls.y); - this.scrolls = {}; - }, - _add_scroll:function(){ - if (this.scrolls.ready) return; - - var d; - if (this.my>5 && this.axisY){ - var h = this.dy*this.dy/this.my-1; - this.scrolls.y = d = document.createElement("DIV"); - d.className="dhx_scroll_y"; - d.style.height = h +"px"; - this.node.appendChild(d); - } - if (this.mx>5 && this.axisX){ - var h = this.dx*this.dx/this.mx; - this.scrolls.x = d = document.createElement("DIV"); - d.className="dhx_scroll_x"; - d.style.width = h +"px"; - this.node.appendChild(d); - } - - var temp = this.get_matrix(); - this._correct_scroll(temp.e, temp.f, 0); - this.scrolls.ready = true; - }, - _init_events:function(){ - document.addEventListener("touchmove",this,false); - document.addEventListener("touchend",this,false); - if (this.debug){ - document.addEventListener("mousemove",this,false); - document.addEventListener("mouseup",this,false); - } - }, - _deinit_events:function(){ - document.removeEventListener("touchmove",this,false); - document.removeEventListener("touchend",this,false); - if (this.debug){ - document.removeEventListener("mousemove",this,false); - document.removeEventListener("mouseup",this,false); - } - }, - _init:function(){ - document.styleSheets[0].insertRule(".dhx_scroll_x { width:50px;height:4px;background:rgba(0, 0, 0, 0.4);position:absolute; left:0px; bottom:3px; border:1px solid transparent; -webkit-border-radius:4px;-webkit-transition: -webkit-transform;}",0); - document.styleSheets[0].insertRule(".dhx_scroll_y { width:4px;height:50px;background:rgba(0, 0, 0, 0.4);position:absolute; top:0px; right:3px; border:1px solid transparent; -webkit-border-radius:4px;-webkit-transition: -webkit-transform;}",0); - this._init = function(){}; - } -}; - - - - - -scheduler._ipad_before_init=function(){ - scheduler._ipad_before_init=function(){}; - scheduler.xy.scroll_width = 0; - - var tabs = scheduler._els["dhx_cal_tab"]; - var right = 42; - for (var i=tabs.length-1; i >=0; i--) { - tabs[i].style.cssText+="top:4px;"; - tabs[i].style.left="auto"; - tabs[i].style.right = right+"px"; - if (i==0) - tabs[i].style.cssText+=";-webkit-border-top-left-radius: 5px; -webkit-border-bottom-left-radius: 5px;"; - if (i==tabs.length-1) - tabs[i].style.cssText+=";-webkit-border-top-right-radius: 5px; -webkit-border-bottom-right-radius: 5px;"; - - right+=100; - }; - - scheduler._els["dhx_cal_prev_button"][0].innerHTML = "<"; - scheduler._els["dhx_cal_next_button"][0].innerHTML = ">"; - var d = document.createElement("div"); - d.className = "dhx_cal_add_button"; - d.innerHTML = "+ "; - d.onclick = function(){ - var now = new Date(); - if (now > scheduler._min_date && now < scheduler._max_date) - scheduler.addEventNow(); - else - scheduler.addEventNow(scheduler._min_date.valueOf()); - } - scheduler._els["dhx_cal_navline"][0].appendChild(d); - - - this._obj.onmousedown = this._obj.onmouseup = this._obj.onmousemove = function(){}; - - var long_tap = null; - var long_tap_pos = []; - this._obj.ontouchmove=function(e){ - if (long_tap){ - var dx = Math.abs(e.touches[0].pageX - long_tap_pos[0]); - var dy = Math.abs(e.touches[0].pageY - long_tap_pos[1]); - if (dx>50 || dy>50) - long_tap = window.clearTimeout(long_tap); - } - if (scheduler.config.touch_actions) - scheduler._on_mouse_move(e.touches[0]); - } - this._obj.ontouchstart = function(e){ - if (scheduler._lightbox_id) return; - - long_tap = window.setTimeout(function(){ - scheduler._on_dbl_click(e.touches[0],(e.target.className?e.target:e.target.parentNode)); - },400); - long_tap_pos = [e.touches[0].pageX, e.touches[0].pageY]; - if (scheduler.config.touch_actions) - scheduler._on_mouse_down(e.touches[0]); - } - this._obj.ontouchend = function(e){ - if (long_tap) - long_tap = window.clearTimeout(long_tap); - if (scheduler.config.touch_actions) - scheduler._on_mouse_up(e.touches[0]); - } -} -scheduler._ipad_init=function(){ - var d = document.createElement("DIV"); - var data = scheduler._els["dhx_cal_data"][0]; - d.appendChild(data); - d.style.cssText = "overflow:hidden; width:100%; overflow:hidden;position:relative;"; - this._obj.appendChild(d); - - data.style.overflowY = "hidden"; - - var scroll = new TouchScroll(d); - scroll.axisX = false; - scheduler._ipad_init = function(){ - data.parentNode.style.height = data.style.height; - data.parentNode.style.top = data.style.top; - data.style.height = data.scrollHeight+"px"; - data.style.top = "0px"; - - if (Math.abs(data.parentNode.offsetHeight - data.offsetHeight)<5){ - scroll.axisY=false; - scroll.scrollTo(0,0,0); - } else - scroll.axisY=true; - - scroll.refresh(); - }; - - scheduler.attachEvent("onSchedulerResize", function(){ - setTimeout(function(){ - scheduler._ipad_init(); - }); - return true; - }) - - scheduler._ipad_init(); -}; - -scheduler.attachEvent("onViewChange",function(){ - scheduler._ipad_init(); -}); -scheduler.attachEvent("onBeforeViewChange",function(){ - scheduler._ipad_before_init(); - return true; -}); - -scheduler.showCover=function(box){ - this.show_cover(); - if (box){ - box.style.display="block"; - var pos = getOffset(this._obj); - box.style.top = box.offsetHeight*-1+"px"; - box.style.left = Math.round(pos.left+(this._obj.offsetWidth-box.offsetWidth)/2)+"px"; - } - - var node =this._get_lightbox(); - node.style.webkitTransform = "translate(0px,"+(box.offsetHeight+41)+"px)"; - node.style.webkitTransitionDuration = "500ms"; -}; - -scheduler.hideCover=function(box){ - if (box){ - box.style.webkitTransform = "translate(0px,"+(box.offsetHeight+41)*-1+"px)"; - box.style.webkitTransitionDuration = "500ms"; - } - this.hide_cover(); -} - -scheduler.config.lightbox.sections[0].height = 100; -if (scheduler.form_blocks.calendar_time){ - scheduler.config.lightbox.sections[1].type = "calendar_time"; - scheduler._mini_cal_arrows = ["<", ">"]; -} - -scheduler.xy.menu_width = 0; -scheduler.attachEvent("onClick", function(){ - return false; -}); - -scheduler.locale.labels.new_event=""; - -scheduler._mouse_coords=function(ev){ - var pos; - var b=document.body; - var d = document.documentElement; - if(ev.pageX || ev.pageY) - pos={x:ev.pageX, y:ev.pageY}; - else pos={ - x:ev.clientX + (b.scrollLeft||d.scrollLeft||0) - b.clientLeft, - y:ev.clientY + (b.scrollTop||d.scrollTop||0) - b.clientTop - } - - //apply layout - pos.x-=getAbsoluteLeft(this._obj)+(this._table_view?0:this.xy.scale_width); - var top = - pos.y-=getAbsoluteTop(this._obj)+this.xy.nav_height+this._dy_shift+this.xy.scale_height-(this._els["dhx_cal_data"][0]._scrollTop||0); - //transform to date - if (!this._table_view){ - pos.x=Math.max(0,Math.ceil(pos.x/this._cols[0])-1); - pos.y=Math.max(0,Math.ceil(pos.y*60/(this.config.time_step*this.config.hour_size_px))-1)+this.config.first_hour*(60/this.config.time_step); - } else { - var dy=0; - for (dy=1; dy < this._colsS.heights.length; dy++) - if (this._colsS.heights[dy]>pos.y) break; - - pos.y=(Math.max(0,Math.ceil(pos.x/this._cols[0])-1)+Math.max(0,dy-1)*7)*24*60/this.config.time_step; - pos.x=0; - } - return pos; -} diff --git a/addons/base_calendar/static/lib/dhtmlxScheduler/sources/ext/ext_treetimeline.js b/addons/base_calendar/static/lib/dhtmlxScheduler/sources/ext/ext_treetimeline.js index 9fb08261470..d92a4be8428 100644 --- a/addons/base_calendar/static/lib/dhtmlxScheduler/sources/ext/ext_treetimeline.js +++ b/addons/base_calendar/static/lib/dhtmlxScheduler/sources/ext/ext_treetimeline.js @@ -1,8 +1,16 @@ +/* +This software is allowed to use under GPL or you need to obtain Commercial or Enterise License +to use it in not GPL project. Please contact sales@dhtmlx.com for details +*/ scheduler.attachEvent("onTimelineCreated", function (obj){ if(obj.render == "tree") { obj.y_unit_original = obj.y_unit; obj.y_unit = scheduler._getArrayToDisplay(obj.y_unit_original); + + scheduler.attachEvent('onOptionsLoadStart', function(){ + obj.y_unit = scheduler._getArrayToDisplay(obj.y_unit_original); + }); scheduler.form_blocks[obj.name]={ render:function(sns) { @@ -33,7 +41,7 @@ scheduler.attachEvent("onTimelineCreated", function (obj){ focus:function(node){ } }; - }; + } }); scheduler.attachEvent("onBeforeViewRender", function (render_name, y_unit, timeline){ @@ -61,7 +69,7 @@ scheduler.attachEvent("onBeforeViewRender", function (render_name, y_unit, timel div_expand = ''; table_className = "dhx_data_table"; } - td_content = "
"+div_expand+"
"+(scheduler.templates[timeline.name+'_scale_label'](y_unit.key, y_unit.label, timeline)||y_unit.label)+"
"; + td_content = "
"+div_expand+"
"+(scheduler.templates[timeline.name+'_scale_label'](y_unit.key, y_unit.label, y_unit)||y_unit.label)+"
"; res = { height: height, @@ -81,7 +89,7 @@ var section_id_before; // section id of the event before dragging (to bring it b scheduler.attachEvent("onBeforeEventChanged", function(event_object, native_event, is_new) { if (scheduler._isRender("tree")) { // if mode's render == tree - var section = scheduler.getSection(event_object.section_id); + var section = scheduler.getSection(event_object[scheduler.matrix[scheduler._mode].y_property]); if (typeof section.children != 'undefined' && !scheduler.matrix[scheduler._mode].folder_events_available) { if (!is_new) { //if old - move back event_object[scheduler.matrix[scheduler._mode].y_property] = section_id_before; @@ -140,7 +148,7 @@ scheduler._getArrayForSelect = function(array, mode){ // function to flatten out } if(array[i].children) fillResultArray(array[i].children, mode); - }; + } }; fillResultArray(array); return result; @@ -228,6 +236,14 @@ scheduler.deleteSection = function(id){ } }; +scheduler.deleteAllSections = function(){ + if(scheduler._isRender("tree")) { + scheduler.matrix[scheduler._mode].y_unit_original = []; + scheduler.matrix[scheduler._mode].y_unit = scheduler._getArrayToDisplay(scheduler.matrix[scheduler._mode].y_unit_original); + scheduler.callEvent("onOptionsLoad",[]); + } +}; + scheduler.addSection = function(obj, parent_id){ if(scheduler._isRender("tree")) { var result = false; diff --git a/addons/base_calendar/static/lib/dhtmlxScheduler/sources/ext/ext_url.js b/addons/base_calendar/static/lib/dhtmlxScheduler/sources/ext/ext_url.js index 744fe2c27ae..01d030ec83b 100644 --- a/addons/base_calendar/static/lib/dhtmlxScheduler/sources/ext/ext_url.js +++ b/addons/base_calendar/static/lib/dhtmlxScheduler/sources/ext/ext_url.js @@ -1,3 +1,7 @@ +/* +This software is allowed to use under GPL or you need to obtain Commercial or Enterise License +to use it in not GPL project. Please contact sales@dhtmlx.com for details +*/ scheduler.attachEvent("onTemplatesReady",function(){ var first = true; var s2d = scheduler.date.str_to_date("%Y-%m-%d"); diff --git a/addons/base_calendar/static/lib/dhtmlxScheduler/sources/ext/ext_week_agenda.js b/addons/base_calendar/static/lib/dhtmlxScheduler/sources/ext/ext_week_agenda.js new file mode 100644 index 00000000000..9aa8b46d4cc --- /dev/null +++ b/addons/base_calendar/static/lib/dhtmlxScheduler/sources/ext/ext_week_agenda.js @@ -0,0 +1,255 @@ +/* +This software is allowed to use under GPL or you need to obtain Commercial or Enterise License +to use it in not GPL project. Please contact sales@dhtmlx.com for details +*/ +scheduler._wa = {}; +scheduler.xy.week_agenda_scale_height = 20; +scheduler.templates.week_agenda_event_text = function(start_date, end_date, event, date) { + return scheduler.templates.event_date(start_date) + " " + event.text; +}; +scheduler.date.week_agenda_start = scheduler.date.week_start; +scheduler.date.week_agenda_end = function(date){ + return scheduler.date.add(date, 7, "day"); +}; +scheduler.date.add_week_agenda = function(date, inc){ + return scheduler.date.add(date, inc*7, "day"); +}; + +scheduler.attachEvent("onSchedulerReady", function(){ + var t = scheduler.templates; + if(!t.week_agenda_date) + t.week_agenda_date = t.week_date; +}); + +(function(){ + var scale_date_format = scheduler.date.date_to_str("%l, %F %d"); + scheduler.templates.week_agenda_scale_date = function(date) { + return scale_date_format(date); + }; +})(); + +scheduler.attachEvent("onTemplatesReady", function() { + + scheduler.attachEvent("onSchedulerResize", function() { + if (this._mode == "week_agenda") { + this.week_agenda_view(true); + return false; + } + return true; + }); + + var old = scheduler.render_data; + scheduler.render_data = function(evs) { + if (this._mode == "week_agenda") { + fillWeekAgendaTab(); + } + else + return old.apply(this, arguments); + }; + + var getColumnSizes = function() { + // widths + scheduler._cols = []; + var twidth = parseInt(scheduler._els['dhx_cal_data'][0].style.width); + scheduler._cols.push(Math.floor(twidth / 2)); + scheduler._cols.push(twidth - scheduler._cols[0] - 1); // To add border between columns + + // heights + scheduler._colsS = { + 0: [], + 1: [] + }; + var theight = parseInt(scheduler._els['dhx_cal_data'][0].style.height); + for (var i = 0; i < 3; i++) { + scheduler._colsS[0].push(Math.floor(theight / (3 - scheduler._colsS[0].length))); + theight -= scheduler._colsS[0][i]; + } + scheduler._colsS[1].push(scheduler._colsS[0][0]); + scheduler._colsS[1].push(scheduler._colsS[0][1]); + // last two days + theight = scheduler._colsS[0][scheduler._colsS[0].length - 1]; + scheduler._colsS[1].push(Math.floor(theight / 2)); + scheduler._colsS[1].push(theight - scheduler._colsS[1][scheduler._colsS[1].length - 1]); + }; + var fillWeekAgendaTab = function() { + scheduler._els["dhx_cal_data"][0].innerHTML = ''; + var html = ''; + for (var i = 0; i < 2; i++) { + var width = scheduler._cols[i]; + var column_css = 'dhx_wa_column'; + if (i == 1) + column_css += ' dhx_wa_column_last'; + html += "
"; + for (var k = 0; k < scheduler._colsS[i].length; k++) { + var scale_height = scheduler.xy.week_agenda_scale_height - 2; + var height = scheduler._colsS[i][k] - scale_height - 2; + html += "
"; + } + html += "
"; + } + scheduler._els["dhx_cal_date"][0].innerHTML = scheduler.templates[scheduler._mode+"_date"](scheduler._min_date, scheduler._max_date, scheduler._mode); + scheduler._els["dhx_cal_data"][0].innerHTML = html; + var all_divs = scheduler._els["dhx_cal_data"][0].getElementsByTagName('div'); + var day_divs = []; + for (var i = 0; i < all_divs.length; i++) { + if (all_divs[i].className == 'dhx_wa_day_cont') + day_divs.push(all_divs[i]); + } + scheduler._wa._selected_divs = []; + var events = scheduler.get_visible_events(); // list of events to be displayed in current week + var tstart = scheduler.date.week_start(scheduler._date); + var tend = scheduler.date.add(tstart, 1, "day"); + for (var i = 0; i < 7; i++) { + day_divs[i]._date = tstart; + var scale_bar = day_divs[i].childNodes[0]; + var events_div = day_divs[i].childNodes[1]; + scale_bar.innerHTML = scheduler.templates.week_agenda_scale_date(tstart); + var evs = []; // events which will be displayed in the current day + for (var j = 0; j < events.length; j++) { + var tev = events[j]; + if(tev.start_datetstart) + evs.push(tev); + } + evs.sort(function(a,b){ + if(a.start_date.valueOf()==b.start_date.valueOf()) + return a.id>b.id?1:-1; + return a.start_date>b.start_date?1:-1; + }); + for (var k = 0; k < evs.length; k++) { + var ev = evs[k]; + var ev_div = document.createElement('div'); + scheduler._rendered.push(ev_div); + ev_div.className = 'dhx_wa_ev_body'; + if(ev._text_style) + ev_div.style.cssText = ev._text_style; + if(ev.color) + ev_div.style.backgroundColor = ev.color; + if(ev.textColor) + ev_div.style.color = ev.textColor; + if(scheduler._select_id && ev.id == scheduler._select_id) { + ev_div.className += " dhx_cal_event_selected"; + scheduler._wa._selected_divs.push(ev_div); + } + var position = ""; + if(!ev._timed){ + position = "middle"; + if(ev.start_date.valueOf() >= tstart.valueOf() && ev.start_date.valueOf() <= tend.valueOf()) + position = "start"; + if(ev.end_date.valueOf() >= tstart.valueOf() && ev.end_date.valueOf() <= tend.valueOf()) + position = "end"; + } + ev_div.innerHTML = scheduler.templates.week_agenda_event_text(ev.start_date, ev.end_date, ev, tstart, position); + ev_div.setAttribute('event_id', ev.id); + events_div.appendChild(ev_div); + } + tstart = scheduler.date.add(tstart, 1, "day"); + tend = scheduler.date.add(tend, 1, "day"); + } + }; + scheduler.week_agenda_view = function(mode) { + scheduler._min_date = scheduler.date.week_start(scheduler._date); + scheduler._max_date = scheduler.date.add(scheduler._min_date, 1, "week"); + scheduler.set_sizes(); + if (mode) { // mode enabled + scheduler._table_view=true; + + // hiding default top border from dhx_cal_data + scheduler._wa._prev_data_border = scheduler._els['dhx_cal_data'][0].style.borderTop; + scheduler._els['dhx_cal_data'][0].style.borderTop = 0; + scheduler._els['dhx_cal_data'][0].style.overflowY = 'hidden'; + + // cleaning dhx_cal_date from the previous date + scheduler._els['dhx_cal_date'][0].innerHTML = ""; + + // 1 to make navline to be over data + scheduler._els['dhx_cal_data'][0].style.top = (parseInt(scheduler._els['dhx_cal_data'][0].style.top)-scheduler.xy.bar_height-1) + 'px'; + scheduler._els['dhx_cal_data'][0].style.height = (parseInt(scheduler._els['dhx_cal_data'][0].style.height)+scheduler.xy.bar_height+1) + 'px'; + + scheduler._els['dhx_cal_header'][0].style.display = 'none'; + getColumnSizes(); + fillWeekAgendaTab(); + } + else { // leaving week_agenda mode + scheduler._table_view=false; + + // restoring default top border to dhx_cal_data + if (scheduler._wa._prev_data_border) + scheduler._els['dhx_cal_data'][0].style.borderTop = scheduler._wa._prev_data_border; + + scheduler._els['dhx_cal_data'][0].style.overflowY = 'auto'; + scheduler._els['dhx_cal_data'][0].style.top = (parseInt(scheduler._els['dhx_cal_data'][0].style.top)+scheduler.xy.bar_height) + 'px'; + scheduler._els['dhx_cal_data'][0].style.height = (parseInt(scheduler._els['dhx_cal_data'][0].style.height)-scheduler.xy.bar_height) + 'px'; + scheduler._els['dhx_cal_header'][0].style.display = 'block'; + } + }; + scheduler.mouse_week_agenda = function(pos) { + var native_event = pos.ev; + var src = native_event.srcElement || native_event.target; + while (src.parentNode) { + if (src._date) + var date = src._date; + src = src.parentNode; + } + if(!date) + return pos; + pos.x = 0; + var diff = date.valueOf() - scheduler._min_date.valueOf(); + pos.y = Math.ceil(( diff / (1000 * 60) ) / this.config.time_step); + if (this._drag_mode == 'move') { + this._drag_event._dhx_changed = true; + this._select_id = this._drag_id; + for (var i = 0; i < scheduler._rendered.length; i++) { + if (scheduler._drag_id == this._rendered[i].getAttribute('event_id')) + var event_div = this._rendered[i]; + } + if (!scheduler._wa._dnd) { + var div = event_div.cloneNode(true); + this._wa._dnd = div; + div.className = event_div.className; + div.id = 'dhx_wa_dnd'; + div.className += ' dhx_wa_dnd'; + document.body.appendChild(div); + } + var dnd_div = document.getElementById('dhx_wa_dnd'); + dnd_div.style.top = ((native_event.pageY || native_event.clientY) + 20) + "px"; + dnd_div.style.left = ((native_event.pageX || native_event.clientX) + 20) + "px"; + } + return pos; + }; + scheduler.attachEvent('onBeforeEventChanged', function(event_object, native_event, is_new) { + if (this._mode == 'week_agenda') { + if (this._drag_mode == 'move') { + var dnd = document.getElementById('dhx_wa_dnd'); + dnd.parentNode.removeChild(dnd); + scheduler._wa._dnd = false; + } + } + return true; + }); + + scheduler.attachEvent("onEventSave",function(id,data,is_new_event){ + if(is_new_event) + this._select_id = id; + return true; + }); + + scheduler._wa._selected_divs = []; + + scheduler.attachEvent("onClick",function(event_id, native_event_object){ + if(this._mode == 'week_agenda'){ + if(scheduler._wa._selected_divs) { + for(var i=0; i"; + html += "
" + (evs[i]._timed ? this.templates.event_date(evs[i].start_date) : "") + "
"; + html += "
 
"; + html += this.templates.year_tooltip(evs[i].start_date, evs[i].end_date, evs[i]) + "
"; + } + + this._tooltip.style.display = ""; + this._tooltip.style.top = "0px"; -scheduler.hideToolTip=function(){ - if (this._tooltip){ - this._tooltip.style.display = "none"; - this._tooltip.date = new Date(9999,1,1); - } - -} -scheduler.showToolTip=function(date,pos,e,src){ - if (this._tooltip){ - if (this._tooltip.date.valueOf() == date.valueOf()) return; - this._tooltip.innerHTML=""; - } else { - var t = this._tooltip = document.createElement("DIV"); - t.className = "dhx_tooltip"; - document.body.appendChild(t); - t.onclick = scheduler._click.dhx_cal_data; - - } - var evs = this.getEvents(date,this.date.add(date,1,"day")); - var html = ""; - - for (var i=0; i" - html+="
"+(evs[i]._timed?this.templates.event_date(evs[i].start_date):"")+"
"; - html+="
 
"; - html+=this.templates.year_tooltip(evs[i].start_date, evs[i].end_date,evs[i])+""; - } - - this._tooltip.style.display=""; - this._tooltip.style.top = "0px"; - - - if (document.body.offsetWidth-pos.left-this._tooltip.offsetWidth < 0) - this._tooltip.style.left = pos.left-this._tooltip.offsetWidth+"px"; - else - this._tooltip.style.left = pos.left+src.offsetWidth+"px"; - - this._tooltip.date = date; - this._tooltip.innerHTML = html; - - if (document.body.offsetHeight-pos.top-this._tooltip.offsetHeight < 0) - this._tooltip.style.top= pos.top-this._tooltip.offsetHeight+src.offsetHeight+"px"; - else - this._tooltip.style.top= pos.top+"px"; -} + if (document.body.offsetWidth - pos.left - this._tooltip.offsetWidth < 0) + this._tooltip.style.left = pos.left - this._tooltip.offsetWidth + "px"; + else + this._tooltip.style.left = pos.left + src.offsetWidth + "px"; -scheduler._init_year_tooltip=function(){ - dhtmlxEvent(scheduler._els["dhx_cal_data"][0], "mouseover", function(e){ - if (!is_year_mode()) return; - - var e = e || event; - var src = e.target||e.srcElement; - if ((src.className||"").indexOf("dhx_year_event")!=-1) - scheduler.showToolTip(from_attr(src.getAttribute("date")),getOffset(src),e,src); - else - scheduler.hideToolTip(); - }) - this._init_year_tooltip=function(){}; -} + this._tooltip.date = date; + this._tooltip.innerHTML = html; -scheduler.attachEvent("onSchedulerResize",function(){ - if (is_year_mode()){ - this.year_view(true); - return false; - } - return true; -}); -scheduler._get_year_cell=function(d){ - //there can be more than 1 year in view - //year can start not from January - var m = d.getMonth()+12*(d.getFullYear()-this._min_date.getFullYear())-this.week_starts._month; - var t = this._els["dhx_cal_data"][0].childNodes[m]; - var d = this.week_starts[m]+d.getDate()-1; - - - return t.childNodes[2].firstChild.rows[Math.floor(d/7)].cells[d%7].firstChild; -} + if (document.body.offsetHeight - pos.top - this._tooltip.offsetHeight < 0) + this._tooltip.style.top = pos.top - this._tooltip.offsetHeight + src.offsetHeight + "px"; + else + this._tooltip.style.top = pos.top + "px"; + }; + + scheduler._init_year_tooltip = function() { + dhtmlxEvent(scheduler._els["dhx_cal_data"][0], "mouseover", function(e) { + if (!is_year_mode()) return; + + var e = e || event; + var src = e.target || e.srcElement; + if (src.tagName.toLowerCase() == 'a') // fix for active links extension (it adds links to the date in the cell) + src = src.parentNode; + if ((src.className || "").indexOf("dhx_year_event") != -1) + scheduler.showToolTip(from_attr(src.getAttribute("date")), getOffset(src), e, src); + else + scheduler.hideToolTip(); + }); + this._init_year_tooltip = function() { + }; + }; + + scheduler.attachEvent("onSchedulerResize", function() { + if (is_year_mode()) { + this.year_view(true); + return false; + } + return true; + }); + scheduler._get_year_cell = function(d) { + //there can be more than 1 year in view + //year can start not from January + var m = d.getMonth() + 12 * (d.getFullYear() - this._min_date.getFullYear()) - this.week_starts._month; + var t = this._els["dhx_cal_data"][0].childNodes[m]; + var d = this.week_starts[m] + d.getDate() - 1; -var marked = []; -scheduler._mark_year_date=function(d,ev){ - var c = this._get_year_cell(d); - c.className = "dhx_month_head dhx_year_event "+this.templates.event_class(ev.start_date,ev.end_date,ev); - c.setAttribute("date",to_attr(d)) - marked.push(c); -} -scheduler._unmark_year_date=function(d){ - this._get_year_cell(d).className = "dhx_month_head"; -} -scheduler._year_render_event=function(ev){ - var d = ev.start_date; - if (d.valueOf()=this._max_date.valueOf()) - return; - } -} -scheduler.year_view=function(mode){ - if (mode){ - var temp = scheduler.xy.scale_height; - scheduler.xy.scale_height = -1; - } - - scheduler._els["dhx_cal_header"][0].style.display=mode?"none":""; - scheduler.set_sizes(); - - if (mode) - scheduler.xy.scale_height = temp; - - - scheduler._table_view = mode; - if (this._load_mode && this._load()) return; - - if (mode){ - scheduler._init_year_tooltip(); - scheduler._reset_year_scale(); - scheduler.render_view_data(); - } else { - scheduler.hideToolTip(); - } -} -scheduler._reset_year_scale = function(){ - this._cols=[]; this._colsS={}; - var week_starts = []; //start day of first week in each month - var b=this._els["dhx_cal_data"][0]; - - var c = this.config; - b.scrollTop=0; //fix flickering in FF - b.innerHTML=""; - - var dx = Math.floor(parseInt(b.style.width)/c.year_x); - var dy = Math.floor((parseInt(b.style.height)-scheduler.xy.year_top)/c.year_y); - if (dy<190) { - dy = 190; - dx = Math.floor((parseInt(b.style.width)-scheduler.xy.scroll_width)/c.year_x); - } - - var summ = dx-11; - var left = 0; - var week_template = document.createElement("div"); - var dummy_date = this.date.week_start(new Date()); - for (var i=0; i<7; i++){ - this._cols[i]=Math.floor(summ/(7-i)); - this._render_x_header(i,left,dummy_date,week_template); - dummy_date = this.date.add(dummy_date,1,"day"); - summ-=this._cols[i]; - left+=this._cols[i]; - } - week_template.lastChild.className+=" dhx_scale_bar_last"; - - var sd = this.date[this._mode+"_start"](this.date.copy(this._date)); - var ssd=sd; - - for (var i=0; i
"; - d.childNodes[0].innerHTML=this.templates.year_month(sd); - - var dd = this.date.week_start(sd); - var ed = this._reset_month_scale(d.childNodes[2],sd,dd); - - var r=d.childNodes[2].firstChild.rows; - for (var k=r.length; k<6; k++) { - r[0].parentNode.appendChild(r[0].cloneNode(true)); - for (var ri=0; ri < r[k].childNodes.length; ri++) { - r[k].childNodes[ri].className = "dhx_after"; - r[k].childNodes[ri].firstChild.innerHTML = scheduler.templates.month_day(ed); - ed = scheduler.date.add(ed,1,"day"); - }; - } - - - b.appendChild(d); - - var dt = Math.round((dy-190)/2); - d.style.marginTop=dt+"px"; - this.set_xy(d,dx-10,dy-dt-10,dx*j+5,dy*i+5+scheduler.xy.year_top); - - week_starts[i*c.year_x+j] = (sd.getDay()-(this.config.start_on_monday?1:0)+7)%7; - sd = this.date.add(sd,1,"month"); - - } - this._els["dhx_cal_date"][0].innerHTML=this.templates[this._mode+"_date"](ssd,sd,this._mode); - this.week_starts = week_starts; - week_starts._month = ssd.getMonth(); - this._min_date = ssd; - this._max_date = sd; -} + return t.childNodes[2].firstChild.rows[Math.floor(d / 7)].cells[d % 7].firstChild; + }; + + var marked = []; + scheduler._mark_year_date = function(d, ev) { + var c = this._get_year_cell(d); + c.className = "dhx_month_head dhx_year_event " + this.templates.event_class(ev.start_date, ev.end_date, ev); + c.setAttribute("date", to_attr(d)) + marked.push(c); + }; + scheduler._unmark_year_date = function(d) { + this._get_year_cell(d).className = "dhx_month_head"; + }; + scheduler._year_render_event = function(ev) { + var d = ev.start_date; + if (d.valueOf() < this._min_date.valueOf()) + d = this._min_date; + else d = this.date.date_part(new Date(d)); + + while (d < ev.end_date) { + this._mark_year_date(d, ev); + d = this.date.add(d, 1, "day"); + if (d.valueOf() >= this._max_date.valueOf()) + return; + } + }; + + scheduler.year_view = function(mode) { + if (mode) { + var temp = scheduler.xy.scale_height; + scheduler.xy.scale_height = -1; + } + + scheduler._els["dhx_cal_header"][0].style.display = mode ? "none" : ""; + scheduler.set_sizes(); + + if (mode) + scheduler.xy.scale_height = temp; + + + scheduler._table_view = mode; + if (this._load_mode && this._load()) return; + + if (mode) { + scheduler._init_year_tooltip(); + scheduler._reset_year_scale(); + scheduler.render_view_data(); + } else { + scheduler.hideToolTip(); + } + }; + scheduler._reset_year_scale = function() { + this._cols = []; + this._colsS = {}; + var week_starts = []; //start day of first week in each month + var b = this._els["dhx_cal_data"][0]; + + var c = this.config; + b.scrollTop = 0; //fix flickering in FF + b.innerHTML = ""; + + var dx = Math.floor(parseInt(b.style.width) / c.year_x); + var dy = Math.floor((parseInt(b.style.height) - scheduler.xy.year_top) / c.year_y); + if (dy < 190) { + dy = 190; + dx = Math.floor((parseInt(b.style.width) - scheduler.xy.scroll_width) / c.year_x); + } + + var summ = dx - 11; + var left = 0; + var week_template = document.createElement("div"); + var dummy_date = this.date.week_start(new Date()); + for (var i = 0; i < 7; i++) { + this._cols[i] = Math.floor(summ / (7 - i)); + this._render_x_header(i, left, dummy_date, week_template); + dummy_date = this.date.add(dummy_date, 1, "day"); + summ -= this._cols[i]; + left += this._cols[i]; + } + week_template.lastChild.className += " dhx_scale_bar_last"; + + var sd = this.date[this._mode + "_start"](this.date.copy(this._date)); + var ssd = sd; + + for (var i = 0; i < c.year_y; i++) + for (var j = 0; j < c.year_x; j++) { + var d = document.createElement("DIV"); + d.style.cssText = "position:absolute;"; + d.setAttribute("date", this.templates.xml_format(sd)); + d.innerHTML = "
" + week_template.innerHTML + "
"; + d.childNodes[0].innerHTML = this.templates.year_month(sd); + + var dd = this.date.week_start(sd); + var ed = this._reset_month_scale(d.childNodes[2], sd, dd); + + var r = d.childNodes[2].firstChild.rows; + for (var k=r.length; k<6; k++) { + r[0].parentNode.appendChild(r[0].cloneNode(true)); + for (var ri=0; ri < r[k].childNodes.length; ri++) { + r[k].childNodes[ri].className = "dhx_after"; + r[k].childNodes[ri].firstChild.innerHTML = scheduler.templates.month_day(ed); + ed = scheduler.date.add(ed,1,"day"); + } + } + b.appendChild(d); + + d.childNodes[1].style.height = d.childNodes[1].childNodes[0].offsetHeight + "px"; // dhx_year_week should have height property so that day dates would get correct position. dhx_year_week height = height of it's child (with the day name) + var dt = Math.round((dy - 190) / 2); + d.style.marginTop = dt + "px"; + this.set_xy(d, dx - 10, dy - dt - 10, dx * j + 5, dy * i + 5 + scheduler.xy.year_top); + + week_starts[i * c.year_x + j] = (sd.getDay() - (this.config.start_on_monday ? 1 : 0) + 7) % 7; + sd = this.date.add(sd, 1, "month"); + + } + this._els["dhx_cal_date"][0].innerHTML = this.templates[this._mode + "_date"](ssd, sd, this._mode); + this.week_starts = week_starts; + week_starts._month = ssd.getMonth(); + this._min_date = ssd; + this._max_date = sd; + } })(); diff --git a/addons/base_calendar/static/lib/dhtmlxScheduler/sources/glossy.css b/addons/base_calendar/static/lib/dhtmlxScheduler/sources/glossy.css new file mode 100644 index 00000000000..51c4e99d668 --- /dev/null +++ b/addons/base_calendar/static/lib/dhtmlxScheduler/sources/glossy.css @@ -0,0 +1,294 @@ +/* +This software is allowed to use under GPL or you need to obtain Commercial or Enterise License +to use it in not GPL project. Please contact sales@dhtmlx.com for details +*/ +.dhx_cal_tab.active{ + border:none; +} +.dhx_multi_day{ + border:none; + border-top:1px solid #A4BED4; +} +.dhx_multi_day_icon, .dhx_multi_day_icon_small{ + border-right:none; +} +.dhx_cal_container { + background-image:url(imgs_glossy/top-days-bg.png); + background-position:0 24px; + background-repeat:repeat-x; + background-color:#EBEBEB; +} +.dhx_cal_navline{ + background-color:#EBEBEB; + height:23px !important; +} +.dhx_cal_prev_button{ + background-image:url(imgs_glossy/buttons.gif); + width:30px; + height:20px; +} +.dhx_cal_next_button{ + background-image:url(imgs_glossy/buttons.gif); + width:30px; + height:20px; +} +.dhx_cal_today_button{ + padding-top:3px; + background-image:url(imgs_glossy/buttons.gif); + width:67px; + left:110px; + text-decoration:none; +} +.dhx_cal_navline .dhx_cal_date{ + padding-top:4px; + left:230px; +} +.dhx_cal_tab{ + background-image:url(imgs_glossy/white_tab.png); + width:60px; + height:15px; + text-decoration:none; + padding-top:4px; + margin-top: 4px; +} +.dhx_cal_tab.active{ + background-image:url(imgs_glossy/blue_tab.png); + height:18px; + width:60px; + padding-top:4px; + margin-top: 2px; +} +.dhx_cal_data{ + border-top: 1px solid #A4BED4; +} +.dhx_cal_header{ + background-image:url(imgs_glossy/top-days-bg.png); + background-repeat:repeat-x; + border-top: 0px; + border-right: 0px; +} +.dhx_scale_bar{ + background-image:url(imgs_glossy/top-separator.gif); + background-position: 0px 0px; + background-repeat:no-repeat; + background-color: transparent; + padding-top:3px; + border-left:0px; +} + +.dhx_scale_holder { + border-right:1px solid #A4BED4; +} +.dhx_scale_holder_now{ + border-right:1px solid #A4BED4; +} +.dhx_scale_hour{ + background-image:url(imgs_glossy/left-time-bg.png); + border-bottom:1px solid #A4BED4; + color:#2F3A48; +} +.dhx_multi_day{ + background-image:url(imgs_glossy/multi-days-bg.png); + background-repeat:repeat; + border-bottom:1px solid #A4BED4; + border-left:0px; +} +.dhx_multi_day_icon,.dhx_multi_day_icon_small{ + background-image:url(imgs_glossy/multi-days-bg.png); + border-bottom:1px solid #A4BED4; + border-left:1px solid #ffffff; + background-position:0 0; + background-repeat:repeat; +} +.dhx_month_head{ + background-color:#FFFFFF; +} +.dhx_after .dhx_month_head,.dhx_before .dhx_month_head{ + background-color:#EFEDE2; +} +.dhx_now .dhx_month_head{ + background-color:#E4EFFF; +} +.dhx_after .dhx_month_body,.dhx_before .dhx_month_body{ + background-color:#EFEDE2; +} +.dhx_cal_event div{ + border:1px solid #FFBD51; + background-color:#FFE4AB; + color:#000000; +} +.dhx_cal_event_clear{ + color:#000000; +} +.dhx_cal_event_line{ + background-image:url(imgs_glossy/event-bg.png); + border:1px solid #FFBD51; + color:#000000; +} +.dhx_in_move{ + background-image:url(imgs_glossy/move.png); +} +.dhx_cal_event .dhx_body{ + background-color:#FFE4AB; +} +.dhx_cal_event .dhx_title{ + background-color:#FFE4AB; +} +.dhx_cal_light{ + -moz-box-shadow:5px 5px 5px #888888; + -khtml-box-shadow: 5px 5px 5px #888; + background-color:#EBEBEB; + border:2px solid #A4BED4; + color:#000000; +} +.dhx_cal_larea{ + border:1px solid #A4BED4; + border-width:0 1px 1px; + background-color:#FFFFFF; +} + +.dhx_cal_lsection{ + background-image:url(imgs_glossy/lightbox.png); + font-size:14px; + padding:5px 0 5px 10px; + color:#000000; +} +.dhx_cal_light_wide .dhx_cal_lsection{ + background-image:url(imgs_glossy/multi-days-bg.png); +} + + +.dhx_cal_ltext textarea{ + background-color:#ffffff; + color:#000000; +} + +.dhx_cal_light select, .dhx_cal_light input{ + color:#000000; +} +.dhx_save_btn{ + background-image:url(imgs_glossy/controlls5.png); +} +.dhx_cancel_btn{ + background-image:url(imgs_glossy/controlls5.png); +} +.dhx_delete_btn{ + background-image:url(imgs_glossy/controlls5.png); +} +div.dhx_menu_head{ + background-image:url(imgs_glossy/controlls5.png); + border:1px solid #FFE4AB; +} +div.dhx_menu_icon{ + background-image:url(imgs_glossy/controlls5.png); + border:medium none; +} +.dhx_section_time{ + height:20px !important; + padding:7px 0 !important; + text-align:center; + background:white; +} + +div.dhx_cal_editor{ + background-color:#FFE4AB; +} +.dhx_year_month{ + background-image:url(imgs_glossy/top-days-bg.png); + border: 0px; +} +.dhx_year_week{ + background-image:url(imgs_glossy/top-days-bg.png); +} +.dhx_month_head{ + border-right:1px solid #A4BED4; +} +.dhx_month_body{ + border-right:1px solid #A4BED4; + border-bottom:1px solid #A4BED4; +} +.dhx_year_body{ + border-left:1px solid #A4BED4; +} +.dhx_scale_bar_last{ + border-right: none; +} +.dhx_month_head.dhx_year_event{ + background-color:#FFE4AB; +} +.dhx_year_body .dhx_before .dhx_month_head, .dhx_year_body .dhx_after .dhx_month_head, .dhx_year_body .dhx_before .dhx_month_head a, .dhx_year_body .dhx_after .dhx_month_head a{ + color:#EFEDE2 !important; +} +.dhx_cal_lsection .dhx_readonly{ + color:#000000; +} +.dhx_tooltip{ + -moz-box-shadow:2px 2px 2px #888; /*Doesn't work in IE*/ + -khtml-box-shadow: 2px 2px 2px #888; +} +.dhx_custom_button { + margin-top: -2px; +} +/*2.3*/ +.dhx_cal_lsection .dhx_fullday{ + color:#000000; +} + +.dhx_cal_lsection.dhx_cal_checkbox{ + height:16px; + line-height:18px; +} +.dhx_cal_light_wide .dhx_cal_lsection.dhx_cal_checkbox{ + height:20px; +} +.dhx_cal_checkbox label{ + vertical-align:top; +} + +.dhx_cal_light_wide .dhx_cal_lsection{ + color:black; +} + +.dhx_cal_light_wide .dhx_wrap_section{ + border-top:1px solid #A4BED4; + background-image:url(imgs_glossy/multi-days-bg.png); +} +.dhx_cal_light_wide .dhx_cal_ltext{ + border-left:1px solid #A4BED4; +} +.dhx_cal_light_wide .dhx_cal_ltext { + background-color:white; +} +.dhx_custom_button{ + background:white; + color:black; +} +.dhx_form_repeat{ + background:white; +} +.dhx_repeat_divider{ + border-left:1px solid #A4BED4; +} + +/* timeline second scale start */ +.dhx_cal_header.dhx_second_cal_header { + background-image: url("imgs_glossy/second-top-days-bg.png"); + padding-right: 20px; +} +.dhx_scale_bar { + padding-top: 4px; +} +.dhx_second_scale_bar { + border-bottom: 0; + padding-top: 4px; +} + +/* timeline second scale end */ +.dhx_cal_light_wide .dhx_cal_lsection .dhx_fullday, .dhx_cal_lsection .dhx_fullday{ + color:#000000; + font-size: 14px; +} +.dhx_cal_light_wide .dhx_cal_lsection { + font-size: 14px; + padding-right:10px; +} \ No newline at end of file diff --git a/addons/base_calendar/static/lib/dhtmlxScheduler/sources/ical.js b/addons/base_calendar/static/lib/dhtmlxScheduler/sources/ical.js index ab6fdb0101c..60dbfef8626 100644 --- a/addons/base_calendar/static/lib/dhtmlxScheduler/sources/ical.js +++ b/addons/base_calendar/static/lib/dhtmlxScheduler/sources/ical.js @@ -1,3 +1,7 @@ +/* +This software is allowed to use under GPL or you need to obtain Commercial or Enterise License +to use it in not GPL project. Please contact sales@dhtmlx.com for details +*/ scheduler.ical={ parse:function(str){ var data = str.match(RegExp(this.c_start+"[^\f]*"+this.c_end,"")); diff --git a/addons/base_calendar/static/lib/dhtmlxScheduler/sources/layout.css b/addons/base_calendar/static/lib/dhtmlxScheduler/sources/layout.css index 4818d92db21..a888f4d0c79 100644 --- a/addons/base_calendar/static/lib/dhtmlxScheduler/sources/layout.css +++ b/addons/base_calendar/static/lib/dhtmlxScheduler/sources/layout.css @@ -1,3 +1,7 @@ +/* +This software is allowed to use under GPL or you need to obtain Commercial or Enterise License +to use it in not GPL project. Please contact sales@dhtmlx.com for details +*/ .dhx_cal_container{ background-color:#C2D5FC; font-family:Tahoma; @@ -52,18 +56,28 @@ text-decoration:underline; } .dhx_cal_tab{ - background-image:url(imgs/white_tab.png); - width:61px; height:19px; + width:59px; height:19px; text-align:center; text-decoration:underline; - padding-top:3px; cursor:pointer; + padding-top:2px; + cursor:pointer; + background-color: #D8E1EA; + + -webkit-border-top-left-radius: 4px; + -webkit-border-top-right-radius: 4px; + -moz-border-radius-topleft: 4px; + -moz-border-radius-topright: 4px; + border-top-left-radius: 4px; + border-top-right-radius: 4px; } .dhx_cal_tab.active{ - background-image:url(imgs/blue_tab.png); text-decoration:none; - height:20px; - padding-top:2px; cursor:default; + + cursor:default; font-weight:bold; + border: 1px dotted #586A7E; + border-bottom: 0; + background-color: #C2D5FC; } .dhx_cal_header{ position:absolute; @@ -154,11 +168,13 @@ z-index:9999; } .dhx_multi_day_icon, .dhx_multi_day{ - position:absolute; background-color:#E1E6FF; background-repeat:no-repeat; - border-bottom:1px dotted #8894A3; - border-left:1px dotted #8894A3; + border-right:1px dotted #8894A3; +} +.dhx_multi_day{ + position: absolute; + border-top:1px dotted #8894A3; } .dhx_multi_day_icon{ background-image:url(imgs/clock_big.gif); @@ -168,11 +184,10 @@ } .dhx_multi_day_icon, .dhx_multi_day_icon_small{ background-position: center center; - position:absolute; background-color:#E1E6FF; background-repeat:no-repeat; border-bottom:1px dotted #8894A3; - border-left:1px dotted #8894A3; + border-right:1px dotted #8894A3; } .dhtmlxLayoutPolyContainer_dhx_skyblue .dhx_cal_container { background-color: #d0e5ff; diff --git a/addons/base_calendar/static/lib/dhtmlxScheduler/sources/lightbox.css b/addons/base_calendar/static/lib/dhtmlxScheduler/sources/lightbox.css index 5781bc3d3b5..afb83295be3 100644 --- a/addons/base_calendar/static/lib/dhtmlxScheduler/sources/lightbox.css +++ b/addons/base_calendar/static/lib/dhtmlxScheduler/sources/lightbox.css @@ -1,151 +1,239 @@ - .dhx_cal_light{ - height:400px; - light:300px; - background-color:#FFE763; - - font-family:Tahoma; - font-size:8pt; - border:1px solid #B7A64B; - color:#887A2E; - - position:absolute; - z-index:10001; - - width:580px; - height:300px; - } - .dhx_mark{ - position:relative; top:3px; - background-image:url('./imgs/controls.gif'); - background-position: 0px -43px; - padding-left:10px; - } - .dhx_ie6 .dhx_mark{ - background-position: 6px -41px; - } - - .dhx_cal_light select{ - font-family:Tahoma; - font-size:8pt; - color:#887A2E; - padding:2px; - margin:0px; - } - .dhx_cal_ltitle{ - padding:2px 0px 2px 5px; - overflow:hidden; - white-space:nowrap; - } - .dhx_cal_ltitle span{ - white-space:nowrap; - } - .dhx_cal_lsection{ - background-color:#DBCF8C; - color:#FFF4B5; - font-size:18pt; - font-weight:bold; - padding:5px 0px 3px 10px; - } - .dhx_cal_ltext{ - padding:2px 0px 2px 10px; - height:130px; - height=140px; - overflow:hidden; - } - .dhx_cal_ltext textarea{ - background-color:transparent; - overflow:auto; - border:none; - color:#887A2E; - height:100%; - width:100%; - outline:none !important; - } - .dhx_time{ - font-weight:bold; - } - .dhx_cal_light .dhx_title{ - padding-left:10px; - } - .dhx_cal_larea{ - border:1px solid #DCC43E; - background-color:#FFF4B5; - overflow:hidden; - - margin-left:3px; - - width:572px; - height:1px; - } - .dhx_btn_set{ - padding:5px 10px 0px 10px; - float:left; - } - .dhx_btn_set div{ - float:left; - height:21px; - line-height:21px; - vertical-align:middle; - cursor:pointer; - } - .dhx_save_btn{ - background-image:url('./imgs/controls.gif'); - background-position:-84px 0px; - width:21px; - - } - .dhx_cancel_btn{ - background-image:url('./imgs/controls.gif'); - background-position:-63px 0px; - width:20px; - } - .dhx_delete_btn{ - background-image:url('./imgs/controls.gif'); - background-position:-42px 0px; - width:20px; - } - .dhx_cal_cover{ - width:100%; - height:100%; - position:absolute; - z-index:10000; - top:0px; - left:0px; - background-color:black; - - opacity:0.1; - filter:alpha(opacity=10); - } - .dhx_custom_button{ - padding:0px 3px 0px 3px; - color:#887A2E; - font-family:Tahoma; - font-size:8pt; - background-color:#FFE763; - font-weight:normal; - margin-right:5px; - margin-top:5px; - cursor:pointer; - } - .dhx_custom_button div{ - cursor:pointer; - float:left; - height:21px; - line-height:21px; - vertical-align:middle; - } - - .dhx_fullday_checkbox { - padding-top: 5px; - float:right; - } - - .dhx_fullday_checkbox input{ - vertical-align: middle; - } - - .dhx_fullday_checkbox label{ - font-size: 12pt; - font-weight: bold; - vertical-align: middle; - } \ No newline at end of file +/* +This software is allowed to use under GPL or you need to obtain Commercial or Enterise License +to use it in not GPL project. Please contact sales@dhtmlx.com for details +*/ +.dhx_unselectable, .dhx_unselectable div{ + -webkit-user-select:none; + -moz-user-select:none; + -moz-user-select:-moz-none; +} +.dhx_cal_light{ + background-color:#FFE763; + border-radius:5px; + font-family:Tahoma; + font-size:8pt; + border:1px solid #B7A64B; + color:#887A2E; + + position:absolute; + z-index:10001; + + width:580px; + height:300px; + + box-shadow:5px 5px 5px #888; +} +.dhx_cal_light_wide{ + width:650px; +} +.dhx_mark{ + position:relative; top:3px; + background-image:url('./imgs/controls.gif'); + background-position: 0px -43px; + padding-left:10px; +} +.dhx_ie6 .dhx_mark{ + background-position: 6px -41px; +} + +.dhx_cal_light select{ + font-family:Tahoma; + font-size:8pt; + color:#887A2E; + padding:2px; + margin:0px; +} +.dhx_cal_ltitle{ + padding:2px 0px 2px 5px; + overflow:hidden; + white-space:nowrap; +} +.dhx_cal_ltitle span{ + white-space:nowrap; +} +.dhx_cal_lsection{ + background-color:#DBCF8C; + color:#FFF4B5; + font-weight:bold; + padding:5px 0px 3px 10px; +} +.dhx_section_time{ + background-color:#DBCF8C; +} +.dhx_cal_lsection .dhx_fullday{ + float:right; + margin-right:5px; + color:#887A2E; + font-size:12px; + font-weight:normal; + line-height:20px; + vertical-align:top; + cursor:pointer; +} +.dhx_cal_lsection{ + font-size:18px; + font-family:Arial; +} +.dhx_cal_ltext{ + padding:2px 0px 2px 10px; + overflow:hidden; +} +.dhx_cal_ltext textarea{ + background-color: #FFF4B5; /* #FFF4B5; should be the same for dhx_cal_larea, was transperent */ + overflow:auto; + border:none; + color:#887A2E; + height:100%; + width:100%; + outline:none !important; +} +.dhx_time{ + font-weight:bold; +} +.dhx_cal_light .dhx_title{ + padding-left:10px; +} +.dhx_cal_larea{ + border:1px solid #DCC43E; + background-color:#FFF4B5; + overflow:hidden; + + margin-left:3px; + + width:572px; + height:1px; +} +.dhx_btn_set{ + padding:5px 10px 0px 10px; + float:left; +} +.dhx_btn_set div{ + float:left; + height:21px; + line-height:21px; + vertical-align:middle; + cursor:pointer; +} +.dhx_save_btn{ + background-image:url('./imgs/controls.gif'); + background-position:-84px 0px; + width:21px; + +} +.dhx_cancel_btn{ + background-image:url('./imgs/controls.gif'); + background-position:-63px 0px; + width:20px; +} +.dhx_delete_btn{ + background-image:url('./imgs/controls.gif'); + background-position:-42px 0px; + width:20px; +} +.dhx_cal_cover{ + width:100%; + height:100%; + position:absolute; + z-index:10000; + top:0px; + left:0px; + background-color:black; + + opacity:0.1; + filter:alpha(opacity=10); +} +.dhx_custom_button{ + padding:0px 3px 0px 3px; + color:#887A2E; + font-family:Tahoma; + font-size:8pt; + background-color:#FFE763; + font-weight:normal; + margin-right:5px; + margin-top:0px; + cursor:pointer; +} +.dhx_custom_button div{ + cursor:pointer; + float:left; + height:21px; + line-height:21px; + vertical-align:middle; +} + + +.dhx_cal_light_wide .dhx_cal_larea{ + border-top-width:0px; +} +.dhx_cal_light_wide .dhx_cal_lsection{ + border:0px; + float:left; + text-align:right; + width:100px; + height:20px; + font-size:16px; + padding: 5px 0px 0px 10px; +} +.dhx_cal_light_wide .dhx_wrap_section{ + border-top:1px solid #DBCF8C; + position:relative; + background-color:#DBCF8C; + overflow:hidden; +} +.dhx_cal_light_wide .dhx_section_time{ + padding-top:2px !important; + height:20px !important; +} +.dhx_section_time{ + text-align: center; +} +.dhx_cal_light_wide .dhx_cal_larea{ + width:730px; +} +.dhx_cal_light_wide{ + width:738px; +} + +.dhx_cal_light_wide .dhx_section_time{ + background:transparent; +} +.dhx_cal_light_wide .dhx_cal_checkbox label{ + padding-left:0px; +} +.dhx_cal_wide_checkbox input{ + margin-top:8px; + margin-left:14px; +} +.dhx_cal_light input{ + font-family:Tahoma; + font-size:8pt; + color:#887A2E; +} +.dhx_cal_light_wide .dhx_cal_lsection .dhx_fullday{ + float:none; + margin-right:0px; + color:#FFF4B5; + font-weight:bold; + font-size:16px; + font-family:Arial; + cursor:pointer; +} +.dhx_custom_button{ + float: right; + height: 21px; + width:90px; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + -ms-border-radius: 4px; + -o-border-radius: 4px; + border-radius: 4px; +} +.dhx_cal_light_wide .dhx_custom_button { + position:absolute; + top:0; + right:0; + margin-top: 2px; +} +.dhx_cal_light_wide .dhx_repeat_right { + margin-right: 55px; +} \ No newline at end of file diff --git a/addons/base_calendar/static/lib/dhtmlxScheduler/sources/lightbox.js b/addons/base_calendar/static/lib/dhtmlxScheduler/sources/lightbox.js index 2a928a34831..7749ff6708c 100644 --- a/addons/base_calendar/static/lib/dhtmlxScheduler/sources/lightbox.js +++ b/addons/base_calendar/static/lib/dhtmlxScheduler/sources/lightbox.js @@ -1,4 +1,40 @@ +/* +This software is allowed to use under GPL or you need to obtain Commercial or Enterise License +to use it in not GPL project. Please contact sales@dhtmlx.com for details +*/ +scheduler.formSection = function(name){ + var config = this.config.lightbox.sections; + var i =0; + for (i; i < config.length; i++) + if (config[i].name == name) + break; + var section = config[i]; + var node = document.getElementById(section.id).nextSibling; + + return { + getValue:function(ev){ + return scheduler.form_blocks[section.type].get_value(node, (ev||{}), section); + }, + setValue:function(value, ev){ + return scheduler.form_blocks[section.type].set_value(node, value, (ev||{}), section); + } + }; +}; scheduler.form_blocks={ + template:{ + render: function(sns){ + var height=(sns.height||"30")+"px"; + return "
"; + }, + set_value:function(node,value,ev,config){ + node.innerHTML = value||""; + }, + get_value:function(node,ev,config){ + return node.innerHTML||""; + }, + focus: function(node){ + } + }, textarea:{ render:function(sns){ var height=(sns.height||"130")+"px"; @@ -17,7 +53,7 @@ scheduler.form_blocks={ select:{ render:function(sns){ var height=(sns.height||"23")+"px"; - var html="
"; for (var i=0; i < sns.options.length; i++) html+=""; html+="
"; @@ -48,10 +84,16 @@ scheduler.form_blocks={ } var html=" "; - return "
"+html+"  –  "+html+"
"; + return "
"+html+"  –  "+html+"
"; }, set_value:function(node,value,ev){ + var s=node.getElementsByTagName("select"); if(scheduler.config.full_day) { if (!node._full_day){ - node.previousSibling.innerHTML+="
"; + var html = ""; + if (!scheduler.config.wide_form) + html = node.previousSibling.innerHTML+html; + node.previousSibling.innerHTML=html; node._full_day=true; } var input=node.previousSibling.getElementsByTagName("input")[0]; - var isFulldayEvent = (scheduler.date.time_part(ev.start_date)==0 && scheduler.date.time_part(ev.end_date)==0 && ev.end_date.valueOf()-ev.start_date.valueOf() < 2*24*60*60*1000); + var isFulldayEvent = (scheduler.date.time_part(ev.start_date)===0 && scheduler.date.time_part(ev.end_date)===0 && ev.end_date.valueOf()-ev.start_date.valueOf() < 2*24*60*60*1000); input.checked = isFulldayEvent; for(var k in s) @@ -96,14 +142,14 @@ scheduler.form_blocks={ var end_date = new Date(ev.end_date); scheduler.date.date_part(start_date); - end_date = scheduler.date.add(start_date, 1, "day") + end_date = scheduler.date.add(start_date, 1, "day"); } for(var i in s) s[i].disabled=input.checked; _fill_lightbox_select(s,0,start_date||ev.start_date); _fill_lightbox_select(s,4,end_date||ev.end_date); - } + }; } if(scheduler.config.auto_end_date && scheduler.config.event_duration) { @@ -138,16 +184,29 @@ scheduler.form_blocks={ node.getElementsByTagName("select")[0].focus(); } } -} +}; scheduler.showCover=function(box){ - this.show_cover(); if (box){ box.style.display="block"; - var pos = getOffset(this._obj); - box.style.top=Math.round(pos.top+(this._obj.offsetHeight-box.offsetHeight)/2)+"px"; - box.style.left=Math.round(pos.left+(this._obj.offsetWidth-box.offsetWidth)/2)+"px"; + + var scroll_top = window.pageYOffset||document.body.scrollTop||document.documentElement.scrollTop; + var scroll_left = window.pageXOffset||document.body.scrollLeft||document.documentElement.scrollLeft; + + var view_height = window.innerHeight||document.documentElement.clientHeight; + + if(scroll_top) // if vertical scroll on window + box.style.top=Math.round(scroll_top+Math.max((view_height-box.offsetHeight)/2, 0))+"px"; + else // vertical scroll on body + box.style.top=Math.round(Math.max(((view_height-box.offsetHeight)/2), 0) + 9)+"px"; // +9 for compatibility with auto tests + + // not quite accurate but used for compatibility reasons + if(document.documentElement.scrollWidth > document.body.offsetWidth) // if horizontal scroll on the window + box.style.left=Math.round(scroll_left+(document.body.offsetWidth-box.offsetWidth)/2)+"px"; + else // horizontal scroll on the body + box.style.left=Math.round((document.body.offsetWidth-box.offsetWidth)/2)+"px"; } -} + this.show_cover(); +}; scheduler.showLightbox=function(id){ if (!id) return; if (!this.callEvent("onBeforeLightbox",[id])) return; @@ -155,7 +214,7 @@ scheduler.showLightbox=function(id){ this.showCover(box); this._fill_lightbox(id,box); this.callEvent("onLightbox",[id]); -} +}; scheduler._fill_lightbox=function(id,box){ var ev=this.getEvent(id); var s=box.getElementsByTagName("span"); @@ -172,24 +231,25 @@ scheduler._fill_lightbox=function(id,box){ for (var i=0; i < sns.length; i++) { var node=document.getElementById(sns[i].id).nextSibling; var block=this.form_blocks[sns[i].type]; - block.set_value.call(this,node,ev[sns[i].map_to],ev, sns[i]) + block.set_value.call(this,node,ev[sns[i].map_to],ev, sns[i]); if (sns[i].focus) block.focus.call(this,node); - }; + } scheduler._lightbox_id=id; -} +}; scheduler._lightbox_out=function(ev){ var sns = this.config.lightbox.sections; for (var i=0; i < sns.length; i++) { - var node=document.getElementById(sns[i].id).nextSibling; + var node = document.getElementById(sns[i].id); + node=(node?node.nextSibling:node); var block=this.form_blocks[sns[i].type]; var res=block.get_value.call(this,node,ev, sns[i]); if (sns[i].map_to!="auto") ev[sns[i].map_to]=res; } return ev; -} +}; scheduler._empty_lightbox=function(){ var id=scheduler._lightbox_id; var ev=this.getEvent(id); @@ -199,38 +259,41 @@ scheduler._empty_lightbox=function(){ ev._timed=this.is_one_day_event(ev); this.setEvent(ev.id,ev); - this._edit_stop_event(ev,true) + this._edit_stop_event(ev,true); this.render_view_data(); -} +}; scheduler.hide_lightbox=function(id){ this.hideCover(this._get_lightbox()); this._lightbox_id=null; this.callEvent("onAfterLightbox",[]); -} +}; scheduler.hideCover=function(box){ if (box) box.style.display="none"; this.hide_cover(); -} +}; scheduler.hide_cover=function(){ if (this._cover) this._cover.parentNode.removeChild(this._cover); this._cover=null; -} +}; scheduler.show_cover=function(){ this._cover=document.createElement("DIV"); this._cover.className="dhx_cal_cover"; + var _document_height = ((document.height !== undefined) ? document.height : document.body.offsetHeight); + var _scroll_height = ((document.documentElement) ? document.documentElement.scrollHeight : 0); + this._cover.style.height = Math.max(_document_height, _scroll_height) + 'px'; document.body.appendChild(this._cover); -} +}; scheduler.save_lightbox=function(){ - if (this.checkEvent("onEventSave") && !this.callEvent("onEventSave",[this._lightbox_id,this._lightbox_out({ id: this._lightbox_id}), this._new_event])) + if (this.checkEvent("onEventSave") && !this.callEvent("onEventSave",[this._lightbox_id,this._lightbox_out({ id: this._lightbox_id}), this._new_event])) return; - this._empty_lightbox() + this._empty_lightbox(); this.hide_lightbox(); }; scheduler.startLightbox = function(id, box){ this._lightbox_id=id; this.showCover(box); -} +}; scheduler.endLightbox = function(mode, box){ this._edit_stop_event(scheduler.getEvent(this._lightbox_id),mode); if (mode) @@ -238,6 +301,8 @@ scheduler.endLightbox = function(mode, box){ this.hideCover(box); }; scheduler.resetLightbox = function(){ + if (scheduler._lightbox) + scheduler._lightbox.parentNode.removeChild(scheduler._lightbox); scheduler._lightbox = null; }; scheduler.cancel_lightbox=function(){ @@ -267,15 +332,18 @@ scheduler._init_lightbox_events=function(){ break; default: - if (src.className.indexOf("dhx_custom_button_")!=-1){ + if (src.getAttribute("dhx_button")){ + scheduler.callEvent("onLightboxButton", [src.className, src, e]); + } else if (src.className.indexOf("dhx_custom_button_")!=-1){ var index = src.parentNode.getAttribute("index"); var block=scheduler.form_blocks[scheduler.config.lightbox.sections[index].type]; var sec = src.parentNode.parentNode; block.button_click(index,src,sec,sec.nextSibling); } + break; } }; - this._get_lightbox().onkeypress=function(e){ + this._get_lightbox().onkeydown=function(e){ switch((e||event).keyCode){ case scheduler.keys.edit_save: if ((e||event).shiftKey) return; @@ -284,9 +352,11 @@ scheduler._init_lightbox_events=function(){ case scheduler.keys.edit_cancel: scheduler.cancel_lightbox(); break; + default: + break; } - } -} + }; +}; scheduler.setLightboxSize=function(){ var d = this._lightbox; if (!d) return; @@ -296,36 +366,92 @@ scheduler.setLightboxSize=function(){ con.style.height=con.scrollHeight+"px"; d.style.height=con.scrollHeight+50+"px"; con.style.height=con.scrollHeight+"px"; //it is incredible , how ugly IE can be -} +}; -scheduler._get_lightbox=function(){ +scheduler._init_dnd_events = function(){ + dhtmlxEvent(document.body, "mousemove", scheduler._move_while_dnd); + dhtmlxEvent(document.body, "mouseup", scheduler._finish_dnd); + scheduler._init_dnd_events = function(){}; +}; +scheduler._move_while_dnd = function(e){ + if (scheduler._dnd_start_lb){ + if (!document.dhx_unselectable){ + document.body.className += " dhx_unselectable"; + document.dhx_unselectable = true; + } + var lb = scheduler._get_lightbox(); + var now = (e&&e.target)?[e.pageX, e.pageY]:[event.clientX, event.clientY]; + lb.style.top = scheduler._lb_start[1]+now[1]-scheduler._dnd_start_lb[1]+"px"; + lb.style.left = scheduler._lb_start[0]+now[0]-scheduler._dnd_start_lb[0]+"px"; + } +}; +scheduler._ready_to_dnd = function(e){ + var lb = scheduler._get_lightbox(); + scheduler._lb_start = [parseInt(lb.style.left,10), parseInt(lb.style.top,10)]; + scheduler._dnd_start_lb = (e&&e.target)?[e.pageX, e.pageY]:[event.clientX, event.clientY]; +}; +scheduler._finish_dnd = function(){ + if (scheduler._lb_start){ + scheduler._lb_start = scheduler._dnd_start_lb = false; + document.body.className = document.body.className.replace(" dhx_unselectable",""); + document.dhx_unselectable = false; + } +}; +scheduler._get_lightbox=function(){ //scheduler.config.wide_form=true; if (!this._lightbox){ var d=document.createElement("DIV"); d.className="dhx_cal_light"; + if (scheduler.config.wide_form) + d.className+=" dhx_cal_light_wide"; + if (scheduler.form_blocks.recurring) + d.className+=" dhx_cal_light_rec"; + if (/msie|MSIE 6/.test(navigator.userAgent)) d.className+=" dhx_ie6"; d.style.visibility="hidden"; - d.innerHTML=this._lightbox_template; + var html = this._lightbox_template + var buttons = this.config.buttons_left; + scheduler.locale.labels["dhx_save_btn"] = scheduler.locale.labels.icon_save; + scheduler.locale.labels["dhx_cancel_btn"] = scheduler.locale.labels.icon_cancel; + scheduler.locale.labels["dhx_delete_btn"] = scheduler.locale.labels.icon_delete; + for (var i = 0; i < buttons.length; i++) + html+="
"+scheduler.locale.labels[buttons[i]]+"
"; + buttons = this.config.buttons_right; + for (var i = 0; i < buttons.length; i++) + html+="
"+scheduler.locale.labels[buttons[i]]+"
"; + + html+=""; + d.innerHTML=html; + if (scheduler.config.drag_lightbox){ + d.firstChild.onmousedown = scheduler._ready_to_dnd; + d.firstChild.onselectstart = function(){ return false; }; + d.firstChild.style.cursor = "pointer"; + scheduler._init_dnd_events(); + + } document.body.insertBefore(d,document.body.firstChild); this._lightbox=d; var sns=this.config.lightbox.sections; - var html=""; + html=""; for (var i=0; i < sns.length; i++) { var block=this.form_blocks[sns[i].type]; if (!block) continue; //ignore incorrect blocks sns[i].id="area_"+this.uid(); var button = ""; - if (sns[i].button) button = "
"+this.locale.labels["button_"+sns[i].button]+"
"; + if (sns[i].button){ + button = "
"+this.locale.labels["button_"+sns[i].button]+"
"; + } + + if (this.config.wide_form){ + html+="
"; + } html+="
"+button+this.locale.labels["section_"+sns[i].name]+"
"+block.render.call(this,sns[i]); - }; + html+="
" + } - //localization var ds=d.getElementsByTagName("div"); - ds[4].innerHTML=scheduler.locale.labels.icon_save; - ds[7].innerHTML=scheduler.locale.labels.icon_cancel; - ds[10].innerHTML=scheduler.locale.labels.icon_delete; //sections ds[1].innerHTML=html; //sizes @@ -336,5 +462,5 @@ scheduler._get_lightbox=function(){ d.style.visibility="visible"; } return this._lightbox; -} -scheduler._lightbox_template="
 
 
 
 
"; \ No newline at end of file +}; +scheduler._lightbox_template="
 
"; diff --git a/addons/base_calendar/static/lib/dhtmlxScheduler/sources/load.js b/addons/base_calendar/static/lib/dhtmlxScheduler/sources/load.js index cb81b4ee2ee..6d1579862ff 100644 --- a/addons/base_calendar/static/lib/dhtmlxScheduler/sources/load.js +++ b/addons/base_calendar/static/lib/dhtmlxScheduler/sources/load.js @@ -1,3 +1,7 @@ +/* +This software is allowed to use under GPL or you need to obtain Commercial or Enterise License +to use it in not GPL project. Please contact sales@dhtmlx.com for details +*/ scheduler._loaded={}; scheduler._load=function(url,from){ url=url||this._load_url; @@ -38,13 +42,14 @@ scheduler._load=function(url,from){ dhtmlxAjax.get(url,function(l){scheduler.on_load(l);}); this.callEvent("onXLS",[]); return true; -} +}; scheduler.on_load=function(loader){ this._loading=true; + var evs; if (this._process) - var evs=this[this._process].parse(loader.xmlDoc.responseText); + evs=this[this._process].parse(loader.xmlDoc.responseText); else - var evs=this._magic_parser(loader); + evs=this._magic_parser(loader); this._not_render=true; for (var i=0; i
'; diff --git a/addons/base_calendar/static/lib/dhtmlxScheduler/sources/locale_recurring_cs.js b/addons/base_calendar/static/lib/dhtmlxScheduler/sources/locale_recurring_cs.js index 69fd9d50454..310f5c508fb 100644 --- a/addons/base_calendar/static/lib/dhtmlxScheduler/sources/locale_recurring_cs.js +++ b/addons/base_calendar/static/lib/dhtmlxScheduler/sources/locale_recurring_cs.js @@ -1,3 +1,7 @@ +/* +This software is allowed to use under GPL or you need to obtain Commercial or Enterise License +to use it in not GPL project. Please contact sales@dhtmlx.com for details +*/ scheduler.__recurring_template='
@@ -145,7 +149,7 @@ scheduler.__recurring_template=' -
+
diff --git a/addons/base_calendar/static/lib/dhtmlxScheduler/sources/locale_recurring_da.js b/addons/base_calendar/static/lib/dhtmlxScheduler/sources/locale_recurring_da.js new file mode 100644 index 00000000000..1d3e272a936 --- /dev/null +++ b/addons/base_calendar/static/lib/dhtmlxScheduler/sources/locale_recurring_da.js @@ -0,0 +1,6 @@ +/* +This software is allowed to use under GPL or you need to obtain Commercial or Enterise License +to use it in not GPL project. Please contact sales@dhtmlx.com for details +*/ +scheduler.__recurring_template='



i hvermåned
hvermåned

gentagelse

'; + diff --git a/addons/base_calendar/static/lib/dhtmlxScheduler/sources/locale_recurring_de.js b/addons/base_calendar/static/lib/dhtmlxScheduler/sources/locale_recurring_de.js index f74afa55dc1..71929e988ea 100644 --- a/addons/base_calendar/static/lib/dhtmlxScheduler/sources/locale_recurring_de.js +++ b/addons/base_calendar/static/lib/dhtmlxScheduler/sources/locale_recurring_de.js @@ -1,2 +1,6 @@ -scheduler.__recurring_template='



Tag eines jedenMonats
jedenMonats

Ereignissen

'; +/* +This software is allowed to use under GPL or you need to obtain Commercial or Enterise License +to use it in not GPL project. Please contact sales@dhtmlx.com for details +*/ +scheduler.__recurring_template='



Tag eines jedenMonats
jedenMonats

Ereignissen

'; diff --git a/addons/base_calendar/static/lib/dhtmlxScheduler/sources/locale_recurring_el.js b/addons/base_calendar/static/lib/dhtmlxScheduler/sources/locale_recurring_el.js new file mode 100644 index 00000000000..d3d18ab4358 --- /dev/null +++ b/addons/base_calendar/static/lib/dhtmlxScheduler/sources/locale_recurring_el.js @@ -0,0 +1,6 @@ +/* +This software is allowed to use under GPL or you need to obtain Commercial or Enterise License +to use it in not GPL project. Please contact sales@dhtmlx.com for details +*/ +scheduler.__recurring_template='



ημέρα κάθεμήνα
κάθεμήνα

επαναλήψεις

'; + diff --git a/addons/base_calendar/static/lib/dhtmlxScheduler/sources/locale_recurring_es.js b/addons/base_calendar/static/lib/dhtmlxScheduler/sources/locale_recurring_es.js index 77b3539d21a..99bb3fdbfa5 100644 --- a/addons/base_calendar/static/lib/dhtmlxScheduler/sources/locale_recurring_es.js +++ b/addons/base_calendar/static/lib/dhtmlxScheduler/sources/locale_recurring_es.js @@ -1,2 +1,6 @@ -scheduler.__recurring_template='



dia cada mes
cadames

occurencias

'; +/* +This software is allowed to use under GPL or you need to obtain Commercial or Enterise License +to use it in not GPL project. Please contact sales@dhtmlx.com for details +*/ +scheduler.__recurring_template='



dia cada mes
cadames

occurencias

'; diff --git a/addons/base_calendar/static/lib/dhtmlxScheduler/sources/locale_recurring_fi.js b/addons/base_calendar/static/lib/dhtmlxScheduler/sources/locale_recurring_fi.js index 93d4675df3b..02184e9b601 100644 --- a/addons/base_calendar/static/lib/dhtmlxScheduler/sources/locale_recurring_fi.js +++ b/addons/base_calendar/static/lib/dhtmlxScheduler/sources/locale_recurring_fi.js @@ -1,2 +1,6 @@ -scheduler.__recurring_template='



päivänä jokakuukausi
jokakuukausi

Toiston jälkeen

'; +/* +This software is allowed to use under GPL or you need to obtain Commercial or Enterise License +to use it in not GPL project. Please contact sales@dhtmlx.com for details +*/ +scheduler.__recurring_template='



päivänä jokakuukausi
jokakuukausi

Toiston jälkeen

'; diff --git a/addons/base_calendar/static/lib/dhtmlxScheduler/sources/locale_recurring_fr.js b/addons/base_calendar/static/lib/dhtmlxScheduler/sources/locale_recurring_fr.js index 66601553fdb..d11418acba3 100644 --- a/addons/base_calendar/static/lib/dhtmlxScheduler/sources/locale_recurring_fr.js +++ b/addons/base_calendar/static/lib/dhtmlxScheduler/sources/locale_recurring_fr.js @@ -1,2 +1,6 @@ -scheduler.__recurring_template='



jour chaquemois
chaquemois

occurrences

'; +/* +This software is allowed to use under GPL or you need to obtain Commercial or Enterise License +to use it in not GPL project. Please contact sales@dhtmlx.com for details +*/ +scheduler.__recurring_template='



jour chaquemois
chaquemois

occurrences

'; diff --git a/addons/base_calendar/static/lib/dhtmlxScheduler/sources/locale_recurring_it.js b/addons/base_calendar/static/lib/dhtmlxScheduler/sources/locale_recurring_it.js index 8c0e82b7c12..a40b63939d3 100644 --- a/addons/base_calendar/static/lib/dhtmlxScheduler/sources/locale_recurring_it.js +++ b/addons/base_calendar/static/lib/dhtmlxScheduler/sources/locale_recurring_it.js @@ -1,2 +1,6 @@ -scheduler.__recurring_template='



giorno ognimese
ognimese

occorenze

'; +/* +This software is allowed to use under GPL or you need to obtain Commercial or Enterise License +to use it in not GPL project. Please contact sales@dhtmlx.com for details +*/ +scheduler.__recurring_template='



giorno ognimese
ognimese

occorenze

'; diff --git a/addons/base_calendar/static/lib/dhtmlxScheduler/sources/locale_recurring_nb.js b/addons/base_calendar/static/lib/dhtmlxScheduler/sources/locale_recurring_nb.js new file mode 100644 index 00000000000..65078dbc0b7 --- /dev/null +++ b/addons/base_calendar/static/lib/dhtmlxScheduler/sources/locale_recurring_nb.js @@ -0,0 +1,5 @@ +/* +This software is allowed to use under GPL or you need to obtain Commercial or Enterise License +to use it in not GPL project. Please contact sales@dhtmlx.com for details +*/ +scheduler.__recurring_template='



dag hvermåned
hvermåned

forekomst

'; \ No newline at end of file diff --git a/addons/base_calendar/static/lib/dhtmlxScheduler/sources/locale_recurring_nl.js b/addons/base_calendar/static/lib/dhtmlxScheduler/sources/locale_recurring_nl.js index 4ccfb09e526..314e1b083ad 100644 --- a/addons/base_calendar/static/lib/dhtmlxScheduler/sources/locale_recurring_nl.js +++ b/addons/base_calendar/static/lib/dhtmlxScheduler/sources/locale_recurring_nl.js @@ -1,2 +1,6 @@ -scheduler.__recurring_template='



dag iederemaanden
iederemaanden

keren

'; +/* +This software is allowed to use under GPL or you need to obtain Commercial or Enterise License +to use it in not GPL project. Please contact sales@dhtmlx.com for details +*/ +scheduler.__recurring_template='



dag iederemaanden
iederemaanden

keren

'; diff --git a/addons/base_calendar/static/lib/dhtmlxScheduler/sources/locale_recurring_pl.js b/addons/base_calendar/static/lib/dhtmlxScheduler/sources/locale_recurring_pl.js index b11a117a507..f3f27bf4eb1 100644 --- a/addons/base_calendar/static/lib/dhtmlxScheduler/sources/locale_recurring_pl.js +++ b/addons/base_calendar/static/lib/dhtmlxScheduler/sources/locale_recurring_pl.js @@ -1,2 +1,6 @@ -scheduler.__recurring_template='



dnia ka�degomiesi�ca
ka�degomiesi�ca

wyst�pieniu/ach

'; +/* +This software is allowed to use under GPL or you need to obtain Commercial or Enterise License +to use it in not GPL project. Please contact sales@dhtmlx.com for details +*/ +scheduler.__recurring_template='



dnia ka�degomiesi�ca
ka�degomiesi�ca

wyst�pieniu/ach

'; diff --git a/addons/base_calendar/static/lib/dhtmlxScheduler/sources/locale_recurring_pt.js b/addons/base_calendar/static/lib/dhtmlxScheduler/sources/locale_recurring_pt.js index 665e26d7a43..c15c10cbea4 100644 --- a/addons/base_calendar/static/lib/dhtmlxScheduler/sources/locale_recurring_pt.js +++ b/addons/base_calendar/static/lib/dhtmlxScheduler/sources/locale_recurring_pt.js @@ -1 +1,5 @@ -scheduler.__recurring_template='



todo diamês
todomês

ocorrências

'; \ No newline at end of file +/* +This software is allowed to use under GPL or you need to obtain Commercial or Enterise License +to use it in not GPL project. Please contact sales@dhtmlx.com for details +*/ +scheduler.__recurring_template='



todo diamês
todomês

ocorrências

'; \ No newline at end of file diff --git a/addons/base_calendar/static/lib/dhtmlxScheduler/sources/locale_recurring_ru.js b/addons/base_calendar/static/lib/dhtmlxScheduler/sources/locale_recurring_ru.js index 1919fe21b28..0bff7bde13a 100644 --- a/addons/base_calendar/static/lib/dhtmlxScheduler/sources/locale_recurring_ru.js +++ b/addons/base_calendar/static/lib/dhtmlxScheduler/sources/locale_recurring_ru.js @@ -1,2 +1,6 @@ -scheduler.__recurring_template='



числа каждый месяц
каждый месяц

повторений

'; +/* +This software is allowed to use under GPL or you need to obtain Commercial or Enterise License +to use it in not GPL project. Please contact sales@dhtmlx.com for details +*/ +scheduler.__recurring_template='



числа каждый месяц
каждый месяц

повторений

'; diff --git a/addons/base_calendar/static/lib/dhtmlxScheduler/sources/locale_recurring_sv.js b/addons/base_calendar/static/lib/dhtmlxScheduler/sources/locale_recurring_sv.js index 3087f904bcb..bb16adafb12 100644 --- a/addons/base_calendar/static/lib/dhtmlxScheduler/sources/locale_recurring_sv.js +++ b/addons/base_calendar/static/lib/dhtmlxScheduler/sources/locale_recurring_sv.js @@ -1 +1,5 @@ -scheduler.__recurring_template='



dagen varmånad
varmånad

upprepningar

'; \ No newline at end of file +/* +This software is allowed to use under GPL or you need to obtain Commercial or Enterise License +to use it in not GPL project. Please contact sales@dhtmlx.com for details +*/ +scheduler.__recurring_template='



dagen varmånad
varmånad

upprepningar

'; \ No newline at end of file diff --git a/addons/base_calendar/static/lib/dhtmlxScheduler/sources/locale_recurring_ua.js b/addons/base_calendar/static/lib/dhtmlxScheduler/sources/locale_recurring_ua.js index 5b723675b69..fbe032f3e32 100644 --- a/addons/base_calendar/static/lib/dhtmlxScheduler/sources/locale_recurring_ua.js +++ b/addons/base_calendar/static/lib/dhtmlxScheduler/sources/locale_recurring_ua.js @@ -1,2 +1,6 @@ -scheduler.__recurring_template='



числа кожний місяць
кожен місяць

повторень

'; +/* +This software is allowed to use under GPL or you need to obtain Commercial or Enterise License +to use it in not GPL project. Please contact sales@dhtmlx.com for details +*/ +scheduler.__recurring_template='



числа кожний місяць
кожен місяць

повторень

'; diff --git a/addons/base_calendar/static/lib/dhtmlxScheduler/sources/locale_ru.js b/addons/base_calendar/static/lib/dhtmlxScheduler/sources/locale_ru.js index 485cd795488..f199ae683e4 100644 --- a/addons/base_calendar/static/lib/dhtmlxScheduler/sources/locale_ru.js +++ b/addons/base_calendar/static/lib/dhtmlxScheduler/sources/locale_ru.js @@ -1,3 +1,7 @@ +/* +This software is allowed to use under GPL or you need to obtain Commercial or Enterise License +to use it in not GPL project. Please contact sales@dhtmlx.com for details +*/ scheduler.locale={ date:{ month_full:["Январь", "Февраль", "Март", "Апрель", "Maй", "Июнь", "Июль", "Август", "Сентябрь", "Oктябрь", "Ноябрь", "Декабрь"], @@ -33,6 +37,9 @@ scheduler.locale={ description:"Описание", /*year view extension*/ - year_tab:"Год" + year_tab:"Год", + + /*week agenda view extension*/ + week_agenda_tab: "Список" } } diff --git a/addons/base_calendar/static/lib/dhtmlxScheduler/sources/locale_si.js b/addons/base_calendar/static/lib/dhtmlxScheduler/sources/locale_si.js index 29da1a35bc0..1225b6ece32 100644 --- a/addons/base_calendar/static/lib/dhtmlxScheduler/sources/locale_si.js +++ b/addons/base_calendar/static/lib/dhtmlxScheduler/sources/locale_si.js @@ -1,3 +1,7 @@ +/* +This software is allowed to use under GPL or you need to obtain Commercial or Enterise License +to use it in not GPL project. Please contact sales@dhtmlx.com for details +*/ scheduler.locale={ date:{ month_full:["Januar", "Februar", "Marec", "April", "Maj", "Junij", "Julij", "Avgust", "September", "Oktober", "November", "December"], @@ -34,7 +38,10 @@ scheduler.locale={ description:"Opis", /*year view extension*/ - year_tab:"Leto" + year_tab:"Leto", + + /*week agenda view extension*/ + week_agenda_tab: "Agenda" } } diff --git a/addons/base_calendar/static/lib/dhtmlxScheduler/sources/locale_sv.js b/addons/base_calendar/static/lib/dhtmlxScheduler/sources/locale_sv.js index 76bf908acec..bcb120831e9 100644 --- a/addons/base_calendar/static/lib/dhtmlxScheduler/sources/locale_sv.js +++ b/addons/base_calendar/static/lib/dhtmlxScheduler/sources/locale_sv.js @@ -1,3 +1,7 @@ +/* +This software is allowed to use under GPL or you need to obtain Commercial or Enterise License +to use it in not GPL project. Please contact sales@dhtmlx.com for details +*/ /* Copyright DHTMLX LTD. http://www.dhtmlx.com You allowed to use this component or parts of it under GPL terms @@ -40,6 +44,9 @@ scheduler.locale={ description:"Beskrivning", /*year view extension*/ - year_tab:"År" + year_tab:"År", + + /*week agenda view extension*/ + week_agenda_tab: "Dagordning" } } \ No newline at end of file diff --git a/addons/base_calendar/static/lib/dhtmlxScheduler/sources/locale_tr.js b/addons/base_calendar/static/lib/dhtmlxScheduler/sources/locale_tr.js new file mode 100644 index 00000000000..5548a6f0dfc --- /dev/null +++ b/addons/base_calendar/static/lib/dhtmlxScheduler/sources/locale_tr.js @@ -0,0 +1,47 @@ +/* +This software is allowed to use under GPL or you need to obtain Commercial or Enterise License +to use it in not GPL project. Please contact sales@dhtmlx.com for details +*/ +scheduler.locale={ + date:{ + month_full:["Ocak", "ubat", "Mart", "Nisan", "Mays", "Haziran", "Temmuz", "Austos", "Eyll", "Ekim", "Kasm", "Aralk"], + month_short:["Oca", "ub", "Mar", "Nis", "May", "Haz", "Tem", "Au", "Eyl", "Eki", "Kas", "Ara"], + day_full:["Pazar", "Pazartes,", "Sal", "aramba", "Perembe", "Cuma", "Cumartesi"], + day_short:["Paz", "Pts", "Sal", "ar", "Per", "Cum", "Cts"] + }, + labels:{ + dhx_cal_today_button:"Bugn", + day_tab:"Gn", + week_tab:"Hafta", + month_tab:"Ay", + new_event:"Uygun", + icon_save:"Kaydet", + icon_cancel:"ptal", + icon_details:"Detaylar", + icon_edit:"Dzenle", + icon_delete:"Sil", + confirm_closing:"",//Your changes will be lost, are your sure ? + confirm_deleting:"Etkinlik silinecek, devam?", + section_description:"Aklama", + section_time:"Zaman aral", + full_day:"Tam gn", + + /*recurring events*/ + confirm_recurring:"Tm tekrar eden etkinlikler silinecek, devam?", + section_recurring:"Etkinlii tekrarla", + button_recurring:"Pasif", + button_recurring_open:"Aktif", + + /*agenda view extension*/ + agenda_tab:"Ajanda", + date:"Tarih", + description:"Aklama", + + /*year view extension*/ + year_tab:"Yl", + + /*week agenda view extension*/ + week_agenda_tab: "Ajanda" + } +} + diff --git a/addons/base_calendar/static/lib/dhtmlxScheduler/sources/locale_ua.js b/addons/base_calendar/static/lib/dhtmlxScheduler/sources/locale_ua.js index a7c946159e1..4009969d298 100644 --- a/addons/base_calendar/static/lib/dhtmlxScheduler/sources/locale_ua.js +++ b/addons/base_calendar/static/lib/dhtmlxScheduler/sources/locale_ua.js @@ -1,3 +1,7 @@ +/* +This software is allowed to use under GPL or you need to obtain Commercial or Enterise License +to use it in not GPL project. Please contact sales@dhtmlx.com for details +*/ scheduler.locale={ date:{ month_full:["Січень", "Лютий", "Березень", "Квітень", "Травень", "Червень", "Липень", "Серпень", "Вересень", "Жовтень", "Листопад", "Грудень"], @@ -34,7 +38,10 @@ scheduler.locale={ description:"Опис", /*year view extension*/ - year_tab:"Рік" + year_tab:"Рік", + + /*week agenda view extension*/ + week_agenda_tab: "Перелік" } } diff --git a/addons/base_calendar/static/lib/dhtmlxScheduler/sources/mobile.css b/addons/base_calendar/static/lib/dhtmlxScheduler/sources/mobile.css new file mode 100644 index 00000000000..8f543f20fee --- /dev/null +++ b/addons/base_calendar/static/lib/dhtmlxScheduler/sources/mobile.css @@ -0,0 +1,380 @@ +/* +This software is allowed to use under GPL or you need to obtain Commercial or Enterise License +to use it in not GPL project. Please contact sales@dhtmlx.com for details +*/ +/**Toolbar**/ + +.dhx_schedulerbar{ + background: -webkit-gradient(linear, left top, left bottom,from(#d7d7d7), to(#b7b7b7)); + background: -moz-linear-gradient(top, #d7d7d7, #b7b7b7); +} +.dhx_el_button input { + border-radius:4px; + -moz-border-radius:4px; + -webkit-border-radius:4px; + background: -webkit-gradient(linear, left top, left bottom, from(#9dbcc7),color-stop(0.4,#80a9b8),color-stop(0.6,#6799aa),to(#4f899d)); + background: -moz-linear-gradient(top, #9dbcc7, #518a9e); + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.6); + font-size: 14px; + color: #ffffff; + padding: 0px 10px; + border:1px solid #636363; + -moz-box-shadow: 0px 1px #ffffff; + -webkit-box-shadow:0px 1px #ffffff; + box-shadow: 0px 1px #ffffff; +} +.add .dhx_el_button input{ + background-image: url(./imgs_mobile/add.png),-webkit-gradient(linear, left top, left bottom, from(#9dbcc7),color-stop(0.4,#80a9b8),color-stop(0.6,#6799aa),to(#4f899d)); + background-image: url(./imgs_mobile/add.png),-moz-linear-gradient(top, #9dbcc7, #518a9e); + background-position: center center; + background-repeat:no-repeat; + width:34px; +} +.dhx_schedulerbar .dhx_el_segmented{ + border-radius:4px; + -moz-border-radius:4px; + -webkit-border-radius:4px; + float:none !important; + border:1px solid #636363; + -moz-box-shadow: 0px 1px #ffffff; + -webkit-box-shadow:0px 1px #ffffff; + height:32px; +} + + +.dhx_schedulerbar .dhx_el_segmented .segment_0,.dhx_schedulerbar .dhx_el_segmented .segment_1, .dhx_schedulerbar .dhx_el_segmented .segment_N { + background: -webkit-gradient(linear, left top, left bottom, from(#f8f8f8),color-stop(0.3,#eeeeee),color-stop(0.6,#dcdcdc),to(#d5d5d5)); + background: -moz-linear-gradient(top, #f8f8f8, #d5d5d5); + +} +.dhx_schedulerbar .dhx_el_segmented .selected.segment_0 ,.dhx_schedulerbar .dhx_el_segmented .selected.segment_1, .dhx_schedulerbar .dhx_el_segmented .selected.segment_N { + background: -webkit-gradient(linear, left top, left bottom, from(#9dbcc7),color-stop(0.4,#80a9b8),color-stop(0.6,#6799aa),to(#4f899d)); + background: -moz-linear-gradient(top, #9dbcc7, #518a9e); +} +.dhx_el_segmented .segment_N, .dhx_el_segmented .selected.segment_N { + border-left: 0; +} +.dhx_schedulerbar .dhx_el_segmented div { + text-shadow: 0 1px 0 #ffffff; + font-size: 14px; + color: #757575; + border:0px; + height:30px; +} +.dhx_schedulerbar .dhx_el_segmented div.selected { + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.6); + color: #ffffff; + height:30px; +} + + +.dhx_schedulerbar .dhx_el_segmented .segment_0{ + -webkit-border-top-left-radius: 4px; + -webkit-border-bottom-left-radius: 4px; + -moz-border-radius-topleft: 4px; + -moz-border-radius-bottomleft: 4px; + border-top-left-radius: 4px; + border-bottom-left-radius: 4px; + padding:0 11px 0 14px; +} +.dhx_schedulerbar .dhx_el_segmented .segment_1{ + border-left:1px solid #ababab; + border-right:1px solid #ababab; + padding:0 11px; +} +.dhx_schedulerbar .dhx_el_segmented .segment_N{ + -webkit-border-top-right-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -moz-border-radius-topright: 4px; + -moz-border-radius-bottomright: 4px; + border-top-right-radius: 4px; + border-bottom-right-radius: 4px; + padding:0 14px 0 11px; +} + + +/**Day Events**/ + +/*scale:*/ +/*scale item container*/ +.dhx_dayevents_scale_item { + -moz-user-select:-moz-none; + border-bottom:1px solid #D4D4D4; + color:#303030; + font-family:"Helvetica World","HelveticaNeue","Helvetica Neue","HelveticaNeueRoman","Helvetica","Tahoma","Geneva","Arial",sans-serif; + white-space:nowrap; +} +/*hour container*/ +.dhx_dayevents_scale_hour{ + float: left; + text-align: center; + font-size: 16px; + vertical-align:middle; + font-weight: bold; + /*background-color:#E1E6FF;*/ + /*background-color: #EEE;*/ +} +/*scale items*/ +.dhx_dayevents_scale_top, .dhx_dayevents_scale_bottom { + font-size: 10px; + float: left; + text-align:center; +} +.dhx_dayevents_scale_top{ + border-bottom:1px dotted #D4D4D4; +} +/*minutes container*/ +.dhx_dayevents_scale_minute{ + /*background-color:#E1E6FF;*/ + background-color: #EEE; + border-right:1px dotted #D4D4D4; + float:left; +} +/*event container*/ +.dhx_dayevents_scale_event { + float:left; +} +/*event:*/ +.dhx_dayevents_event_item{ + position:absolute; + border-radius: 4px; + -moz-border-radius: 4px; + -webkit-border-radius:4px; + font-size: 12px; + background-color: #e6f8ff; + border:1px solid #78a5b4; + font-family:"Helvetica World","HelveticaNeue","Helvetica Neue","HelveticaNeueRoman","Helvetica","Tahoma","Geneva","Arial",sans-serif; + /*-moz-box-shadow: 1px 1px 1px #888; + -webkit-box-shadow: 1px 1px 1px #888; + box-shadow: 1px 1px 1px #888;*/ +} +/*toolbar*/ +.dhx_topbar{ + font-size:18px; + background: -webkit-gradient(linear, left top, left bottom, from(#fdfdfd),color-stop(0.5, #ededed), to(#c8c8c8)) !important; + background: -moz-linear-gradient(top, #fdfdfd, #c8c8c8) !important; +} + + +/**List view**/ +.dhx_list_events_item{ + position:relative; + background-color:#ffffff; +} +.dhx_list_events_item .dhx_day_title{ + height:16px; + line-height:16px; + width:75px; + position:absolute; + left:1px; + top:0px; + /*background-color: #d23530;*/ + background: #518A9E; + border-radius: 2px; + text-align:center; + -moz-border-radius: 2px; + -moz-box-shadow: 1px 1px 1px #1c2329; + -webkit-box-shadow: 1px 1px 1px #1c2329; + box-shadow: 1px 1px 1px #1c2329; + -webkit-border-radius:2px; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.6); + font-size: 14px; + color: #ffffff; +} +.dhx_list_events_item .dhx_event_marker{ + display:inline-block; + margin-left:5px; + margin-top:5px; + height:10px; + /*line-height:22px;*/ + width:10px; + border-radius: 6px; + -moz-border-radius: 6px; + -webkit-border-radius:6px; + background-color: #e6f8ff; + border:1px solid #78a5b4; + vertical-align:top; +} + +.dhx_list_events_item .dhx_event_time{ + display:inline-block; + width:70px; + font-size:16px; + padding-top:8px; +} + +.dhx_list_events_item .dhx_event_text{ + display:inline-block; + padding-left:4px; + overflow:hidden; + height:22px; + vertical-align:top; + /*width:208px;*/ + white-space:nowrap; +} + + +/**Month events**/ + +/*calendar*/ +.dhx_cal_day_num.dhx_cal_selected_day, .dhx_cal_day_num.dhx_cal_current_day.dhx_cal_selected_day{ + background: -webkit-gradient(linear, left top, left bottom, from(#a0bfc9), to(#4f899d)) !important; + background: -moz-linear-gradient(top, #a0bfc9, #4f899d); + text-shadow:0 1px 0 rgba(0, 0, 0, 0.6); +} +.dhx_cal_day_num.dhx_cal_current_day { + background: -webkit-gradient(linear, left top, left bottom, from(#bababa), to(#eeeeee)) !important; + background: -moz-linear-gradient(top, #bababa, #eeeeee); + border-color:#636363; + text-shadow: 0 1px 0 rgba(0, 0, 0, 0.6); +} +.dhx_cal_day_num.dhx_cal_selected_day span{ + color:#ffffff; +} +.dhx_cal_day_num{ + position:relative; +} +.dhx_cal_day_num .day_with_events{ + position:absolute; + bottom:0px; + right:0px; + background-image:url(./imgs_mobile/event.png); + background-repeat:no-repeat; + width:12px; + height:12px; +} +.dhx_cal_day_num.dhx_cal_selected_day .day_with_events{ + background-image:url(./imgs_mobile/event_focus.png); +} +.dhx_cal_prev_button div { + background-image:url("./imgs_mobile/arrow_left.png"); + background-position:0; + width:28px; + height:29px; + top:6px; +} +.dhx_cal_next_button div { + background-image:url("./imgs_mobile/arrow_right.png"); + background-position:0; + width:28px; + height:29px; + top:6px; +} +/*events list*/ +.dhx_list_day_events_item{ + background-color:#ffffff; +} +.dhx_list_day_events_item .dhx_event_marker{ + display:inline-block; + margin-top:16px; + margin-left:5px; + height:10px; + width:10px; + border-radius: 6px; + -moz-border-radius: 6px; + -webkit-border-radius:6px; + background-color: #e6f8ff; + border:1px solid #78a5b4; +} +.dhx_list_day_events_item .dhx_event_time{ + display:inline-block; + width:auto; + height:42px; + line-height:42px; + padding-left:5px; +} + +.dhx_list_day_events_item .dhx_event_text{ + display:inline-block; + padding-left:10px; + line-height:42px; +} + +/*No events BG*/ +.no_events{ + background-image:url(./imgs_mobile/noevents.png); + background-repeat:no-repeat; +} + + +/**Selected event view**/ +.selected_event{ + width: 290px; + margin:5px; + background-color: #e6f8ff; + border:1px solid #78a5b4; + border-radius: 5px; + -moz-border-radius: 5px; + -webkit-border-radius:5px; + padding:3px 6px; +} +.selected_event .event_title{ + font-weight:bold +} +.selected_event .event_text{ + font-size:12px; +} +/*toolbar*/ +/* +.dhx_topbar.single_event{ + background: -webkit-gradient(linear, left top, left bottom,from(#d6d6d6), to(#b8b8b8)) !important; + background: -moz-linear-gradient(top, #d6d6d6, #b8b8b8) !important; +} +*/ + + +/**Editing form**/ +.dhx_el_formbutton.delete .dhx_inp_form_button{ + background: -webkit-gradient(linear, left top, left bottom, from(#f8f8f8), to(#d4d4d4)); + background: -moz-linear-gradient(top, #f8f8f8, #d4d4d4); + border-top:1px solid #888; + font-size:18px; + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + border-radius: 5px; + border:1px solid #8f8f8f; + color:#606060; + text-shadow: 0 1px 0 #ffffff; + height:40px; + +} +.dhx_el_button.cancel input{ + background: -webkit-gradient(linear, left top, left bottom, from(#f8f8f8),color-stop(0.3,#eeeeee),color-stop(0.6,#dcdcdc),to(#d5d5d5)); + background: -moz-linear-gradient(top, #f8f8f8, #d5d5d5); + color:#6E6E6E; + text-shadow:0 1px 0 #FFFFFF +} +.invalid .dhx_inp_text_border{ + border-color:#cc0000; +} +.invalid .dhx_inp_list { + color:#cc0000; +} + +/*confirm*/ + + + + +.dhx_win_body{ + font-weight:bold; + color:#3f2317; + text-shadow: 0px 1px #e2d3b6; + background:url(../images/confirm_main_bgr.png); +} +.dhx_win_body .dhx_view{ + background:transparent; +} +.dhx_el_bigbutton input, .dhx_el_bigroundbutton input{ + height:40px; + line-height:40px; +} +.dhx_el_bigroundbutton input, .alert .dhx_el_bigbutton input{ + background: #83a41f; + background: -webkit-gradient(linear, left top, left bottom, from(#9dbcc7),color-stop(0.4,#80a9b8),color-stop(0.6,#6799aa),to(#4f899d)); + background: -moz-linear-gradient(top, #9dbcc7, #518a9e); +} +.dhx_el_bigroundbutton{ + padding-top:0px; +} + diff --git a/addons/base_calendar/static/lib/dhtmlxScheduler/sources/mobile.js b/addons/base_calendar/static/lib/dhtmlxScheduler/sources/mobile.js new file mode 100644 index 00000000000..4455ef939be --- /dev/null +++ b/addons/base_calendar/static/lib/dhtmlxScheduler/sources/mobile.js @@ -0,0 +1,626 @@ +/* +This software is allowed to use under GPL or you need to obtain Commercial or Enterise License +to use it in not GPL project. Please contact sales@dhtmlx.com for details +*/ +if (!window.scheduler){ + window.scheduler = { + config:{ + }, + templates:{ + }, + xy:{ + }, + locale:{ + } + }; +} +/*Locale*/ +if(!scheduler.locale) + scheduler.locale = {}; +scheduler.locale.labels = { + list_tab : "List", + day_tab : "Day", + month_tab : "Month", + icon_today : "Today", + icon_save : "Save", + icon_delete : "Delete event", + icon_cancel : "Cancel", + icon_edit : "Edit", + icon_back : "Back", + icon_close : "Close form", + icon_yes : "Yes", + icon_no : "No", + confirm_closing : "Your changes will be lost, are your sure ?", + confirm_deleting : "Event will be deleted permanently, are you sure?", + label_event:"Event", + label_start:"Start", + label_end:"End", + label_details:"Notes", + label_from: "from", + label_to: "to" +}; + +/*Config*/ + +/*date*/ + +scheduler.config = { + init_date : new Date(), + form_date : "%d-%m-%Y %H:%i", + xml_date : "%Y-%m-%d %H:%i", + item_date : "%d.%m.%Y", + header_date : "%d.%m.%Y", + hour_date : "%H:%i", + scale_hour : "%H", + calendar_date : "%F %Y" +}; + +scheduler.config.form_rules = { + end_date:function(value,obj){ + return (obj.start_date.valueOf() < value.valueOf()); + } +}; + +/*Dimentions*/ +scheduler.xy = { + confirm_height : 231, + confirm_width : 250, + scale_width : 45, + scale_height : 15, + list_tab:54, + day_tab:54, + month_tab:68, + icon_today : 72, + icon_save : 100, + icon_cancel : 100, + icon_edit : 100, + icon_back : 100, + list_height: 42, + month_list_height: 42 +} + +/*Templates*/ +scheduler.templates = { + selected_event : function(obj){ + var html = ""; + if(!obj.start_date) return html; + html += "
"; + html += "
"+obj.text+"
"; + if(dhx.Date.datePart(obj.start_date).valueOf()==dhx.Date.datePart(obj.end_date).valueOf()){ + var fd = dhx.i18n.dateFormatStr(obj.start_date); + var fts = dhx.i18n.timeFormatStr(obj.start_date); + var fte = dhx.i18n.timeFormatStr(obj.end_date); + html += "
"+fd+"
"; + html += "
"+scheduler.locale.labels.label_from+" "+fts+" "+scheduler.locale.labels.label_to+" "+fte+"
"; + } + else{ + var fds = dhx.i18n.longDateFormatStr(obj.start_date); + var fde = dhx.i18n.longDateFormatStr(obj.end_date); + var fts = dhx.i18n.timeFormatStr(obj.start_date); + var fte = dhx.i18n.timeFormatStr(obj.end_date); + html += "
"+scheduler.locale.labels.label_from+" "+fts+" "+fds+"
"; + html += "
"+scheduler.locale.labels.label_to+" "+fte+" "+fde+"
"; + } + if(obj.details&&obj.details!==""){ + html += "
"+scheduler.locale.labels.label_details+"
"; + html += "
"+obj.details+"
"; + } + html += "
"; + return html; + }, + calendar_event : function(date){ + return date+"
"; + }, + event_date: function(date){ + return dhx.i18n.dateFormatStr(date); + }, + event_long_date: function(date){ + return dhx.i18n.longDateFormatStr(date); + }, + event_time : function(date){ + return dhx.i18n.timeFormatStr(date); + }, + event_color : function(obj,type){ + return (obj.color?"background-color:"+obj.color:""); + }, + event_marker : function(obj,type){ + return "
"; + }, + event_title: function(obj,type){ + return "
"+type.dateStart(obj.start_date)+"
"+type.timeStart(obj.start_date)+"
"+type.marker(obj,type)+"
"+obj.text+"
"; + }, + month_event_title : function(obj,type){ + return type.marker(obj,type)+"
"+type.timeStart(obj.start_date)+"
"+obj.text+"
" + }, + day_event: function(obj,type){ + return obj.text + } +}; + +/*Views of scheduler multiview*/ +scheduler.config.views = []; + + +dhx.ready(function(){ + if (scheduler.locale&&scheduler.locale.date) + dhx.Date.Locale = scheduler.locale.date; + + if(!scheduler.config.form){ + scheduler.config.form = [ + {view:"text", label:scheduler.locale.labels.label_event, name:'text'}, + {view:"datepicker", label:scheduler.locale.labels.label_start, name:'start_date', timeSelect:1, dateFormat:scheduler.config.form_date}, + {view:"datepicker", label:scheduler.locale.labels.label_end, name:'end_date', timeSelect:1, dateFormat:scheduler.config.form_date}, + {view:"textarea", label:scheduler.locale.labels.label_details, name:'details', width:300, height:150}, + {view:"button", label:scheduler.locale.labels.icon_delete, id:'delete',type:"form" ,css:"delete"} + ]; + } + if(!scheduler.config.bottom_toolbar){ + scheduler.config.bottom_toolbar = [ + { view:"button",id:"today",label:scheduler.locale.labels.icon_today,inputWidth:scheduler.xy.icon_today, align:"left",width:scheduler.xy.icon_today+6}, + { view:"segmented", id:"buttons",selected:"list",align:"center",multiview:true, options:[ + {value:"list", label:scheduler.locale.labels.list_tab,width:scheduler.xy.list_tab}, + {value:"day", label:scheduler.locale.labels.day_tab,width:scheduler.xy.day_tab}, + {value:"month", label:scheduler.locale.labels.month_tab,width:scheduler.xy.month_tab} + ]}, + { view:"button",css:"add",id:"add", align:"right",label:"",inputWidth:42,width:50}, + { view:"label", label:"",inputWidth:42,width:50, batch:"readonly"} + ]; + } + if(!scheduler.config.day_toolbar){ + scheduler.config.day_toolbar = [ + {view:'label',id:"prev",align:"left",label:"
"}, + {view:'label',id:"date",align:"center",width:200}, + {view:'label',id:"next",align:"right",label:"
"} + ]; + } + if(!scheduler.config.selected_toolbar){ + scheduler.config.selected_toolbar = [ + {view:'button', inputWidth:scheduler.xy.icon_back, type:"prev", id:"back",align:"left",label:scheduler.locale.labels.icon_back}, + {view:'button', inputWidth:scheduler.xy.icon_edit, id:"edit",align:"right",label:scheduler.locale.labels.icon_edit} + ]; + } + if(!scheduler.config.form_toolbar){ + scheduler.config.form_toolbar = [ + {view:'button', inputWidth:scheduler.xy.icon_cancel, id:"cancel",css:"cancel",align:"left",label:scheduler.locale.labels.icon_cancel}, + {view:'button', inputWidth:scheduler.xy.icon_save, id:"save",align:"right",label:scheduler.locale.labels.icon_save} + ]; + } + + /*List types*/ + scheduler.types = { + event_list:{ + name:"EventsList", + css:"events", + cssNoEvents:"no_events", + padding:0, + height:scheduler.xy.list_height, + width:"auto", + dateStart:scheduler.templates.event_date, + timeStart:scheduler.templates.event_time, + color:scheduler.templates.event_color, + marker:scheduler.templates.event_marker, + template:scheduler.templates.event_title + }, + day_event_list:{ + name:"DayEventsList", + css:"day_events", + cssNoEvents:"no_events", + padding:0, + height:scheduler.xy.month_list_height, + width:"auto", + timeStart:scheduler.templates.event_time, + color:scheduler.templates.event_color, + marker:scheduler.templates.event_marker, + template:scheduler.templates.month_event_title + } + }; + + dhx.Type(dhx.ui.list, scheduler.types.event_list); + dhx.Type(dhx.ui.list, scheduler.types.day_event_list); + + dhx.DataDriver.scheduler = { + records:"/*/event" + }; + dhx.extend(dhx.DataDriver.scheduler,dhx.DataDriver.xml); + + /*the views of scheduler multiview*/ + var views = [ + { + id:"list", + view:"list", + type:"EventsList", + startDate:new Date() + }, + { + id:"day", + rows:[ + { + id:"dayBar", + view:"toolbar", + css:"dhx_topbar", + elements: scheduler.config.day_toolbar + }, + { + id:"dayList", + view:"dayevents" + } + ] + }, + { + id:"month", + rows:[ + { + id:"calendar", + view:"calendar", + dayWithEvents: scheduler.templates.calendar_event, + calendarHeader:scheduler.config.calendar_date + }, + { + id:"calendarDayEvents", + view:"list", + type:"DayEventsList" + } + ] + + }, + { + id:"event", + animate:{ + type:"slide", + subtype:"in", + direction:"top" + }, + rows:[ + { + id:"eventBar", + view:"toolbar", + type:"TopBar", + css:"single_event", + elements: scheduler.config.selected_toolbar + }, + { + id:"eventTemplate", + view:"template", + template:scheduler.templates.selected_event + } + + ] + }, + { + id:"form", + rows:[ + { + id:"editBar", + view:"toolbar", + type:"TopBar", + elements:scheduler.config.form_toolbar + }, + { + id:"editForm", + view:"form", + elements: scheduler.config.form, + rules: scheduler.config.form_rules + } + ] + } + ].concat(scheduler.config.views); + + dhx.protoUI({ + name:"scheduler", + defaults:{ + rows:[ + { + view:"multiview", + id:"views", + cells: views + }, + { + view:"toolbar", + id:"bottomBar", + type:"SchedulerBar", + visibleBatch:"default", + elements: scheduler.config.bottom_toolbar + } + ], + color:"#color#", + textColor:"#textColor#" + }, + $init: function() { + this.name = "Scheduler"; + this._viewobj.className += " dhx_scheduler"; + /*date format functions*/ + dhx.i18n.dateFormat = scheduler.config.item_date; + dhx.i18n.timeFormat = scheduler.config.hour_date; + dhx.i18n.fullDateFormat = scheduler.config.xml_date; + dhx.i18n.headerFormatStr = dhx.Date.dateToStr( scheduler.config.header_date); + dhx.i18n.setLocale(); + this.data.provideApi(this); + this.data.extraParser = dhx.bind(function(data){ + data.start_date = dhx.i18n.fullDateFormatDate(data.start_date); + data.end_date = dhx.i18n.fullDateFormatDate(data.end_date); + },this); + this.$ready.push(this._initStructure); + this.data.attachEvent("onStoreUpdated", dhx.bind(this._sortDates,this)); + }, + _initStructure:function(){ + this._initToolbars(); + this._initmonth(); + + //store current date + this.coreData = new dhx.DataValue(); + this.coreData.setValue(scheduler.config.init_date); + + this.$$("dayList").define("date",this.coreData); + + this.selectedEvent = new dhx.DataRecord(); + + if(this.config.readonly){ + this.define("readonly",this.config.readonly); + } + else if(scheduler.config.readonly) + this.define("readonly",true); + /*saving data*/ + if(this.config.save){ + var dp = new dhx.DataProcessor({ + master:this, + url:this.config.save + }); + dp.attachEvent("onBeforeDataSend",this._onSchedulerUpdate); + } + + if(this.$$("date")) + this.$$("date").bind(this.coreData, null, dhx.i18n.headerFormatStr); + + + this.$$("list").sync(this); + this.$$("list").bind(this.coreData, function(target, source){ + return source < target.end_date; + }); + + this.$$("dayList").sync(this, true); + this.$$("dayList").bind(this.coreData, function(target, source){ + var d = dhx.Date.datePart(source); + return d < target.end_date && dhx.Date.add(d,1,"day") > target.start_date; + }); + + this.$$("calendar").bind(this.coreData); + + this.$$("calendarDayEvents").sync(this, true); + this.$$("calendarDayEvents").bind(this.coreData, function(target, source){ + var d = dhx.Date.datePart(source); + return d < target.end_date && dhx.Date.add(d,1,"day") > target.start_date; + }); + + this.$$("eventTemplate").bind(this); + this.$$("editForm").bind(this); + + this.$$("list").attachEvent("onItemClick", dhx.bind(this._on_event_clicked, this)); + this.$$("dayList").attachEvent("onItemClick", dhx.bind(this._on_event_clicked, this)); + this.$$("calendarDayEvents").attachEvent("onItemClick", dhx.bind(this._on_event_clicked, this)); + }, + _on_event_clicked:function(id){ + this.setCursor(id); + this.$$('event').show(); + }, + /*Sorts dates asc, gets hash of dates with event*/ + _sortDates:function(){ + this.data.blockEvent(); + this.data.sort(function(a,b){ + return a.start_date < b.start_date?1:-1; + }); + this.data.unblockEvent(); + this._eventsByDate = {}; + var evs = this.data.getRange(); + for(var i = 0; i < evs.length;i++) + this._setDateEvents(evs[i]); + }, + /*Month Events view: gets dates of a certain event*/ + _setDateEvents:function(ev){ + var start = dhx.Date.datePart(ev.start_date); + var end = dhx.Date.datePart(ev.end_date); + if(ev.end_date.valueOf()!=end.valueOf()) + end = dhx.Date.add(end,1,"day"); + while(startscheduler._props[name].options.length){ + scheduler._props[name]._original_size = size; + size = 0; + } + scheduler._props[name].size = size; + scheduler._props[name].skip_incorrect = skip_incorrect||false; + scheduler.date[name+"_start"]= scheduler.date.day_start; scheduler.templates[name+"_date"] = function(date){ return scheduler.templates.day_date(date); - } + }; + scheduler.templates[name+"_scale_date"] = function(date){ + var list = scheduler._props[name].options; if (!list.length) return ""; var index = (scheduler._props[name].position||0)+Math.floor((scheduler._correct_shift(date.valueOf(),1)-scheduler._min_date.valueOf())/(60*60*24*1000)); if (list[index].css) return ""+list[index].label+""; else return list[index].label; - } - scheduler.date["add_"+name]=function(date,inc){ return scheduler.date.add(date,inc,"day"); } - scheduler.date["get_"+name+"_end"]=function(date){ return scheduler.date.add(date,size||list.length,"day"); } - - scheduler._props[name]={map_to:property, options:list, size:size, step:step, position:0 }; + }; + + scheduler.date["add_"+name]=function(date,inc){ return scheduler.date.add(date,inc,"day"); }; + scheduler.date["get_"+name+"_end"]=function(date){ + return scheduler.date.add(date,scheduler._props[name].size||scheduler._props[name].options.length,"day"); + }; scheduler.attachEvent("onOptionsLoad",function(){ - var order = scheduler._props[name].order = {}; + var pr = scheduler._props[name]; + var order = pr.order = {}; + var list = pr.options; for(var i=0; i list.length) { + pr._original_size = pr.size; + pr.size = 0; + } + else + pr.size = pr._original_size||pr.size; + if (scheduler._date && scheduler._mode == name) scheduler.setCurrentView(scheduler._date, scheduler._mode); }); scheduler.callEvent("onOptionsLoad",[]); @@ -40,8 +69,31 @@ scheduler.scrollUnit=function(step){ this.update_view(); } }; - (function(){ + var _removeIncorrectEvents = function(evs) { + var pr = scheduler._props[scheduler._mode]; + if(pr && pr.order && pr.skip_incorrect) { + var correct_events = []; + for(var i=0; i= pr.size+pr.position ) - return false; + var val = pr.order[e[pr.map_to]]; + if (val < pr.position || val >= pr.size+pr.position ) + return false; } } return res; - } - + }; scheduler._reset_scale = function(){ var pr = scheduler._props[this._mode]; var ret = t.apply(this,arguments); @@ -106,7 +157,7 @@ scheduler.scrollUnit=function(step){ } return ret; - } + }; var r = scheduler._get_event_sday; scheduler._get_event_sday=function(ev){ var pr = scheduler._props[this._mode]; @@ -115,7 +166,7 @@ scheduler.scrollUnit=function(step){ return pr.order[ev[pr.map_to]]-pr.position; } return r.call(this,ev); - } + }; var l = scheduler.locate_holder_day; scheduler.locate_holder_day=function(a,b,ev){ var pr = scheduler._props[this._mode]; @@ -124,23 +175,25 @@ scheduler.scrollUnit=function(step){ return pr.order[ev[pr.map_to]]*1+(b?1:0)-pr.position; } return l.apply(this,arguments); - } + }; var p = scheduler._mouse_coords; scheduler._mouse_coords=function(){ var pr = scheduler._props[this._mode]; var pos=p.apply(this,arguments); if (pr){ + if(!this._drag_event) this._drag_event = {}; var ev = this._drag_event; - if (this._drag_id){ + if (this._drag_id && this._drag_mode){ ev = this.getEvent(this._drag_id); this._drag_event._dhx_changed = true; } var unit_ind = Math.min(pos.x+pr.position,pr.options.length-1); ev[pr.map_to]=pr.options[unit_ind].key; - pos.x = unit_ind/10000000; + pos.x = 0; + pos.custom = true; } return pos; - } + }; var o = scheduler._time_order; scheduler._time_order = function(evs){ var pr = scheduler._props[this._mode]; @@ -150,8 +203,7 @@ scheduler.scrollUnit=function(step){ }); } else o.apply(this,arguments); - } - + }; scheduler.attachEvent("onEventAdded",function(id,ev){ if (this._loading) return true; for (var a in scheduler._props){ @@ -160,7 +212,7 @@ scheduler.scrollUnit=function(step){ ev[pr.map_to] = pr.options[0].key; } return true; - }) + }); scheduler.attachEvent("onEventCreated",function(id,n_ev){ var pr = scheduler._props[this._mode]; if (pr){ @@ -170,6 +222,20 @@ scheduler.scrollUnit=function(step){ this.event_updated(ev); } return true; - }) - -})(); \ No newline at end of file + }) +})(); + + +/* just in case, there shouldn't be any need for this + + scheduler.getUnitSection = function(event_id) { + var ev = scheduler.getEvent(event_id); + var options = scheduler._props['unit'].options; + var section; + for(var i=0; ifrom) - result.push(sev[i]); - } else if (!ev.event_pid || ev.event_pid==0){ + for (var i=0; i < sev.length; i++) { + // if event is in rec_markers then it will be checked by himself, here need to skip it + if (!sev[i].rec_pattern && sev[i].start_datefrom && !this._rec_markers[sev[i].id]) { + result.push(sev[i]); + } + } + } else if (ev.id.toString().indexOf("#")==-1){ // if it's virtual event we can skip it result.push(ev); } } @@ -585,7 +628,7 @@ scheduler.getEvents = function(from,to){ scheduler.config.repeat_date="%m.%d.%Y"; scheduler.config.lightbox.sections=[ {name:"description", height:130, map_to:"text", type:"textarea" , focus:true}, - {name:"recurring", height:115, type:"recurring", map_to:"rec_type", button:"recurring"}, + {name:"recurring", type:"recurring", map_to:"rec_type", button:"recurring"}, {name:"time", height:72, type:"time", map_to:"auto"} ]; //drop secondary attributes diff --git a/addons/base_calendar/static/lib/dhtmlxScheduler/sources/repeat_template.html b/addons/base_calendar/static/lib/dhtmlxScheduler/sources/repeat_template.html index 3d351383fc9..078f4415777 100644 --- a/addons/base_calendar/static/lib/dhtmlxScheduler/sources/repeat_template.html +++ b/addons/base_calendar/static/lib/dhtmlxScheduler/sources/repeat_template.html @@ -49,7 +49,7 @@

occurrences
-
+
diff --git a/addons/base_calendar/static/lib/dhtmlxScheduler/sources/repeat_template_cn.html b/addons/base_calendar/static/lib/dhtmlxScheduler/sources/repeat_template_cn.html index 222bb5f6e6c..c47f485b80f 100644 --- a/addons/base_calendar/static/lib/dhtmlxScheduler/sources/repeat_template_cn.html +++ b/addons/base_calendar/static/lib/dhtmlxScheduler/sources/repeat_template_cn.html @@ -49,7 +49,7 @@

次结束
-
+
diff --git a/addons/base_calendar/static/lib/dhtmlxScheduler/sources/repeat_template_de.html b/addons/base_calendar/static/lib/dhtmlxScheduler/sources/repeat_template_de.html index ae9dbb3cabf..bb70c5aac79 100644 --- a/addons/base_calendar/static/lib/dhtmlxScheduler/sources/repeat_template_de.html +++ b/addons/base_calendar/static/lib/dhtmlxScheduler/sources/repeat_template_de.html @@ -52,7 +52,7 @@

Ereignissen
-
+
diff --git a/addons/base_calendar/static/lib/dhtmlxScheduler/sources/repeat_template_el.html b/addons/base_calendar/static/lib/dhtmlxScheduler/sources/repeat_template_el.html new file mode 100644 index 00000000000..eddddee99aa --- /dev/null +++ b/addons/base_calendar/static/lib/dhtmlxScheduler/sources/repeat_template_el.html @@ -0,0 +1,57 @@ +
+
+
+
+
+
+ +
+
+
+ + +
+ ημέρα κάθεμήνα
+ κάθεμήνα
+
+ +
+
+
+
+ επαναλήψεις
+
+
+
+
+
+
\ No newline at end of file diff --git a/addons/base_calendar/static/lib/dhtmlxScheduler/sources/repeat_template_es.html b/addons/base_calendar/static/lib/dhtmlxScheduler/sources/repeat_template_es.html index bcfcf2e81ea..94549432bc8 100644 --- a/addons/base_calendar/static/lib/dhtmlxScheduler/sources/repeat_template_es.html +++ b/addons/base_calendar/static/lib/dhtmlxScheduler/sources/repeat_template_es.html @@ -49,7 +49,7 @@

occurencias
-
+
diff --git a/addons/base_calendar/static/lib/dhtmlxScheduler/sources/repeat_template_fr.html b/addons/base_calendar/static/lib/dhtmlxScheduler/sources/repeat_template_fr.html index 65313e6314b..281dbe7afc4 100644 --- a/addons/base_calendar/static/lib/dhtmlxScheduler/sources/repeat_template_fr.html +++ b/addons/base_calendar/static/lib/dhtmlxScheduler/sources/repeat_template_fr.html @@ -49,7 +49,7 @@

occurrences
-
+
diff --git a/addons/base_calendar/static/lib/dhtmlxScheduler/sources/repeat_template_it.html b/addons/base_calendar/static/lib/dhtmlxScheduler/sources/repeat_template_it.html index e55c7ebc2bc..1d92cb4d420 100644 --- a/addons/base_calendar/static/lib/dhtmlxScheduler/sources/repeat_template_it.html +++ b/addons/base_calendar/static/lib/dhtmlxScheduler/sources/repeat_template_it.html @@ -49,7 +49,7 @@

occorenze
-
+
diff --git a/addons/base_calendar/static/lib/dhtmlxScheduler/sources/repeat_template_nl.html b/addons/base_calendar/static/lib/dhtmlxScheduler/sources/repeat_template_nl.html index 14f32c7f2ef..d9e563191f6 100644 --- a/addons/base_calendar/static/lib/dhtmlxScheduler/sources/repeat_template_nl.html +++ b/addons/base_calendar/static/lib/dhtmlxScheduler/sources/repeat_template_nl.html @@ -57,7 +57,7 @@

keren
-
+
diff --git a/addons/base_calendar/static/lib/dhtmlxScheduler/sources/repeat_template_ru.html b/addons/base_calendar/static/lib/dhtmlxScheduler/sources/repeat_template_ru.html index 6b521212eb0..becab2809c7 100644 --- a/addons/base_calendar/static/lib/dhtmlxScheduler/sources/repeat_template_ru.html +++ b/addons/base_calendar/static/lib/dhtmlxScheduler/sources/repeat_template_ru.html @@ -49,7 +49,7 @@

повторений
-
+
diff --git a/addons/base_calendar/static/lib/dhtmlxScheduler/sources/scheduler.js b/addons/base_calendar/static/lib/dhtmlxScheduler/sources/scheduler.js index b14592a050b..80018266f24 100644 --- a/addons/base_calendar/static/lib/dhtmlxScheduler/sources/scheduler.js +++ b/addons/base_calendar/static/lib/dhtmlxScheduler/sources/scheduler.js @@ -1,8 +1,14 @@ -window.dhtmlXScheduler=window.scheduler={version:2.2}; +/* +This software is allowed to use under GPL or you need to obtain Commercial or Enterise License +to use it in not GPL project. Please contact sales@dhtmlx.com for details +*/ +window.dhtmlXScheduler=window.scheduler={version:3.0}; dhtmlxEventable(scheduler); scheduler.init=function(id,date,mode){ date=date||(new Date()); mode=mode||"week"; + + scheduler.date.init(); this._obj=(typeof id == "string")?document.getElementById(id):id; this._els=[]; @@ -19,9 +25,9 @@ scheduler.init=function(id,date,mode){ if (scheduler.callEvent("onSchedulerResize",[])) scheduler.update_view(); }, 100); - }) - + }); this.set_sizes(); + scheduler.callEvent('onSchedulerReady', []); this.setCurrentView(date,mode); }; scheduler.xy={ @@ -57,7 +63,7 @@ scheduler.set_sizes=function(){ var data_y=this.xy.scale_height+this.xy.nav_height+(this._quirks?-2:0); this.set_xy(this._els["dhx_cal_data"][0],w,h-(data_y+2),0,data_y+2); -} +}; scheduler.set_xy=function(node,w,h,x,y){ node.style.width=Math.max(0,w)+"px"; node.style.height=Math.max(0,h)+"px"; @@ -65,7 +71,7 @@ scheduler.set_xy=function(node,w,h,x,y){ node.style.left=x+"px"; node.style.top=y+"px"; } -} +}; scheduler.get_elements=function(){ //get all child elements as named hash var els=this._obj.getElementsByTagName("DIV"); @@ -78,26 +84,26 @@ scheduler.get_elements=function(){ var t=scheduler.locale.labels[els[i].getAttribute("name")||name]; if (t) els[i].innerHTML=t; } -} +}; scheduler.set_actions=function(){ for (var a in this._els) if (this._click[a]) for (var i=0; i < this._els[a].length; i++) this._els[a][i].onclick=scheduler._click[a]; - this._obj.onselectstart=function(e){ return false; } + this._obj.onselectstart=function(e){ return false; }; this._obj.onmousemove=function(e){ scheduler._on_mouse_move(e||event); - } + }; this._obj.onmousedown=function(e){ scheduler._on_mouse_down(e||event); - } + }; this._obj.onmouseup=function(e){ scheduler._on_mouse_up(e||event); - } + }; this._obj.ondblclick=function(e){ scheduler._on_dbl_click(e||event); } -} +}; scheduler.select=function(id){ if (this._table_view || !this.getEvent(id)._timed) return; //temporary block if (this._select_id==id) return; @@ -105,13 +111,13 @@ scheduler.select=function(id){ this.unselect(); this._select_id = id; this.updateEvent(id); -} +}; scheduler.unselect=function(id){ if (id && id!=this._select_id) return; var t=this._select_id; this._select_id = null; if (t) this.updateEvent(t); -} +}; scheduler.getState=function(){ return { mode: this._mode, @@ -119,11 +125,13 @@ scheduler.getState=function(){ min_date: this._min_date, max_date: this._max_date, editor_id: this._edit_id, - lightbox_id: this._lightbox_id + lightbox_id: this._lightbox_id, + new_event: this._new_event }; -} +}; scheduler._click={ dhx_cal_data:function(e){ + //debugger; var trg = e?e.target:event.srcElement; var id = scheduler._locate_event(trg); @@ -149,7 +157,8 @@ scheduler._click={ scheduler.setCurrentView(new Date()); }, dhx_cal_tab:function(){ - var mode = this.getAttribute("name").split("_")[0]; + var name = this.getAttribute("name"); + var mode = name.substring(0, name.search("_tab")); scheduler.setCurrentView(scheduler._date,mode); }, buttons:{ @@ -159,11 +168,10 @@ scheduler._click={ details:function(id){ scheduler.showLightbox(id); }, cancel:function(id){ scheduler.editStop(false); } } -} - +}; scheduler.addEventNow=function(start,end,e){ var base = {}; - if (typeof start == "object"){ + if (start && start.constructor.toString().match(/object/i) !== null){ base = start; start = null; } @@ -179,14 +187,18 @@ scheduler.addEventNow=function(start,end,e){ } end = start+d; } - - + var end_date = new Date(end); + + // scheduler.addEventNow(new Date(), new Date()) + collision though get_visible events defect (such event was not retrieved) + if(start_date.valueOf() == end_date.valueOf()) + end_date.setTime(end_date.valueOf()+d); + base.start_date = base.start_date||start_date; - base.end_date = base.end_date||new Date(end); + base.end_date = base.end_date||end_date; base.text = base.text||this.locale.labels.new_event; base.id = this._drag_id = this.uid(); this._drag_mode="new-size"; - + this._loading=true; this.addEvent(base); this.callEvent("onEventCreated",[this._drag_id,e]); @@ -194,7 +206,7 @@ scheduler.addEventNow=function(start,end,e){ this._drag_event={}; //dummy , to trigger correct event updating logic this._on_mouse_up(e); -} +}; scheduler._on_dbl_click=function(e,src){ src = src||(e.target||e.srcElement); if (this.config.readonly) return; @@ -203,6 +215,7 @@ scheduler._on_dbl_click=function(e,src){ case "dhx_scale_holder": case "dhx_scale_holder_now": case "dhx_month_body": + case "dhx_wa_day_data": if (!scheduler.config.dblclick_create) break; var pos=this._mouse_coords(e); var start=this._min_date.valueOf()+(pos.y*this.config.time_step+(this._table_view?0:pos.x)*24*60)*60000; @@ -210,6 +223,7 @@ scheduler._on_dbl_click=function(e,src){ this.addEventNow(start,null,e); break; case "dhx_body": + case "dhx_wa_ev_body": case "dhx_cal_event_line": case "dhx_cal_event_clear": var id = this._locate_event(src); @@ -227,7 +241,7 @@ scheduler._on_dbl_click=function(e,src){ if (t) t.call(this,e); break; } -} +}; scheduler._mouse_coords=function(ev){ var pos; @@ -238,17 +252,17 @@ scheduler._mouse_coords=function(ev){ else pos={ x:ev.clientX + (b.scrollLeft||d.scrollLeft||0) - b.clientLeft, y:ev.clientY + (b.scrollTop||d.scrollTop||0) - b.clientTop - } + }; //apply layout pos.x-=getAbsoluteLeft(this._obj)+(this._table_view?0:this.xy.scale_width); pos.y-=getAbsoluteTop(this._obj)+this.xy.nav_height+(this._dy_shift||0)+this.xy.scale_height-this._els["dhx_cal_data"][0].scrollTop; pos.ev = ev; - + var handler = this["mouse_"+this._mode]; if (handler) return handler.call(this,pos); - + //transform to date if (!this._table_view){ pos.x=Math.max(0,Math.ceil(pos.x/this._cols[0])-1); @@ -258,7 +272,7 @@ scheduler._mouse_coords=function(ev){ for (dy=1; dy < this._colsS.heights.length; dy++) if (this._colsS.heights[dy]>pos.y) break; - pos.y=(Math.max(0,Math.ceil(pos.x/this._cols[0])-1)+Math.max(0,dy-1)*7)*24*60/this.config.time_step; + pos.y=(Math.max(0,Math.ceil(pos.x/this._cols[0])-1)+Math.max(0,dy-1)*7)*24*60/this.config.time_step; pos.x=0; } @@ -270,14 +284,14 @@ scheduler._close_not_saved=function(){ if (!c || confirm(c)) scheduler.editStop(scheduler.config.positive_closing); } -} +}; scheduler._correct_shift=function(start, back){ return start-=((new Date(scheduler._min_date)).getTimezoneOffset()-(new Date(start)).getTimezoneOffset())*60000*(back?-1:1); -} +}; scheduler._on_mouse_move=function(e){ if (this._drag_mode){ var pos=this._mouse_coords(e); - if (!this._drag_pos || this._drag_pos.x!=pos.x || this._drag_pos.y!=pos.y){ + if (!this._drag_pos || pos.custom || this._drag_pos.x!=pos.x || this._drag_pos.y!=pos.y){ if (this._edit_id!=this._drag_id) this._close_not_saved(); @@ -316,8 +330,11 @@ scheduler._on_mouse_move=function(e){ end = ev.end_date.valueOf()-(ev.start_date.valueOf()-start); } else { start = ev.start_date.valueOf(); - if (this._table_view) + if (this._table_view) { end = this._min_date.valueOf()+pos.y*this.config.time_step*60000 + (pos.custom?0:24*60*60000); + if (this._mode == "month") + end = this._correct_shift(end, false); + } else{ end = this.date.date_part(new Date(ev.end_date)).valueOf()+pos.y*this.config.time_step*60000; this._els["dhx_cal_data"][0].style.cursor="s-resize"; @@ -327,7 +344,7 @@ scheduler._on_mouse_move=function(e){ if (this._drag_mode == "new-size"){ if (end <= this._drag_start){ var shift = pos.shift||((this._table_view && !pos.custom)?24*60*60000:0); - start = end-shift; + start = end-(pos.shift?0:shift); end = this._drag_start+(shift||(this.config.time_step*60000)); } else { start = this._drag_start; @@ -339,7 +356,7 @@ scheduler._on_mouse_move=function(e){ var new_end = new Date(end-1); var new_start = new Date(start); //prevent out-of-borders situation for day|week view - if (this._table_view || (new_end.getDate()==new_start.getDate() && new_end.getHours() this._min_date && now.getHours() >= this.config.first_hour && now.getHours()
" + html+=">
"+this.templates.month_day(sd)+"
"; sd=this.date.add(sd,1,"day"); } html+=""; @@ -625,7 +683,7 @@ scheduler._reset_month_scale=function(b,dd,sd){ b.innerHTML=html; return sd; -} +}; scheduler.getLabel = function(property, key) { var sections = this.config.lightbox.sections; for (var i=0; i