From d5d9ea0ac379833c32da54240410099400b36faf Mon Sep 17 00:00:00 2001 From: Manuel Cillero Date: Tue, 15 Aug 2017 20:27:06 +0200 Subject: [PATCH] dhtmlxGantt library is now a requirement to download --- config/INSTALL.md | 431 +- .../dhtmlxgantt/connector/base_connector.php | 948 -- .../dhtmlxgantt/connector/chart_connector.php | 18 - .../dhtmlxgantt/connector/combo_connector.php | 94 - libraries/dhtmlxgantt/connector/convert.php | 69 - .../connector/crosslink_connector.php | 141 - .../dhtmlxgantt/connector/data_connector.php | 528 - .../dhtmlxgantt/connector/dataprocessor.php | 521 - .../connector/dataview_connector.php | 73 - libraries/dhtmlxgantt/connector/db_adodb.php | 72 - libraries/dhtmlxgantt/connector/db_common.php | 1149 -- libraries/dhtmlxgantt/connector/db_excel.php | 190 - .../dhtmlxgantt/connector/db_filesystem.php | 345 - libraries/dhtmlxgantt/connector/db_mssql.php | 73 - libraries/dhtmlxgantt/connector/db_mysqli.php | 56 - libraries/dhtmlxgantt/connector/db_oracle.php | 88 - libraries/dhtmlxgantt/connector/db_pdo.php | 100 - .../dhtmlxgantt/connector/db_phpcake.php | 85 - libraries/dhtmlxgantt/connector/db_phpci.php | 65 - libraries/dhtmlxgantt/connector/db_phpyii.php | 91 - .../dhtmlxgantt/connector/db_postgre.php | 73 - libraries/dhtmlxgantt/connector/db_sasql.php | 54 - libraries/dhtmlxgantt/connector/db_sqlite.php | 34 - .../dhtmlxgantt/connector/db_sqlite3.php | 33 - libraries/dhtmlxgantt/connector/db_sqlsrv.php | 102 - .../dhtmlxgantt/connector/filesystem_item.php | 19 - .../dhtmlxgantt/connector/form_connector.php | 62 - .../dhtmlxgantt/connector/gantt_connector.php | 364 - .../dhtmlxgantt/connector/grid_config.php | 423 - .../dhtmlxgantt/connector/grid_connector.php | 269 - .../connector/keygrid_connector.php | 48 - .../dhtmlxgantt/connector/mixed_connector.php | 28 - .../connector/options_connector.php | 45 - .../connector/scheduler_connector.php | 230 - libraries/dhtmlxgantt/connector/strategy.php | 508 - libraries/dhtmlxgantt/connector/tools.php | 267 - .../dhtmlxgantt/connector/tree_connector.php | 231 - .../connector/treedatagroup_connector.php | 89 - .../treedatamultitable_connector.php | 91 - .../connector/treegrid_connector.php | 121 - .../connector/treegridgroup_connector.php | 46 - .../treegridmultitable_connector.php | 69 - .../connector/treegroup_connector.php | 46 - .../connector/treemultitable_connector.php | 51 - libraries/dhtmlxgantt/connector/update.php | 266 - .../dhtmlxgantt/connector/xss_filter.php | 199 - libraries/dhtmlxgantt/dhtmlxgantt.css | 9 - libraries/dhtmlxgantt/dhtmlxgantt.js | 419 - .../dhtmlxgantt/ext/dhtmlxgantt_marker.js | 15 - .../ext/dhtmlxgantt_multiselect.js | 21 - .../dhtmlxgantt/ext/dhtmlxgantt_quick_info.js | 22 - .../dhtmlxgantt/ext/dhtmlxgantt_tooltip.js | 17 - libraries/dhtmlxgantt/locale/locale.js | 11 - libraries/dhtmlxgantt/locale/locale_ar.js | 12 - libraries/dhtmlxgantt/locale/locale_be.js | 12 - libraries/dhtmlxgantt/locale/locale_ca.js | 12 - libraries/dhtmlxgantt/locale/locale_cn.js | 11 - libraries/dhtmlxgantt/locale/locale_cs.js | 12 - libraries/dhtmlxgantt/locale/locale_da.js | 12 - libraries/dhtmlxgantt/locale/locale_de.js | 12 - libraries/dhtmlxgantt/locale/locale_el.js | 12 - libraries/dhtmlxgantt/locale/locale_es.js | 12 - libraries/dhtmlxgantt/locale/locale_fi.js | 12 - libraries/dhtmlxgantt/locale/locale_fr.js | 12 - libraries/dhtmlxgantt/locale/locale_he.js | 11 - libraries/dhtmlxgantt/locale/locale_hu.js | 12 - libraries/dhtmlxgantt/locale/locale_id.js | 12 - libraries/dhtmlxgantt/locale/locale_it.js | 12 - libraries/dhtmlxgantt/locale/locale_jp.js | 11 - libraries/dhtmlxgantt/locale/locale_kr.js | 11 - libraries/dhtmlxgantt/locale/locale_nb.js | 12 - libraries/dhtmlxgantt/locale/locale_nl.js | 12 - libraries/dhtmlxgantt/locale/locale_no.js | 12 - libraries/dhtmlxgantt/locale/locale_pl.js | 12 - libraries/dhtmlxgantt/locale/locale_pt.js | 12 - libraries/dhtmlxgantt/locale/locale_ro.js | 12 - libraries/dhtmlxgantt/locale/locale_ru.js | 12 - libraries/dhtmlxgantt/locale/locale_si.js | 12 - libraries/dhtmlxgantt/locale/locale_sk.js | 12 - libraries/dhtmlxgantt/locale/locale_sv.js | 12 - libraries/dhtmlxgantt/locale/locale_tr.js | 12 - libraries/dhtmlxgantt/locale/locale_ua.js | 12 - .../skins/dhtmlxgantt_broadway.css | 9 - .../dhtmlxgantt/skins/dhtmlxgantt_meadow.css | 9 - .../dhtmlxgantt/skins/dhtmlxgantt_skyblue.css | 9 - .../dhtmlxgantt/skins/dhtmlxgantt_terrace.css | 9 - libraries/dhtmlxgantt/sources/dhtmlxgantt.js | 9424 ----------------- .../dhtmlxgantt/sources/dhtmlxgantt.js.map | 1 - .../sources/ext/dhtmlxgantt_marker.js | 119 - .../sources/ext/dhtmlxgantt_marker.js.map | 1 - .../sources/ext/dhtmlxgantt_multiselect.js | 241 - .../ext/dhtmlxgantt_multiselect.js.map | 1 - .../sources/ext/dhtmlxgantt_quick_info.js | 218 - .../sources/ext/dhtmlxgantt_quick_info.js.map | 1 - .../sources/ext/dhtmlxgantt_tooltip.js | 172 - .../sources/ext/dhtmlxgantt_tooltip.js.map | 1 - .../dhtmlxgantt/sources/locale/locale.js | 54 - .../dhtmlxgantt/sources/locale/locale.js.map | 1 - .../dhtmlxgantt/sources/locale/locale_ar.js | 57 - .../sources/locale/locale_ar.js.map | 1 - .../dhtmlxgantt/sources/locale/locale_be.js | 58 - .../sources/locale/locale_be.js.map | 1 - .../dhtmlxgantt/sources/locale/locale_ca.js | 61 - .../sources/locale/locale_ca.js.map | 1 - .../dhtmlxgantt/sources/locale/locale_cn.js | 64 - .../sources/locale/locale_cn.js.map | 1 - .../dhtmlxgantt/sources/locale/locale_cs.js | 58 - .../sources/locale/locale_cs.js.map | 1 - .../dhtmlxgantt/sources/locale/locale_da.js | 58 - .../sources/locale/locale_da.js.map | 1 - .../dhtmlxgantt/sources/locale/locale_de.js | 58 - .../sources/locale/locale_de.js.map | 1 - .../dhtmlxgantt/sources/locale/locale_el.js | 58 - .../sources/locale/locale_el.js.map | 1 - .../dhtmlxgantt/sources/locale/locale_es.js | 61 - .../sources/locale/locale_es.js.map | 1 - .../dhtmlxgantt/sources/locale/locale_fi.js | 58 - .../sources/locale/locale_fi.js.map | 1 - .../dhtmlxgantt/sources/locale/locale_fr.js | 56 - .../sources/locale/locale_fr.js.map | 1 - .../dhtmlxgantt/sources/locale/locale_he.js | 58 - .../sources/locale/locale_he.js.map | 1 - .../dhtmlxgantt/sources/locale/locale_hu.js | 58 - .../sources/locale/locale_hu.js.map | 1 - .../dhtmlxgantt/sources/locale/locale_id.js | 9 - .../sources/locale/locale_id.js.map | 1 - .../dhtmlxgantt/sources/locale/locale_it.js | 58 - .../sources/locale/locale_it.js.map | 1 - .../dhtmlxgantt/sources/locale/locale_jp.js | 61 - .../sources/locale/locale_jp.js.map | 1 - .../dhtmlxgantt/sources/locale/locale_kr.js | 49 - .../sources/locale/locale_kr.js.map | 1 - .../dhtmlxgantt/sources/locale/locale_nb.js | 58 - .../sources/locale/locale_nb.js.map | 1 - .../dhtmlxgantt/sources/locale/locale_nl.js | 58 - .../sources/locale/locale_nl.js.map | 1 - .../dhtmlxgantt/sources/locale/locale_no.js | 58 - .../sources/locale/locale_no.js.map | 1 - .../dhtmlxgantt/sources/locale/locale_pl.js | 58 - .../sources/locale/locale_pl.js.map | 1 - .../dhtmlxgantt/sources/locale/locale_pt.js | 67 - .../sources/locale/locale_pt.js.map | 1 - .../dhtmlxgantt/sources/locale/locale_ro.js | 62 - .../sources/locale/locale_ro.js.map | 1 - .../dhtmlxgantt/sources/locale/locale_ru.js | 58 - .../sources/locale/locale_ru.js.map | 1 - .../dhtmlxgantt/sources/locale/locale_si.js | 58 - .../sources/locale/locale_si.js.map | 1 - .../dhtmlxgantt/sources/locale/locale_sk.js | 58 - .../sources/locale/locale_sk.js.map | 1 - .../dhtmlxgantt/sources/locale/locale_sv.js | 60 - .../sources/locale/locale_sv.js.map | 1 - .../dhtmlxgantt/sources/locale/locale_tr.js | 58 - .../sources/locale/locale_tr.js.map | 1 - .../dhtmlxgantt/sources/locale/locale_ua.js | 58 - .../sources/locale/locale_ua.js.map | 1 - .../sources/skins/dhtmlxgantt_broadway.css | 1524 --- .../sources/skins/dhtmlxgantt_meadow.css | 1420 --- .../sources/skins/dhtmlxgantt_skyblue.css | 1389 --- .../sources/skins/dhtmlxgantt_terrace.css | 1422 --- 160 files changed, 220 insertions(+), 27248 deletions(-) delete mode 100644 libraries/dhtmlxgantt/connector/base_connector.php delete mode 100644 libraries/dhtmlxgantt/connector/chart_connector.php delete mode 100644 libraries/dhtmlxgantt/connector/combo_connector.php delete mode 100644 libraries/dhtmlxgantt/connector/convert.php delete mode 100644 libraries/dhtmlxgantt/connector/crosslink_connector.php delete mode 100644 libraries/dhtmlxgantt/connector/data_connector.php delete mode 100644 libraries/dhtmlxgantt/connector/dataprocessor.php delete mode 100644 libraries/dhtmlxgantt/connector/dataview_connector.php delete mode 100644 libraries/dhtmlxgantt/connector/db_adodb.php delete mode 100644 libraries/dhtmlxgantt/connector/db_common.php delete mode 100644 libraries/dhtmlxgantt/connector/db_excel.php delete mode 100644 libraries/dhtmlxgantt/connector/db_filesystem.php delete mode 100644 libraries/dhtmlxgantt/connector/db_mssql.php delete mode 100644 libraries/dhtmlxgantt/connector/db_mysqli.php delete mode 100644 libraries/dhtmlxgantt/connector/db_oracle.php delete mode 100644 libraries/dhtmlxgantt/connector/db_pdo.php delete mode 100644 libraries/dhtmlxgantt/connector/db_phpcake.php delete mode 100644 libraries/dhtmlxgantt/connector/db_phpci.php delete mode 100644 libraries/dhtmlxgantt/connector/db_phpyii.php delete mode 100644 libraries/dhtmlxgantt/connector/db_postgre.php delete mode 100644 libraries/dhtmlxgantt/connector/db_sasql.php delete mode 100644 libraries/dhtmlxgantt/connector/db_sqlite.php delete mode 100644 libraries/dhtmlxgantt/connector/db_sqlite3.php delete mode 100644 libraries/dhtmlxgantt/connector/db_sqlsrv.php delete mode 100644 libraries/dhtmlxgantt/connector/filesystem_item.php delete mode 100644 libraries/dhtmlxgantt/connector/form_connector.php delete mode 100644 libraries/dhtmlxgantt/connector/gantt_connector.php delete mode 100644 libraries/dhtmlxgantt/connector/grid_config.php delete mode 100644 libraries/dhtmlxgantt/connector/grid_connector.php delete mode 100644 libraries/dhtmlxgantt/connector/keygrid_connector.php delete mode 100644 libraries/dhtmlxgantt/connector/mixed_connector.php delete mode 100644 libraries/dhtmlxgantt/connector/options_connector.php delete mode 100644 libraries/dhtmlxgantt/connector/scheduler_connector.php delete mode 100644 libraries/dhtmlxgantt/connector/strategy.php delete mode 100644 libraries/dhtmlxgantt/connector/tools.php delete mode 100644 libraries/dhtmlxgantt/connector/tree_connector.php delete mode 100644 libraries/dhtmlxgantt/connector/treedatagroup_connector.php delete mode 100644 libraries/dhtmlxgantt/connector/treedatamultitable_connector.php delete mode 100644 libraries/dhtmlxgantt/connector/treegrid_connector.php delete mode 100644 libraries/dhtmlxgantt/connector/treegridgroup_connector.php delete mode 100644 libraries/dhtmlxgantt/connector/treegridmultitable_connector.php delete mode 100644 libraries/dhtmlxgantt/connector/treegroup_connector.php delete mode 100644 libraries/dhtmlxgantt/connector/treemultitable_connector.php delete mode 100644 libraries/dhtmlxgantt/connector/update.php delete mode 100644 libraries/dhtmlxgantt/connector/xss_filter.php delete mode 100644 libraries/dhtmlxgantt/dhtmlxgantt.css delete mode 100644 libraries/dhtmlxgantt/dhtmlxgantt.js delete mode 100644 libraries/dhtmlxgantt/ext/dhtmlxgantt_marker.js delete mode 100644 libraries/dhtmlxgantt/ext/dhtmlxgantt_multiselect.js delete mode 100644 libraries/dhtmlxgantt/ext/dhtmlxgantt_quick_info.js delete mode 100644 libraries/dhtmlxgantt/ext/dhtmlxgantt_tooltip.js delete mode 100644 libraries/dhtmlxgantt/locale/locale.js delete mode 100644 libraries/dhtmlxgantt/locale/locale_ar.js delete mode 100644 libraries/dhtmlxgantt/locale/locale_be.js delete mode 100644 libraries/dhtmlxgantt/locale/locale_ca.js delete mode 100644 libraries/dhtmlxgantt/locale/locale_cn.js delete mode 100644 libraries/dhtmlxgantt/locale/locale_cs.js delete mode 100644 libraries/dhtmlxgantt/locale/locale_da.js delete mode 100644 libraries/dhtmlxgantt/locale/locale_de.js delete mode 100644 libraries/dhtmlxgantt/locale/locale_el.js delete mode 100644 libraries/dhtmlxgantt/locale/locale_es.js delete mode 100644 libraries/dhtmlxgantt/locale/locale_fi.js delete mode 100644 libraries/dhtmlxgantt/locale/locale_fr.js delete mode 100644 libraries/dhtmlxgantt/locale/locale_he.js delete mode 100644 libraries/dhtmlxgantt/locale/locale_hu.js delete mode 100644 libraries/dhtmlxgantt/locale/locale_id.js delete mode 100644 libraries/dhtmlxgantt/locale/locale_it.js delete mode 100644 libraries/dhtmlxgantt/locale/locale_jp.js delete mode 100644 libraries/dhtmlxgantt/locale/locale_kr.js delete mode 100644 libraries/dhtmlxgantt/locale/locale_nb.js delete mode 100644 libraries/dhtmlxgantt/locale/locale_nl.js delete mode 100644 libraries/dhtmlxgantt/locale/locale_no.js delete mode 100644 libraries/dhtmlxgantt/locale/locale_pl.js delete mode 100644 libraries/dhtmlxgantt/locale/locale_pt.js delete mode 100644 libraries/dhtmlxgantt/locale/locale_ro.js delete mode 100644 libraries/dhtmlxgantt/locale/locale_ru.js delete mode 100644 libraries/dhtmlxgantt/locale/locale_si.js delete mode 100644 libraries/dhtmlxgantt/locale/locale_sk.js delete mode 100644 libraries/dhtmlxgantt/locale/locale_sv.js delete mode 100644 libraries/dhtmlxgantt/locale/locale_tr.js delete mode 100644 libraries/dhtmlxgantt/locale/locale_ua.js delete mode 100644 libraries/dhtmlxgantt/skins/dhtmlxgantt_broadway.css delete mode 100644 libraries/dhtmlxgantt/skins/dhtmlxgantt_meadow.css delete mode 100644 libraries/dhtmlxgantt/skins/dhtmlxgantt_skyblue.css delete mode 100644 libraries/dhtmlxgantt/skins/dhtmlxgantt_terrace.css delete mode 100644 libraries/dhtmlxgantt/sources/dhtmlxgantt.js delete mode 100644 libraries/dhtmlxgantt/sources/dhtmlxgantt.js.map delete mode 100644 libraries/dhtmlxgantt/sources/ext/dhtmlxgantt_marker.js delete mode 100644 libraries/dhtmlxgantt/sources/ext/dhtmlxgantt_marker.js.map delete mode 100644 libraries/dhtmlxgantt/sources/ext/dhtmlxgantt_multiselect.js delete mode 100644 libraries/dhtmlxgantt/sources/ext/dhtmlxgantt_multiselect.js.map delete mode 100644 libraries/dhtmlxgantt/sources/ext/dhtmlxgantt_quick_info.js delete mode 100644 libraries/dhtmlxgantt/sources/ext/dhtmlxgantt_quick_info.js.map delete mode 100644 libraries/dhtmlxgantt/sources/ext/dhtmlxgantt_tooltip.js delete mode 100644 libraries/dhtmlxgantt/sources/ext/dhtmlxgantt_tooltip.js.map delete mode 100644 libraries/dhtmlxgantt/sources/locale/locale.js delete mode 100644 libraries/dhtmlxgantt/sources/locale/locale.js.map delete mode 100644 libraries/dhtmlxgantt/sources/locale/locale_ar.js delete mode 100644 libraries/dhtmlxgantt/sources/locale/locale_ar.js.map delete mode 100644 libraries/dhtmlxgantt/sources/locale/locale_be.js delete mode 100644 libraries/dhtmlxgantt/sources/locale/locale_be.js.map delete mode 100644 libraries/dhtmlxgantt/sources/locale/locale_ca.js delete mode 100644 libraries/dhtmlxgantt/sources/locale/locale_ca.js.map delete mode 100644 libraries/dhtmlxgantt/sources/locale/locale_cn.js delete mode 100644 libraries/dhtmlxgantt/sources/locale/locale_cn.js.map delete mode 100644 libraries/dhtmlxgantt/sources/locale/locale_cs.js delete mode 100644 libraries/dhtmlxgantt/sources/locale/locale_cs.js.map delete mode 100644 libraries/dhtmlxgantt/sources/locale/locale_da.js delete mode 100644 libraries/dhtmlxgantt/sources/locale/locale_da.js.map delete mode 100644 libraries/dhtmlxgantt/sources/locale/locale_de.js delete mode 100644 libraries/dhtmlxgantt/sources/locale/locale_de.js.map delete mode 100644 libraries/dhtmlxgantt/sources/locale/locale_el.js delete mode 100644 libraries/dhtmlxgantt/sources/locale/locale_el.js.map delete mode 100644 libraries/dhtmlxgantt/sources/locale/locale_es.js delete mode 100644 libraries/dhtmlxgantt/sources/locale/locale_es.js.map delete mode 100644 libraries/dhtmlxgantt/sources/locale/locale_fi.js delete mode 100644 libraries/dhtmlxgantt/sources/locale/locale_fi.js.map delete mode 100644 libraries/dhtmlxgantt/sources/locale/locale_fr.js delete mode 100644 libraries/dhtmlxgantt/sources/locale/locale_fr.js.map delete mode 100644 libraries/dhtmlxgantt/sources/locale/locale_he.js delete mode 100644 libraries/dhtmlxgantt/sources/locale/locale_he.js.map delete mode 100644 libraries/dhtmlxgantt/sources/locale/locale_hu.js delete mode 100644 libraries/dhtmlxgantt/sources/locale/locale_hu.js.map delete mode 100644 libraries/dhtmlxgantt/sources/locale/locale_id.js delete mode 100644 libraries/dhtmlxgantt/sources/locale/locale_id.js.map delete mode 100644 libraries/dhtmlxgantt/sources/locale/locale_it.js delete mode 100644 libraries/dhtmlxgantt/sources/locale/locale_it.js.map delete mode 100644 libraries/dhtmlxgantt/sources/locale/locale_jp.js delete mode 100644 libraries/dhtmlxgantt/sources/locale/locale_jp.js.map delete mode 100644 libraries/dhtmlxgantt/sources/locale/locale_kr.js delete mode 100644 libraries/dhtmlxgantt/sources/locale/locale_kr.js.map delete mode 100644 libraries/dhtmlxgantt/sources/locale/locale_nb.js delete mode 100644 libraries/dhtmlxgantt/sources/locale/locale_nb.js.map delete mode 100644 libraries/dhtmlxgantt/sources/locale/locale_nl.js delete mode 100644 libraries/dhtmlxgantt/sources/locale/locale_nl.js.map delete mode 100644 libraries/dhtmlxgantt/sources/locale/locale_no.js delete mode 100644 libraries/dhtmlxgantt/sources/locale/locale_no.js.map delete mode 100644 libraries/dhtmlxgantt/sources/locale/locale_pl.js delete mode 100644 libraries/dhtmlxgantt/sources/locale/locale_pl.js.map delete mode 100644 libraries/dhtmlxgantt/sources/locale/locale_pt.js delete mode 100644 libraries/dhtmlxgantt/sources/locale/locale_pt.js.map delete mode 100644 libraries/dhtmlxgantt/sources/locale/locale_ro.js delete mode 100644 libraries/dhtmlxgantt/sources/locale/locale_ro.js.map delete mode 100644 libraries/dhtmlxgantt/sources/locale/locale_ru.js delete mode 100644 libraries/dhtmlxgantt/sources/locale/locale_ru.js.map delete mode 100644 libraries/dhtmlxgantt/sources/locale/locale_si.js delete mode 100644 libraries/dhtmlxgantt/sources/locale/locale_si.js.map delete mode 100644 libraries/dhtmlxgantt/sources/locale/locale_sk.js delete mode 100644 libraries/dhtmlxgantt/sources/locale/locale_sk.js.map delete mode 100644 libraries/dhtmlxgantt/sources/locale/locale_sv.js delete mode 100644 libraries/dhtmlxgantt/sources/locale/locale_sv.js.map delete mode 100644 libraries/dhtmlxgantt/sources/locale/locale_tr.js delete mode 100644 libraries/dhtmlxgantt/sources/locale/locale_tr.js.map delete mode 100644 libraries/dhtmlxgantt/sources/locale/locale_ua.js delete mode 100644 libraries/dhtmlxgantt/sources/locale/locale_ua.js.map delete mode 100644 libraries/dhtmlxgantt/sources/skins/dhtmlxgantt_broadway.css delete mode 100644 libraries/dhtmlxgantt/sources/skins/dhtmlxgantt_meadow.css delete mode 100644 libraries/dhtmlxgantt/sources/skins/dhtmlxgantt_skyblue.css delete mode 100644 libraries/dhtmlxgantt/sources/skins/dhtmlxgantt_terrace.css diff --git a/config/INSTALL.md b/config/INSTALL.md index 65ca43e..3ef75f5 100644 --- a/config/INSTALL.md +++ b/config/INSTALL.md @@ -8,18 +8,16 @@ Contents of this file: * Drupal administration * Customizing your theme(s) * Multisite Configuration - * More Information - * Copyright notices REQUIREMENTS ------------ **SuiteDesk** began long time ago as a Drupal 6 project, and now continues as a -standalone open software product. It requires: +standalone opensource product. It requires: * A web server (Apache web server with mode_rewrite module and the ability to - use local .htaccess files is recommended), + use local `.htaccess` files is recommended), * PHP 5 (better with version 5.4.45), and * MySQL (4.1.1 or greater). @@ -29,7 +27,7 @@ See http://www.php.net and http://www.mysql.com for more information. INSTALLATION ------------ -### 1. DOWNLOAD SUITEDESK +### 1. Download SuiteDesk You can obtain the latest **SuiteDesk** release from: @@ -47,7 +45,7 @@ your web server's document root or your public HTML directory: mv suitedesk-version/* suitedesk-version/.htaccess /var/www/html -### 2. DOWNLOAD PDF TOOL +### 2. Download PDF tool The print PDF module requires the use of an external PDF generation tool. The currently supported is *wkhtmltopdf*. To install follow the next steps: @@ -61,7 +59,44 @@ currently supported is *wkhtmltopdf*. To install follow the next steps: also place a symbolic link to the executable. 3. Check https://wkhtmltopdf.org/usage/wkhtmltopdf.txt for further information. -### 3. CREATE THE CONFIGURATION FILE AND GRANT WRITE PERMISSIONS +### 3. Download HTML Purifier library + +Make sure you check *HTML Purifier* and make sure that you have fulfilled all of +its requirements before running this. Specifically, you'll need the PHP +extension `ctype` (in almost all PHP distributions), and it's nice to have `dom` +and `iconv`. + +Download HTML Purifier from http://htmlpurifier.org. You will need 4.8.0 or +later. Extract the `library` folder to `libraries` directory. The final setup +should be: + + libraries/htmlpurifier/ + HTMLPurifier + HTMLPurifier.autoload.php + HTMLPurifier.auto.php + HTMLPurifier.func.php + HTMLPurifier.includes.php + HTMLPurifier.kses.php + HTMLPurifier.path.php + HTMLPurifier.php + HTMLPurifier.safe-includes.php + +### 4. Download dhtmlxGantt library + +Download dhtmlxGantt from https://dhtmlx.com/docs/products/dhtmlxGantt/. You +will need 3.2.0 or later. Extract the `codebase` folder and rename it to +`dhtmlxgantt` in the `libraries` directory. The final setup should be: + + libraries/dhtmlxGantt/ + connector + ext + locale + skins + sources + dhtmlxgantt.css + dhtmlxgantt.js + +### 5. Create the configuration file and grant write permissions **SuiteDesk** comes with a `default.settings.php` file in the `config/default` directory. Use this file as a template to create your settings file. To avoid @@ -82,36 +117,7 @@ write privileges to the `config/default` directory with the command (from the chmod o+w config/default -You can create more than one configuration file, and the configuration file to -be loaded is based upon the rules below. - -The configuration directory will be discovered by stripping the website's -hostname from left to right and pathname from right to left. The first -configuration file found will be used and any others will be ignored. If no -other configuration file is found then the default configuration file at -`config/default` will be used. For example, for a fictitious site installed at -http://www.example.org/mysite/test the `settings.php` is searched in the -following directories: - - 1. config/www.example.org.mysite.test - 2. config/example.org.mysite.test - 3. config/org.mysite.test - - 4. config/www.example.org.mysite - 5. config/example.org.mysite - 6. config/org.mysite - - 7. config/www.example.org - 8. config/example.org - 9. config/org - - 10. config/default - -If you are installing on a non-standard port number, prefix the hostname with -that number. For example, http://www.example.org:8080/mysite/test could be -loaded from `config/8080.www.drupal.org.mysite.test` directory. - -### 4. CREATE THE SUITEDESK DATABASE +### 6. Create the SuiteDesk database **SuiteDesk** requires access to a database in order to be installed. Your database user will need sufficient privileges to run **SuiteDesk**. @@ -122,22 +128,22 @@ documentation or ask your webhost service provider. Take note of the *username*, *password*, *database name* and *hostname* as you create the database. You will enter these items in the next commands. -This step is only necessary if you don't already have a database set-up (e.g. by -your host). In the following examples, *username* is an example MySQL user which -has the CREATE and GRANT privileges. Use the appropriate user name for your -system. +This step is only necessary if you don't already have a database setup (e.g. by +your host). In the following examples, *useradmin* is an example MySQL user +which has the CREATE and GRANT privileges. Use the appropriate user name for +your system. First, you must create a new database for your site (here, *databasename* is the name of the new database): - mysqladmin -u username -p create databasename + mysqladmin -u useradmin -p create databasename -MySQL will prompt for the *username* database password and then create the +MySQL will prompt for the *useradmin* database password and then create the initial database files. Next you must login and set the access database rights: - mysql -u username -p + mysql -u useradmin -p -Again, you will be asked for the *username* database password. At the MySQL +Again, you will be asked for the *useradmin* database password. At the MySQL prompt, enter following command: ```sql @@ -148,9 +154,9 @@ prompt, enter following command: where - *databasename* is the name of your database - *username@localhost* is the username of your MySQL account - *password* is the password required for that username + - *databasename* is the name of your database, + - *username@localhost* is the username of your MySQL account, and + - *password* is the password required for that username. Note: Unless your database user has all of the privileges listed above, you will not be able to run **SuiteDesk**. @@ -159,8 +165,8 @@ If successful, MySQL will reply with: Query OK, 0 rows affected -In the configuration file you will fill out the `$db_url` variable to configure -the database connection using the format: +In the configuration file you will fill out the `$db_url` value to configure the +database connection using the format: $db_url['default'] = 'mysql://username:password@localhost/databasename'; @@ -192,135 +198,175 @@ the prefix for any tables not specified elsewhere in the array: 'authmap' => 'shared_', ); -### 5. RUN THE INSTALL SCRIPT +All data stored in database is in UTF-8. MySQL support different algorithms for +comparing, indexing, and sorting characters; a so called "collation". The +default collation of a database normally works for many use-cases, but depending +on the language(s) of the stored data, it may be necessary to use a different +collation in the `$db_collation` setting. Important: - To run the install script point your browser to the base URL of your website - (e.g., http://www.example.com). + - Only set or change this value before installing **SuiteDesk**, unless you + know what you are doing. + - All database tables and columns should be in the same collation. Otherwise, + string comparisons performed for table JOINs will be significantly slower. + - Especially when storing data in German or Russian on MySQL 5.1+, you want + to use the 'utf8_unicode_ci' collation instead. + - More information at http://drupal.org/node/772678 - You will be guided through several screens to set up the database, - create tables, add the first user account and provide basic web - site settings. +### 7. Populate the database - The install script will attempt to create a files storage directory - in the default location at config/default/files (the location of the - files directory may be changed after Drupal is installed). In some - cases, you may need to create the directory and modify its permissions - manually. Use the following commands (from the installation directory) - to create the files directory and grant the web server write privileges to it: +Run the next command to setup the database, create tables, populate them, set +the first users accounts and provide basic web site settings. Remember, you will +be asked for the *username* database password defined in previous step: - mkdir config/default/files - chmod o+w config/default/files + mysql -u username -p databasename < config/populatedb.sql - The install script will attempt to write-protect the settings.php file and - the config/default directory after saving your configuration. However, you - may need to manually write-protect them using the commands (from the - installation directory): +Also you will need to create a files storage directory in the default location +at config/default/files (the location of the files directory may be changed +after Drupal is installed). In some cases, you may need to create the directory +and modify its permissions manually. Use the following commands (from the +installation directory) to create the files directory and grant the web server +write privileges to it: - chmod a-w config/default/settings.php - chmod a-w config/default + mkdir config/default/files + chmod o+w config/default/files - If you make manual changes to the file later, be sure to protect it again - after making your modifications. Failure to remove write permissions to that - file is a security risk. Although the default location for the settings.php - file is at config/default/settings.php, it may be in another location - if you use the multi-site setup, as explained below. +The install script will attempt to write-protect the settings.php file and the +config/default directory after saving your configuration. However, you may need +to manually write-protect them using the commands (from the installation +directory): -### 6. CONFIGURE SUITEDESK + chmod a-w config/default/settings.php + chmod a-w config/default - When the install script succeeds, you will be directed to the "Welcome" - page, and you will be logged in as the administrator already. Proceed with - the initial configuration steps suggested on the "Welcome" page. +If you make manual changes to the file later, be sure to protect it again after +making your modifications. Failure to remove write permissions to that file is a +security risk. Although the default location for the settings.php file is at +config/default/settings.php, it may be in another location if you use the +multi-site setup, as explained below. - If the default Drupal theme is not displaying properly and links on the page - result in "Page Not Found" errors, try manually setting the $base_url variable - in the settings.php file if not already set. It's currently known that servers - running FastCGI can run into problems if the $base_url variable is left - commented out (see http://bugs.php.net/bug.php?id=19656). +### 8. Review file system storage settings and file permissions -### 7. REVIEW FILE SYSTEM STORAGE SETTINGS AND FILE PERMISSIONS +The files directory created in previous step is the default file system path +used to store all uploaded files, as well as some temporary files created by +Drupal. After installation, the settings for the file system path may be +modified to store uploaded files in a different location. - The files directory created in step 4 is the default file system path used - to store all uploaded files, as well as some temporary files created by Drupal. - After installation, the settings for the file system path may be modified - to store uploaded files in a different location. +It is not necessary to modify this path, but you may wish to change it if: - It is not necessary to modify this path, but you may wish to change it if: + * your site runs multiple Drupal installations from a single codebase (modify + the file system path of each installation to a different directory so that + uploads do not overlap between installations); or, - * your site runs multiple Drupal installations from a single codebase - (modify the file system path of each installation to a different - directory so that uploads do not overlap between installations); or, + * your site runs a number of web server front-ends behind a load balancer or + reverse proxy (modify the file system path on each server to point to a + shared file repository). - * your site runs a number of web server front-ends behind a load - balancer or reverse proxy (modify the file system path on each - server to point to a shared file repository). +To modify the file system path: - To modify the file system path: + * Ensure that the new location for the path exists or create it if necessary. + To create a new directory named uploads, for example, use the following + command from a shell or system prompt (while in the installation directory): - * Ensure that the new location for the path exists or create it if - necessary. To create a new directory named uploads, for example, - use the following command from a shell or system prompt (while in - the installation directory): + mkdir uploads - mkdir uploads + * Ensure that the new location for the path is writable by the web server + process. To grant write permissions for a directory named uploads, you may + need to use the following command from a shell or system prompt (while in + the installation directory): - * Ensure that the new location for the path is writable by the web - server process. To grant write permissions for a directory named - uploads, you may need to use the following command from a shell - or system prompt (while in the installation directory): + chmod o+w uploads - chmod o+w uploads + * Access the file system path settings in Drupal by selecting these menu items + from the Navigation menu: - * Access the file system path settings in Drupal by selecting these - menu items from the Navigation menu: + Administer > Site configuration > File system - Administer > Site configuration > File system + Enter the path to the new location (e.g.: uploads) at the File System Path + prompt. - Enter the path to the new location (e.g.: uploads) at the File - System Path prompt. + Changing the file system path after files have been uploaded may cause + unexpected problems on an existing site. If you modify the file system path + on an existing site, remember to copy all files from the original location + to the new location. - Changing the file system path after files have been uploaded may cause - unexpected problems on an existing site. If you modify the file system path - on an existing site, remember to copy all files from the original location - to the new location. +Some administrators suggest making the documentation files non-readable so that +the exact version of **SuiteDesk** you are running is slightly more difficult to +determine. If you wish to implement this optional security measure, use the +following command from a shell or system prompt (while in the `config` +directory): - Some administrators suggest making the documentation files, especially - CHANGELOG.txt, non-readable so that the exact version of Drupal you are - running is slightly more difficult to determine. If you wish to implement - this optional security measure, use the following command from a shell or - system prompt (while in the installation directory): + chmod a-r CHANGELOG.md - chmod a-r CHANGELOG.txt +Note that the example only affects CHANGELOG.md. To completely hide all +documentation files from public view, repeat this command for each of the Drupal +documentation files in the `config` directory, substituting the name of each +file for CHANGELOG.md in the example. - Note that the example only affects CHANGELOG.txt. To completely hide - all documentation files from public view, repeat this command for each of - the Drupal documentation files in the installation directory, substituting the - name of each file for CHANGELOG.txt in the example. +### 9. Initial configuration and first access - For more information on setting file permissions, see "Modifying Linux, Unix, - and Mac file permissions" (http://drupal.org/node/202483) or "Modifying - Windows file permissions" (http://drupal.org/node/202491) in the online - handbook. +When the install script succeeds, you will be directed to the "Welcome" page, +and you will be logged in as the administrator already. Proceed with the initial +configuration steps suggested on the "Welcome" page. -### 8. CRON MAINTENANCE TASKS +If the default **SuiteDesk** theme is not displaying properly and links on the +page result in "Page Not Found" errors, try manually setting the `$base_url` +variable in the `settings.php` file if not already set. It's currently known +that servers running FastCGI can run into problems if the `$base_url` variable +is left commented out (see http://bugs.php.net/bug.php?id=19656). Examples: - Many Drupal modules have periodic tasks that must be triggered by a cron - maintenance task, including search module (to build and update the index - used for keyword searching), aggregator module (to retrieve feeds from other - sites), ping module (to notify other sites about new or updated content), and - system module (to perform routine maintenance and pruning on system tables). - To activate these tasks, call the cron page by visiting - http://www.example.com/cron.php, which, in turn, executes tasks on behalf - of installed modules. + $base_url = 'http://www.example.com'; + $base_url = 'http://www.example.com:8888'; + $base_url = 'http://www.example.com/drupal'; + $base_url = 'https://www.example.com:8888/drupal'; - Most systems support the crontab utility for scheduling tasks like this. The - following example crontab line will activate the cron tasks automatically on - the hour: +You might also want to force users to use a given domain. See the `.htaccess` +file for more information. Drupal automatically generates a unique session +cookie name for each site based on its full domain name. If you have multiple +domains pointing at the same site, you can either redirect them all to a single +domain (see comment in `.htaccess`), or uncomment the `$cookie_domain` and +specify their shared base domain. Doing so assures that users remain logged in +as they cross between your various domains. - 0 * * * * wget -O - -q -t 1 http://www.example.com/cron.php +Also you can see in the `settings.php` file what PHP settings are possible, +including whether they can be set at runtime (i.e., when ini_set() occurs), read +the PHP documentation at http://www.php.net/manual/en/ini.php#ini.list and take +a look at the `.htaccess` file to see which non-runtime settings are used there. +Settings defined in the configuration file should not be duplicated there so as +to avoid conflict issues. - More information about cron maintenance tasks are available in the help pages - and in Drupal's online handbook at http://drupal.org/cron. Example scripts can - be found in the scripts/ directory. +If you encounter a situation where users post a large amount of text, and the +result is stripped out upon viewing but can still be edited, Drupal's output +filter may not have sufficient memory to process it. If you have this, you may +wish to uncomment the lines with PHP settings `pcre.*_limit` and increase their +limit values. See http://php.net/manual/en/pcre.configuration.php. + +Finally, to override specific global settings for your site, set them in the +configuration file, including the reverse proxy if needed. + +And that's all, you are ready to access to your site writting its URL in your +preferred and use one of the next pre-configured Drupal/**SuiteDesk** users: + + * root, Drupal user to administer site (see Drupal Administration below), + * pmdemo, SuiteDesk user to use Project management features, + * clidemo, SuiteDesk user to use Customer features. + +It's highly recommended to change the password of all these users before +delivery the site in production. + +### 10. Cron Maintenance tasks + +Many **SuiteDesk** modules have periodic tasks that must be triggered by a cron +maintenance task, including search module (to build and update the index used +for keyword searching) and system module (to perform routine maintenance and +pruning on system tables). To activate these tasks, call the cron page by +visiting http://www.example.com/cron.php, which, in turn, executes tasks on +behalf of installed modules. + +Most systems support the crontab utility for scheduling tasks like this. The +following example crontab line will activate the cron tasks automatically on the +hour: + + 0 * * * * wget -O - -q -t 1 http://www.example.com/cron.php DRUPAL ADMINISTRATION @@ -358,77 +404,40 @@ http://drupal.org/handbook/customization to find out more. MULTISITE CONFIGURATION ----------------------- -A single Drupal installation can host several Drupal-powered sites, each with -its own individual configuration. +A single **SuiteDesk** installation can host several Drupal-powered sites, each +with its own individual configuration. -Additional site configurations are created in subdirectories within the 'config' -directory. Each subdirectory must have a 'settings.php' file which specifies the +Additional site configurations are created in subdirectories within the `config` +directory. Each subdirectory must have a `settings.php` file which specifies the configuration settings. The easiest way to create additional sites is to copy -the 'default' directory and modify the 'settings.php' file as appropriate. The -new directory name is constructed from the site's URL. The configuration for -www.example.com could be in 'config/example.com/settings.php' (note that 'www.' -should be omitted if users can access your site at http://example.com/). +the `default` directory and modify the `settings.php` file as appropriate. The +configuration file to be loaded is based upon the rules below. -Sites do not have to have a different domain. You can also use subdomains and -subdirectories for Drupal sites. For example, example.com, sub.example.com, -and sub.example.com/site3 can all be defined as independent Drupal sites. The -setup for a configuration such as this would look like the following: +The configuration directory will be discovered by stripping the website's +hostname from left to right and pathname from right to left. The first +configuration file found will be used and any others will be ignored. If no +other configuration file is found then the default configuration file at +`config/default` will be used. For example, for a fictitious site installed at +http://www.example.org/mysite/test the `settings.php` is searched in the +following directories: - config/default/settings.php - config/example.com/settings.php - config/sub.example.com/settings.php - config/sub.example.com.site3/settings.php + 1. config/www.example.org.mysite.test + 2. config/example.org.mysite.test + 3. config/org.mysite.test -When searching for a site configuration (for example www.sub.example.com/site3), -Drupal will search for configuration files in the following order, using the -first configuration it finds: + 4. config/www.example.org.mysite + 5. config/example.org.mysite + 6. config/org.mysite - config/www.sub.example.com.site3/settings.php - config/sub.example.com.site3/settings.php - config/example.com.site3/settings.php - config/www.sub.example.com/settings.php - config/sub.example.com/settings.php - config/example.com/settings.php - config/default/settings.php + 7. config/www.example.org + 8. config/example.org + 9. config/org -If you are installing on a non-standard port, the port number is treated as the -deepest subdomain. For example: http://www.example.com:8080/ could be loaded -from config/8080.www.example.com/. The port number will be removed according to -the pattern above if no port-specific configuration is found, just like a real -subdomain. + 10. config/default -Each site configuration can have its own site-specific modules and themes in -addition to those installed in the standard 'modules' and 'themes' directories. -To use site-specific modules or themes, simply create a 'modules' or 'themes' -directory within the site configuration directory. For example, if -sub.example.com has a custom theme and a custom module that should not be -accessible to other sites, the setup would look like this: +If you are installing on a non-standard port number, prefix the hostname with +that number. For example, http://www.example.org:8080/mysite/test could be +loaded from `config/8080.www.example.org.mysite.test` directory. - config/sub.example.com/: - settings.php - themes/custom_theme - modules/custom_module - -NOTE: for more information about multiple virtual hosts or the configuration -settings, consult the Drupal handbook at drupal.org. - -For more information on configuring Drupal's file system path in a multi-site -configuration, see step 6 above. - - -MORE INFORMATION ----------------- - -- For additional documentation, see the online Drupal handbook at - http://drupal.org/handbook. - -- For a list of security announcements, see the "Security announcements" page - at http://drupal.org/security (available as an RSS feed). This page also - describes how to subscribe to these announcements via e-mail. - -- For information about the Drupal security process, or to find out how to report - a potential security issue to the Drupal security team, see the "Security team" - page at http://drupal.org/security-team. - -- For information about the wide range of available support options, see the - "Support" page at http://drupal.org/support. +For more information on configuring the file system path in a multi-site +configuration, see step 7 above. diff --git a/libraries/dhtmlxgantt/connector/base_connector.php b/libraries/dhtmlxgantt/connector/base_connector.php deleted file mode 100644 index dd74fbd..0000000 --- a/libraries/dhtmlxgantt/connector/base_connector.php +++ /dev/null @@ -1,948 +0,0 @@ -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, $encoding=""){ - ob_clean(); - - if ($this->type == "xml"){ - $header = "Content-type: text/xml"; - if ("" != $encoding) - $header.="; charset=".$encoding; - header($header); - } - - 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){ - if ($dir === false) - $this->request->set_sort($name); - else - $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 - protected $userdata; - - /*! 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; - $this->userdata=false; - } - - //set userdata for the item - function set_userdata($name, $value){ - if ($this->userdata === false) - $this->userdata = array(); - - $this->userdata[$name]=$value; - } - /*! 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 - */ - public 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"]; - $db_name=$this->config->data[$i]["db_name"]; - $str.=" ".$name."='".$this->xmlentities($this->data[$name])."'"; - } - //output custom data - if ($this->userdata !== false) - foreach ($this->userdata as $key => $value){ - $str.=" ".$key."='".$this->xmlentities($value)."'"; - } - - 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 - protected $encoding="utf-8";//!< assigned encoding (UTF-8 by default) - protected $editing=false;//!< flag of edit mode ( response for dataprocessor ) - - public static $filter_var="dhx_filter"; - public static $sort_var="dhx_sort"; - public static $kids_var="dhx_kids"; - - public $model=false; - - 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 - protected $data_separator = "\n"; - - 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 - protected $extra_output="";//!< extra info which need to be sent to client side - protected $options=array();//!< hash of OptionsConnector - protected $as_string = false; // render() returns string, don't send result in response - protected $simple = false; // render only data without any other info - protected $filters; - protected $sorts; - protected $mix; - protected $order = false; - - /*! 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, $render_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"; - if (!$render_type) $render_type="RenderStrategy"; - - $this->names=array( - "db_class"=>$type, - "item_class"=>$item_type, - "data_class"=>$data_type, - "render_class"=>$render_type - ); - $this->attributes = array(); - $this->filters = array(); - $this->sorts = array(); - $this->mix = array(); - - $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->render = new $this->names["render_class"]($this); - - $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->request); - } - - - protected $attributes; - public function add_top_attribute($name, $string){ - $this->attributes[$name] = $string; - } - - //model is a class, which will be used for all data operations - //we expect that it has next methods get, update, insert, delete - //if method was not defined - we will use default logic - public function useModel($model){ - $this->model = $model; - } - - - /*! 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); - if (strpos(trim($table), " ")!==false) - $this->request->parse_sql($table); - else - $this->request->set_source($table); - } - - public 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(); - } - - public function render_array($data, $id, $fields, $extra=false, $relation_id=false){ - $this->configure("-",$id,$fields,$extra,$relation_id); - $this->sql = new ArrayDBDataWrapper($data, $this->config); - return $this->render(); - } - - public function render_complex_sql($sql,$id,$fields,$extra=false,$relation_id=false){ - $this->config->init($id,$fields,$extra,$relation_id); - $this->request->parse_sql($sql, true); - 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(){ - $this->event->trigger("onInit", $this); - EventMaster::trigger_static("connectorInit",$this); - - if (!$this->as_string) - $this->parse_request(); - $this->set_relation(); - - 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 { - if (!$this->access->check("read")){ - LogMaster::log("Access control: read operation blocked"); - echo "Access denied"; - die(); - } - $wrap = new SortInterface($this->request); - $this->apply_sorts($wrap); - $this->event->trigger("beforeSort",$wrap); - $wrap->store(); - - $wrap = new FilterInterface($this->request); - $this->apply_filters($wrap); - $this->event->trigger("beforeFilter",$wrap); - $wrap->store(); - - if ($this->model && method_exists($this->model, "get")){ - $this->sql = new ArrayDBDataWrapper(); - $result = new ArrayQueryWrapper(call_user_func(array($this->model, "get"), $this->request)); - $out = $this->output_as_xml($result); - } else { - $out = $this->output_as_xml($this->get_resource()); - - if ($out !== null) return $out; - } - - } - } - $this->end_run(); - } - - - /*! empty call which used for tree-logic - * to prevent code duplicating - */ - protected function set_relation() {} - - /*! gets resource for rendering - */ - protected function get_resource() { - return $this->sql->select($this->request); - } - - - /*! 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; - } - - - public function limit($start, $count, $sort_field=false, $sort_dir=false){ - $this->request->set_limit($start, $count); - if ($sort_field) - $this->request->set_sort($sort_field, $sort_dir); - } - - 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); - - if (isset($_GET["posStart"]) && isset($_GET["count"])) { - $this->request->set_limit($_GET["posStart"],$_GET["count"]); - } - - $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[Connector::$sort_var])) - foreach($_GET[Connector::$sort_var] as $k => $v){ - $k = $this->safe_field_name($k); - $this->request->set_sort($this->resolve_parameter($k),$v); - } - - if (isset($_GET[Connector::$filter_var])) - foreach($_GET[Connector::$filter_var] as $k => $v){ - $k = $this->safe_field_name($k); - if ($v !== "") - $this->request->set_filter($this->resolve_parameter($k),$v); - } - - $this->check_csrf(); - } - - protected function check_csrf(){ - $key = ConnectorSecurity::checkCSRF($this->editing); - if ($key !== "") - $this->add_top_attribute(ConnectorSecurity::$security_var, $key); - } - - /*! 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 - */ - protected function xmlentities($string) { - return str_replace( array( '&', '"', "'", '<', '>', '’' ), array( '&' , '"', ''' , '<' , '>', ''' ), $string); - } - - public function getRecord($id){ - LogMaster::log("Retreiving data for record: ".$id); - $source = new DataRequestConfig($this->request); - $source->set_filter($this->config->id["name"],$id, "="); - - $res = $this->sql->select($source); - - $temp = $this->data_separator; - $this->data_separator=""; - $output = $this->render_set($res); - $this->data_separato=$temp; - - return $output; - } - - /*! render from DB resultset - @param res - DB resultset - process commands, output requested data as XML - */ - protected function render_set($res){ - return $this->render->render_set($res, $this->names["item_class"], $this->dload, $this->data_separator, $this->config, $this->mix); - } - - /*! output fetched data as XML - @param res - DB resultset - */ - protected function output_as_xml($res){ - $result = $this->render_set($res); - if ($this->simple) return $result; - - $start="encoding."' ?>".$this->xml_start(); - $end=$result.$this->xml_end(); - - if ($this->as_string) return $start.$end; - - $out = new OutputWriter($start, $end); - $this->event->trigger("beforeOutput", $this, $out); - $out->output("", true, $this->encoding); - } - - - /*! 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 or disable data reordering - - @param name - name of field, which will be used for order storing, optional - by default 'sortorder' field will be used - */ - public function enable_order($name = true){ - if ($name === true) - $name = "sortorder"; - - $this->sort($name); - $this->access->allow("order"); - $this->request->set_order($name); - $this->order = $name; - } - - /*! 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() || isset($_GET['dhx_no_header'])); - - } - - /*! renders self as xml, starting part - */ - protected function xml_start(){ - $attributes = ""; - - if ($this->dload){ - //info for dyn. loadin - if ($pos=$this->request->get_start()) - $attributes .= " pos='".$pos."'"; - else - $attributes .= " total_count='".$this->sql->get_size($this->request)."'"; - } - foreach($this->attributes as $k=>$v) - $attributes .= " ".$k."='".$v."'"; - - return ""; - } - /*! renders self as xml, ending part - */ - protected function xml_end(){ - $this->fill_collections(); - if (isset($this->extra_output)) - return $this->extra_output.""; - else - return ""; - } - - protected function fill_collections($list=""){ - 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.=""; - } - } - - /*! 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; - } - - - 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")); - } - - /*! render() returns result as string or send to response - */ - public function asString($as_string) { - $this->as_string = $as_string; - } - - public function simple_render() { - $this->simple = true; - return $this->render(); - } - - public function filter($name, $value = false, $operation = '=') { - $this->filters[] = array('name' => $name, 'value' => $value, 'operation' => $operation); - } - - public function clear_filter() { - $this->filters = array(); - $this->request->set_filters(array()); - } - - protected function apply_filters($wrap) { - for ($i = 0; $i < count($this->filters); $i++) { - $f = $this->filters[$i]; - $wrap->add($f['name'], $f['value'], $f['operation']); - } - } - - public function sort($name, $direction = false) { - $this->sorts[] = array('name' => $name, 'direction' => $direction); - } - - protected function apply_sorts($wrap) { - for ($i = 0; $i < count($this->sorts); $i++) { - $s = $this->sorts[$i]; - $wrap->add($s['name'], $s['direction']); - } - } - - public function mix($name, $value, $filter=false) { - $this->mix[] = Array('name'=>$name, 'value'=>$value, 'filter'=>$filter); - } -} - - -/*! 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); - } -} - -?> \ No newline at end of file diff --git a/libraries/dhtmlxgantt/connector/chart_connector.php b/libraries/dhtmlxgantt/connector/chart_connector.php deleted file mode 100644 index 488ee26..0000000 --- a/libraries/dhtmlxgantt/connector/chart_connector.php +++ /dev/null @@ -1,18 +0,0 @@ - \ No newline at end of file diff --git a/libraries/dhtmlxgantt/connector/combo_connector.php b/libraries/dhtmlxgantt/connector/combo_connector.php deleted file mode 100644 index 4c54b79..0000000 --- a/libraries/dhtmlxgantt/connector/combo_connector.php +++ /dev/null @@ -1,94 +0,0 @@ -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]["db_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/libraries/dhtmlxgantt/connector/convert.php b/libraries/dhtmlxgantt/connector/convert.php deleted file mode 100644 index 4276b32..0000000 --- a/libraries/dhtmlxgantt/connector/convert.php +++ /dev/null @@ -1,69 +0,0 @@ -url = $url; - $this->pdf(); - EventMaster::attach_static("connectorInit",array($this, "handle")); - } - public function pdf($name = "data.pdf", $inline = false){ - $this->type = "pdf"; - $this->name = $name; - $this->inline = $inline; - } - public function excel($name = "data.xls", $inline = false){ - $this->type = "excel"; - $this->name = $name; - $this->inline = $inline; - } - public function handle($conn){ - $conn->event->attach("beforeOutput",array($this,"convert")); - } - private function as_file($size, $name, $inline){ - header('Content-Type: application/force-download'); - header('Content-Type: application/octet-stream'); - header('Content-Type: application/download'); - header('Content-Transfer-Encoding: binary'); - - header('Content-Length: '.$size); - if ($inline) - header('Content-Disposition: inline; filename="'.$name.'";'); - else - header('Content-Disposition: attachment; filename="'.basename($name).'";'); - } - public function convert($conn, $out){ - - $str_out = str_replace("","", $out); - $str_out = str_replace("","", $str_out); - $str_out = str_replace("","", $str_out); - - if ($this->type == "pdf") - header("Content-type: application/pdf"); - else - header("Content-type: application/ms-excel"); - - $handle = curl_init($this->url); - curl_setopt($handle, CURLOPT_POST, true); - curl_setopt($handle, CURLOPT_HEADER, false); - curl_setopt($handle, CURLOPT_RETURNTRANSFER, true); - curl_setopt($handle, CURLOPT_POSTFIELDS, "grid_xml=".urlencode($str_out)); - - - $out->reset(); - $out->set_type("pdf"); - $out->add(curl_exec($handle)); - $this->as_file(strlen((string)$out), $this->name, $this->inline); - - curl_close($handle); - } -} - -?> \ No newline at end of file diff --git a/libraries/dhtmlxgantt/connector/crosslink_connector.php b/libraries/dhtmlxgantt/connector/crosslink_connector.php deleted file mode 100644 index 7c3f8f9..0000000 --- a/libraries/dhtmlxgantt/connector/crosslink_connector.php +++ /dev/null @@ -1,141 +0,0 @@ -data_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_id();//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": - //cross link options not loaded yet, so we can skip update - if (!array_key_exists($this->link_name, $action->get_data())) - break; - //else, delete old options and continue in insert section to add new values - $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; - } - } -} - - -class JSONCrossOptionsConnector extends CrossOptionsConnector{ - 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 JSONOptionsConnector($res,$type,$item_type,$data_type); - $this->link = new DelayedConnector($res,$type,$item_type,$data_type); - - EventMaster::attach_static("connectorInit",array($this, "handle")); - } -} -?> \ No newline at end of file diff --git a/libraries/dhtmlxgantt/connector/data_connector.php b/libraries/dhtmlxgantt/connector/data_connector.php deleted file mode 100644 index a3cacb5..0000000 --- a/libraries/dhtmlxgantt/connector/data_connector.php +++ /dev/null @@ -1,528 +0,0 @@ -$value) - $dataset[$key] = ConnectorSecurity::filter($value); - - $data[$_POST["id"]] = $dataset; - } - else - $data["dummy_id"] = $_POST; - return $data; - } - return parent::get_post_values($ids); - } - - protected function get_ids(){ - if (isset($_GET['action'])){ - if (isset($_POST["id"])) - return array($_POST['id']); - else - return array("dummy_id"); - } - return parent::get_ids(); - } - - protected function get_operation($rid){ - if (isset($_GET['action'])) - return $_GET['action']; - return parent::get_operation($rid); - } - - public function output_as_xml($results){ - if (isset($_GET['action'])){ - LogMaster::log("Edit operation finished",$results); - ob_clean(); - $type = $results[0]->get_status(); - if ($type == "error" || $type == "invalid"){ - echo "false"; - } else if ($type=="insert"){ - echo "true\n".$results[0]->get_new_id(); - } else - echo "true"; - } else - return parent::output_as_xml($results); - } -}; - -/*! DataItem class for DataView component -**/ -class CommonDataItem extends DataItem{ - /*! return self as XML string - */ - function to_xml(){ - if ($this->skip) return ""; - return $this->to_xml_start().$this->to_xml_end(); - } - - function to_xml_start(){ - $str="config->text); $i++){ - $name=$this->config->text[$i]["name"]; - $str.=" ".$name."='".$this->xmlentities($this->data[$name])."'"; - } - - if ($this->userdata !== false) - foreach ($this->userdata as $key => $value) - $str.=" ".$key."='".$this->xmlentities($value)."'"; - - return $str.">"; - } -} - - -/*! Connector class for DataView -**/ -class DataConnector extends Connector{ - - /*! 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,$render_type=false){ - if (!$item_type) $item_type="CommonDataItem"; - if (!$data_type) $data_type="CommonDataProcessor"; - - $this->sections = array(); - - if (!$render_type) $render_type="RenderStrategy"; - parent::__construct($res,$type,$item_type,$data_type,$render_type); - - } - - protected $sections; - public function add_section($name, $string){ - $this->sections[$name] = $string; - } - - protected function parse_request_mode(){ - if (isset($_GET['action']) && $_GET["action"] != "get") - $this->editing = true; - else - parent::parse_request_mode(); - } - - //parse GET scoope, all operations with incoming request must be done here - protected function parse_request(){ - if (isset($_GET['action'])){ - $action = $_GET['action']; - //simple request mode - if ($action == "get"){ - //data request - if (isset($_GET['id'])){ - //single entity data request - $this->request->set_filter($this->config->id["name"],$_GET['id'],"="); - } else { - //loading collection of items - } - } else { - //data saving - $this->editing = true; - } - parent::check_csrf(); - } else { - if (isset($_GET['editing']) && isset($_POST['ids'])) - $this->editing = true; - parent::parse_request(); - } - - if (isset($_GET["start"]) && isset($_GET["count"])) - $this->request->set_limit($_GET["start"],$_GET["count"]); - - } - - /*! renders self as xml, starting part - */ - protected function xml_start(){ - $start = "attributes as $k=>$v) - $start .= " ".$k."='".$v."'"; - $start.= ">"; - - foreach($this->sections as $k=>$v) - $start .= "<".$k.">".$v."\n"; - return $start; - } -}; - -class JSONDataConnector extends DataConnector{ - - public function __construct($res,$type=false,$item_type=false,$data_type=false,$render_type=false){ - if (!$item_type) $item_type="JSONCommonDataItem"; - if (!$data_type) $data_type="CommonDataProcessor"; - if (!$render_type) $render_type="JSONRenderStrategy"; - $this->data_separator = ",\n"; - parent::__construct($res,$type,$item_type,$data_type,$render_type); - } - - /*! 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=array(); - foreach($options as $k => $v) - $str[]='{"id":"'.$this->xmlentities($k).'", "value":"'.$this->xmlentities($v).'"}'; - $options=implode(",",$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=""){ - $options = array(); - foreach ($this->options as $k=>$v) { - $name = $k; - $option="\"{$name}\":["; - if (!is_string($this->options[$name])) - $option.=substr(json_encode($this->options[$name]->render()),1,-1); - else - $option.=$this->options[$name]; - $option.="]"; - $options[] = $option; - } - $this->extra_output .= implode($this->data_separator, $options); - } - - protected function resolve_parameter($name){ - if (intval($name).""==$name) - return $this->config->text[intval($name)]["db_name"]; - return $name; - } - - protected function output_as_xml($res){ - $json = $this->render_set($res); - if ($this->simple) return $json; - $result = json_encode($json); - - $this->fill_collections(); - $is_sections = sizeof($this->sections) && $this->is_first_call(); - if ($this->dload || $is_sections || sizeof($this->attributes) || !empty($this->extra_data)){ - - $attributes = ""; - foreach($this->attributes as $k=>$v) - $attributes .= ", \"".$k."\":\"".$v."\""; - - $extra = ""; - if (!empty($this->extra_output)) - $extra .= ', "collections": {'.$this->extra_output.'}'; - - $sections = ""; - if ($is_sections){ - //extra sections - foreach($this->sections as $k=>$v) - $sections .= ", \"".$k."\":".$v; - } - - $dyn = ""; - if ($this->dload){ - //info for dyn. loadin - if ($pos=$this->request->get_start()) - $dyn .= ", \"pos\":".$pos; - else - $dyn .= ", \"pos\":0, \"total_count\":".$this->sql->get_size($this->request); - } - if ($attributes || $sections || $this->extra_output || $dyn) { - $result = "{ \"data\":".$result.$attributes.$extra.$sections.$dyn."}"; - } - } - - // return as string - if ($this->as_string) return $result; - - // output direct to response - $out = new OutputWriter($result, ""); - $out->set_type("json"); - $this->event->trigger("beforeOutput", $this, $out); - $out->output("", true, $this->encoding); - return null; - } -} - -class JSONCommonDataItem extends DataItem{ - /*! return self as XML string - */ - function to_xml(){ - if ($this->skip) return false; - - $data = array( - 'id' => $this->get_id() - ); - for ($i=0; $iconfig->text); $i++){ - $extra = $this->config->text[$i]["name"]; - $data[$extra]=$this->data[$extra]; - if (is_null($data[$extra])) - $data[$extra] = ""; - } - - if ($this->userdata !== false) - foreach ($this->userdata as $key => $value){ - if ($value === null) - $data[$key]=""; - $data[$key]=$value; - } - - return $data; - } -} - - -/*! wrapper around options collection, used for comboboxes and filters -**/ -class JSONOptionsConnector extends JSONDataConnector{ - 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="JSONCommonDataItem"; - 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 JSONDistinctOptionsConnector extends JSONOptionsConnector{ - /*! 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); - } -} - - - -class TreeCommonDataItem extends CommonDataItem{ - protected $kids=-1; - - function to_xml_start(){ - $str="config->text); $i++){ - $name=$this->config->text[$i]["name"]; - $str.=" ".$name."='".$this->xmlentities($this->data[$name])."'"; - } - - if ($this->userdata !== false) - foreach ($this->userdata as $key => $value) - $str.=" ".$key."='".$this->xmlentities($value)."'"; - - if ($this->kids === true) - $str .=" ".Connector::$kids_var."='1'"; - - return $str.">"; - } - - function has_kids(){ - return $this->kids; - } - - function set_kids($value){ - $this->kids=$value; - } -} - - -class TreeDataConnector extends DataConnector{ - protected $parent_name = 'parent'; - public $rootId = "0"; - - /*! 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. - * @param render_type - * name of class which will provides data rendering - */ - public function __construct($res,$type=false,$item_type=false,$data_type=false,$render_type=false){ - if (!$item_type) $item_type="TreeCommonDataItem"; - if (!$data_type) $data_type="CommonDataProcessor"; - if (!$render_type) $render_type="TreeRenderStrategy"; - parent::__construct($res,$type,$item_type,$data_type,$render_type); - } - - //parse GET scoope, all operations with incoming request must be done here - protected function parse_request(){ - parent::parse_request(); - - if (isset($_GET[$this->parent_name])) - $this->request->set_relation($_GET[$this->parent_name]); - else - $this->request->set_relation($this->rootId); - - $this->request->set_limit(0,0); //netralize default reaction on dyn. loading mode - } - - /*! renders self as xml, starting part - */ - protected function xml_start(){ - $attributes = " "; - if (!$this->rootId || $this->rootId != $this->request->get_relation()) - $attributes = " parent='".$this->request->get_relation()."' "; - - foreach($this->attributes as $k=>$v) - $attributes .= " ".$k."='".$v."'"; - - return ""; - } -} - - -class JSONTreeDataConnector extends TreeDataConnector{ - - public function __construct($res,$type=false,$item_type=false,$data_type=false,$render_type=false){ - if (!$item_type) $item_type="JSONTreeCommonDataItem"; - if (!$data_type) $data_type="CommonDataProcessor"; - if (!$render_type) $render_type="JSONTreeRenderStrategy"; - parent::__construct($res,$type,$item_type,$data_type,$render_type); - } - - protected function output_as_xml($res){ - $result = $this->render_set($res); - if ($this->simple) return $result; - - $data = array(); - if (!$this->rootId || $this->rootId != $this->request->get_relation()) - $data["parent"] = $this->request->get_relation(); - - $data["data"] = $result; - - $this->fill_collections(); - if (!empty($this->options)) - $data["collections"] = $this->options; - - - foreach($this->attributes as $k=>$v) - $data[$k] = $v; - - $data = json_encode($data); - - // return as string - if ($this->as_string) return $data; - - // output direct to response - $out = new OutputWriter($data, ""); - $out->set_type("json"); - $this->event->trigger("beforeOutput", $this, $out); - $out->output("", true, $this->encoding); - } - - /*! 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=array(); - foreach($options as $k => $v) - $str[]=Array("id"=>$this->xmlentities($k), "value"=>$this->xmlentities($v));//'{"id":"'.$this->xmlentities($k).'", "value":"'.$this->xmlentities($v).'"}'; - $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=""){ - $options = array(); - foreach ($this->options as $k=>$v) { - $name = $k; - if (!is_array($this->options[$name])) - $option=$this->options[$name]->render(); - else - $option=$this->options[$name]; - $options[$name] = $option; - } - $this->options = $options; - $this->extra_output .= "'collections':".json_encode($options); - } - -} - - -class JSONTreeCommonDataItem extends TreeCommonDataItem{ - /*! return self as XML string - */ - function to_xml_start(){ - if ($this->skip) return false; - - $data = array( "id" => $this->get_id() ); - for ($i=0; $iconfig->text); $i++){ - $extra = $this->config->text[$i]["name"]; - if (isset($this->data[$extra])) - $data[$extra]=$this->data[$extra]; - } - - if ($this->userdata !== false) - foreach ($this->userdata as $key => $value) - $data[$key]=$value; - - if ($this->kids === true) - $data[Connector::$kids_var] = 1; - - return $data; - } - - function to_xml_end(){ - return ""; - } -} - - -?> diff --git a/libraries/dhtmlxgantt/connector/dataprocessor.php b/libraries/dhtmlxgantt/connector/dataprocessor.php deleted file mode 100644 index 89a4460..0000000 --- a/libraries/dhtmlxgantt/connector/dataprocessor.php +++ /dev/null @@ -1,521 +0,0 @@ -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 - */ - protected 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]=ConnectorSecurity::filter($value); - } - - return $data; - } - protected function get_ids(){ - if (!isset($_POST["ids"])) - throw new Exception("Incorrect incoming data, ID of incoming records not recognized"); - return explode(",",$_POST["ids"]); - } - - protected function get_operation($rid){ - if (!isset($_POST[$rid."_".DataProcessor::$action_param])) - throw new Exception("Status of record [{$rid}] not found in incoming request"); - return $_POST[$rid."_".DataProcessor::$action_param]; - } - /*! process incoming request ( save|update|delete ) - */ - function process(){ - LogMaster::log("DataProcessor object initialized",$_POST); - - $results=array(); - - $ids=$this->get_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]); - $status = $this->get_operation($rid); - - $action=new DataAction($status,$rid,$rows_data[$rid]); - $results[]=$action; - $this->inner_process($action); - } - - } catch(Exception $e){ - LogMaster::log($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: {$mode} operation blocked"); - $action->error(); - } else { - $check = $this->connector->event->trigger("beforeProcessing",$action); - if (!$action->is_ready()) - $this->check_exts($action,$mode); - if ($mode == "insert" && $action->get_status() != "error" && $action->get_status() != "invalid") - $this->connector->sql->new_record_order($action, $this->request); - - $check = $this->connector->event->trigger("afterProcessing",$action); - } - - } catch (Exception $e){ - LogMaster::log($e); - $action->set_status("error"); - if ($action) - $this->connector->event->trigger("onDBError", $action, $e); - } - - 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); - if ($this->connector->model && method_exists($this->connector->model, $mode)){ - call_user_func(array($this->connector->model, $mode), $action); - LogMaster::log("Model object process action: ".$mode); - } - if (!$action->is_ready()){ - $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->copy($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; - } - /*! set id - @param id - id value - */ - function set_id($id) { - $this->id = $id; - LogMaster::log("Change id: ".$id); - } - /*! set id - @param id - id value - */ - function set_new_id($id) { - $this->nid = $id; - LogMaster::log("Change new id: ".$id); - } - /*! 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."='".$this->xmlentities($v)."' "; - } - $str.=">{$this->output}"; - return $str; - } - - /*! replace xml unsafe characters - - @param string - string to be escaped - @return - escaped string - */ - public function xmlentities($string) { - return str_replace( array( '&', '"', "'", '<', '>', '’' ), array( '&' , '"', ''' , '<' , '>', ''' ), $string); - } - - /*! 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/libraries/dhtmlxgantt/connector/dataview_connector.php b/libraries/dhtmlxgantt/connector/dataview_connector.php deleted file mode 100644 index 516d350..0000000 --- a/libraries/dhtmlxgantt/connector/dataview_connector.php +++ /dev/null @@ -1,73 +0,0 @@ -skip) return ""; - - $str=""; - for ($i=0; $iconfig->text); $i++){ - $extra = $this->config->text[$i]["name"]; - $str.="<".$extra.">data[$extra]."]]>"; - } - return $str.""; - } -} - - -/*! Connector class for DataView -**/ -class DataViewConnector extends Connector{ - - /*! 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="DataViewDataItem"; - if (!$data_type) $data_type="DataProcessor"; - 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["posStart"]) && isset($_GET["count"])) - $this->request->set_limit($_GET["posStart"],$_GET["count"]); - } - - /*! renders self as xml, starting part - */ - protected function xml_start(){ - $attributes = ""; - foreach($this->attributes as $k=>$v) - $attributes .= " ".$k."='".$v."'"; - - if ($this->dload){ - if ($pos=$this->request->get_start()) - return ""; - else - return ""; - } - else - return ""; - } -} -?> \ No newline at end of file diff --git a/libraries/dhtmlxgantt/connector/db_adodb.php b/libraries/dhtmlxgantt/connector/db_adodb.php deleted file mode 100644 index a3c274c..0000000 --- a/libraries/dhtmlxgantt/connector/db_adodb.php +++ /dev/null @@ -1,72 +0,0 @@ -connection->SelectLimit($sql['sql'], $sql['numrows'], $sql['offset']); - } else { - $res = $this->connection->Execute($sql); - } - - if ($res===false) throw new Exception("ADODB operation failed\n".$this->connection->ErrorMsg()); - $this->last_result = $res; - return $res; - } - - public function get_next($res){ - if (!$res) - $res = $this->last_result; - - if ($res->EOF) - return false; - - $row = $res->GetRowAssoc(false); - $res->MoveNext(); - return $row; - } - - protected function get_new_id(){ - return $this->connection->Insert_ID(); - } - - public function escape($data){ - return $this->connection->addq($data); - } - - /*! 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 || is_int($data)) || (strpos($data,".")!==false)) - return $data; - return '`'.$data.'`'; - } - - - protected function select_query($select,$from,$where,$sort,$start,$count){ - if (!$from) - return $select; - - $sql="SELECT ".$select." FROM ".$from; - if ($where) $sql.=" WHERE ".$where; - if ($sort) $sql.=" ORDER BY ".$sort; - - if ($start || $count) { - $sql=array("sql"=>$sql,'numrows'=>$count, 'offset'=>$start); - } - return $sql; - } - -} -?> \ No newline at end of file diff --git a/libraries/dhtmlxgantt/connector/db_common.php b/libraries/dhtmlxgantt/connector/db_common.php deleted file mode 100644 index 4c98a23..0000000 --- a/libraries/dhtmlxgantt/connector/db_common.php +++ /dev/null @@ -1,1149 +0,0 @@ -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_order(){ - return $this->order; - } - public function set_order($order){ - $this->order = $order; - } - 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{ - if ($order===false) - $this->sort_by[] = $field; - 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=false,$operation=false){ - if ($value === false) - array_push($this->filters,$field); - else - 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){ - if (is_string($value)) - $value = trim($value); - $this->source = $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, $as_is = false){ - if ($as_is){ - $this->fieldset = $sql; - return; - } - - $sql= preg_replace("/[ \n\t]+limit[\n\t ,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); - - //Ignore next type of calls - //direct call to stored procedure without FROM - if ((count($data) == 1) || - //UNION select - preg_match("#[ \n\r\t]union[ \n\t\r]#i", $sql)){ - $this->fieldset = $sql; - return; - } - - $table_data = preg_split("/[ \n\t]+where/i",$data[1],2); - /* - if sql code contains group_by we will place all sql query in the FROM - it will not allow to use any filtering against the query - still it is better than just generate incorrect sql commands for any group by query - */ - if (sizeof($table_data)>1 && !preg_match("#.*group by.*#i",$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",$data[1],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); - if (sizeof($data)>1) - $this->set_sort($data[0],$data[1]); - else - $this->set_sort($data[0]); - } - - } - } -} - -/*! 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]["db_name"]==$name || $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 - } - - /*! remove field from dataset config ($text and $data collections) - - removed field will be excluded from all auto-generated queries - @param name - name of field, or aliase of field - */ - public function remove_field_full($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); - - $ind = $this->is_field($name, $this->data); - if ($ind==-1) throw new Exception('There was no such data field registered as: '.$name); - array_splice($this->data,$ind,1); - } - - /*! 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 - */ - public 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 new_record_order($action, $source){ - $order = $source->get_order(); - if ($order){ - $table = $source->get_source(); - $id = $this->config->id["db_name"]; - $idvalue = $action->get_new_id(); - - $max = $this->queryOne("SELECT MAX($order) as dhx_maxvalue FROM $table"); - $dhx_maxvalue = $max["dhx_maxvalue"] + 1; - - $this->query("UPDATE $table SET $order = $dhx_maxvalue WHERE $id = $idvalue"); - } - } - - public function order($data, $source){ - //id of moved item - $id1 = $this->escape($data->get_value("id")); - //id of target item - $target = $data->get_value("target"); - if (strpos($target, "next:") !== false){ - $dropnext = true; - $id2 = str_replace("next:", "", $target); - } else { - $id2 = $target; - } - $id2 = $this->escape($id2); - - - //for tree like components we need to limit out queries to the affected branch only - $relation_select = $relation_update = $relation_sql_out = $relation_sql = ""; - if ($this->config->relation_id["name"]){ - $relation = $data->get_value($this->config->relation_id["name"]); - if ($relation !== false && $relation !== ""){ - $relation_sql = " ".$this->config->relation_id["db_name"]." = '".$this->escape($relation)."' AND "; - $relation_select = $this->config->relation_id["db_name"]." as dhx_parent, "; - $relation_update = " ".$this->config->relation_id["db_name"]." = '".$this->escape($relation)."', "; - } - } - - - $name = $source->get_order(); - $table = $source->get_source(); - $idkey = $this->config->id["db_name"]; - - $source = $this->queryOne("select $relation_select $name as dhx_index from $table where $idkey = '$id1'"); - $source_index = $source["dhx_index"] ? $source["dhx_index"] : 0; - if ($relation_sql) - $relation_sql_out = " ".$this->config->relation_id["db_name"]." = '".$this->escape($source["dhx_parent"])."' AND "; - - $this->query("update $table set $name = $name - 1 where $relation_sql_out $name >= $source_index"); - - if ($id2 !== ""){ - $target = $this->queryOne("select $name as dhx_index from $table where $idkey = '$id2'"); - $target_index = $target["dhx_index"]; - if (!$target_index) - $target_index = 0; - if ($dropnext) - $target_index += 1; - $this->query("update $table set $name = $name + 1 where $relation_sql $name >= $target_index"); - } else { - $target = $this->queryOne("select max($name) as dhx_index from $table"); - $target_index = ($target["dhx_index"] ? $target["dhx_index"] : 0)+1; - } - - $this->query("update $table set $relation_update $name = $target_index where $idkey = '$id1'"); - } - - 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 queryOne($sql){ - $res = $this->query($sql); - if ($res) - return $this->get_next($res); - return false; - } - 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"); - $sort = new SortInterface($source); - $count->set_sort(null); - for ($i = 0; $i < count($sort->rules); $i++) { - if ($sort->rules[$i]['name'] == $name) - $count->set_sort($sort->rules[$i]['name'], $sort->rules[$i]['direction']); - } - $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 && $relation !== ""){ - $relsql = $this->escape_name($this->config->relation_id["db_name"])." = '".$this->escape($relation)."'"; - if ($relation == "0") - $relsql = "( ".$relsql." OR ".$this->escape_name($this->config->relation_id["db_name"])." IS NULL )"; - - array_push($sql,$relsql); - } - 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 (is_string($by[$i])) - $out[] = $by[$i]; - else 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){ - if (!$from) - return $select; - - $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()); - 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()); - 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 public 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 public 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"); - } - -} - -class ArrayDBDataWrapper extends DBDataWrapper{ - public function get_next($res){ - if ($res->index < sizeof($res->data)) - return $res->data[$res->index++]; - } - public function select($sql){ - if ($this->config->relation_id["db_name"] == "") { - if ($sql->get_relation() == "0" || $sql->get_relation() == "") { - return new ArrayQueryWrapper($this->connection); - } else { - return new ArrayQueryWrapper(array()); - } - } - - $relation_id = $this->config->relation_id["db_name"]; - - for ($i = 0; $i < count($this->connection); $i++) { - $item = $this->connection[$i]; - if (!isset($item[$relation_id])) continue; - if ($item[$relation_id] == $sql->get_relation()) - $result[] = $item; - - } - - return new ArrayQueryWrapper($result); - } - public function query($sql){ - throw new Exception("Not implemented"); - } - public function escape($value){ - throw new Exception("Not implemented"); - } - public function get_new_id(){ - throw new Exception("Not implemented"); - } -} - -class ArrayQueryWrapper{ - public function __construct($data){ - $this->data = $data; - $this->index = 0; - } -} -/*! 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); - } - - public function get_new_id(){ - return mysql_insert_id($this->connection); - } - - public function escape($data){ - return mysql_real_escape_string($data, $this->connection); - } - - 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 || is_int($data)) || (strpos($data,".")!==false)) - return $data; - return '`'.$data.'`'; - } -} -?> \ No newline at end of file diff --git a/libraries/dhtmlxgantt/connector/db_excel.php b/libraries/dhtmlxgantt/connector/db_excel.php deleted file mode 100644 index e25d9fe..0000000 --- a/libraries/dhtmlxgantt/connector/db_excel.php +++ /dev/null @@ -1,190 +0,0 @@ -connection; - $excel = PHPExcel_IOFactory::createReaderForFile($path); - $excel = $excel->load($path); - $result = array(); - $excelWS = $excel->getActiveSheet(); - - for ($i=0; $i < sizeof($points); $i++) { - $c = array(); - preg_match("/^([a-zA-Z]+)(\d+)/", $points[$i], $c); - if (count($c) > 0) { - $col = PHPExcel_Cell::columnIndexFromString($c[1]) - 1; - $cell = $excelWS->getCellByColumnAndRow($col, (int)$c[2]); - $result[] = $cell->getValue(); - } - } - - return $result; - } - public function select($source) { - $path = $this->connection; - $excel = PHPExcel_IOFactory::createReaderForFile($path); - $excel->setReadDataOnly(false); - $excel = $excel->load($path); - $excRes = new ExcelResult(); - $excelWS = $excel->getActiveSheet(); - $addFields = true; - - $coords = array(); - if ($source->get_source() == '*') { - $coords['start_row'] = 0; - $coords['end_row'] = false; - } else { - $c = array(); - preg_match("/^([a-zA-Z]+)(\d+)/", $source->get_source(), $c); - if (count($c) > 0) { - $coords['start_row'] = (int) $c[2]; - } else { - $coords['start_row'] = 0; - } - $c = array(); - preg_match("/:(.+)(\d+)$/U", $source->get_source(), $c); - if (count($c) > 0) { - $coords['end_row'] = (int) $c[2]; - } else { - $coords['end_row'] = false; - } - } - - $i = $coords['start_row']; - $end = 0; - while ((($coords['end_row'] == false)&&($end < $this->emptyLimit))||(($coords['end_row'] !== false)&&($i < $coords['end_row']))) { - $r = Array(); - $emptyNum = 0; - for ($j = 0; $j < count($this->config->text); $j++) { - $col = PHPExcel_Cell::columnIndexFromString($this->config->text[$j]['name']) - 1; - $cell = $excelWS->getCellByColumnAndRow($col, $i); - if (PHPExcel_Shared_Date::isDateTime($cell)) { - $r[PHPExcel_Cell::stringFromColumnIndex($col)] = PHPExcel_Shared_Date::ExcelToPHP($cell->getValue()); - } else if ($cell->getDataType() == 'f') { - $r[PHPExcel_Cell::stringFromColumnIndex($col)] = $cell->getCalculatedValue(); - } else { - $r[PHPExcel_Cell::stringFromColumnIndex($col)] = $cell->getValue(); - } - if ($r[PHPExcel_Cell::stringFromColumnIndex($col)] == '') { - $emptyNum++; - } - } - if ($emptyNum < count($this->config->text)) { - $r['id'] = $i; - $excRes->addRecord($r); - $end = 0; - } else { - if (DHX_IGNORE_EMPTY_ROWS == false) { - $r['id'] = $i; - $excRes->addRecord($r); - } - $end++; - } - $i++; - } - return $excRes; - } - - public function query($sql) { - } - - public function get_new_id() { - } - - public function escape($data) { - } - - public function get_next($res) { - return $res->next(); - } - -} - - -class ExcelResult { - private $rows; - private $currentRecord = 0; - - - // add record to output list - public function addRecord($file) { - $this->rows[] = $file; - } - - - // return next record - public function next() { - if ($this->currentRecord < count($this->rows)) { - $row = $this->rows[$this->currentRecord]; - $this->currentRecord++; - return $row; - } else { - return false; - } - } - - - // sorts records under $sort array - public function sort($sort, $data) { - if (count($this->files) == 0) { - return $this; - } - // defines fields list if it's need - for ($i = 0; $i < count($sort); $i++) { - $fieldname = $sort[$i]['name']; - if (!isset($this->files[0][$fieldname])) { - if (isset($data[$fieldname])) { - $fieldname = $data[$fieldname]['db_name']; - $sort[$i]['name'] = $fieldname; - } else { - $fieldname = false; - } - } - } - - // for every sorting field will sort - for ($i = 0; $i < count($sort); $i++) { - // if field, setted in sort parameter doesn't exist, continue - if ($sort[$i]['name'] == false) { - continue; - } - // sorting by current field - $flag = true; - while ($flag == true) { - $flag = false; - // checks if previous sorting fields are equal - for ($j = 0; $j < count($this->files) - 1; $j++) { - $equal = true; - for ($k = 0; $k < $i; $k++) { - if ($this->files[$j][$sort[$k]['name']] != $this->files[$j + 1][$sort[$k]['name']]) { - $equal = false; - } - } - // compares two records in list under current sorting field and sorting direction - if (((($this->files[$j][$sort[$i]['name']] > $this->files[$j + 1][$sort[$i]['name']])&&($sort[$i]['direction'] == 'ASC'))||(($this->files[$j][$sort[$i]['name']] < $this->files[$j + 1][$sort[$i]['name']])&&($sort[$i]['direction'] == 'DESC')))&&($equal == true)) { - $c = $this->files[$j]; - $this->files[$j] = $this->files[$j+1]; - $this->files[$j+1] = $c; - $flag = true; - } - } - } - } - return $this; - } - -} - - -?> \ No newline at end of file diff --git a/libraries/dhtmlxgantt/connector/db_filesystem.php b/libraries/dhtmlxgantt/connector/db_filesystem.php deleted file mode 100644 index 122ebd2..0000000 --- a/libraries/dhtmlxgantt/connector/db_filesystem.php +++ /dev/null @@ -1,345 +0,0 @@ -getFileName($source->get_relation()); - // for tree checks relation id and forms absolute path - if ($relation == '0') { - $relation = ''; - } else { - $path = $source->get_source(); - } - $path = $source->get_source(); - $path = $this->getFileName($path); - $path = realpath($path); - if ($path == false) { - return new FileSystemResult(); - } - - if (strpos(realpath($path.'/'.$relation), $path) !== 0) { - return new FileSystemResult(); - } - // gets files and directories list - $res = $this->getFilesList($path, $relation); - // sorts list - $res = $res->sort($source->get_sort_by(), $this->config->data); - return $res; - } - - - // gets files and directory list - private function getFilesList($path, $relation) { - $fileSystemTypes = FileSystemTypes::getInstance(); - LogMaster::log("Query filesystem: ".$path); - $dir = opendir($path.'/'.$relation); - $result = new FileSystemResult(); - // forms fields list - for ($i = 0; $i < count($this->config->data); $i++) { - $fields[] = $this->config->data[$i]['db_name']; - } - // for every file and directory of folder - while ($file = readdir($dir)) { - // . and .. should not be in output list - if (($file == '.')||($file == '..')) { - continue; - } - $newFile = array(); - // parse file name as Array('name', 'ext', 'is_dir') - $fileNameExt = $this->parseFileName($path.'/'.$relation, $file); - // checks if file should be in output array - if (!$fileSystemTypes->checkFile($file, $fileNameExt)) { - continue; - } - // takes file stat if it's need - if ((in_array('size', $fields))||(in_array('date', $fields))) { - $fileInfo = stat($path.'/'.$file); - } - - // for every field forms list of fields - for ($i = 0; $i < count($fields); $i++) { - $field = $fields[$i]; - switch ($field) { - case 'filename': - $newFile['filename'] = $file; - break; - case 'full_filename': - $newFile['full_filename'] = $path."/".$file; - break; - case 'size': - $newFile['size'] = $fileInfo['size']; - break; - case 'extention': - $newFile['extention'] = $fileNameExt['ext']; - break; - case 'name': - $newFile['name'] = $fileNameExt['name']; - break; - case 'date': - $newFile['date'] = date("Y-m-d H:i:s", $fileInfo['ctime']); - break; - } - $newFile['relation_id'] = $relation.'/'.$file; - $newFile['safe_name'] = $this->setFileName($relation.'/'.$file); - $newFile['is_folder'] = $fileNameExt['is_dir']; - } - // add file in output list - $result->addFile($newFile); - } - return $result; - } - - - // replaces '.' and '_' in id - private function setFileName($filename) { - $filename = str_replace(".", "{-dot-}", $filename); - $filename = str_replace("_", "{-nizh-}", $filename); - return $filename; - } - - - // replaces '{-dot-}' and '{-nizh-}' in id - private function getFileName($filename) { - $filename = str_replace("{-dot-}", ".", $filename); - $filename = str_replace("{-nizh-}", "_", $filename); - return $filename; - } - - - // parses file name and checks if is directory - private function parseFileName($path, $file) { - $result = Array(); - if (is_dir($path.'/'.$file)) { - $result['name'] = $file; - $result['ext'] = 'dir'; - $result['is_dir'] = 1; - } else { - $pos = strrpos($file, '.'); - $result['name'] = substr($file, 0, $pos); - $result['ext'] = substr($file, $pos + 1); - $result['is_dir'] = 0; - } - return $result; - } - - public function query($sql) { - } - - public function get_new_id() { - } - - public function escape($data) { - } - - public function get_next($res) { - return $res->next(); - } - -} - - -class FileSystemResult { - private $files; - private $currentRecord = 0; - - - // add record to output list - public function addFile($file) { - $this->files[] = $file; - } - - - // return next record - public function next() { - if ($this->currentRecord < count($this->files)) { - $file = $this->files[$this->currentRecord]; - $this->currentRecord++; - return $file; - } else { - return false; - } - } - - - // sorts records under $sort array - public function sort($sort, $data) { - if (count($this->files) == 0) { - return $this; - } - // defines fields list if it's need - for ($i = 0; $i < count($sort); $i++) { - $fieldname = $sort[$i]['name']; - if (!isset($this->files[0][$fieldname])) { - if (isset($data[$fieldname])) { - $fieldname = $data[$fieldname]['db_name']; - $sort[$i]['name'] = $fieldname; - } else { - $fieldname = false; - } - } - } - - // for every sorting field will sort - for ($i = 0; $i < count($sort); $i++) { - // if field, setted in sort parameter doesn't exist, continue - if ($sort[$i]['name'] == false) { - continue; - } - // sorting by current field - $flag = true; - while ($flag == true) { - $flag = false; - // checks if previous sorting fields are equal - for ($j = 0; $j < count($this->files) - 1; $j++) { - $equal = true; - for ($k = 0; $k < $i; $k++) { - if ($this->files[$j][$sort[$k]['name']] != $this->files[$j + 1][$sort[$k]['name']]) { - $equal = false; - } - } - // compares two records in list under current sorting field and sorting direction - if (((($this->files[$j][$sort[$i]['name']] > $this->files[$j + 1][$sort[$i]['name']])&&($sort[$i]['direction'] == 'ASC'))||(($this->files[$j][$sort[$i]['name']] < $this->files[$j + 1][$sort[$i]['name']])&&($sort[$i]['direction'] == 'DESC')))&&($equal == true)) { - $c = $this->files[$j]; - $this->files[$j] = $this->files[$j+1]; - $this->files[$j+1] = $c; - $flag = true; - } - } - } - } - return $this; - } - -} - - -// singleton class for setting file types filter -class FileSystemTypes { - - static private $instance = NULL; - private $extentions = Array(); - private $extentions_not = Array(); - private $all = true; - private $patterns = Array(); - // predefined types - private $types = Array( - 'image' => Array('jpg', 'jpeg', 'gif', 'png', 'tiff', 'bmp', 'psd', 'dir'), - 'document' => Array('txt', 'doc', 'docx', 'xls', 'xlsx', 'rtf', 'dir'), - 'web' => Array('php', 'html', 'htm', 'js', 'css', 'dir'), - 'audio' => Array('mp3', 'wav', 'ogg', 'dir'), - 'video' => Array('avi', 'mpg', 'mpeg', 'mp4', 'dir'), - 'only_dir' => Array('dir') - ); - - - static function getInstance() { - if (self::$instance == NULL) { - self::$instance = new FileSystemTypes(); - } - return self::$instance; - } - - // sets array of extentions - public function setExtentions($ext) { - $this->all = false; - $this->extentions = $ext; - } - - // adds one extention in array - public function addExtention($ext) { - $this->all = false; - $this->extentions[] = $ext; - } - - - // adds one extention which will not ouputed in array - public function addExtentionNot($ext) { - $this->extentions_not[] = $ext; - } - - - // returns array of extentions - public function getExtentions() { - return $this->extentions; - } - - // adds regexp pattern - public function addPattern($pattern) { - $this->all = false; - $this->patterns[] = $pattern; - } - - // clear extentions array - public function clearExtentions() { - $this->all = true; - $this->extentions = Array(); - } - - // clear regexp patterns array - public function clearPatterns() { - $this->all = true; - $this->patterns = Array(); - } - - // clear all filters - public function clearAll() { - $this->clearExtentions(); - $this->clearPatterns(); - } - - // sets predefined type - public function setType($type, $clear = false) { - $this->all = false; - if ($type == 'all') { - $this->all = true; - return true; - } - if (isset($this->types[$type])) { - if ($clear) { - $this->clearExtentions(); - } - for ($i = 0; $i < count($this->types[$type]); $i++) { - $this->extentions[] = $this->types[$type][$i]; - } - return true; - } else { - return false; - } - } - - - // check file under setted filter - public function checkFile($filename, $fileNameExt) { - if (in_array($fileNameExt['ext'], $this->extentions_not)) { - return false; - } - if ($this->all) { - return true; - } - - if ((count($this->extentions) > 0)&&(!in_array($fileNameExt['ext'], $this->extentions))) { - return false; - } - - for ($i = 0; $i < count($this->patterns); $i++) { - if (!preg_match($this->patterns[$i], $filename)) { - return false; - } - } - return true; - } -} - -?> \ No newline at end of file diff --git a/libraries/dhtmlxgantt/connector/db_mssql.php b/libraries/dhtmlxgantt/connector/db_mssql.php deleted file mode 100644 index 8d0c835..0000000 --- a/libraries/dhtmlxgantt/connector/db_mssql.php +++ /dev/null @@ -1,73 +0,0 @@ -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); - } - - public 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){ - if (!$from) - return $select; - - $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/libraries/dhtmlxgantt/connector/db_mysqli.php b/libraries/dhtmlxgantt/connector/db_mysqli.php deleted file mode 100644 index 0902618..0000000 --- a/libraries/dhtmlxgantt/connector/db_mysqli.php +++ /dev/null @@ -1,56 +0,0 @@ -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(); - } - - public 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/libraries/dhtmlxgantt/connector/db_oracle.php b/libraries/dhtmlxgantt/connector/db_oracle.php deleted file mode 100644 index 9abca38..0000000 --- a/libraries/dhtmlxgantt/connector/db_oracle.php +++ /dev/null @@ -1,88 +0,0 @@ -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(oci_error($this->connection)); - - $this->last_id=$out[0]; - - return $stm; - } - - public function get_next($res){ - $data = oci_fetch_assoc($res); - if ($data){ - foreach ($data as $k => $v) - $data[strtolower($k)] = $v; - } - return $data; - } - - public 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){ - if (!$from) - return $select; - - $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/libraries/dhtmlxgantt/connector/db_pdo.php b/libraries/dhtmlxgantt/connector/db_pdo.php deleted file mode 100644 index 6d56c14..0000000 --- a/libraries/dhtmlxgantt/connector/db_pdo.php +++ /dev/null @@ -1,100 +0,0 @@ -connection->query($sql); - if ($res===false) { - $message = $this->connection->errorInfo(); - throw new Exception("PDO - sql execution failed\n".$message[2]); - } - - return new PDOResultSet($res); - } - - protected function select_query($select,$from,$where,$sort,$start,$count){ - if (!$from) - return $select; - - $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 tables_list() { - $result = $this->query("SHOW TABLES"); - if ($result===false) throw new Exception("MySQL operation failed\n".mysql_error($this->connection)); - - $tables = array(); - while ($table = $result->next()) { - $tables[] = $table[0]; - } - return $tables; - } - - public function fields_list($table) { - $result = $this->query("SHOW COLUMNS FROM `".$table."`"); - if ($result===false) throw new Exception("MySQL operation failed\n".mysql_error($this->connection)); - - $fields = array(); - $id = ""; - while ($field = $result->next()) { - if ($field['Key'] == "PRI") - $id = $field["Field"]; - else - $fields[] = $field["Field"]; - } - return array("fields" => $fields, "key" => $id ); - } - - public function get_next($res){ - $data = $res->next(); - return $data; - } - - public 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/libraries/dhtmlxgantt/connector/db_phpcake.php b/libraries/dhtmlxgantt/connector/db_phpcake.php deleted file mode 100644 index 3fcf19c..0000000 --- a/libraries/dhtmlxgantt/connector/db_phpcake.php +++ /dev/null @@ -1,85 +0,0 @@ -get_source(); - if (is_array($source)) //result of find - $res = $source; - else - $res = $this->connection->find("all"); - - $temp = array(); - if (sizeof($res)){ - $name = get_class($this->connection); - for ($i=sizeof($res)-1; $i>=0; $i--) - $temp[]=&$res[$i][$name]; - } - return new ArrayQueryWrapper($temp); - } - - protected function getErrorMessage(){ - $errors = $this->connection->invalidFields(); - $text = array(); - foreach ($errors as $key => $value){ - $text[] = $key." - ".$value[0]; - } - return implode("\n", $text); - } - - public function insert($data,$source){ - $name = get_class($this->connection); - $save = array(); - $temp_data = $data->get_data(); - unset($temp_data[$this->config->id['db_name']]); - unset($temp_data["!nativeeditor_status"]); - $save[$name] = $temp_data; - - if ($this->connection->save($save)){ - $data->success($this->connection->getLastInsertID()); - } else { - $data->set_response_attribute("details", $this->getErrorMessage()); - $data->invalid(); - } - } - public function delete($data,$source){ - $id = $data->get_id(); - $this->connection->delete($id); - $data->success(); - } - public function update($data,$source){ - $name = get_class($this->connection); - $save = array(); - $save[$name] = &$data->get_data(); - - if ($this->connection->save($save)){ - $data->success(); - } else { - $data->set_response_attribute("details", $this->getErrorMessage()); - $data->invalid(); - } - } - - - public function escape($str){ - throw new Exception("Not implemented"); - } - public function query($str){ - throw new Exception("Not implemented"); - } - public function get_new_id(){ - throw new Exception("Not implemented"); - } -} - -?> \ No newline at end of file diff --git a/libraries/dhtmlxgantt/connector/db_phpci.php b/libraries/dhtmlxgantt/connector/db_phpci.php deleted file mode 100644 index 9d10d99..0000000 --- a/libraries/dhtmlxgantt/connector/db_phpci.php +++ /dev/null @@ -1,65 +0,0 @@ -connection->query($sql); - if ($res===false) { - throw new Exception("CI - sql execution failed"); - } - - if (is_object($res)) - return new PHPCIResultSet($res); - return new ArrayQueryWrapper(array()); - } - - public function get_next($res){ - $data = $res->next(); - return $data; - } - - public function get_new_id(){ - return $this->connection->insert_id(); - } - - public function escape($str){ - return $this->connection->escape_str($str); - } - - public function escape_name($data){ - return $this->connection->protect_identifiers($data); - } -} - -class PHPCIResultSet{ - private $res; - private $start; - private $count; - - public function __construct($res){ - $this->res = $res; - $this->start = $res->current_row; - $this->count = $res->num_rows; - } - public function next(){ - if ($this->start != $this->count){ - return $this->res->row($this->start++,'array'); - } else { - $this->res->free_result(); - return null; - } - } -} -?> \ No newline at end of file diff --git a/libraries/dhtmlxgantt/connector/db_phpyii.php b/libraries/dhtmlxgantt/connector/db_phpyii.php deleted file mode 100644 index d625e9d..0000000 --- a/libraries/dhtmlxgantt/connector/db_phpyii.php +++ /dev/null @@ -1,91 +0,0 @@ -connection)) //result of findAll - $res = $this->connection; - else - $res = $this->connection->findAll(); - - $temp = array(); - if (sizeof($res)){ - foreach ($res as $obj) - $temp[]=$obj->getAttributes(); - } - return new ArrayQueryWrapper($temp); - } - - protected function getErrorMessage(){ - $errors = $this->connection->invalidFields(); - $text = array(); - foreach ($errors as $key => $value){ - $text[] = $key." - ".$value[0]; - } - return implode("\n", $text); - } - public function insert($data,$source){ - $name = get_class($this->connection); - $obj = new $name(); - - $this->fill_model_and_save($obj, $data); - } - public function delete($data,$source){ - $obj = $this->connection->findByPk($data->get_id()); - if ($obj->delete()){ - $data->success(); - $data->set_new_id($obj->getPrimaryKey()); - } else { - $data->set_response_attribute("details", $this->errors_to_string($obj->getErrors())); - $data->invalid(); - } - } - public function update($data,$source){ - $obj = $this->connection->findByPk($data->get_id()); - $this->fill_model_and_save($obj, $data); - } - - protected function fill_model_and_save($obj, $data){ - $values = $data->get_data(); - - //map data to model object - for ($i=0; $i < sizeof($this->config->text); $i++){ - $step=$this->config->text[$i]; - $obj->setAttribute($step["name"], $data->get_value($step["name"])); - } - if ($relation = $this->config->relation_id["db_name"]) - $obj->setAttribute($relation, $data->get_value($relation)); - - //save model - if ($obj->save()){ - $data->success(); - $data->set_new_id($obj->getPrimaryKey()); - } else { - $data->set_response_attribute("details", $this->errors_to_string($obj->getErrors())); - $data->invalid(); - } - } - - protected function errors_to_string($errors){ - $text = array(); - foreach($errors as $value) - $text[]=implode("\n", $value); - return implode("\n",$text); - } - public function escape($str){ - throw new Exception("Not implemented"); - } - public function query($str){ - throw new Exception("Not implemented"); - } - public function get_new_id(){ - throw new Exception("Not implemented"); - } -} - -?> \ No newline at end of file diff --git a/libraries/dhtmlxgantt/connector/db_postgre.php b/libraries/dhtmlxgantt/connector/db_postgre.php deleted file mode 100644 index 0a84856..0000000 --- a/libraries/dhtmlxgantt/connector/db_postgre.php +++ /dev/null @@ -1,73 +0,0 @@ -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){ - if (!$from) - return $select; - - $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); - } - - public 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/libraries/dhtmlxgantt/connector/db_sasql.php b/libraries/dhtmlxgantt/connector/db_sasql.php deleted file mode 100644 index 992b747..0000000 --- a/libraries/dhtmlxgantt/connector/db_sasql.php +++ /dev/null @@ -1,54 +0,0 @@ -connection, $sql); - if ($res===false) throw new Exception("SaSQL operation failed\n".sasql_error($this->connection)); - $this->last_result = $res; - return $res; - } - - public function get_next($res){ - if (!$res) - $res = $this->last_result; - - return sasql_fetch_assoc($res); - } - - public function get_new_id(){ - return sasql_insert_id($this->connection); - } - - protected function insert_query($data,$request){ - $sql = parent::insert_query($data,$request); - $this->insert_operation=true; - return $sql; - } - - protected function select_query($select,$from,$where,$sort,$start,$count){ - if (!$from) - return $select; - - $sql="SELECT " ; - if ($count) - $sql.=" TOP ".($count+$start); - $sql.=" ".$select." FROM ".$from; - if ($where) $sql.=" WHERE ".$where; - if ($sort) $sql.=" ORDER BY ".$sort; - return $sql; - } - - public function escape($data){ - return sasql_escape_string($this->connection, $data); - } - - public function begin_transaction(){ - $this->query("BEGIN TRAN"); - } -} -?> \ No newline at end of file diff --git a/libraries/dhtmlxgantt/connector/db_sqlite.php b/libraries/dhtmlxgantt/connector/db_sqlite.php deleted file mode 100644 index 769df79..0000000 --- a/libraries/dhtmlxgantt/connector/db_sqlite.php +++ /dev/null @@ -1,34 +0,0 @@ -connection,$sql); - if ($res === false) - throw new Exception("SQLLite - sql execution failed\n".sqlite_error_string(sqlite_last_error($this->connection))); - - return $res; - } - - public function get_next($res){ - $data = sqlite_fetch_array($res, SQLITE_ASSOC); - return $data; - } - - public function get_new_id(){ - return sqlite_last_insert_rowid($this->connection); - } - - public function escape($data){ - return sqlite_escape_string($data); - } -} -?> \ No newline at end of file diff --git a/libraries/dhtmlxgantt/connector/db_sqlite3.php b/libraries/dhtmlxgantt/connector/db_sqlite3.php deleted file mode 100644 index 4e04b25..0000000 --- a/libraries/dhtmlxgantt/connector/db_sqlite3.php +++ /dev/null @@ -1,33 +0,0 @@ -connection->query($sql); - if ($res === false) - throw new Exception("SQLLite - sql execution failed\n".$this->connection->lastErrorMsg()); - - return $res; - } - - public function get_next($res){ - return $res->fetchArray(); - } - - public function get_new_id(){ - return $this->connection->lastInsertRowID(); - } - - public function escape($data){ - return $this->connection->escapeString($data); - } -} -?> \ No newline at end of file diff --git a/libraries/dhtmlxgantt/connector/db_sqlsrv.php b/libraries/dhtmlxgantt/connector/db_sqlsrv.php deleted file mode 100644 index 47e2c4e..0000000 --- a/libraries/dhtmlxgantt/connector/db_sqlsrv.php +++ /dev/null @@ -1,102 +0,0 @@ -start_from) - $res = sqlsrv_query($this->connection,$sql, array(), array("Scrollable" => SQLSRV_CURSOR_STATIC)); - else - $res = sqlsrv_query($this->connection,$sql); - - if ($res === false){ - $errors = sqlsrv_errors(); - $message = Array(); - foreach($errors as $error) - $message[]=$error["SQLSTATE"].$error["code"].$error["message"]; - throw new Exception("SQLSrv operation failed\n".implode("\n\n", $message)); - } - - if ($this->insert_operation){ - sqlsrv_next_result($res); - $last = sqlsrv_fetch_array($res); - $this->last_id = $last["dhx_id"]; - sqlsrv_free_stmt($res); - } - if ($this->start_from) - $data = sqlsrv_fetch($res, SQLSRV_SCROLL_ABSOLUTE, $this->start_from-1); - return $res; - } - - public function get_next($res){ - $data = sqlsrv_fetch_array($res, SQLSRV_FETCH_ASSOC); - if ($data) - foreach ($data as $key => $value) - if (is_a($value, "DateTime")) - $data[$key] = $value->format("Y-m-d H:i"); - return $data; - } - - public 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 SCOPE_IDENTITY() as dhx_id"; - } - - protected function select_query($select,$from,$where,$sort,$start,$count){ - if (!$from) - return $select; - - $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(){ - sqlsrv_begin_transaction($this->connection); - } - public function commit_transaction(){ - sqlsrv_commit($this->connection); - } - public function rollback_transaction(){ - sqlsrv_rollback($this->connection); - } -} -?> \ No newline at end of file diff --git a/libraries/dhtmlxgantt/connector/filesystem_item.php b/libraries/dhtmlxgantt/connector/filesystem_item.php deleted file mode 100644 index b604317..0000000 --- a/libraries/dhtmlxgantt/connector/filesystem_item.php +++ /dev/null @@ -1,19 +0,0 @@ -data['is_folder'] == '1') { - return true; - } else { - return false; - } - } - -} - -?> \ No newline at end of file diff --git a/libraries/dhtmlxgantt/connector/form_connector.php b/libraries/dhtmlxgantt/connector/form_connector.php deleted file mode 100644 index c5a1263..0000000 --- a/libraries/dhtmlxgantt/connector/form_connector.php +++ /dev/null @@ -1,62 +0,0 @@ -skip) return ""; - $str=""; - for ($i = 0; $i < count($this->config->data); $i++) { - $str .= "<".$this->config->data[$i]['name'].">data[$this->config->data[$i]['name']]."]]>config->data[$i]['name'].">"; - } - return $str; - } -} - - -/*! Connector class for dhtmlxForm -**/ -class FormConnector extends Connector{ - - /*! 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="FormDataItem"; - if (!$data_type) $data_type="FormDataProcessor"; - 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["id"])) - $this->request->set_filter($this->config->id["name"],$_GET["id"],"="); - else if (!$_POST["ids"]) - throw new Exception("ID parameter is missed"); - } - -} - -/*! DataProcessor class for dhxForm component -**/ -class FormDataProcessor extends DataProcessor{ - -} -?> \ No newline at end of file diff --git a/libraries/dhtmlxgantt/connector/gantt_connector.php b/libraries/dhtmlxgantt/connector/gantt_connector.php deleted file mode 100644 index e4afa71..0000000 --- a/libraries/dhtmlxgantt/connector/gantt_connector.php +++ /dev/null @@ -1,364 +0,0 @@ -skip) return ""; - - $str=""; - $str.="data[$this->config->text[0]["name"]]."]]>"; - $str.="<".$this->config->text[1]["name"].">data[$this->config->text[1]["name"]]."]]>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]."]]>"; - } - if ($this->userdata !== false) - foreach ($this->userdata as $key => $value) - $str.="<".$key.">"; - - return $str.""; - } -} - - -/*! Connector class for dhtmlxGantt -**/ -class GanttConnector extends Connector{ - - protected $extra_output="";//!< extra info which need to be sent to client side - protected $options=array();//!< hash of OptionsConnector - protected $links_mode = false; - - - /*! 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; - } - - - /*! 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. - * @param render_type - name of class which will be used for rendering. - */ - public function __construct($res,$type=false,$item_type=false,$data_type=false,$render_type=false){ - if (!$item_type) $item_type="GanttDataItem"; - if (!$data_type) $data_type="GanttDataProcessor"; - if (!$render_type) $render_type="RenderStrategy"; - parent::__construct($res,$type,$item_type,$data_type,$render_type); - - $this->event->attach("afterDelete", array($this, "delete_related_links")); - $this->event->attach("afterOrder", array($this, "order_set_parent")); - } - - //parse GET scoope, all operations with incoming request must be done here - function parse_request(){ - parent::parse_request(); - - if (isset($_GET["gantt_mode"]) && $_GET["gantt_mode"] == "links") - $this->links_mode = true; - - 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"],">"); - } - } - - function order_set_parent($action){ - $value = $action->get_id(); - $parent = $action->get_value("parent"); - - $table = $this->request->get_source(); - $id = $this->config->id["db_name"]; - - $this->sql->query("UPDATE $table SET parent = $parent WHERE $id = $value"); - } - - function delete_related_links($action){ - if (isset($this->options["links"])){ - $links = $this->options["links"]; - $value = $this->sql->escape($action->get_new_id()); - $table = $links->get_request()->get_source(); - - $this->sql->query("DELETE FROM $table WHERE source = '$value'"); - $this->sql->query("DELETE FROM $table WHERE target = '$value'"); - } - } - - public function render_links($table,$id="",$fields=false,$extra=false,$relation_id=false) { - $links = new GanttLinksConnector($this->get_connection(),$this->names["db_class"]); - $links->render_table($table,$id,$fields,$extra); - $this->set_options("links", $links); - } -} - -/*! DataProcessor class for Gantt component -**/ -class GanttDataProcessor extends DataProcessor{ - function name_data($data){ - if ($data=="start_date") - return $this->config->text[0]["name"]; - if ($data=="id") - return $this->config->id["name"]; - if ($data=="duration" && $this->config->text[1]["name"] == "duration") - return $this->config->text[1]["name"]; - if ($data=="end_date" && $this->config->text[1]["name"] == "end_date") - return $this->config->text[1]["name"]; - if ($data=="text") - return $this->config->text[2]["name"]; - - return $data; - } -} - - -class JSONGanttDataItem extends GanttDataItem{ - /*! return self as XML string - */ - function to_xml(){ - if ($this->skip) return ""; - - $obj = array(); - $obj['id'] = $this->get_id(); - $obj['start_date'] = $this->data[$this->config->text[0]["name"]]; - $obj[$this->config->text[1]["name"]] = $this->data[$this->config->text[1]["name"]]; - $obj['text'] = $this->data[$this->config->text[2]["name"]]; - for ($i=3; $iconfig->text); $i++){ - $extra = $this->config->text[$i]["name"]; - $obj[$extra]=$this->data[$extra]; - } - - if ($this->userdata !== false) - foreach ($this->userdata as $key => $value) - $obj[$key]=$value; - - return $obj; - } -} - - -class JSONGanttConnector extends GanttConnector { - - protected $data_separator = ","; - - /*! 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,$render_type=false){ - if (!$item_type) $item_type="JSONGanttDataItem"; - if (!$data_type) $data_type="GanttDataProcessor"; - if (!$render_type) $render_type="JSONRenderStrategy"; - parent::__construct($res,$type,$item_type,$data_type,$render_type); - } - - protected function xml_start() { - return '{ "data":'; - } - - protected function xml_end() { - $this->fill_collections(); - $end = (!empty($this->extra_output)) ? ', "collections": {'.$this->extra_output.'}' : ''; - foreach ($this->attributes as $k => $v) - $end.=", \"".$k."\":\"".$v."\""; - $end .= '}'; - return $end; - } - - /*! 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=array(); - foreach($options as $k => $v) - $str[]='{"id":"'.$this->xmlentities($k).'", "value":"'.$this->xmlentities($v).'"}'; - $options=implode(",",$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=""){ - $options = array(); - foreach ($this->options as $k=>$v) { - $name = $k; - $option="\"{$name}\":["; - if (!is_string($this->options[$name])){ - $data = json_encode($this->options[$name]->render()); - $option.=substr($data,1,-1); - } else - $option.=$this->options[$name]; - $option.="]"; - $options[] = $option; - } - $this->extra_output .= implode($this->data_separator, $options); - } - - - /*! output fetched data as XML - @param res - DB resultset - */ - protected function output_as_xml($res){ - $result = $this->render_set($res); - if ($this->simple) return $result; - - $data=$this->xml_start().json_encode($result).$this->xml_end(); - - if ($this->as_string) return $data; - - $out = new OutputWriter($data, ""); - $out->set_type("json"); - $this->event->trigger("beforeOutput", $this, $out); - $out->output("", true, $this->encoding); - } - - public function render_links($table,$id="",$fields=false,$extra=false,$relation_id=false) { - $links = new JSONGanttLinksConnector($this->get_connection(),$this->names["db_class"]); - $links->render_table($table,$id,$fields,$extra); - $this->set_options("links", $links); - } - - - /*! render self - process commands, output requested data as XML - */ - public function render(){ - $this->event->trigger("onInit", $this); - EventMaster::trigger_static("connectorInit",$this); - - if (!$this->as_string) - $this->parse_request(); - $this->set_relation(); - - if ($this->live_update !== false && $this->updating!==false) { - $this->live_update->get_updates(); - } else { - if ($this->editing){ - if ($this->links_mode && isset($this->options["links"])) { - $this->options["links"]->save(); - } else { - $dp = new $this->names["data_class"]($this,$this->config,$this->request); - $dp->process($this->config,$this->request); - } - } else { - if (!$this->access->check("read")){ - LogMaster::log("Access control: read operation blocked"); - echo "Access denied"; - die(); - } - $wrap = new SortInterface($this->request); - $this->apply_sorts($wrap); - $this->event->trigger("beforeSort",$wrap); - $wrap->store(); - - $wrap = new FilterInterface($this->request); - $this->apply_filters($wrap); - $this->event->trigger("beforeFilter",$wrap); - $wrap->store(); - - if ($this->model && method_exists($this->model, "get")){ - $this->sql = new ArrayDBDataWrapper(); - $result = new ArrayQueryWrapper(call_user_func(array($this->model, "get"), $this->request)); - $out = $this->output_as_xml($result); - } else { - $out = $this->output_as_xml($this->get_resource()); - - if ($out !== null) return $out; - } - - } - } - $this->end_run(); - } -} - - -class GanttLinksConnector extends OptionsConnector { - public function render(){ - if (!$this->init_flag){ - $this->init_flag=true; - return ""; - } - - $res = $this->sql->select($this->request); - return $this->render_set($res); - } - - public function save() { - $dp = new $this->names["data_class"]($this,$this->config,$this->request); - $dp->process($this->config,$this->request); - } -} - - -class JSONGanttLinksConnector extends JSONOptionsConnector { - public function render(){ - if (!$this->init_flag){ - $this->init_flag=true; - return ""; - } - - $res = $this->sql->select($this->request); - return $this->render_set($res); - } - - public function save() { - $dp = new $this->names["data_class"]($this,$this->config,$this->request); - $dp->process($this->config,$this->request); - } -} - -?> \ No newline at end of file diff --git a/libraries/dhtmlxgantt/connector/grid_config.php b/libraries/dhtmlxgantt/connector/grid_config.php deleted file mode 100644 index 47e4ba2..0000000 --- a/libraries/dhtmlxgantt/connector/grid_config.php +++ /dev/null @@ -1,423 +0,0 @@ -headerNames = $headers; - else - $this->setHeader($headers); - } - - /*! brief convert list of parameters to an array - @param param - list of values or array of values - @return array of parameters - */ - private function parse_param_array($param, $check=false, $default = ""){ - if (gettype($param) == 'string') - $param = explode($this->headerDelimiter, $param); - - if ($check){ - for ($i=0; $i < sizeof($param); $i++) { - if (!array_key_exists($param[$i],$check)) - $param[$i] = $default; - } - } - return $param; - } - - /*! sets delimiter for string arguments in attach header functions (default is ,) - @param headerDelimiter - string delimiter - */ - public function setHeaderDelimiter($headerDelimiter) { - $this->headerDelimiter = $headerDelimiter; - } - - /*! sets header - @param names - array of names or string of names, delimited by headerDelimiter (default is ,) - */ - public function setHeader($names) { - if ($names instanceof DataConfig){ - $out = array(); - for ($i=0; $i < sizeof($names->text); $i++) - $out[]=$names->text[$i]["name"]; - $names = $out; - } - - $this->headerNames = $this->parse_param_array($names); - } - - /*! sets init columns width in pixels - @param wp - array of widths or string of widths, delimited by headerDelimiter (default is ,) - */ - public function setInitWidths($wp) { - $this->headerWidths = $this->parse_param_array($wp); - $this->headerWidthsUnits = 'px'; - } - - /*! sets init columns width in persents - @param wp - array of widths or string of widths, delimited by headerDelimiter (default is ,) - */ - public function setInitWidthsP($wp) { - $this->setInitWidths($wp); - $this->headerWidthsUnits = '%'; - } - - /*! sets columns align - @param alStr - array of aligns or string of aligns, delimited by headerDelimiter (default is ,) - */ - public function setColAlign($alStr) { - $this->headerAlign = $this->parse_param_array($alStr, - array("right"=>1, "left"=>1, "center"=>1, "justify"=>1), - "left"); - } - - /*! sets columns vertical align - @param alStr - array of vertical aligns or string of vertical aligns, delimited by headerDelimiter (default is ,) - */ - public function setColVAlign($alStr) { - $this->headerVAlign = $this->parse_param_array($alStr, - array("baseline"=>1, "sub"=>1, "super"=>1, "top"=>1, "text-top"=>1, "middle"=>1, "bottom"=>1, "text-bottom"=>1), - "top"); - } - - /*! sets column types - @param typeStr - array of types or string of types, delimited by headerDelimiter (default is ,) - */ - public function setColTypes($typeStr) { - $this->headerTypes = $this->parse_param_array($typeStr); - } - - /*! sets columns sorting - @param sortStr - array if sortings or string of sortings, delimited by headerDelimiter (default is ,) - */ - public function setColSorting($sortStr) { - $this->headerSorts = $this->parse_param_array($sortStr); - } - - /*! sets columns colors - @param colorStr - array of colors or string of colors, delimited by headerDelimiter (default is ,) - if (color should not be applied it's value should be null) - */ - public function setColColor($colorStr) { - $this->headerColors = $this->parse_param_array($colorStr); - } - - /*! sets hidden columns - @param hidStr - array of bool values or string of bool values, delimited by headerDelimiter (default is ,) - */ - public function setColHidden($hidStr) { - $this->headerHidden = $this->parse_param_array($hidStr); - } - - /*! sets columns id - @param idsStr - array of ids or string of ids, delimited by headerDelimiter (default is ,) - */ - public function setColIds($idsStr) { - $this->headerIds = $this->parse_param_array($idsStr); - } - - /*! sets number/date format - @param formatArr - array of mask formats for number/dates , delimited by headerDelimiter (default is ,) - */ - public function setColFormat($formatArr) { - $this->headerFormat = $this->parse_param_array($formatArr); - } - - /*! attaches header - @param values - array of header names or string of header names, delimited by headerDelimiter (default is ,) - @param styles - array of header styles or string of header styles, delimited by headerDelimiter (default is ,) - */ - public function attachHeader($values, $styles = null, $footer = false) { - $header = array(); - $header['values'] = $this->parse_param_array($values); - if ($styles != null) { - $header['styles'] = $this->parse_param_array($styles); - } else { - $header['styles'] = null; - } - if ($footer) - $this->footerAttaches[] = $header; - else - $this->headerAttaches[] = $header; - } - - /*! attaches footer - @param values - array of footer names or string of footer names, delimited by headerDelimiter (default is ,) - @param styles - array of footer styles or string of footer styles, delimited by headerDelimiter (default is ,) - */ - public function attachFooter($values, $styles = null) { - $this->attachHeader($values, $styles, true); - } - - private function auto_fill($mode){ - $headerWidths = array(); - $headerTypes = array(); - $headerSorts = array(); - $headerAttaches = array(); - - for ($i=0; $i < sizeof($this->headerNames); $i++) { - $headerWidths[] = 100; - $headerTypes[] = "ro"; - $headerSorts[] = "connector"; - $headerAttaches[] = "#connector_text_filter"; - } - if ($this->headerWidths == false) - $this->setInitWidths($headerWidths); - if ($this->headerTypes == false) - $this->setColTypes($headerTypes); - - if ($mode){ - if ($this->headerSorts == false) - $this->setColSorting($headerSorts); - $this->attachHeader($headerAttaches); - } - } - - public function defineOptions($conn){ - if (!$conn->is_first_call()) return; //render head only for first call - - $config = $conn->get_config(); - $full_header = ($this->headerNames === true); - - if (gettype($this->headerNames) == 'boolean') //auto-config - $this->setHeader($config); - $this->auto_fill($full_header); - - if (isset($_GET["dhx_colls"])) return; - - $fillList = array(); - for ($i = 0; $i < count($this->headerNames); $i++) - if ($this->headerTypes[$i] == "co" || $this->headerTypes[$i] == "coro") - $fillList[$i] = true; - - for ($i = 0; $i < count($this->headerAttaches); $i++) { - for ($j = 0; $j < count($this->headerAttaches[$i]['values']); $j++) { - if ($this->headerAttaches[$i]['values'][$j] == "#connector_select_filter" - || $this->headerAttaches[$i]['values'][$j] == "#select_filter") { - $fillList[$j] = true;; - } - } - } - - $temp = array(); - foreach($fillList as $k => $v) - $temp[] = $k; - if (count($temp)) - $_GET["dhx_colls"] = implode(",",$temp); - } - - - /*! gets header as array - */ - private function getHeaderArray() { - $head = Array(); - $head[0] = $this->headerNames; - $head = $this->getAttaches($head, $this->headerAttaches); - return $head; - } - - - /*! get footer as array - */ - private function getFooterArray() { - $foot = Array(); - $foot = $this->getAttaches($foot, $this->footerAttaches); - return $foot; - } - - - /*! gets array of data with attaches - */ - private function getAttaches($to, $from) { - for ($i = 0; $i < count($from); $i++) { - $line = $from[$i]['values']; - $to[] = $line; - } - return $to; - } - - - /*! calculates rowspan array according #cspan markers - */ - private function processCspan($data) { - $rspan = Array(); - for ($i = 0; $i < count($data); $i++) { - $last = 0; - $rspan[$i] = Array(); - for ($j = 0; $j < count($data[$i]); $j++) { - $rspan[$i][$j] = 0; - if ($data[$i][$j] === '#cspan') { - $rspan[$i][$last]++; - } else { - $last = $j; - } - } - } - return $rspan; - } - - - /*! calculates colspan array according #rspan markers - */ - private function processRspan($data) { - $last = Array(); - $cspan = Array(); - for ($i = 0; $i < count($data); $i++) { - $cspan[$i] = Array(); - for ($j = 0; $j < count($data[$i]); $j++) { - $cspan[$i][$j] = 0; - if (!isset($last[$j])) $last[$j] = 0; - if ($data[$i][$j] === '#rspan') { - $cspan[$last[$j]][$j]++; - } else { - $last[$j] = $i; - } - } - } - return $cspan; - } - - - /*! sets mode of output format: usual mode or convert mode. - * @param mode - * true - convert mode, false - otherwise - */ - public function set_convert_mode($mode) { - $this->convert_mode = $mode; - } - - - /*! adds header configuration in output XML - */ - public function attachHeaderToXML($conn, $out) { - if (!$conn->is_first_call()) return; //render head only for first call - - $head = $this->getHeaderArray(); - $foot = $this->getFooterArray(); - $rspan = $this->processRspan($head); - $cspan = $this->processCspan($head); - - $str = ''; - - if ($this->convert_mode) $str .= ""; - - for ($i = 0; $i < count($this->headerNames); $i++) { - $str .= 'headerTypes[$i].'"'; - $str .= ' width="'.$this->headerWidths[$i].'"'; - $str .= $this->headerIds ? ' id="'.$this->headerIds[$i].'"' : ''; - $str .= $this->headerAlign[$i] ? ' align="'.$this->headerAlign[$i].'"' : ''; - $str .= $this->headerVAlign[$i] ? ' valign="'.$this->headerVAlign[$i].'"' : ''; - $str .= $this->headerSorts[$i] ? ' sort="'.$this->headerSorts[$i].'"' : ''; - $str .= $this->headerColors[$i] ? ' color="'.$this->headerColors[$i].'"' : ''; - $str .= $this->headerHidden[$i] ? ' hidden="'.$this->headerHidden[$i].'"' : ''; - $str .= $this->headerFormat[$i] ? ' format="'.$this->headerFormat[$i].'"' : ''; - $str .= $cspan[0][$i] ? ' colspan="'.($cspan[0][$i] + 1).'"' : ''; - $str .= $rspan[0][$i] ? ' rowspan="'.($rspan[0][$i] + 1).'"' : ''; - $str .= '>'.$this->headerNames[$i].''; - } - - if (!$this->convert_mode) { - $str .= ''.$this->headerWidthsUnits.''; - if ((count($this->headerAttaches) > 0)||(count($this->footerAttaches) > 0)) { - $str .= ''; - } - for ($i = 0; $i < count($this->headerAttaches); $i++) { - $str .= ''; - $str .= ''.implode(",",$this->headerAttaches[$i]['values']).''; - if ($this->headerAttaches[$i]['styles'] != null) { - $str .= ''.implode(",",$this->headerAttaches[$i]['styles']).''; - } - $str .= ''; - } - for ($i = 0; $i < count($this->footerAttaches); $i++) { - $str .= ''; - $str .= ''.implode(",",$this->footerAttaches[$i]['values']).''; - if ($this->footerAttaches[$i]['styles'] != null) { - $str .= ''.implode(",",$this->footerAttaches[$i]['styles']).''; - } - $str .= ''; - } - if ((count($this->headerAttaches) > 0)||(count($this->footerAttaches) > 0)) { - $str .= ''; - } - } else { - $str .= ""; - for ($i = 1; $i < count($head); $i++) { - $str .= ""; - for ($j = 0; $j < count($head[$i]); $j++) { - $str .= ''; - } - $str .= "\n"; - } - } - $str .= ''; - - - if ($this->convert_mode && count($foot) > 0) { - $rspan = $this->processRspan($foot); - $cspan = $this->processCspan($foot); - $str .= ""; - for ($i = 0; $i < count($foot); $i++) { - $str .= ""; - for ($j = 0; $j < count($foot[$i]); $j++) { - $str .= ''; - } - $str .= "\n"; - } - $str .= ""; - } - - $out->add($str); - } -} - -?> \ No newline at end of file diff --git a/libraries/dhtmlxgantt/connector/grid_connector.php b/libraries/dhtmlxgantt/connector/grid_connector.php deleted file mode 100644 index d38bc87..0000000 --- a/libraries/dhtmlxgantt/connector/grid_connector.php +++ /dev/null @@ -1,269 +0,0 @@ -row_attrs=array(); - $this->cell_attrs=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 (!array_key_exists($name, $this->cell_attrs)) $this->cell_attrs[$name]=array(); - $this->cell_attrs[$name][$attr]=$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"]; - $xmlcontent = false; - if (isset($this->cell_attrs[$name])){ - $cattrs=$this->cell_attrs[$name]; - foreach ($cattrs as $k => $v){ - $str.=" ".$k."='".$this->xmlentities($v)."'"; - if ($k == "xmlcontent") - $xmlcontent = true; - } - } - $value = isset($this->data[$name]) ? $this->data[$name] : ''; - if (!$xmlcontent) - $str.=">"; - else - $str.=">".$value.""; - } - if ($this->userdata !== false) - 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{ - - /*! 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,$render_type=false){ - if (!$item_type) $item_type="GridDataItem"; - if (!$data_type) $data_type="GridDataProcessor"; - if (!$render_type) $render_type="RenderStrategy"; - parent::__construct($res,$type,$item_type,$data_type,$render_type); - } - - - protected function parse_request(){ - parent::parse_request(); - - if (isset($_GET["dhx_colls"])) - $this->fill_collections($_GET["dhx_colls"]); - } - 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 - */ - protected 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(){ - $attributes = ""; - foreach($this->attributes as $k=>$v) - $attributes .= " ".$k."='".$v."'"; - - 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")); - $this->event->attach("onInit", Array($config, "defineOptions")); - } -} - -/*! 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]=="" && ((string)intval($parts[1]))==$parts[1]) - if (sizeof($this->config->text)>intval($parts[1])) - return $this->config->text[intval($parts[1])]["name"]; - return $data; - } -} -?> \ No newline at end of file diff --git a/libraries/dhtmlxgantt/connector/keygrid_connector.php b/libraries/dhtmlxgantt/connector/keygrid_connector.php deleted file mode 100644 index 3d7951a..0000000 --- a/libraries/dhtmlxgantt/connector/keygrid_connector.php +++ /dev/null @@ -1,48 +0,0 @@ -event->attach("beforeProcessing",array($this,"before_check_key")); - $this->event->attach("afterProcessing",array($this,"after_check_key")); - } - - public function before_check_key($action){ - if ($action->get_value($this->config->id["name"])=="") - $action->error(); - } - public function after_check_key($action){ - if ($action->get_status()=="inserted" || $action->get_status()=="updated"){ - $action->success($action->get_value($this->config->id["name"])); - $action->set_status("inserted"); - } - } -}; - -class KeyGridDataProcessor 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 "__dummy__id__"; //ignore ID - $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/libraries/dhtmlxgantt/connector/mixed_connector.php b/libraries/dhtmlxgantt/connector/mixed_connector.php deleted file mode 100644 index 037e43e..0000000 --- a/libraries/dhtmlxgantt/connector/mixed_connector.php +++ /dev/null @@ -1,28 +0,0 @@ -connectors[$name] = $conn; - } - - public function render() { - $result = "{"; - $parts = array(); - foreach($this->connectors as $name => $conn) { - $conn->asString(true); - $parts[] = "\"".$name."\":".($conn->render())."\n"; - } - $result .= implode(",\n", $parts)."}"; - echo $result; - } -} - -?> \ No newline at end of file diff --git a/libraries/dhtmlxgantt/connector/options_connector.php b/libraries/dhtmlxgantt/connector/options_connector.php deleted file mode 100644 index a81b679..0000000 --- a/libraries/dhtmlxgantt/connector/options_connector.php +++ /dev/null @@ -1,45 +0,0 @@ -skip) return ""; - $str =""; - - $str .= "xmlentities($this->data[$this->config->data[0]['db_name']])."\" label=\"".$this->xmlentities($this->data[$this->config->data[1]['db_name']])."\" />"; - return $str; - } -} - -/*! Connector class for dhtmlxForm:options -**/ -class SelectOptionsConnector extends Connector{ - - /*! 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="OptionsDataItem"; - parent::__construct($res,$type,$item_type,$data_type); - } - -} - -?> \ No newline at end of file diff --git a/libraries/dhtmlxgantt/connector/scheduler_connector.php b/libraries/dhtmlxgantt/connector/scheduler_connector.php deleted file mode 100644 index dfe8aa9..0000000 --- a/libraries/dhtmlxgantt/connector/scheduler_connector.php +++ /dev/null @@ -1,230 +0,0 @@ -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]."]]>"; - } - if ($this->userdata !== false) - foreach ($this->userdata as $key => $value) - $str.="<".$key.">"; - - return $str.""; - } -} - - -/*! Connector class for dhtmlxScheduler -**/ -class SchedulerConnector extends Connector{ - - protected $extra_output="";//!< extra info which need to be sent to client side - protected $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; - } - - - /*! 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. - * @param render_type - name of class which will be used for rendering. - */ - public function __construct($res,$type=false,$item_type=false,$data_type=false,$render_type=false){ - if (!$item_type) $item_type="SchedulerDataItem"; - if (!$data_type) $data_type="SchedulerDataProcessor"; - if (!$render_type) $render_type="RenderStrategy"; - parent::__construct($res,$type,$item_type,$data_type,$render_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; - } -} - - -class JSONSchedulerDataItem extends SchedulerDataItem{ - /*! return self as XML string - */ - function to_xml(){ - if ($this->skip) return ""; - - $obj = array(); - $obj['id'] = $this->get_id(); - $obj['start_date'] = $this->data[$this->config->text[0]["name"]]; - $obj['end_date'] = $this->data[$this->config->text[1]["name"]]; - $obj['text'] = $this->data[$this->config->text[2]["name"]]; - for ($i=3; $iconfig->text); $i++){ - $extra = $this->config->text[$i]["name"]; - $obj[$extra]=$this->data[$extra]; - } - - if ($this->userdata !== false) - foreach ($this->userdata as $key => $value) - $obj[$key]=$value; - - return $obj; - } -} - - -class JSONSchedulerConnector extends SchedulerConnector { - - protected $data_separator = ","; - - /*! 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,$render_type=false){ - if (!$item_type) $item_type="JSONSchedulerDataItem"; - if (!$data_type) $data_type="SchedulerDataProcessor"; - if (!$render_type) $render_type="JSONRenderStrategy"; - parent::__construct($res,$type,$item_type,$data_type,$render_type); - } - - protected function xml_start() { - return '{ "data":'; - } - - protected function xml_end() { - $this->fill_collections(); - $end = (!empty($this->extra_output)) ? ', "collections": {'.$this->extra_output.'}' : ''; - foreach ($this->attributes as $k => $v) - $end.=", \"".$k."\":\"".$v."\""; - $end .= '}'; - return $end; - } - - /*! 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=array(); - foreach($options as $k => $v) - $str[]='{"id":"'.$this->xmlentities($k).'", "value":"'.$this->xmlentities($v).'"}'; - $options=implode(",",$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=""){ - $options = array(); - foreach ($this->options as $k=>$v) { - $name = $k; - $option="\"{$name}\":["; - if (!is_string($this->options[$name])){ - $data = json_encode($this->options[$name]->render()); - $option.=substr($data,1,-1); - } else - $option.=$this->options[$name]; - $option.="]"; - $options[] = $option; - } - $this->extra_output .= implode($this->data_separator, $options); - } - - - /*! output fetched data as XML - @param res - DB resultset - */ - protected function output_as_xml($res){ - $result = $this->render_set($res); - if ($this->simple) return $result; - - $data=$this->xml_start().json_encode($result).$this->xml_end(); - - if ($this->as_string) return $data; - - $out = new OutputWriter($data, ""); - $out->set_type("json"); - $this->event->trigger("beforeOutput", $this, $out); - $out->output("", true, $this->encoding); - } -} -?> \ No newline at end of file diff --git a/libraries/dhtmlxgantt/connector/strategy.php b/libraries/dhtmlxgantt/connector/strategy.php deleted file mode 100644 index 4227933..0000000 --- a/libraries/dhtmlxgantt/connector/strategy.php +++ /dev/null @@ -1,508 +0,0 @@ -conn = $conn; - } - - /*! adds mix fields into DataConfig - * @param config - * DataConfig object - * @param mix - * mix structure - */ - protected function mix($config, $mix) { - for ($i = 0; $i < count($mix); $i++) { - if ($config->is_field($mix[$i]['name'])===-1) { - $config->add_field($mix[$i]['name']); - } - } - } - - /*! remove mix fields from DataConfig - * @param config - * DataConfig object - * @param mix - * mix structure - */ - protected function unmix($config, $mix) { - for ($i = 0; $i < count($mix); $i++) { - if ($config->is_field($mix[$i]['name'])!==-1) { - $config->remove_field_full($mix[$i]['name']); - } - } - } - - /*! adds mix fields in item - * simple mix adds only strings specified by user - * @param mix - * mix structure - * @param data - * array of selected data - */ - protected function simple_mix($mix, $data) { - // get mix details - for ($i = 0; $i < count($mix); $i++) - $data[$mix[$i]["name"]] = is_object($mix[$i]["value"]) ? "" : $mix[$i]["value"]; - return $data; - } - - /*! adds mix fields in item - * complex mix adds strings specified by user and results of subrequests - * @param mix - * mix structure - * @param data - * array of selected data - */ - protected function complex_mix($mix, $data) { - // get mix details - for ($i = 0; $i < count($mix); $i++) { - $mixname = $mix[$i]["name"]; - if ($mix[$i]['filter'] !== false) { - $subconn = $mix[$i]["value"]; - $filter = $mix[$i]["filter"]; - - // setting relationships - $subconn->clear_filter(); - foreach ($filter as $k => $v) - if (isset($data[$v])) - $subconn->filter($k, $data[$v], "="); - else - throw new Exception('There was no such data field registered as: '.$k); - - $subconn->asString(true); - $data[$mixname]=$subconn->simple_render(); - if (is_array($data[$mixname]) && count($data[$mixname]) == 1) - $data[$mixname] = $data[$mixname][0]; - } else { - $data[$mixname] = $mix[$i]["value"]; - } - } - return $data; - } - - /*! render from DB resultset - @param res - DB resultset - process commands, output requested data as XML - */ - public function render_set($res, $name, $dload, $sep, $config, $mix){ - $output=""; - $index=0; - $conn = $this->conn; - $this->mix($config, $mix); - $conn->event->trigger("beforeRenderSet",$conn,$res,$config); - while ($data=$conn->sql->get_next($res)){ - $data = $this->simple_mix($mix, $data); - - $data = new $name($data,$config,$index); - if ($data->get_id()===false) - $data->set_id($conn->uuid()); - $conn->event->trigger("beforeRender",$data); - $output.=$data->to_xml().$sep; - $index++; - } - $this->unmix($config, $mix); - return $output; - } - -} - -class JSONRenderStrategy extends RenderStrategy { - - /*! render from DB resultset - @param res - DB resultset - process commands, output requested data as json - */ - public function render_set($res, $name, $dload, $sep, $config, $mix){ - $output=array(); - $index=0; - $conn = $this->conn; - $this->mix($config, $mix); - $conn->event->trigger("beforeRenderSet",$conn,$res,$config); - while ($data=$conn->sql->get_next($res)){ - $data = $this->complex_mix($mix, $data); - $data = new $name($data,$config,$index); - if ($data->get_id()===false) - $data->set_id($conn->uuid()); - $conn->event->trigger("beforeRender",$data); - $item = $data->to_xml(); - if ($item !== false) - $output[]=$item; - $index++; - } - $this->unmix($config, $mix); - return $output; - } - -} - -class TreeRenderStrategy extends RenderStrategy { - - protected $id_swap = array(); - - public function __construct($conn) { - parent::__construct($conn); - $conn->event->attach("afterInsert",array($this,"parent_id_correction_a")); - $conn->event->attach("beforeProcessing",array($this,"parent_id_correction_b")); - } - - public function render_set($res, $name, $dload, $sep, $config, $mix){ - $output=""; - $index=0; - $conn = $this->conn; - $config_copy = new DataConfig($config); - $this->mix($config, $mix); - while ($data=$conn->sql->get_next($res)){ - $data = $this->simple_mix($mix, $data); - $data = new $name($data,$config,$index); - $conn->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 && $dload) - $data->set_kids(true); - $output.=$data->to_xml_start(); - if ($data->has_kids()===-1 || ( $data->has_kids()==true && !$dload)){ - $sub_request = new DataRequestConfig($conn->get_request()); - //$sub_request->set_fieldset(implode(",",$config_copy->db_names_list($conn->sql))); - $sub_request->set_relation($data->get_id()); - $output.=$this->render_set($conn->sql->select($sub_request), $name, $dload, $sep, $config_copy, $mix); - } - $output.=$data->to_xml_end(); - $index++; - } - $this->unmix($config, $mix); - return $output; - } - - /*! 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->conn->get_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]); - } -} - - - -class JSONTreeRenderStrategy extends TreeRenderStrategy { - - public function render_set($res, $name, $dload, $sep, $config,$mix){ - $output=array(); - $index=0; - $conn = $this->conn; - $config_copy = new DataConfig($config); - $this->mix($config, $mix); - while ($data=$conn->sql->get_next($res)){ - $data = $this->complex_mix($mix, $data); - $data = new $name($data,$config,$index); - $conn->event->trigger("beforeRender",$data); - //there is no info about child elements, - //if we are using dyn. loading - assume that it has, - //in normal mode just exec sub-render routine - if ($data->has_kids()===-1 && $dload) - $data->set_kids(true); - $record = $data->to_xml_start(); - if ($data->has_kids()===-1 || ( $data->has_kids()==true && !$dload)){ - $sub_request = new DataRequestConfig($conn->get_request()); - //$sub_request->set_fieldset(implode(",",$config_copy->db_names_list($conn->sql))); - $sub_request->set_relation($data->get_id()); - //$sub_request->set_filters(array()); - $temp = $this->render_set($conn->sql->select($sub_request), $name, $dload, $sep, $config_copy, $mix); - if (sizeof($temp)) - $record["data"] = $temp; - } - if ($record !== false) - $output[] = $record; - $index++; - } - $this->unmix($config, $mix); - return $output; - } - -} - - -class MultitableTreeRenderStrategy extends TreeRenderStrategy { - - private $level = 0; - private $max_level = null; - protected $sep = ","; - - public function __construct($conn) { - parent::__construct($conn); - $conn->event->attach("beforeProcessing", Array($this, 'id_translate_before')); - $conn->event->attach("afterProcessing", Array($this, 'id_translate_after')); - } - - public function set_separator($sep) { - $this->sep = $sep; - } - - public function render_set($res, $name, $dload, $sep, $config, $mix){ - $output=""; - $index=0; - $conn = $this->conn; - $this->mix($config, $mix); - while ($data=$conn->sql->get_next($res)){ - $data = $this->simple_mix($mix, $data); - $data[$config->id['name']] = $this->level_id($data[$config->id['name']]); - $data = new $name($data,$config,$index); - $conn->event->trigger("beforeRender",$data); - if (($this->max_level !== null)&&($conn->get_level() == $this->max_level)) { - $data->set_kids(false); - } else { - if ($data->has_kids()===-1) - $data->set_kids(true); - } - $output.=$data->to_xml_start(); - $output.=$data->to_xml_end(); - $index++; - } - $this->unmix($config, $mix); - return $output; - } - - - public function level_id($id, $level = null) { - return ($level === null ? $this->level : $level).$this->sep.$id; - } - - - /*! remove level prefix from id, parent id and set new id before processing - @param action - DataAction object - */ - public function id_translate_before($action) { - $id = $action->get_id(); - $id = $this->parse_id($id, false); - $action->set_id($id); - $action->set_value('tr_id', $id); - $action->set_new_id($id); - $pid = $action->get_value($this->conn->get_config()->relation_id['db_name']); - $pid = $this->parse_id($pid, false); - $action->set_value($this->conn->get_config()->relation_id['db_name'], $pid); - } - - - /*! add level prefix in id and new id after processing - @param action - DataAction object - */ - public function id_translate_after($action) { - $id = $action->get_id(); - $action->set_id($this->level_id($id)); - $id = $action->get_new_id(); - $action->success($this->level_id($id)); - } - - - public function get_level($parent_name) { - if ($this->level) return $this->level; - if (!isset($_GET[$parent_name])) { - if (isset($_POST['ids'])) { - $ids = explode(",",$_POST["ids"]); - $id = $this->parse_id($ids[0]); - $this->level--; - } - $this->conn->get_request()->set_relation(false); - } else { - $id = $this->parse_id($_GET[$parent_name]); - $_GET[$parent_name] = $id; - } - return $this->level; - } - - - public function is_max_level() { - if (($this->max_level !== null) && ($this->level >= $this->max_level)) - return true; - return false; - } - public function set_max_level($max_level) { - $this->max_level = $max_level; - } - public function parse_id($id, $set_level = true) { - $parts = explode($this->sep, $id, 2); - if (count($parts) === 2) { - $level = $parts[0] + 1; - $id = $parts[1]; - } else { - $level = 0; - $id = ''; - } - if ($set_level) $this->level = $level; - return $id; - } - -} - - -class JSONMultitableTreeRenderStrategy extends MultitableTreeRenderStrategy { - - public function render_set($res, $name, $dload, $sep, $config, $mix){ - $output=array(); - $index=0; - $conn = $this->conn; - $this->mix($config, $mix); - while ($data=$conn->sql->get_next($res)){ - $data = $this->complex_mix($mix, $data); - $data[$config->id['name']] = $this->level_id($data[$config->id['name']]); - $data = new $name($data,$config,$index); - $conn->event->trigger("beforeRender",$data); - - if ($this->is_max_level()) { - $data->set_kids(false); - } else { - if ($data->has_kids()===-1) - $data->set_kids(true); - } - $record = $data->to_xml_start($output); - $output[] = $record; - $index++; - } - $this->unmix($config, $mix); - return $output; - } - -} - - -class GroupRenderStrategy extends RenderStrategy { - - protected $id_postfix = '__{group_param}'; - - public function __construct($conn) { - parent::__construct($conn); - $conn->event->attach("beforeProcessing", Array($this, 'check_id')); - $conn->event->attach("onInit", Array($this, 'replace_postfix')); - } - - public function render_set($res, $name, $dload, $sep, $config, $mix, $usemix = false){ - $output=""; - $index=0; - $conn = $this->conn; - if ($usemix) $this->mix($config, $mix); - while ($data=$conn->sql->get_next($res)){ - if (isset($data[$config->id['name']])) { - $this->simple_mix($mix, $data); - $has_kids = false; - } else { - $data[$config->id['name']] = $data['value'].$this->id_postfix; - $data[$config->text[0]['name']] = $data['value']; - $has_kids = true; - } - $data = new $name($data,$config,$index); - $conn->event->trigger("beforeRender",$data); - if ($has_kids === false) { - $data->set_kids(false); - } - - if ($data->has_kids()===-1 && $dload) - $data->set_kids(true); - $output.=$data->to_xml_start(); - if (($data->has_kids()===-1 || ( $data->has_kids()==true && !$dload))&&($has_kids == true)){ - $sub_request = new DataRequestConfig($conn->get_request()); - $sub_request->set_relation(str_replace($this->id_postfix, "", $data->get_id())); - $output.=$this->render_set($conn->sql->select($sub_request), $name, $dload, $sep, $config, $mix, true); - } - $output.=$data->to_xml_end(); - $index++; - } - if ($usemix) $this->unmix($config, $mix); - return $output; - } - - public function check_id($action) { - if (isset($_GET['editing'])) { - $config = $this->conn->get_config(); - $id = $action->get_id(); - $pid = $action->get_value($config->relation_id['name']); - $pid = str_replace($this->id_postfix, "", $pid); - $action->set_value($config->relation_id['name'], $pid); - if (!empty($pid)) { - return $action; - } else { - $action->error(); - $action->set_response_text("This record can't be updated!"); - return $action; - } - } else { - return $action; - } - } - - public function replace_postfix() { - if (isset($_GET['id'])) { - $_GET['id'] = str_replace($this->id_postfix, "", $_GET['id']); - } - } - - public function get_postfix() { - return $this->id_postfix; - } - -} - - -class JSONGroupRenderStrategy extends GroupRenderStrategy { - - public function render_set($res, $name, $dload, $sep, $config, $mix, $usemix = false){ - $output=array(); - $index=0; - $conn = $this->conn; - if ($usemix) $this->mix($config, $mix); - while ($data=$conn->sql->get_next($res)){ - if (isset($data[$config->id['name']])) { - $data = $this->complex_mix($mix, $data); - $has_kids = false; - } else { - $data[$config->id['name']] = $data['value'].$this->id_postfix; - $data[$config->text[0]['name']] = $data['value']; - $has_kids = true; - } - $data = new $name($data,$config,$index); - $conn->event->trigger("beforeRender",$data); - if ($has_kids === false) { - $data->set_kids(false); - } - - if ($data->has_kids()===-1 && $dload) - $data->set_kids(true); - $record = $data->to_xml_start(); - if (($data->has_kids()===-1 || ( $data->has_kids()==true && !$dload))&&($has_kids == true)){ - $sub_request = new DataRequestConfig($conn->get_request()); - $sub_request->set_relation(str_replace($this->id_postfix, "", $data->get_id())); - $temp = $this->render_set($conn->sql->select($sub_request), $name, $dload, $sep, $config, $mix, true); - if (sizeof($temp)) - $record["data"] = $temp; - } - $output[] = $record; - $index++; - } - if ($usemix) $this->unmix($config, $mix); - return $output; - } - -} - - -?> \ No newline at end of file diff --git a/libraries/dhtmlxgantt/connector/tools.php b/libraries/dhtmlxgantt/connector/tools.php deleted file mode 100644 index 5017a72..0000000 --- a/libraries/dhtmlxgantt/connector/tools.php +++ /dev/null @@ -1,267 +0,0 @@ -events=array(); - $this->master = false; - } - /*! 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=false){ - //use class for event handling - if ($method === false){ - $this->master = $name; - return; - } - //use separate functions - $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); - } - - if ($this->master !== false) - if (method_exists($this->master, $name)) - call_user_func_array(array($this->master, $name), $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:i:s")."\n===================================="); - } - } -} - -?> \ No newline at end of file diff --git a/libraries/dhtmlxgantt/connector/tree_connector.php b/libraries/dhtmlxgantt/connector/tree_connector.php deleted file mode 100644 index 03f267d..0000000 --- a/libraries/dhtmlxgantt/connector/tree_connector.php +++ /dev/null @@ -1,231 +0,0 @@ -im0=false; - $this->im1=false; - $this->im2=false; - $this->check=false; - $this->attrs = 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; - } - } - - - /*! 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->im1."' "; - if ($this->im2) $str1.="im2='".$this->im2."' "; - if ($this->check) $str1.="checked='".$this->check."' "; - foreach ($this->attrs as $key => $value) - $str1.=$key."='".$this->xmlentities($value)."' "; - $str1.=">"; - if ($this->userdata !== false) - 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{ - protected $parent_name = 'id'; - public $rootId = "0"; - - /*! 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. - * @param render_type - * name of class which will provides data rendering - */ - public function __construct($res,$type=false,$item_type=false,$data_type=false, $render_type=false){ - if (!$item_type) $item_type="TreeDataItem"; - if (!$data_type) $data_type="TreeDataProcessor"; - if (!$render_type) $render_type="TreeRenderStrategy"; - parent::__construct($res,$type,$item_type,$data_type,$render_type); - } - - //parse GET scoope, all operations with incoming request must be done here - public function parse_request(){ - parent::parse_request(); - - if (isset($_GET[$this->parent_name])) - $this->request->set_relation($_GET[$this->parent_name]); - else - $this->request->set_relation($this->rootId); - - $this->request->set_limit(0,0); //netralize default reaction on dyn. loading mode - } - - /*! renders self as xml, starting part - */ - public function xml_start(){ - $attributes = ""; - foreach($this->attributes as $k=>$v) - $attributes .= " ".$k."='".$v."'"; - - return ""; - } - - /*! renders self as xml, ending part - */ - public function xml_end(){ - $this->fill_collections(); - return $this->extra_output.""; - } -} - - -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/libraries/dhtmlxgantt/connector/treedatagroup_connector.php b/libraries/dhtmlxgantt/connector/treedatagroup_connector.php deleted file mode 100644 index fcf9bbf..0000000 --- a/libraries/dhtmlxgantt/connector/treedatagroup_connector.php +++ /dev/null @@ -1,89 +0,0 @@ -parent_name])) $this->request->set_relation(false); - } - - /*! if it's first level then distinct level - * else select by parent - */ - protected function get_resource() { - $resource = null; - if (isset($_GET[$this->parent_name])) - $resource = $this->sql->select($this->request); - else - $resource = $this->sql->get_variants($this->config->relation_id['name'], $this->request); - return $resource; - } - - - /*! renders self as xml, starting part - */ - public function xml_start(){ - if (isset($_GET[$this->parent_name])) { - return ""; - } else { - return ""; - } - } - -} - - - - -class JSONTreeDataGroupConnector extends JSONTreeDataConnector{ - - public function __construct($res,$type=false,$item_type=false,$data_type=false,$render_type=false){ - if (!$render_type) $render_type="JSONGroupRenderStrategy"; - parent::__construct($res,$type,$item_type,$data_type,$render_type); - } - - /*! if not isset $_GET[id] then it's top level - */ - protected function set_relation() { - if (!isset($_GET[$this->parent_name])) $this->request->set_relation(false); - } - - /*! if it's first level then distinct level - * else select by parent - */ - protected function get_resource() { - $resource = null; - if (isset($_GET[$this->parent_name])) - $resource = $this->sql->select($this->request); - else - $resource = $this->sql->get_variants($this->config->relation_id['name'], $this->request); - return $resource; - } - - - /*! renders self as xml, starting part - */ - public function xml_start(){ - if (isset($_GET[$this->parent_name])) { - return ""; - } else { - return ""; - } - } - -} - - - -?> \ No newline at end of file diff --git a/libraries/dhtmlxgantt/connector/treedatamultitable_connector.php b/libraries/dhtmlxgantt/connector/treedatamultitable_connector.php deleted file mode 100644 index ce1103b..0000000 --- a/libraries/dhtmlxgantt/connector/treedatamultitable_connector.php +++ /dev/null @@ -1,91 +0,0 @@ -dload = true; - return parent::render(); - } - - /*! sets relation for rendering */ - protected function set_relation() { - if (!isset($_GET[$this->parent_name])) - $this->request->set_relation(false); - } - - public function xml_start(){ - if (isset($_GET[$this->parent_name])) { - return ""; - } else { - return ""; - } - } - - /*! set maximum level of tree - @param max_level - maximum level - */ - public function setMaxLevel($max_level) { - $this->render->set_max_level($max_level); - } - - public function get_level() { - return $this->render->get_level($this->parent_name); - } - -} - - - - - - -class JSONTreeDataMultitableConnector extends TreeDataMultitableConnector{ - - public function __construct($res,$type=false,$item_type=false,$data_type=false,$render_type=false){ - if (!$item_type) $item_type="JSONTreeCommonDataItem"; - if (!$data_type) $data_type="CommonDataProcessor"; - if (!$render_type) $render_type="JSONMultitableTreeRenderStrategy"; - parent::__construct($res,$type,$item_type,$data_type,$render_type); - } - - protected function output_as_xml($res){ - $result = $this->render_set($res); - if ($this->simple) return $result; - - $data = array(); - if (isset($_GET['parent'])) - $data["parent"] = $this->render->level_id($_GET[$this->parent_name], $this->render->get_level() - 1); - else - $data["parent"] = "0"; - $data["data"] = $result; - - $result = json_encode($data); - if ($this->as_string) return $result; - - $out = new OutputWriter($result, ""); - $out->set_type("json"); - $this->event->trigger("beforeOutput", $this, $out); - $out->output("", true, $this->encoding); - } - - public function xml_start(){ - return ''; - } -} - - -?> \ No newline at end of file diff --git a/libraries/dhtmlxgantt/connector/treegrid_connector.php b/libraries/dhtmlxgantt/connector/treegrid_connector.php deleted file mode 100644 index 5539bd1..0000000 --- a/libraries/dhtmlxgantt/connector/treegrid_connector.php +++ /dev/null @@ -1,121 +0,0 @@ -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{ - protected $parent_name = 'id'; - protected $rootId = "0"; - - /*! 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. - * @param render_type - * name of class which will provides data rendering - */ - public function __construct($res,$type=false,$item_type=false,$data_type=false,$render_type=false){ - if (!$item_type) $item_type="TreeGridDataItem"; - if (!$data_type) $data_type="TreeGridDataProcessor"; - if (!$render_type) $render_type="TreeRenderStrategy"; - parent::__construct($res,$type,$item_type,$data_type,$render_type); - } - - /*! process treegrid specific options in incoming request */ - public function parse_request(){ - parent::parse_request(); - - if (isset($_GET[$this->parent_name])) - $this->request->set_relation($_GET[$this->parent_name]); - else - $this->request->set_relation($this->rootId); - - $this->request->set_limit(0,0); //netralize default reaction on dyn. loading mode - } - - /*! 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/libraries/dhtmlxgantt/connector/treegridgroup_connector.php b/libraries/dhtmlxgantt/connector/treegridgroup_connector.php deleted file mode 100644 index 0fff41c..0000000 --- a/libraries/dhtmlxgantt/connector/treegridgroup_connector.php +++ /dev/null @@ -1,46 +0,0 @@ -parent_name])) $this->request->set_relation(false); - } - - /*! if it's first level then distinct level - * else select by parent - */ - protected function get_resource() { - $resource = null; - if (isset($_GET[$this->parent_name])) - $resource = $this->sql->select($this->request); - else - $resource = $this->sql->get_variants($this->config->relation_id['name'], $this->request); - return $resource; - } - - - /*! renders self as xml, starting part - */ - protected function xml_start(){ - if (isset($_GET[$this->parent_name])) { - return ""; - } else { - return ""; - } - } - -} - -?> \ No newline at end of file diff --git a/libraries/dhtmlxgantt/connector/treegridmultitable_connector.php b/libraries/dhtmlxgantt/connector/treegridmultitable_connector.php deleted file mode 100644 index eebaee4..0000000 --- a/libraries/dhtmlxgantt/connector/treegridmultitable_connector.php +++ /dev/null @@ -1,69 +0,0 @@ -dload = true; - return parent::render(); - } - - /*! sets relation for rendering */ - protected function set_relation() { - if (!isset($_GET['id'])) - $this->request->set_relation(false); - } - - public function xml_start(){ - if (isset($_GET['id'])) { - return "get_level() - 1))."'>"; - } else { - return ""; - } - } - - /*! set maximum level of tree - @param max_level - maximum level - */ - public function setMaxLevel($max_level) { - $this->render->set_max_level($max_level); - } - - public function get_level() { - return $this->render->get_level($this->parent_name); - } - - -} - - -class TreeGridMultitableDataProcessor extends DataProcessor { - - function name_data($data){ - if ($data=="gr_pid") - return $this->config->relation_id["name"]; - if ($data=="gr_id") - return $this->config->id["name"]; - preg_match('/^c([%\d]+)$/', $data, $data_num); - if (!isset($data_num[1])) return $data; - $data_num = $data_num[1]; - if (isset($this->config->data[$data_num]["db_name"])) { - return $this->config->data[$data_num]["db_name"]; - } - return $data; - } - -} - -?> \ No newline at end of file diff --git a/libraries/dhtmlxgantt/connector/treegroup_connector.php b/libraries/dhtmlxgantt/connector/treegroup_connector.php deleted file mode 100644 index 453cdf9..0000000 --- a/libraries/dhtmlxgantt/connector/treegroup_connector.php +++ /dev/null @@ -1,46 +0,0 @@ -parent_name])) $this->request->set_relation(false); - } - - /*! if it's first level then distinct level - * else select by parent - */ - protected function get_resource() { - $resource = null; - if (isset($_GET[$this->parent_name])) - $resource = $this->sql->select($this->request); - else - $resource = $this->sql->get_variants($this->config->relation_id['name'], $this->request); - return $resource; - } - - - /*! renders self as xml, starting part - */ - public function xml_start(){ - if (isset($_GET[$this->parent_name])) { - return ""; - } else { - return ""; - } - } - -} - -?> \ No newline at end of file diff --git a/libraries/dhtmlxgantt/connector/treemultitable_connector.php b/libraries/dhtmlxgantt/connector/treemultitable_connector.php deleted file mode 100644 index 5f15fb6..0000000 --- a/libraries/dhtmlxgantt/connector/treemultitable_connector.php +++ /dev/null @@ -1,51 +0,0 @@ -dload = true; - return parent::render(); - } - - /*! sets relation for rendering */ - protected function set_relation() { - if (!isset($_GET[$this->parent_name])) - $this->request->set_relation(false); - } - - public function xml_start(){ - if (isset($_GET[$this->parent_name])) { - return ""; - } else { - return ""; - } - } - - /*! set maximum level of tree - @param max_level - maximum level - */ - public function setMaxLevel($max_level) { - $this->render->set_max_level($max_level); - } - - public function get_level() { - return $this->render->get_level($this->parent_name); - } - -} - -?> \ No newline at end of file diff --git a/libraries/dhtmlxgantt/connector/update.php b/libraries/dhtmlxgantt/connector/update.php deleted file mode 100644 index cafb9f4..0000000 --- a/libraries/dhtmlxgantt/connector/update.php +++ /dev/null @@ -1,266 +0,0 @@ -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($conn, $out) { - $out->add($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/libraries/dhtmlxgantt/connector/xss_filter.php b/libraries/dhtmlxgantt/connector/xss_filter.php deleted file mode 100644 index e353a5b..0000000 --- a/libraries/dhtmlxgantt/connector/xss_filter.php +++ /dev/null @@ -1,199 +0,0 @@ - | -// +----------------------------------------------------------------------+ - - -//original name was lx_externalinput_clean -//renamed to prevent possible conflicts -class dhx_externalinput_clean { - // this basic clean should clean html code from - // lot of possible malicious code for Cross Site Scripting - // use it whereever you get external input - - // you can also set $filterOut to some use html cleaning, but I don't know of any code, which could - // exploit that. But if you want to be sure, set it to eg. array("Tidy","Dom"); - static function basic($string, $filterIn = array("Tidy","Dom","Striptags"), $filterOut = "none") { - $string = self::tidyUp($string, $filterIn); - $string = str_replace(array("&", "<", ">"), array("&amp;", "&lt;", "&gt;"), $string); - - // fix &entitiy\n; - $string = preg_replace('#(&\#*\w+)[\x00-\x20]+;#u', "$1;", $string); - $string = preg_replace('#(&\#x*)([0-9A-F]+);*#iu', "$1$2;", $string); - - $string = html_entity_decode($string, ENT_COMPAT, "UTF-8"); - - // remove any attribute starting with "on" or xmlns - $string = preg_replace('#(<[^>]+[\x00-\x20\"\'\/])(on|xmlns)[^>]*>#iUu', "$1>", $string); - - // remove javascript: and vbscript: protocol - $string = preg_replace('#([a-z]*)[\x00-\x20\/]*=[\x00-\x20\/]*([\`\'\"]*)[\x00-\x20\/]*j[\x00-\x20]*a[\x00-\x20]*v[\x00-\x20]*a[\x00-\x20]*s[\x00-\x20]*c[\x00-\x20]*r[\x00-\x20]*i[\x00-\x20]*p[\x00-\x20]*t[\x00-\x20]*:#iUu', '$1=$2nojavascript...', $string); - $string = preg_replace('#([a-z]*)[\x00-\x20\/]*=[\x00-\x20\/]*([\`\'\"]*)[\x00-\x20\/]*v[\x00-\x20]*b[\x00-\x20]*s[\x00-\x20]*c[\x00-\x20]*r[\x00-\x20]*i[\x00-\x20]*p[\x00-\x20]*t[\x00-\x20]*:#iUu', '$1=$2novbscript...', $string); - $string = preg_replace('#([a-z]*)[\x00-\x20\/]*=[\x00-\x20\/]*([\`\'\"]*)[\x00-\x20\/]*-moz-binding[\x00-\x20]*:#Uu', '$1=$2nomozbinding...', $string); - $string = preg_replace('#([a-z]*)[\x00-\x20\/]*=[\x00-\x20\/]*([\`\'\"]*)[\x00-\x20\/]*data[\x00-\x20]*:#Uu', '$1=$2nodata...', $string); - - //remove any style attributes, IE allows too much stupid things in them, eg. - // - // and in general you really don't want style declarations in your UGC - - $string = preg_replace('#(<[^>]+[\x00-\x20\"\'\/])style[^>]*>#iUu', "$1>", $string); - - //remove namespaced elements (we do not need them...) - $string = preg_replace('#]*>#i', "", $string); - - //remove really unwanted tags - do { - $oldstring = $string; - $string = preg_replace('#]*>#i', "", $string); - } while ($oldstring != $string); - - return self::tidyUp($string, $filterOut); - } - - static function tidyUp($string, $filters) { - if (is_array($filters)) { - foreach ($filters as $filter) { - $return = self::tidyUpWithFilter($string, $filter); - if ($return !== false) { - return $return; - } - } - } else { - $return = self::tidyUpWithFilter($string, $filters); - } - // if no filter matched, use the Striptags filter to be sure. - if ($return === false) { - return self::tidyUpModuleStriptags($string); - } else { - return $return; - } - } - - static private function tidyUpWithFilter($string, $filter) { - if (is_callable(array("self", "tidyUpModule" . $filter))) { - return call_user_func(array("self", "tidyUpModule" . $filter), $string); - } - return false; - } - - static private function tidyUpModuleStriptags($string) { - - return strip_tags($string); - } - - static private function tidyUpModuleNone($string) { - return $string; - } - - static private function tidyUpModuleDom($string) { - $dom = new domdocument(); - @$dom->loadHTML("" . $string . ""); - $string = ''; - foreach ($dom->documentElement->firstChild->childNodes as $child) { - $string .= $dom->saveXML($child); - } - return $string; - } - - static private function tidyUpModuleTidy($string) { - if (class_exists("tidy")) { - $tidy = new tidy(); - $tidyOptions = array("output-xhtml" => true, - "show-body-only" => true, - "clean" => true, - "wrap" => "350", - "indent" => true, - "indent-spaces" => 1, - "ascii-chars" => false, - "wrap-attributes" => false, - "alt-text" => "", - "doctype" => "loose", - "numeric-entities" => true, - "drop-proprietary-attributes" => true, - "enclose-text" => false, - "enclose-block-text" => false - - ); - $tidy->parseString($string, $tidyOptions, "utf8"); - $tidy->cleanRepair(); - return (string) $tidy; - } else { - return false; - } - } -} - -define("DHX_SECURITY_SAFETEXT", 1); -define("DHX_SECURITY_SAFEHTML", 2); -define("DHX_SECURITY_TRUSTED", 3); - -class ConnectorSecurity{ - static public $xss = DHX_SECURITY_SAFETEXT; - static public $security_key = false; - static public $security_var = "dhx_security"; - - static private $filterClass = null; - static function filter($value, $mode = false){ - if ($mode === false) - $mode = ConnectorSecurity::$xss; - - if ($mode == DHX_SECURITY_TRUSTED) - return $value; - if ($mode == DHX_SECURITY_SAFETEXT) - return filter_var($value, FILTER_SANITIZE_STRING, FILTER_FLAG_NO_ENCODE_QUOTES); - if ($mode == DHX_SECURITY_SAFEHTML){ - if (ConnectorSecurity::$filterClass == null) - ConnectorSecurity::$filterClass = new dhx_externalinput_clean(); - return ConnectorSecurity::$filterClass->basic($value); - } - throw new Error("Invalid security mode:"+$mode); - } - - static function CSRF_detected(){ - LogMaster::log("[SECURITY] Possible CSRF attack detected", array( - "referer" => $_SERVER["HTTP_REFERER"], - "remote" => $_SERVER["REMOTE_ADDR"] - )); - LogMaster::log("Request data", $_POST); - die(); - } - static function checkCSRF($edit){ - if (ConnectorSecurity::$security_key){ - if (!isset($_SESSION)) - @session_start(); - - if ($edit=== true){ - if (!isset($_POST[ConnectorSecurity::$security_var])) - return ConnectorSecurity::CSRF_detected(); - $master_key = $_SESSION[ConnectorSecurity::$security_var]; - $update_key = $_POST[ConnectorSecurity::$security_var]; - if ($master_key != $update_key) - return ConnectorSecurity::CSRF_detected(); - - return ""; - } - //data loading - if (!array_key_exists(ConnectorSecurity::$security_var,$_SESSION)){ - $_SESSION[ConnectorSecurity::$security_var] = md5(uniqid()); - } - - return $_SESSION[ConnectorSecurity::$security_var]; - } - - return ""; - } - -} \ No newline at end of file diff --git a/libraries/dhtmlxgantt/dhtmlxgantt.css b/libraries/dhtmlxgantt/dhtmlxgantt.css deleted file mode 100644 index 7ca01eb..0000000 --- a/libraries/dhtmlxgantt/dhtmlxgantt.css +++ /dev/null @@ -1,9 +0,0 @@ -/* -@license - -dhtmlxGantt v.3.2.0 Stardard -This software is covered by GPL license. You also can obtain Commercial or Enterprise license to use it in non-GPL project - please contact sales@dhtmlx.com. Usage without proper license is prohibited. - -(c) Dinamenta, UAB. -*/ -.gridHoverStyle,.gridSelection,.timelineSelection{background-color:#fff3a1}.gantt_grid_scale .gantt_grid_head_cell{color:#a6a6a6;border-top:none!important;border-right:none!important}.gantt_grid_data .gantt_cell{border-right:none;color:#454545}.gantt_task_link .gantt_link_arrow_right{border-width:6px;margin-top:-3px}.gantt_task_link .gantt_link_arrow_left{border-width:6px;margin-left:-6px;margin-top:-3px}.gantt_task_link .gantt_link_arrow_down,.gantt_task_link .gantt_link_arrow_top{border-width:6px}.gantt_task_line .gantt_task_progress_drag{bottom:-4px;height:16px;margin-left:-8px;width:16px}.chartHeaderBg{background-color:#fff}.gantt_task .gantt_task_scale .gantt_scale_cell{color:#a6a6a6;border-right:1px solid #ebebeb}.gantt_row.gantt_project,.gantt_row.odd.gantt_project{background-color:#edffef}.gantt_task_row.gantt_project,.gantt_task_row.odd.gantt_project{background-color:#f5fff6}.gantt_task_line.gantt_project{background-color:#65c16f;border:1px solid #3c9445}.gantt_task_line.gantt_project .gantt_task_progress{background-color:#46ad51}.buttonBg{background:#fff}.gantt_cal_light .gantt_btn_set{margin:5px 10px}.gantt_btn_set.gantt_cancel_btn_set{background:#fff;color:#454545;border:1px solid #cecece}.gantt_btn_set.gantt_save_btn_set{background:#3db9d3;text-shadow:0 -1px 0 #248a9f;color:#fff}.gantt_btn_set.gantt_delete_btn_set{background:#ec8e00;text-shadow:0 -1px 0 #a60;color:#fff}.gantt_cal_light_wide{padding-left:0!important;padding-right:0!important}.gantt_cal_light_wide .gantt_cal_larea{border-left:none!important;border-right:none!important}.dhtmlx_popup_button.dhtmlx_ok_button{background:#3db9d3;text-shadow:0 -1px 0 #248a9f;color:#fff;font-weight:700;border-width:0}.dhtmlx_popup_button.dhtmlx_cancel_button{font-weight:700;color:#454544}.gantt_qi_big_icon.icon_edit{color:#454545;background:#fff}.gantt_qi_big_icon.icon_delete{text-shadow:0 -1px 0 #a60;background:#ec8e00;color:#fff;border-width:0}.gantt_container{font-family:Arial;font-size:13px;border:1px solid #cecece;position:relative;white-space:nowrap}.gantt_grid{border-right:1px solid #cecece}.gantt_task_scroll{overflow-x:scroll}.gantt_task{position:relative}.gantt_grid,.gantt_task{overflow-x:hidden;overflow-y:hidden;display:inline-block;vertical-align:top}.gantt_grid_scale,.gantt_task_scale{color:#6b6b6b;font-size:12px;border-bottom:1px solid #cecece;background-color:#fff}.gantt_scale_line{box-sizing:border-box;-moz-box-sizing:border-box;border-top:1px solid #cecece}.gantt_scale_line:first-child{border-top:none}.gantt_grid_head_cell{display:inline-block;vertical-align:top;border-right:1px solid #cecece;text-align:center;position:relative;cursor:default;height:100%;-moz-user-select:-moz-none;-webkit-user-select:none;-user-select:none;overflow:hidden}.gantt_scale_line{clear:both}.gantt_grid_data{width:100%;overflow:hidden}.gantt_row{position:relative;-webkit-user-select:none;-moz-user-select:none;-moz-user-select:-moz-none}.gantt_add,.gantt_grid_head_add{width:100%;height:100%;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NTQ3MjMyMENDNkI0MTFFMjk4MTI5QTg3MDhFNDVDQTkiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NTQ3MjMyMERDNkI0MTFFMjk4MTI5QTg3MDhFNDVDQTkiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo1NDcyMzIwQUM2QjQxMUUyOTgxMjlBODcwOEU0NUNBOSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo1NDcyMzIwQkM2QjQxMUUyOTgxMjlBODcwOEU0NUNBOSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PshZT8UAAABbSURBVHjaYrTdeZmBEsCER+4wEP+H4sPkGGCDg020ARR7gb4GIAcYDKMDdPnDyAbYkGG5DVW9cIQMvUdBBAuUY4vDz8iAcZinA2zgCHqAYQMseAywJcYFAAEGAM+UFGuohFczAAAAAElFTkSuQmCC);background-position:center center;background-repeat:no-repeat;cursor:pointer;position:relative;-moz-opacity:.3;opacity:.3}.gantt_grid_head_cell.gantt_grid_head_add{-moz-opacity:.6;opacity:.6;top:0}.gantt_grid_head_cell.gantt_grid_head_add:hover{-moz-opacity:1;opacity:1}.gantt_grid_data .gantt_row.odd:hover,.gantt_grid_data .gantt_row:hover{background-color:#fff3a1}.gantt_grid_data .gantt_row.odd:hover .gantt_add,.gantt_grid_data .gantt_row:hover .gantt_add{-moz-opacity:1;opacity:1}.gantt_row,.gantt_task_row{border-bottom:1px solid #ebebeb;background-color:#fff}.gantt_row.odd,.gantt_task_row.odd{background-color:#fff}.gantt_cell,.gantt_grid_head_cell,.gantt_row,.gantt_scale_cell,.gantt_task_cell,.gantt_task_row{box-sizing:border-box;-moz-box-sizing:border-box}.gantt_grid_head_cell,.gantt_scale_cell{line-height:inherit}.gantt_grid_scale .gantt_grid_column_resize_wrap{cursor:col-resize;position:absolute;width:13px}.gantt_grid_column_resize_wrap .gantt_grid_column_resize{background-color:#cecece;height:100%;width:1px;margin:0 auto}.gantt_grid .gantt_grid_resize_wrap{cursor:col-resize;position:absolute;width:13px;z-index:1}.gantt_grid_resize_wrap .gantt_grid_resize{background-color:#cecece;width:1px;margin:0 auto}.gantt_drag_marker.gantt_grid_resize_area{background-color:rgba(231,231,231,.5);border-left:1px solid #cecece;border-right:1px solid #cecece;height:100%;width:100%;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.gantt_cell{display:inline-block;vertical-align:top;border-right:1px solid #ebebeb;padding-left:6px;padding-right:6px;height:100%;overflow:hidden;white-space:nowrap;font-size:13px}.gantt_grid_data .gantt_last_cell,.gantt_grid_scale .gantt_last_cell,.gantt_task_bg .gantt_last_cell,.gantt_task_scale .gantt_last_cell{border-right-width:0}.gantt_task_bg{overflow:hidden}.gantt_scale_cell{display:inline-block;white-space:nowrap;overflow:hidden;border-right:1px solid #cecece;text-align:center;height:100%}.gantt_task_cell{display:inline-block;height:100%;border-right:1px solid #ebebeb}.gantt_ver_scroll{width:0;background-color:transparent;height:1px;overflow-x:hidden;overflow-y:scroll;display:none;position:absolute;right:0}.gantt_ver_scroll>div{width:1px;height:1px}.gantt_hor_scroll{height:0;background-color:transparent;width:100%;clear:both;overflow-x:scroll;overflow-y:hidden;display:none}.gantt_hor_scroll>div{width:5000px;height:1px}.gantt_tree_indent{width:15px;height:100%;display:inline-block}.gantt_tree_content,.gantt_tree_icon{vertical-align:top}.gantt_tree_icon{width:28px;height:100%;display:inline-block;background-repeat:no-repeat;background-position:center center}.gantt_tree_content{height:100%;display:inline-block}.gantt_tree_icon.gantt_open{background-image:url(data:image/gif;base64,R0lGODlhEgASALMJAMrKyt3d3ejp6d7f3+/v75aWlvf39////wAAAP///wAAAAAAAAAAAAAAAAAAAAAAACH/C1hNUCBEYXRhWE1QPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS4wLWMwNjAgNjEuMTM0Nzc3LCAyMDEwLzAyLzEyLTE3OjMyOjAwICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdFJlZj0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlUmVmIyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M1IFdpbmRvd3MiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6M0I5RTczQjVDMDdBMTFFMTgxRjc4Mzk4M0Q3MjVFQzAiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6M0I5RTczQjZDMDdBMTFFMTgxRjc4Mzk4M0Q3MjVFQzAiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDozQjlFNzNCM0MwN0ExMUUxODFGNzgzOTgzRDcyNUVDMCIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDozQjlFNzNCNEMwN0ExMUUxODFGNzgzOTgzRDcyNUVDMCIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PgH//v38+/r5+Pf29fTz8vHw7+7t7Ovq6ejn5uXk4+Lh4N/e3dzb2tnY19bV1NPS0dDPzs3My8rJyMfGxcTDwsHAv769vLu6ubi3trW0s7KxsK+urayrqqmop6alpKOioaCfnp2cm5qZmJeWlZSTkpGQj46NjIuKiYiHhoWEg4KBgH9+fXx7enl4d3Z1dHNycXBvbm1sa2ppaGdmZWRjYmFgX15dXFtaWVhXVlVUU1JRUE9OTUxLSklIR0ZFRENCQUA/Pj08Ozo5ODc2NTQzMjEwLy4tLCsqKSgnJiUkIyIhIB8eHRwbGhkYFxYVFBMSERAPDg0MCwoJCAcGBQQDAgEAACH5BAEAAAkALAAAAAASABIAAARJMMlJq704661B+SAIXAVhnKhBFKSZnmuLImhslXPN3ibi+6pdBXc4IIpB2YkGE1IKAoL0ICUInJNCYMDtDgJYiScUGnHO6LQkAgA7);width:18px;cursor:pointer}.gantt_tree_icon.gantt_close{background-image:url(data:image/gif;base64,R0lGODlhEgASALMJAMrKyt3d3ejp6d7f3+/v75aWlvf39wAAAP///////wAAAAAAAAAAAAAAAAAAAAAAACH/C1hNUCBEYXRhWE1QPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS4wLWMwNjAgNjEuMTM0Nzc3LCAyMDEwLzAyLzEyLTE3OjMyOjAwICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdFJlZj0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlUmVmIyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M1IFdpbmRvd3MiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MzY0QzNGM0VDMDdBMTFFMUE3MDlCNUM2QjU1NDA5RjgiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MzY0QzNGM0ZDMDdBMTFFMUE3MDlCNUM2QjU1NDA5RjgiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDozNjRDM0YzQ0MwN0ExMUUxQTcwOUI1QzZCNTU0MDlGOCIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDozNjRDM0YzREMwN0ExMUUxQTcwOUI1QzZCNTU0MDlGOCIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PgH//v38+/r5+Pf29fTz8vHw7+7t7Ovq6ejn5uXk4+Lh4N/e3dzb2tnY19bV1NPS0dDPzs3My8rJyMfGxcTDwsHAv769vLu6ubi3trW0s7KxsK+urayrqqmop6alpKOioaCfnp2cm5qZmJeWlZSTkpGQj46NjIuKiYiHhoWEg4KBgH9+fXx7enl4d3Z1dHNycXBvbm1sa2ppaGdmZWRjYmFgX15dXFtaWVhXVlVUU1JRUE9OTUxLSklIR0ZFRENCQUA/Pj08Ozo5ODc2NTQzMjEwLy4tLCsqKSgnJiUkIyIhIB8eHRwbGhkYFxYVFBMSERAPDg0MCwoJCAcGBQQDAgEAACH5BAEAAAkALAAAAAASABIAAARDMMlJq704661B+SAIXAVhnKhBFKSZnmv7wqxVzmpd3Uff5zKEUAi0uV4xm4DAbBIEOkohMKhaB4HoxBMKjTjgsFgSAQA7);width:18px;cursor:pointer}.gantt_tree_icon.gantt_blank{width:18px}.gantt_tree_icon.gantt_folder_open{background-image:url(data:image/gif;base64,R0lGODlhEgASAJECAJeXl7Gvrf///wAAACH/C1hNUCBEYXRhWE1QPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS4wLWMwNjAgNjEuMTM0Nzc3LCAyMDEwLzAyLzEyLTE3OjMyOjAwICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdFJlZj0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlUmVmIyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M1IFdpbmRvd3MiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NTdDRDM3QzVDMDZEMTFFMUJGMzhFMDhCN0RGRjBGQ0YiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NTdDRDM3QzZDMDZEMTFFMUJGMzhFMDhCN0RGRjBGQ0YiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo1N0NEMzdDM0MwNkQxMUUxQkYzOEUwOEI3REZGMEZDRiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo1N0NEMzdDNEMwNkQxMUUxQkYzOEUwOEI3REZGMEZDRiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PgH//v38+/r5+Pf29fTz8vHw7+7t7Ovq6ejn5uXk4+Lh4N/e3dzb2tnY19bV1NPS0dDPzs3My8rJyMfGxcTDwsHAv769vLu6ubi3trW0s7KxsK+urayrqqmop6alpKOioaCfnp2cm5qZmJeWlZSTkpGQj46NjIuKiYiHhoWEg4KBgH9+fXx7enl4d3Z1dHNycXBvbm1sa2ppaGdmZWRjYmFgX15dXFtaWVhXVlVUU1JRUE9OTUxLSklIR0ZFRENCQUA/Pj08Ozo5ODc2NTQzMjEwLy4tLCsqKSgnJiUkIyIhIB8eHRwbGhkYFxYVFBMSERAPDg0MCwoJCAcGBQQDAgEAACH5BAEAAAIALAAAAAASABIAAAIzlI+pywcPm3mhWgkCsjBOvVkimElG9ZlCBlXd+2XjjLKg5GqoeZXqvsOQXK/ijUZTKVUFADs=)}.gantt_tree_icon.gantt_folder_closed{background-image:url(data:image/gif;base64,R0lGODlhEgASAJECAJeXl7Gvrf///wAAACH/C1hNUCBEYXRhWE1QPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS4wLWMwNjAgNjEuMTM0Nzc3LCAyMDEwLzAyLzEyLTE3OjMyOjAwICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdFJlZj0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlUmVmIyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M1IFdpbmRvd3MiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NTAyMTU1RTNDMDZEMTFFMUJGNzZCRThBRkFCRjg4MTIiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NTAyMTU1RTRDMDZEMTFFMUJGNzZCRThBRkFCRjg4MTIiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo1MDIxNTVFMUMwNkQxMUUxQkY3NkJFOEFGQUJGODgxMiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo1MDIxNTVFMkMwNkQxMUUxQkY3NkJFOEFGQUJGODgxMiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PgH//v38+/r5+Pf29fTz8vHw7+7t7Ovq6ejn5uXk4+Lh4N/e3dzb2tnY19bV1NPS0dDPzs3My8rJyMfGxcTDwsHAv769vLu6ubi3trW0s7KxsK+urayrqqmop6alpKOioaCfnp2cm5qZmJeWlZSTkpGQj46NjIuKiYiHhoWEg4KBgH9+fXx7enl4d3Z1dHNycXBvbm1sa2ppaGdmZWRjYmFgX15dXFtaWVhXVlVUU1JRUE9OTUxLSklIR0ZFRENCQUA/Pj08Ozo5ODc2NTQzMjEwLy4tLCsqKSgnJiUkIyIhIB8eHRwbGhkYFxYVFBMSERAPDg0MCwoJCAcGBQQDAgEAACH5BAEAAAIALAAAAAASABIAAAIwlI+pywcPm3mhWgkCsjBOvVkimElG9ZlCuYIY6TYs+6bmHDO4igfdD3GNhheV0VQAADs=)}.gantt_tree_icon.gantt_file{background-image:url(data:image/gif;base64,R0lGODlhEgASAJECAJeXl7Gvrf///wAAACH/C1hNUCBEYXRhWE1QPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS4wLWMwNjAgNjEuMTM0Nzc3LCAyMDEwLzAyLzEyLTE3OjMyOjAwICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdFJlZj0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlUmVmIyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M1IFdpbmRvd3MiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NzkxQzI4RjZDMDZEMTFFMTgwRjhBQURDQzI3NDU3QUEiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NzkxQzI4RjdDMDZEMTFFMTgwRjhBQURDQzI3NDU3QUEiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo3OTFDMjhGNEMwNkQxMUUxODBGOEFBRENDMjc0NTdBQSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo3OTFDMjhGNUMwNkQxMUUxODBGOEFBRENDMjc0NTdBQSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PgH//v38+/r5+Pf29fTz8vHw7+7t7Ovq6ejn5uXk4+Lh4N/e3dzb2tnY19bV1NPS0dDPzs3My8rJyMfGxcTDwsHAv769vLu6ubi3trW0s7KxsK+urayrqqmop6alpKOioaCfnp2cm5qZmJeWlZSTkpGQj46NjIuKiYiHhoWEg4KBgH9+fXx7enl4d3Z1dHNycXBvbm1sa2ppaGdmZWRjYmFgX15dXFtaWVhXVlVUU1JRUE9OTUxLSklIR0ZFRENCQUA/Pj08Ozo5ODc2NTQzMjEwLy4tLCsqKSgnJiUkIyIhIB8eHRwbGhkYFxYVFBMSERAPDg0MCwoJCAcGBQQDAgEAACH5BAEAAAIALAAAAAASABIAAAIylI+pwN16QJiUQiFThRlJm3RRFYSlR5qXMKmXaMDuuMoyOi8n/e6xn8NMHETgh5RaKQsAOw==)}.gantt_grid_head_cell .gantt_sort{position:absolute;right:5px;top:8px;width:7px;height:13px;background-repeat:no-repeat;background-position:center center}.gantt_grid_head_cell .gantt_sort.gantt_asc{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAANCAYAAABlyXS1AAAARUlEQVR4nGNgQAKGxib/GbABkIS7b8B/DAUwCRiGK0CXwFBAb1DfP/U/LszwHwi2X7qFgUEArBtdAVwCBmAKMCSQFSDzAWXXaOHsXeqkAAAAAElFTkSuQmCC)}.gantt_grid_head_cell .gantt_sort.gantt_desc{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAANCAYAAABlyXS1AAAARUlEQVR42mNgQAL1/VP/M2ADIIntF2/9x1AAlrh0C47hCmA60DFYwX88gIFGwNDY5D8uDFbg7hvwHx2jmIBTAlkB0e4BAEjlaNtBWJPnAAAAAElFTkSuQmCC)}.gantt_inserted,.gantt_updated{font-weight:700}.gantt_deleted{text-decoration:line-through}.gantt_invalid{background-color:FFE0E0}.gantt_error{color:red}.gantt_status{right:1px;padding:5px 10px;background:rgba(155,155,155,.1);position:absolute;top:1px;-webkit-transition:opacity .2s;transition:opacity .2s;opacity:0}.gantt_status.gantt_status_visible{opacity:1}#gantt_ajax_dots span{-webkit-transition:opacity .2s;transition:opacity .2s;background-repeat:no-repeat;opacity:0}#gantt_ajax_dots span.gantt_dot_visible{opacity:1}.dhtmlx_message_area{position:fixed;right:5px;width:250px;z-index:1000}.dhtmlx-info{min-width:120px;font-family:Arial;z-index:10000;margin:5px 5px 10px;-webkit-transition:all .5s ease;-moz-transition:all .5s ease;-o-transition:all .5s ease;transition:all .5s ease}.dhtmlx-info.hidden{height:0;padding:0;border-width:0;margin:0;overflow:hidden}.dhtmlx_modal_box{overflow:hidden;display:inline-block;min-width:250px;width:250px;text-align:center;position:fixed;z-index:20000;box-shadow:3px 3px 3px rgba(0,0,0,.07);font-family:Arial;border-radius:6px;border:1px solid #cecece;background:#fff}.dhtmlx_popup_title{border-top-left-radius:6px;border-top-right-radius:6px;border-width:0}.dhtmlx_button,.dhtmlx_popup_button{border:1px solid #cecece;height:30px;line-height:30px;display:inline-block;margin:0 5px;border-radius:4px;background:#fff}.dhtmlx-info,.dhtmlx_button,.dhtmlx_popup_button{user-select:none;-webkit-user-select:none;-moz-user-select:-moz-none;cursor:pointer}.dhtmlx_popup_text{overflow:hidden}.dhtmlx_popup_controls{border-radius:6px;padding:10px}.dhtmlx_popup_button{min-width:100px}div.dhx_modal_cover{background-color:#000;cursor:default;filter:alpha(opacity=20);opacity:.2;position:fixed;z-index:19999;left:0;top:0;width:100%;height:100%;border:none;zoom:1}.dhtmlx-info img,.dhtmlx_modal_box img{float:left;margin-right:20px}.dhtmlx-alert-error,.dhtmlx-confirm-error{border:1px solid red}.dhtmlx_button input,.dhtmlx_popup_button div{border-radius:4px;font-size:14px;-moz-box-sizing:content-box;box-sizing:content-box;padding:0;margin:0;vertical-align:top}.dhtmlx_popup_title{color:#fff;text-shadow:1px 1px #000;height:40px;line-height:40px;font-size:20px}.dhtmlx_popup_text{margin:15px 15px 5px;font-size:14px;color:#000;min-height:30px;border-radius:6px}.dhtmlx-error,.dhtmlx-info{font-size:14px;color:#000;box-shadow:3px 3px 3px rgba(0,0,0,.07);padding:0;background-color:#FFF;border-radius:3px;border:1px solid #fff}.dhtmlx-info div{padding:5px 10px;background-color:#fff;border-radius:3px;border:1px solid #cecece}.dhtmlx-error{background-color:#d81b1b;border:1px solid #ff3c3c;box-shadow:3px 3px 3px rgba(0,0,0,.07)}.dhtmlx-error div{background-color:#d81b1b;border:1px solid #940000;color:#FFF}.gantt_data_area div,.gantt_grid div{-ms-touch-action:none;-webkit-tap-highlight-color:transparent}.gantt_data_area{position:relative;overflow-x:hidden;overflow-y:hidden;-moz-user-select:-moz-none;-webkit-user-select:none;-user-select:none}.gantt_links_area{position:absolute;left:0;top:0}.gantt_side_content,.gantt_task_content,.gantt_task_progress{line-height:inherit;overflow:hidden;height:100%}.gantt_task_content{font-size:12px;color:#fff;width:100%;top:0;position:absolute;white-space:nowrap;text-align:center}.gantt_task_progress{text-align:center;z-index:0;background:#299cb4}.gantt_task_line{-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px;position:absolute;-moz-box-sizing:border-box;box-sizing:border-box;background-color:#3db9d3;border:1px solid #2898b0;-webkit-user-select:none;-moz-user-select:none;-moz-user-select:-moz-none}.gantt_task_line.gantt_drag_move div{cursor:move}.gantt_touch_move,.gantt_touch_progress .gantt_touch_resize{-moz-transform:scale(1.02,1.1);-o-transform:scale(1.02,1.1);-webkit-transform:scale(1.02,1.1);transform:scale(1.02,1.1);-moz-transform-origin:50%;-o-transform-origin:50%;-webkit-transform-origin:50%;transform-origin:50%}.gantt_touch_progress .gantt_task_progress_drag,.gantt_touch_resize .gantt_task_drag{-moz-transform:scaleY(1.3);-o-transform:scaleY(1.3);-webkit-transform:scaleY(1.3);transform:scaleY(1.3);-moz-transform-origin:50%;-o-transform-origin:50%;-webkit-transform-origin:50%;transform-origin:50%}.gantt_side_content{position:absolute;white-space:nowrap;color:#6e6e6e;bottom:7px;font-size:11px}.gantt_side_content.gantt_left{right:100%;padding-right:15px}.gantt_side_content.gantt_right{left:100%;padding-left:15px}.gantt_side_content.gantt_link_crossing{bottom:8.75px}.gantt_link_arrow,.gantt_task_link .gantt_line_wrapper{position:absolute;cursor:pointer}.gantt_line_wrapper div{background-color:#ffa011}.gantt_task_link:hover .gantt_line_wrapper div{box-shadow:0 0 5px 0 #ffa011}.gantt_task_link div.gantt_link_arrow{background-color:transparent;border-style:solid;width:0;height:0}.gantt_link_control{position:absolute;width:13px;top:0}.gantt_link_control div{display:none;cursor:pointer;box-sizing:border-box;position:relative;top:50%;margin-top:-7.5px;vertical-align:middle;border:1px solid #929292;-webkit-border-radius:6.5px;-moz-border-radius:6.5px;border-radius:6.5px;height:13px;width:13px;background-color:#f0f0f0}.gantt_link_control div:hover{background-color:#fff}.gantt_link_control.task_left{left:-13px}.gantt_link_control.task_right{right:-13px}.gantt_link_target .gantt_link_control div,.gantt_task_line.gantt_selected .gantt_link_control div,.gantt_task_line:hover .gantt_link_control div{display:block}.gantt_link_source,.gantt_link_target{box-shadow:0 0 3px #3db9d3}.gantt_link_target.link_finish_allow,.gantt_link_target.link_start_allow{box-shadow:0 0 3px #ffbf5e}.gantt_link_target.link_finish_deny,.gantt_link_target.link_start_deny{box-shadow:0 0 3px #e87e7b}.link_finish_allow .gantt_link_control.task_right div,.link_start_allow .gantt_link_control.task_left div{background-color:#ffbf5e;border-color:#ffa011}.link_finish_deny .gantt_link_control.task_right div,.link_start_deny .gantt_link_control.task_left div{background-color:#e87e7b;border-color:#dd3e3a}.gantt_link_arrow_right{border-width:4px 0 4px 6px;border-top-color:transparent!important;border-right-color:transparent!important;border-bottom-color:transparent!important;border-color:#ffa011;margin-top:-1px}.gantt_link_arrow_left{border-width:4px 6px 4px 0;margin-top:-1px;border-top-color:transparent!important;border-color:#ffa011;border-bottom-color:transparent!important;border-left-color:transparent!important}.gantt_link_arrow_top{border-width:0 4px 6px;border-color:#ffa011;border-top-color:transparent!important;border-right-color:transparent!important;border-left-color:transparent!important}.gantt_link_arrow_down{border-width:4px 6px 0 4px;border-color:#ffa011;border-right-color:transparent!important;border-bottom-color:transparent!important;border-left-color:transparent!important}.gantt_task_drag,.gantt_task_progress_drag{cursor:w-resize;height:100%;display:none;position:absolute}.gantt_task_line.gantt_selected .gantt_task_drag,.gantt_task_line.gantt_selected .gantt_task_progress_drag,.gantt_task_line:hover .gantt_task_drag,.gantt_task_line:hover .gantt_task_progress_drag{display:block}.gantt_task_drag{width:6px;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAACCAYAAAB7Xa1eAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3QYDDjkw3UJvAwAAABRJREFUCNdj/P//PwM2wASl/6PTAKrrBf4+lD8LAAAAAElFTkSuQmCC);z-index:1;top:0}.gantt_task_drag.task_left{left:0}.gantt_task_drag.task_right{right:0}.gantt_task_progress_drag{height:8px;width:8px;bottom:-4px;margin-left:-4px;background-position:bottom;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAALCAYAAAB24g05AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MkY3Rjk0RUVDMkYzMTFFMkI1OThEQTA3ODU0OTkzMEEiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MkY3Rjk0RUZDMkYzMTFFMkI1OThEQTA3ODU0OTkzMEEiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDoyRjdGOTRFQ0MyRjMxMUUyQjU5OERBMDc4NTQ5OTMwQSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDoyRjdGOTRFREMyRjMxMUUyQjU5OERBMDc4NTQ5OTMwQSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PobPBzIAAADkSURBVHjaYpk2bRoDDsAExL1QdjEQ/8OmiAWHZk4gXqymqhQM4ty6fU8OSMUA8XdiDBAB4k0a6iqWRga6EKcwMQXduHlnL5DpB8Rv0J2JDFSA+JiOtgZcMwiA2CAxkBxUDVYDLEAKgIpV9XQ0MZwFEgPJAZnHoWpRDAgC4n2W5saiQKfjClQGkBxQDciL+6B6wAbkA/EqJwdrTkUFOQZCAKQGpBbIXA3SCzJggo+XK7OEuBgDsQCkFqgHrBfsBT5eHgZSAUwP2IBfv36TbABMDygdtK1Zv6UESLORaAbIhG6AAAMAKN8wE24DXWcAAAAASUVORK5CYII=);background-repeat:no-repeat;z-index:2}.gantt_link_tooltip{box-shadow:3px 3px 3px #888;background-color:#fff;border-left:1px dotted #cecece;border-top:1px dotted #cecece;font-family:Tahoma;font-size:8pt;color:#444;padding:6px;line-height:20px}.gantt_link_direction{height:0;border:0 #ffa011;border-bottom-style:dashed;border-bottom-width:2px;transform-origin:0 0;-ms-transform-origin:0 0;-webkit-transform-origin:0 0;z-index:2;margin-left:1px;position:absolute}.gantt_grid_data .gantt_row.gantt_selected,.gantt_grid_data .gantt_row.odd.gantt_selected,.gantt_task_row.gantt_selected{background-color:#fff3a1}.gantt_task_row.gantt_selected .gantt_task_cell{border-right-color:#ffec6e}.gantt_task_line.gantt_selected{box-shadow:0 0 5px #299cb4}.gantt_task_line.gantt_project.gantt_selected{box-shadow:0 0 5px #46ad51}.gantt_task_line.gantt_milestone{visibility:hidden;background-color:#d33daf;border:0 solid #61164f;box-sizing:content-box;-moz-box-sizing:content-box}.gantt_task_line.gantt_milestone div{visibility:visible}.gantt_task_line.gantt_milestone .gantt_task_content{background:inherit;border:inherit;border-width:1px;border-radius:inherit;box-sizing:border-box;-moz-box-sizing:border-box;-webkit-transform:rotate(45deg);-moz-transform:rotate(45deg);-ms-transform:rotate(45deg);-o-transform:rotate(45deg);transform:rotate(45deg)}.gantt_task_line.gantt_task_inline_color{border-color:#999}.gantt_task_line.gantt_task_inline_color .gantt_task_progress{background-color:#363636;opacity:.2}.gantt_task_line.gantt_task_inline_color.gantt_project.gantt_selected,.gantt_task_line.gantt_task_inline_color.gantt_selected{box-shadow:0 0 5px #999}.gantt_task_link.gantt_link_inline_color:hover .gantt_line_wrapper div{box-shadow:0 0 5px 0 #999}.gantt_critical_task{background-color:#e63030;border-color:#9d3a3a}.gantt_critical_task .gantt_task_progress{background-color:rgba(0,0,0,.4)}.gantt_critical_link .gantt_line_wrapper>div{background-color:#e63030}.gantt_critical_link .gantt_link_arrow{border-color:#e63030}.gantt_unselectable,.gantt_unselectable div{-webkit-user-select:none;-moz-user-select:none;-moz-user-select:-moz-none}.gantt_cal_light{-webkit-tap-highlight-color:transparent;background:#fff;border-radius:6px;font-family:Arial;border:1px solid #cecece;color:#6b6b6b;font-size:12px;position:absolute;z-index:10001;width:550px;height:250px;box-shadow:3px 3px 3px rgba(0,0,0,.07)}.gantt_cal_light select{font-family:Arial;border:1px solid #cecece;font-size:13px;padding:2px;margin:0}.gantt_cal_ltitle{padding:7px 10px;overflow:hidden;white-space:nowrap;-webkit-border-radius:6px 6px 0 0;-moz-border-radius-topleft:6px;-moz-border-radius-bottomleft:0;-moz-border-radius-topright:6px;-moz-border-radius-bottomright:0;border-radius:6px 6px 0 0}.gantt_cal_ltitle span{white-space:nowrap}.gantt_cal_lsection{color:#727272;font-weight:700;padding:12px 0 5px 10px}.gantt_cal_lsection .gantt_fullday{float:right;margin-right:5px;font-size:12px;font-weight:400;line-height:20px;vertical-align:top;cursor:pointer}.gantt_cal_lsection{font-size:13px}.gantt_cal_ltext{padding:2px 10px;overflow:hidden}.gantt_cal_ltext textarea{overflow:auto;font-family:Arial;font-size:13px;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;border:1px solid #cecece;height:100%;width:100%;outline:0!important;resize:none}.gantt_time{font-weight:700}.gantt_cal_light .gantt_title{padding-left:10px}.gantt_cal_larea{border:1px solid #cecece;border-left:none;border-right:none;background-color:#fff;overflow:hidden;height:1px}.gantt_btn_set{margin:10px 7px 5px 10px;padding:5px 15px 5px 10px;float:left;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;border-width:0;border-color:#cecece;border-style:solid;height:32px;font-weight:700;background:#fff;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;cursor:pointer}.gantt_btn_set div{float:left;font-size:13px;height:22px;line-height:22px;background-repeat:no-repeat;vertical-align:middle}.gantt_save_btn{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MTk1OUU5RDFDMzA0MTFFMkExMUZBQTdDNDAzOUE5RjMiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MTk1OUU5RDJDMzA0MTFFMkExMUZBQTdDNDAzOUE5RjMiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDoxOTU5RTlDRkMzMDQxMUUyQTExRkFBN0M0MDM5QTlGMyIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDoxOTU5RTlEMEMzMDQxMUUyQTExRkFBN0M0MDM5QTlGMyIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PjDroXYAAAEXSURBVHjaYvz//z8DJYCRUgPIAUxAbAnEHiAHMIBcQCwGaRYXF3e6evXqoffv39/dv38/CymaGSUkJBzv3LlzCsj///fv3wdAihkkIQnEvkAshU8zLy+v7a1bt06ANP/79+87kDIAy505cybq06dPr3p7ezuwGQLTfOPGjWP/ESAZLg8kPKBO+g01RBJNszWyZqC6uSgWgIg/f/4shxnS2dnZBjMEqNkSFGBImi8CKTYMA4BYCGjIczRDHC5dunQQSfN7IKWI4UUkjjdMMdCwnw8ePLjwHxV4Yw1gZA5Q47z/2EELzhhCE+ABGvIQWSeQvwcU38QaAML2wHj+C/X3MyAlijeB4ZBoBOIPQGxJKIVSnBsBAgwABddBclWfcZUAAAAASUVORK5CYII=);margin-top:2px;width:21px}.gantt_cancel_btn{margin-top:2px;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MDkzMDA3MzlDMzA0MTFFMjg2QTVFMzFEQzgwRkJERDYiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MDkzMDA3M0FDMzA0MTFFMjg2QTVFMzFEQzgwRkJERDYiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDowOTMwMDczN0MzMDQxMUUyODZBNUUzMURDODBGQkRENiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDowOTMwMDczOEMzMDQxMUUyODZBNUUzMURDODBGQkRENiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PmYuYOUAAAEdSURBVHjaYvz//z8DJYAFXWDlypU8QKoIiD2A2AwqfAqIdwBxX3h4+Bdk9YzILgBqtgdS84FYEYeF94E4EWjIQZgAE5LmQCB1AKoZZKMPEAtAMYh9GSp3AKjWD8UFQAEhIPshEIOc3wHENUBb/qJ57SyQMoJyPwKxElDNO1gYFEE17wMKVmIJlzNQzeegrjaA6qmBecEbSvfh0GwMxGeBhoPoemQ9MAO0kEIbl2YTqPAFKK2IbMB3AjabYIkRZmQD7kNpMyI0G0PpO8gGbIUFJj7NQDk2INWIrIcJKfBAKcwJqvkcDs0TgFgXGo19KCkRmpDWQdWDEk0NUoCBoq0FqhkE/IEWbKJKUmZEz43QzFSKIzN1481M5ACAAAMAlfl/lCwRpagAAAAASUVORK5CYII=);width:20px}.gantt_delete_btn{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MjFENzI3NUNDMzA0MTFFMjhBNjJGQTc3MUIyQzYzNEYiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MjFENzI3NURDMzA0MTFFMjhBNjJGQTc3MUIyQzYzNEYiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDoyMUQ3Mjc1QUMzMDQxMUUyOEE2MkZBNzcxQjJDNjM0RiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDoyMUQ3Mjc1QkMzMDQxMUUyOEE2MkZBNzcxQjJDNjM0RiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PmUD0gAAAABvSURBVHjaYvz//z8DIyMjAxYQicReji4J0ofKQNP8HwmgGQbXB8IsWGwDSSwDuioKjY9uBthVjFAXYHUGAQA2kYmBUoAUBpGk0LAwgBvwH+YX4mkwptgLowYMRgOITUyYKRFIN/wnDjQgJySAAAMApryKzL8wjfUAAAAASUVORK5CYII=);margin-top:2px;width:20px}.gantt_cal_cover{width:100%;height:100%;position:absolute;z-index:10000;top:0;left:0;background-color:#000;opacity:.1;filter:alpha(opacity=10)}.gantt_custom_button{padding:0 3px;font-family:Arial;font-size:13px;font-weight:400;margin-right:10px;margin-top:-5px;cursor:pointer;float:right;height:21px;width:90px;border:1px solid #CECECE;text-align:center;-webkit-border-radius:4px;-moz-border-radius:4px;-ms-border-radius:4px;-o-border-radius:4px;border-radius:4px}.gantt_custom_button div{cursor:pointer;float:none;height:21px;line-height:21px;vertical-align:middle}.gantt_custom_button div:first-child{display:none}.gantt_cal_light_wide{width:580px;padding:2px 4px}.gantt_cal_light_wide .gantt_cal_larea{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;border:1px solid #cecece}.gantt_cal_light_wide .gantt_cal_lsection{border:0;float:left;text-align:right;width:80px;height:20px;padding:5px 10px 0 0}.gantt_cal_light_wide .gantt_wrap_section{position:relative;padding:10px 0;overflow:hidden;border-bottom:1px solid #ebebeb}.gantt_cal_light_wide .gantt_section_time{overflow:hidden;padding-top:2px!important;padding-right:0;height:20px!important}.gantt_cal_light_wide .gantt_cal_ltext{padding-right:0}.gantt_cal_light_wide .gantt_cal_larea{padding:0 10px;width:100%}.gantt_cal_light_wide .gantt_section_time{background:0 0}.gantt_cal_light_wide .gantt_cal_checkbox label{padding-left:0}.gantt_cal_light_wide .gantt_cal_lsection .gantt_fullday{float:none;margin-right:0;font-weight:700;cursor:pointer}.gantt_cal_light_wide .gantt_custom_button{position:absolute;top:0;right:0;margin-top:2px}.gantt_cal_light_wide .gantt_repeat_right{margin-right:55px}.gantt_cal_light_wide.gantt_cal_light_full{width:738px}.gantt_cal_wide_checkbox input{margin-top:8px;margin-left:14px}.gantt_cal_light input{font-size:13px}.gantt_section_time{background-color:#fff;white-space:nowrap;padding:5px 10px;padding-top:2px!important}.gantt_section_time .gantt_time_selects{float:left;height:25px}.gantt_section_time .gantt_time_selects select{height:23px;padding:2px;border:1px solid #cecece}.gantt_duration{width:100px;height:23px;float:left;white-space:nowrap;margin-left:20px;line-height:23px}.gantt_duration .gantt_duration_dec,.gantt_duration .gantt_duration_inc,.gantt_duration .gantt_duration_value{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;text-align:center;vertical-align:top;height:100%;border:1px solid #cecece}.gantt_duration .gantt_duration_value{width:40px;padding:3px 4px;border-left-width:0;border-right-width:0}.gantt_duration .gantt_duration_dec,.gantt_duration .gantt_duration_inc{width:20px;padding:1px 1px 3px;background:#fff}.gantt_duration .gantt_duration_dec{-moz-border-top-left-radius:4px;-moz-border-bottom-left-radius:4px;-webkit-border-top-left-radius:4px;-webkit-border-bottom-left-radius:4px;border-top-left-radius:4px;border-bottom-left-radius:4px}.gantt_duration .gantt_duration_inc{margin-right:4px;-moz-border-top-right-radius:4px;-moz-border-bottom-right-radius:4px;-webkit-border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:4px}.gantt_cal_quick_info{border:1px solid #cecece;border-radius:6px;position:absolute;z-index:300;box-shadow:3px 3px 3px rgba(0,0,0,.07);background-color:#fff;width:300px;transition:left .5s ease,right .5s;-moz-transition:left .5s ease,right .5s;-webkit-transition:left .5s ease,right .5s;-o-transition:left .5s ease,right .5s}.gantt_no_animate{transition:none;-moz-transition:none;-webkit-transition:none;-o-transition:none}.gantt_cal_quick_info.gantt_qi_left .gantt_qi_big_icon{float:right}.gantt_cal_qi_title{-webkit-border-radius:6px 6px 0 0;-moz-border-radius-topleft:6px;-moz-border-radius-bottomleft:0;-moz-border-radius-topright:6px;-moz-border-radius-bottomright:0;border-radius:6px 6px 0 0;padding:5px 0 8px 12px;color:#454545;background-color:#fff;border-bottom:1px solid #cecece}.gantt_cal_qi_tdate{font-size:14px;font-weight:700}.gantt_cal_qi_tcontent{font-size:13px}.gantt_cal_qi_content{padding:16px 8px;font-size:13px;color:#454545;overflow:hidden}.gantt_cal_qi_controls{-webkit-border-radius:0 0 6px 6px;-moz-border-radius-topleft:0;-moz-border-radius-bottomleft:6px;-moz-border-radius-topright:0;-moz-border-radius-bottomright:6px;border-radius:0 0 6px 6px;padding-left:7px}.gantt_cal_qi_controls .gantt_menu_icon{margin-top:6px;background-repeat:no-repeat}.gantt_cal_qi_controls .gantt_menu_icon.icon_edit{width:20px;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH3QYFCjI5ZQj5bAAAAFNJREFUOMvt0zEOACAIA0DkwTymH8bJTRTKZGJXyaWEKPKTCQAH4Ls37cItcDUzsxHNDLZNhCq7Gt1wh9ErV7EjyGAhyGLphlnsClWuS32rn0czAV+vNGrM/LBtAAAAAElFTkSuQmCC)}.gantt_cal_qi_controls .gantt_menu_icon.icon_delete{width:20px;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MjFENzI3NUNDMzA0MTFFMjhBNjJGQTc3MUIyQzYzNEYiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MjFENzI3NURDMzA0MTFFMjhBNjJGQTc3MUIyQzYzNEYiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDoyMUQ3Mjc1QUMzMDQxMUUyOEE2MkZBNzcxQjJDNjM0RiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDoyMUQ3Mjc1QkMzMDQxMUUyOEE2MkZBNzcxQjJDNjM0RiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PmUD0gAAAABvSURBVHjaYvz//z8DIyMjAxYQicReji4J0ofKQNP8HwmgGQbXB8IsWGwDSSwDuioKjY9uBthVjFAXYHUGAQA2kYmBUoAUBpGk0LAwgBvwH+YX4mkwptgLowYMRgOITUyYKRFIN/wnDjQgJySAAAMApryKzL8wjfUAAAAASUVORK5CYII=)}.gantt_qi_big_icon{font-size:13px;border-radius:4px;font-weight:700;background:#fff;margin:5px 9px 8px 0;min-width:60px;line-height:32px;vertical-align:middle;padding:0 10px 0 5px;cursor:pointer;border:1px solid #cecece}.gantt_cal_qi_controls div{float:left;height:32px;text-align:center;line-height:32px}.gantt_tooltip{box-shadow:3px 3px 3px rgba(0,0,0,.07);background-color:#fff;border-left:1px solid rgba(0,0,0,.07);border-top:1px solid rgba(0,0,0,.07);font-family:Arial;font-size:8pt;color:#454545;padding:10px;position:absolute;z-index:50}.gantt_marker{height:100%;width:2px;top:0;position:absolute;text-align:center;background-color:rgba(255,0,0,.4);-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.gantt_marker .gantt_marker_content{padding:5px;background:inherit;color:#fff;position:absolute;font-size:12px;line-height:12px;opacity:.8}.gantt_marker_area{position:absolute;top:0;left:0}.gantt_noselect{-moz-user-select:-moz-none;-webkit-user-select:none;-user-select:none}.gantt_drag_marker{position:absolute;font-family:Arial;font-size:13px}.gantt_drag_marker .gantt_tree_icon.gantt_blank,.gantt_drag_marker .gantt_tree_icon.gantt_close,.gantt_drag_marker .gantt_tree_icon.gantt_open,.gantt_drag_marker .gantt_tree_indent{display:none}.gantt_drag_marker,.gantt_drag_marker .gantt_row.odd{background-color:#fff}.gantt_drag_marker .gantt_row{border-left:1px solid #d2d2d2;border-top:1px solid #d2d2d2}.gantt_drag_marker .gantt_cell{border-color:#d2d2d2}.gantt_row.gantt_over,.gantt_task_row.gantt_over{background-color:#0070fe}.gantt_row.gantt_transparent .gantt_cell{opacity:.7}.gantt_task_row.gantt_transparent{background-color:#f8fdfd}.dhtmlx_popup_button.dhtmlx_delete_button{background:#3db9d3;text-shadow:0 -1px 0 #248a9f;color:#fff;font-weight:700;border-width:0} \ No newline at end of file diff --git a/libraries/dhtmlxgantt/dhtmlxgantt.js b/libraries/dhtmlxgantt/dhtmlxgantt.js deleted file mode 100644 index 159befd..0000000 --- a/libraries/dhtmlxgantt/dhtmlxgantt.js +++ /dev/null @@ -1,419 +0,0 @@ -/* -@license - -dhtmlxGantt v.3.2.0 Stardard -This software is covered by GPL license. You also can obtain Commercial or Enterprise license to use it in non-GPL project - please contact sales@dhtmlx.com. Usage without proper license is prohibited. - -(c) Dinamenta, UAB. -*/ -function dhtmlxEvent(t,e,n){t.addEventListener?t.addEventListener(e,n,!1):t.attachEvent&&t.attachEvent("on"+e,n)}function dhtmlxDetachEvent(t,e,n){t.removeEventListener?t.removeEventListener(e,n,!1):t.detachEvent&&t.detachEvent("on"+e,n)}function dhtmlxDnD(t,e){e&&(this._settings=e),dhtmlxEventable(this),dhtmlxEvent(t,"mousedown",dhtmlx.bind(function(n){e.original_target={target:n.target||n.srcElement},this.dragStart(t,n)},this))}function dataProcessor(t){return this.serverProcessor=t,this.action_param="!nativeeditor_status", -this.object=null,this.updatedRows=[],this.autoUpdate=!0,this.updateMode="cell",this._tMode="GET",this._headers=null,this._payload=null,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(!0),dhx4._eventable(this),this}"undefined"==typeof window.dhx4&&(window.dhx4={version:"4.1.3",skin:null,skinDetect:function(t){return{10:"dhx_skyblue",20:"dhx_web",30:"dhx_terrace"}[this.readFromCss(t+"_skin_detect")]||null},readFromCss:function(t,e){var n=document.createElement("DIV");n.className=t,null!=document.body.firstChild?document.body.insertBefore(n,document.body.firstChild):document.body.appendChild(n);var i=n[e||"offsetWidth"];return n.parentNode.removeChild(n), -n=null,i},lastId:1,newId:function(){return this.lastId++},zim:{data:{},step:5,first:function(){return 100},last:function(){var t=this.first();for(var e in this.data)t=Math.max(t,this.data[e]);return t},reserve:function(t){return this.data[t]=this.last()+this.step,this.data[t]},clear:function(t){null!=this.data[t]&&(this.data[t]=null,delete this.data[t])}},s2b:function(t){return"string"==typeof t&&(t=t.toLowerCase()),1==t||1==t||"true"==t||"1"==t||"yes"==t||"y"==t},s2j:function(s){var obj=null;dhx4.temp=null; - -try{eval("dhx4.temp="+s)}catch(e){dhx4.temp=null}return obj=dhx4.temp,dhx4.temp=null,obj},absLeft:function(t){return"string"==typeof t&&(t=document.getElementById(t)),this.getOffset(t).left},absTop:function(t){return"string"==typeof t&&(t=document.getElementById(t)),this.getOffset(t).top},_aOfs:function(t){for(var e=0,n=0;t;)e+=parseInt(t.offsetTop),n+=parseInt(t.offsetLeft),t=t.offsetParent;return{top:e,left:n}},_aOfsRect:function(t){var e=t.getBoundingClientRect(),n=document.body,i=document.documentElement,a=window.pageYOffset||i.scrollTop||n.scrollTop,s=window.pageXOffset||i.scrollLeft||n.scrollLeft,r=i.clientTop||n.clientTop||0,o=i.clientLeft||n.clientLeft||0,l=e.top+a-r,d=e.left+s-o; - -return{top:Math.round(l),left:Math.round(d)}},getOffset:function(t){return t.getBoundingClientRect?this._aOfsRect(t):this._aOfs(t)},_isObj:function(t){return null!=t&&"object"==typeof t&&"undefined"==typeof t.length},_copyObj:function(t){if(this._isObj(t)){var e={};for(var n in t)e[n]="object"==typeof t[n]&&null!=t[n]?this._copyObj(t[n]):t[n]}else for(var e=[],n=0;n=0,e={}; - -return e.left=document.body.scrollLeft,e.right=e.left+(window.innerWidth||document.body.clientWidth),e.top=Math.max((t?document.documentElement:document.getElementsByTagName("html")[0]).scrollTop,document.body.scrollTop),e.bottom=e.top+(t?Math.max(document.documentElement.clientHeight||0,document.documentElement.offsetHeight||0):window.innerHeight),e},selectTextRange:function(t,e,n){t="string"==typeof t?document.getElementById(t):t;var i=t.value.length;if(e=Math.max(Math.min(e,i),0),n=Math.min(n,i), -t.setSelectionRange)try{t.setSelectionRange(e,n)}catch(a){}else if(t.createTextRange){var s=t.createTextRange();s.moveStart("character",e),s.moveEnd("character",n-i);try{s.select()}catch(a){}}},transData:null,transDetect:function(){if(null==this.transData){this.transData={transProp:!1,transEv:null};var t={MozTransition:"transitionend",WebkitTransition:"webkitTransitionEnd",OTransition:"oTransitionEnd",msTransition:"transitionend",transition:"transitionend"};for(var e in t)0==this.transData.transProp&&null!=document.documentElement.style[e]&&(this.transData.transProp=e, -this.transData.transEv=t[e]);t=null}return this.transData},_xmlNodeValue:function(t){for(var e="",n=0;n=0||navigator.userAgent.indexOf("Trident")>=0,window.dhx4.isIE6=null==window.XMLHttpRequest&&navigator.userAgent.indexOf("MSIE")>=0,window.dhx4.isIE7=navigator.userAgent.indexOf("MSIE 7.0")>=0&&navigator.userAgent.indexOf("Trident")<0, -window.dhx4.isIE8=navigator.userAgent.indexOf("MSIE 8.0")>=0&&navigator.userAgent.indexOf("Trident")>=0,window.dhx4.isOpera=navigator.userAgent.indexOf("Opera")>=0,window.dhx4.isChrome=navigator.userAgent.indexOf("Chrome")>=0,window.dhx4.isKHTML=navigator.userAgent.indexOf("Safari")>=0||navigator.userAgent.indexOf("Konqueror")>=0,window.dhx4.isFF=navigator.userAgent.indexOf("Firefox")>=0,window.dhx4.isIPad=navigator.userAgent.search(/iPad/gi)>=0),"undefined"==typeof window.dhx4.ajax&&(window.dhx4.ajax={ -cache:!1,method:"get",parse:function(t){if("string"!=typeof t)return t;if(t=t.replace(/^[\s]+/,""),window.DOMParser&&!dhx4.isIE)var e=(new window.DOMParser).parseFromString(t,"text/xml");else if(window.ActiveXObject!==window.undefined){var e=new window.ActiveXObject("Microsoft.XMLDOM");e.async="false",e.loadXML(t)}return e},xmltop:function(t,e,n){if("undefined"==typeof e.status||e.status<400){var i=e.responseXML?e.responseXML||e:dhx4.ajax.parse(e.responseText||e);if(i&&null!==i.documentElement&&!i.getElementsByTagName("parsererror").length)return i.getElementsByTagName(t)[0]; - -}return-1!==n&&dhx4.callEvent("onLoadXMLError",["Incorrect XML",arguments[1],n]),document.createElement("DIV")},xpath:function(t,e){if(e.nodeName||(e=e.responseXML||e),dhx4.isIE)return e.selectNodes(t)||[];for(var n,i=[],a=(e.ownerDocument||e).evaluate(t,e,null,XPathResult.ANY_TYPE,null);n=a.iterateNext();)i.push(n);return i},query:function(t){dhx4.ajax._call(t.method||"GET",t.url,t.data||"",t.async||!0,t.callback,null,t.headers)},get:function(t,e){this._call("GET",t,null,!0,e)},getSync:function(t){ -return this._call("GET",t,null,!1)},put:function(t,e,n){this._call("PUT",t,e,!0,n)},del:function(t,e,n){this._call("DELETE",t,e,!0,n)},post:function(t,e,n){1==arguments.length?e="":2!=arguments.length||"function"!=typeof e&&"function"!=typeof window[e]?e=String(e):(n=e,e=""),this._call("POST",t,e,!0,n)},postSync:function(t,e){return e=null==e?"":String(e),this._call("POST",t,e,!1)},getLong:function(t,e){this._call("GET",t,null,!0,e,{url:t})},postLong:function(t,e,n){2==arguments.length&&(n=e,e=""), -this._call("POST",t,e,!0,n,{url:t,postData:e})},_call:function(t,e,n,i,a,s,r){var o=window.XMLHttpRequest&&!dhx4.isIE?new XMLHttpRequest:new ActiveXObject("Microsoft.XMLHTTP"),l=null!=navigator.userAgent.match(/AppleWebKit/)&&null!=navigator.userAgent.match(/Qt/)&&null!=navigator.userAgent.match(/Safari/);if(1==i&&(o.onreadystatechange=function(){if(4==o.readyState||1==l&&3==o.readyState){if((200!=o.status||""==o.responseText)&&!dhx4.callEvent("onAjaxError",[o]))return;window.setTimeout(function(){ -"function"==typeof a&&a.apply(window,[{xmlDoc:o}]),null!=s&&("undefined"!=typeof s.postData?dhx4.ajax.postLong(s.url,s.postData,a):dhx4.ajax.getLong(s.url,a)),a=null,o=null},1)}}),"GET"==t&&1!=this.cache&&(e+=(e.indexOf("?")>=0?"&":"?")+"dhxr"+(new Date).getTime()+"=1"),o.open(t,e,i),r)for(var d in r)o.setRequestHeader(d,r[d]);else"POST"==t.toUpperCase()||"PUT"==t||"DELETE"==t?o.setRequestHeader("Content-Type","application/x-www-form-urlencoded"):"GET"==t&&(n=null);return o.setRequestHeader("X-Requested-With","XMLHttpRequest"), -o.send(n),i?void 0:{xmlDoc:o}}}),"undefined"==typeof window.dhx4._eventable&&(window.dhx4._eventable=function(t,e){return"clear"==e?(t.detachAllEvents(),t.dhxevs=null,t.attachEvent=null,t.detachEvent=null,t.checkEvent=null,t.callEvent=null,t.detachAllEvents=null,void(t=null)):(t.dhxevs={data:{}},t.attachEvent=function(t,e){t=String(t).toLowerCase(),this.dhxevs.data[t]||(this.dhxevs.data[t]={});var n=window.dhx4.newId();return this.dhxevs.data[t][n]=e,n},t.detachEvent=function(t){for(var e in this.dhxevs.data){ -var n=0;for(var i in this.dhxevs.data[e])i==t?(this.dhxevs.data[e][i]=null,delete this.dhxevs.data[e][i]):n++;0==n&&(this.dhxevs.data[e]=null,delete this.dhxevs.data[e])}},t.checkEvent=function(t){return t=String(t).toLowerCase(),null!=this.dhxevs.data[t]},t.callEvent=function(t,e){if(t=String(t).toLowerCase(),null==this.dhxevs.data[t])return!0;var n=!0;for(var i in this.dhxevs.data[t])n=this.dhxevs.data[t][i].apply(this,e)&&n;return n},t.detachAllEvents=function(){for(var t in this.dhxevs.data){ -for(var e in this.dhxevs.data[t])this.dhxevs.data[t][e]=null,delete this.dhxevs.data[t][e];this.dhxevs.data[t]=null,delete this.dhxevs.data[t]}},void(t=null))},dhx4._eventable(dhx4)),"undefined"==typeof window.dhtmlx&&(window.dhtmlx={extend:function(t,e){for(var n in e)t[n]||(t[n]=e[n]);return t},extend_api:function(t,e,n){var i=window[t];i&&(window[t]=function(t){if(t&&"object"==typeof t&&!t.tagName){var n=i.apply(this,e._init?e._init(t):arguments);for(var a in dhtmlx)e[a]&&this[e[a]](dhtmlx[a]); - -for(var a in t)e[a]?this[e[a]](t[a]):0===a.indexOf("on")&&this.attachEvent(a,t[a])}else var n=i.apply(this,arguments);return e._patch&&e._patch(this),n||this},window[t].prototype=i.prototype,n&&dhtmlx.extend(window[t].prototype,n))},url:function(t){return-1!=t.indexOf("?")?"&":"?"}}),_isFF=!1,_isIE=!1,_isOpera=!1,_isKHTML=!1,_isMacOS=!1,_isChrome=!1,_FFrv=!1,_KHTMLrv=!1,_OperaRv=!1,-1!=navigator.userAgent.indexOf("Macintosh")&&(_isMacOS=!0),navigator.userAgent.toLowerCase().indexOf("chrome")>-1&&(_isChrome=!0), --1!=navigator.userAgent.indexOf("Safari")||-1!=navigator.userAgent.indexOf("Konqueror")?(_KHTMLrv=parseFloat(navigator.userAgent.substr(navigator.userAgent.indexOf("Safari")+7,5)),_KHTMLrv>525?(_isFF=!0,_FFrv=1.9):_isKHTML=!0):-1!=navigator.userAgent.indexOf("Opera")?(_isOpera=!0,_OperaRv=parseFloat(navigator.userAgent.substr(navigator.userAgent.indexOf("Opera")+6,3))):-1!=navigator.appName.indexOf("Microsoft")?(_isIE=!0,(-1!=navigator.appVersion.indexOf("MSIE 8.0")||-1!=navigator.appVersion.indexOf("MSIE 9.0")||-1!=navigator.appVersion.indexOf("MSIE 10.0")||document.documentMode>7)&&"BackCompat"!=document.compatMode&&(_isIE=8)):"Netscape"==navigator.appName&&-1!=navigator.userAgent.indexOf("Trident")?_isIE=8:(_isFF=!0, -_FFrv=parseFloat(navigator.userAgent.split("rv:")[1])),"undefined"==typeof window.dhtmlxEvent,null==dhtmlxEvent.touchDelay&&(dhtmlxEvent.touchDelay=2e3),"undefined"==typeof dhtmlxEvent.initTouch&&(dhtmlxEvent.initTouch=function(){function t(){if(n){var t=document.createEvent("HTMLEvents");t.initEvent("dblclick",!0,!0),n.dispatchEvent(t),e=n=null}}var e,n,i,a;dhtmlxEvent(document.body,"touchstart",function(s){n=s.touches[0].target,i=s.touches[0].clientX,a=s.touches[0].clientY,e=window.setTimeout(t,dhtmlxEvent.touchDelay); - -}),dhtmlxEvent(document.body,"touchmove",function(t){e&&(Math.abs(t.touches[0].clientX-i)>50||Math.abs(t.touches[0].clientY-a)>50)&&(window.clearTimeout(e),e=n=!1)}),dhtmlxEvent(document.body,"touchend",function(){e&&(window.clearTimeout(e),e=n=!1)}),dhtmlxEvent.initTouch=function(){}}),window.dhtmlx||(window.dhtmlx={}),function(){function t(t,e){var i=t.callback;n(!1),t.box.parentNode.removeChild(t.box),c=t.box=null,i&&i(e)}function e(e){if(c){e=e||event;var n=e.which||event.keyCode;return dhtmlx.message.keyboard&&((13==n||32==n)&&t(c,!0), -27==n&&t(c,!1)),e.preventDefault&&e.preventDefault(),!(e.cancelBubble=!0)}}function n(t){n.cover||(n.cover=document.createElement("DIV"),n.cover.onkeydown=e,n.cover.className="dhx_modal_cover",document.body.appendChild(n.cover));document.body.scrollHeight;n.cover.style.display=t?"inline-block":"none"}function i(t,e){var n="dhtmlx_"+t.toLowerCase().replace(/ /g,"_")+"_button";return"
"+t+"
"}function a(t){g.area||(g.area=document.createElement("DIV"), -g.area.className="dhtmlx_message_area",g.area.style[g.position]="5px",document.body.appendChild(g.area)),g.hide(t.id);var e=document.createElement("DIV");return e.innerHTML="
"+t.text+"
",e.className="dhtmlx-info dhtmlx-"+t.type,e.onclick=function(){g.hide(t.id),t=null},"bottom"==g.position&&g.area.firstChild?g.area.insertBefore(e,g.area.firstChild):g.area.appendChild(e),t.expire>0&&(g.timers[t.id]=window.setTimeout(function(){g.hide(t.id)},t.expire)),g.pull[t.id]=e,e=null,t.id}function s(e,n,a){ -var s=document.createElement("DIV");s.className=" dhtmlx_modal_box dhtmlx-"+e.type,s.setAttribute("dhxbox",1);var r="";if(e.width&&(s.style.width=e.width),e.height&&(s.style.height=e.height),e.title&&(r+='
'+e.title+"
"),r+='
'+(e.content?"":e.text)+'
',n&&(r+=i(e.ok||"OK",!0)),a&&(r+=i(e.cancel||"Cancel",!1)),e.buttons)for(var o=0;o", -s.innerHTML=r,e.content){var l=e.content;"string"==typeof l&&(l=document.getElementById(l)),"none"==l.style.display&&(l.style.display=""),s.childNodes[e.title?1:0].appendChild(l)}return s.onclick=function(n){n=n||event;var i=n.target||n.srcElement;if(i.className||(i=i.parentNode),"dhtmlx_popup_button"==i.className.split(" ")[0]){var a=i.getAttribute("result");a="true"==a||("false"==a?!1:a),t(e,a)}},e.box=s,(n||a)&&(c=e),s}function r(t,i,a){var r=t.tagName?t:s(t,i,a);t.hidden||n(!0),document.body.appendChild(r); - -var o=Math.abs(Math.floor(((window.innerWidth||document.documentElement.offsetWidth)-r.offsetWidth)/2)),l=Math.abs(Math.floor(((window.innerHeight||document.documentElement.offsetHeight)-r.offsetHeight)/2));return r.style.top="top"==t.position?"-3px":l+"px",r.style.left=o+"px",r.onkeydown=e,r.focus(),t.hidden&&dhtmlx.modalbox.hide(r),r}function o(t){return r(t,!0,!1)}function l(t){return r(t,!0,!0)}function d(t){return r(t)}function _(t,e,n){return"object"!=typeof t&&("function"==typeof e&&(n=e,e=""), -t={text:t,type:e,callback:n}),t}function h(t,e,n,i){return"object"!=typeof t&&(t={text:t,type:e,expire:n,id:i}),t.id=t.id||g.uid(),t.expire=t.expire||g.expire,t}var c=null;document.attachEvent?document.attachEvent("onkeydown",e):document.addEventListener("keydown",e,!0),dhtmlx.alert=function(){var t=_.apply(this,arguments);return t.type=t.type||"confirm",o(t)},dhtmlx.confirm=function(){var t=_.apply(this,arguments);return t.type=t.type||"alert",l(t)},dhtmlx.modalbox=function(){var t=_.apply(this,arguments); - -return t.type=t.type||"alert",d(t)},dhtmlx.modalbox.hide=function(t){for(;t&&t.getAttribute&&!t.getAttribute("dhxbox");)t=t.parentNode;t&&(t.parentNode.removeChild(t),n(!1))};var g=dhtmlx.message=function(t){t=h.apply(this,arguments),t.type=t.type||"info";var e=t.type.split("-")[0];switch(e){case"alert":return o(t);case"confirm":return l(t);case"modalbox":return d(t);default:return a(t)}};g.seed=(new Date).valueOf(),g.uid=function(){return g.seed++},g.expire=4e3,g.keyboard=!0,g.position="top",g.pull={}, -g.timers={},g.hideAll=function(){for(var t in g.pull)g.hide(t)},g.hide=function(t){var e=g.pull[t];e&&e.parentNode&&(window.setTimeout(function(){e.parentNode.removeChild(e),e=null},2e3),e.className+=" hidden",g.timers[t]&&window.clearTimeout(g.timers[t]),delete g.pull[t])}}(),gantt={version:"3.2.0"},dhtmlxEventable=function(obj){obj._silent_mode=!1,obj._silentStart=function(){this._silent_mode=!0},obj._silentEnd=function(){this._silent_mode=!1},obj.attachEvent=function(t,e,n){return t="ev_"+t.toLowerCase(), -this[t]||(this[t]=new this._eventCatcher(n||this)),t+":"+this[t].addEvent(e)},obj.callEvent=function(t,e){return this._silent_mode?!0:(t="ev_"+t.toLowerCase(),this[t]?this[t].apply(this,e):!0)},obj.checkEvent=function(t){return!!this["ev_"+t.toLowerCase()]},obj._eventCatcher=function(obj){var dhx_catch=[],z=function(){for(var t=!0,e=0;ethis.config.sensitivity){ -if(this.config.started=!0,this.config.ignore=!1,this.callEvent("onBeforeDragStart",[t,this.config.original_target])===!1)return this.config.ignore=!0,!0;var r=this.config.marker=document.createElement("div");r.className="gantt_drag_marker",r.innerHTML="Dragging object",document.body.appendChild(r),this.callEvent("onAfterDragStart",[t,this.config.original_target])}else this.config.ignore=!0}this.config.ignore||(e.pos=this.getPosition(e),this.config.marker.style.left=e.pos.x+"px",this.config.marker.style.top=e.pos.y+"px", -this.callEvent("onDragMove",[t,e]))},dragEnd:function(){this.config.marker&&(this.config.marker.parentNode.removeChild(this.config.marker),this.config.marker=null,this.callEvent("onDragEnd",[])),document.body.className=document.body.className.replace(" gantt_noselect","")},getPosition:function(t){var e=0,n=0;return t=t||window.event,t.pageX||t.pageY?(e=t.pageX,n=t.pageY):(t.clientX||t.clientY)&&(e=t.clientX+document.body.scrollLeft+document.documentElement.scrollLeft,n=t.clientY+document.body.scrollTop+document.documentElement.scrollTop), -{x:e,y:n}}},gantt._init_grid=function(){this._click.gantt_close=dhtmlx.bind(function(t,e){return this.close(e),!1},this),this._click.gantt_open=dhtmlx.bind(function(t,e){return this.open(e),!1},this),this._click.gantt_row=dhtmlx.bind(function(t,e,n){if(null!==e){var i=this.getTask(e);this.config.scroll_on_click&&this.showDate(i.start_date),this.callEvent("onTaskRowClick",[e,n])}},this),this._click.gantt_grid_head_cell=dhtmlx.bind(function(t,e,n){var i=n.getAttribute("column_id");if(this.callEvent("onGridHeaderClick",[i,t]))if("add"==i)this._click.gantt_add(t,this.config.root_id); -else if(this.config.sort){var a=this._sort&&this._sort.direction&&this._sort.name==i?this._sort.direction:"desc";a="desc"==a?"asc":"desc",this._sort={name:i,direction:a},this.sort(i,"desc"==a)}},this),!this.config.sort&&this.config.order_branch&&this._init_dnd(),this._click.gantt_add=dhtmlx.bind(function(t,e){if(!this.config.readonly){var n={};return this.createTask(n,e?e:this.config.root_id),!1}},this),this._init_resize&&this._init_resize()},gantt._render_grid=function(){this._is_grid_visible()&&(this._calc_grid_width(), -this._render_grid_header())},gantt._calc_grid_width=function(){for(var t=this.getGridColumns(),e=0,n=[],i=[],a=0;a0?n.length:i.length>0?i.length:1)}if(n.length>0)for(var o=r/(n.length?n.length:1),a=0;an+o.width&&(o.width=this._get_grid_width()-n),n+=o.width;var l=this._sort&&o.name==this._sort.name?"
":"",d=["gantt_grid_head_cell","gantt_grid_head_"+o.name,r?"gantt_last_cell":"",this.templates.grid_header_class(o.name,o)].join(" "),_="width:"+(o.width-(r?1:0))+"px;",h=o.label||i["column_"+o.name]; - -h=h||"";var c="
"+h+l+"
";e.push(c)}this.$grid_scale.style.height=this.config.scale_height-1+"px",this.$grid_scale.style.lineHeight=a+"px",this.$grid_scale.style.width=n-1+"px",this.$grid_scale.innerHTML=e.join("")},gantt._render_grid_item=function(t){if(!gantt._is_grid_visible())return null;for(var e=this.getGridColumns(),n=[],i=0;i
":(s=o.template?o.template(t):t[o.name], -s instanceof Date&&(s=this.templates.date_grid(s)),s="
"+s+"
");var l="gantt_cell"+(r?" gantt_last_cell":""),d="";if(o.tree){for(var _=0;_"+d+s+"", -n.push(a)}var l=t.$index%2===0?"":" odd";if(l+=t.$transparent?" gantt_transparent":"",this.templates.grid_row_class){var g=this.templates.grid_row_class.call(this,t.start_date,t.end_date,t);g&&(l+=" "+g)}this.getState().selected_task==t.id&&(l+=" gantt_selected");var u=document.createElement("div");return u.className="gantt_row"+l,u.style.height=this.config.row_height+"px",u.style.lineHeight=gantt.config.row_height+"px",u.setAttribute(this.config.task_attribute,t.id),u.innerHTML=n.join(""),u},gantt.open=function(t){ -gantt._set_item_state(t,!0),this.callEvent("onTaskOpened",[t])},gantt.close=function(t){gantt._set_item_state(t,!1),this.callEvent("onTaskClosed",[t])},gantt._set_item_state=function(t,e){t&&this._pull[t]&&(this._pull[t].$open=e,this.refreshData())},gantt._is_grid_visible=function(){return this.config.grid_width&&this.config.show_grid},gantt._get_grid_width=function(){return this._is_grid_visible()?this._is_chart_visible()?this.config.grid_width:this._x:0},gantt.getTaskIndex=function(t){for(var e=this.getChildren(this.getParent(t)),n=0;n0?i?(this.getTaskIndex(t)>this.getTaskIndex(i)?"next:":"")+i:"next:"+gantt.getPrevSibling(t):r[1*e+1]?r[1*e+1]:n,this.callEvent("onAfterTaskMove",[t,n,e])&&this.refreshData()}}},gantt._init_dnd=function(){var t=new dhtmlxDnD(this.$grid_data,{ -updates_per_second:60});dhtmlx.defined(this.config.dnd_sensitivity)&&(t.config.sensitivity=this.config.dnd_sensitivity),t.attachEvent("onBeforeDragStart",dhtmlx.bind(function(e,n){var i=this._locateHTML(n);if(!i)return!1;this.hideQuickInfo&&this._hideQuickInfo();var a=this.locate(n),s=gantt.getTask(a);return gantt._is_readonly(s)?!1:(t.config.initial_open_state=s.$open,this.callEvent("onRowDragStart",[a,n.target||n.srcElement,n])?void 0:!1)},this)),t.attachEvent("onAfterDragStart",dhtmlx.bind(function(e,n){ -var i=this._locateHTML(n);t.config.marker.innerHTML=i.outerHTML,t.config.id=this.locate(n);var a=this.getTask(t.config.id);t.config.index=this.getTaskIndex(t.config.id),t.config.parent=a.parent,a.$open=!1,a.$transparent=!0,this.refreshData()},this)),t.lastTaskOfLevel=function(t){for(var e=gantt._order,n=gantt._pull,i=null,a=0,s=e.length;s>a;a++)n[e[a]].$level==t&&(i=n[e[a]]);return i?i.id:null},t._getGridPos=dhtmlx.bind(function(t){var e=this._get_position(this.$grid_data),n=e.x,i=t.pos.y-10;return ie.y+this.$grid_data.offsetHeight-this.config.row_height&&(i=e.y+this.$grid_data.offsetHeight-this.config.row_height),e.x=n,e.y=i,e},this),t.attachEvent("onDragMove",dhtmlx.bind(function(e,n){var i=t.config,a=t._getGridPos(n);i.marker.style.left=a.x+10+"px",i.marker.style.top=a.y+"px",a=t._getGridPos(n);var s=(a.x,a.y),r=document.elementFromPoint(a.x-document.body.scrollLeft+1,s-document.body.scrollTop),o=this.locate(r),l=this.getTask(t.config.id);if(this.isTaskExists(o)||(o=t.lastTaskOfLevel(l.$level), -o==t.config.id&&(o=null)),this.isTaskExists(o)){var d=gantt._get_position(r),_=this.getTask(o);if(d.y+r.offsetHeight/2=0;)g=this._pull[this._order[h-u]],u++;if(l.id==_.id)return; -_.$level==l.$level&&l.id!=_.id?this.moveTask(l.id,0,0,_.id):_.$level!=l.$level-1||gantt.getChildren(_.id).length?g&&g.$level==l.$level&&l.id!=g.id&&this.moveTask(l.id,-1,this.getParent(g.id)):this.moveTask(l.id,0,_.id)}return!0},this)),t.attachEvent("onDragEnd",dhtmlx.bind(function(){var e=this.getTask(t.config.id);this.callEvent("onBeforeRowDragEnd",[t.config.id,t.config.index,t.config.parent])===!1?(this.moveTask(t.config.id,t.config.index,t.config.parent),e.$drop_target=null):this.callEvent("onRowDragEnd",[t.config.id,e.$drop_target]), -e.$transparent=!1,e.$open=t.config.initial_open_state,this.refreshData()},this))},gantt.getGridColumns=function(){return this.config.columns},gantt._has_children=function(t){return this.getChildren(t).length>0},gantt._scale_helpers={getSum:function(t,e,n){void 0===n&&(n=t.length-1),void 0===e&&(e=0);for(var i=0,a=e;n>=a;a++)i+=t[a];return i},setSumWidth:function(t,e,n,i){var a=e.width;void 0===i&&(i=a.length-1),void 0===n&&(n=0);var s=i-n+1;if(!(n>a.length-1||0>=s||i>a.length-1)){var r=this.getSum(a,n,i),o=t-r; - -this.adjustSize(o,a,n,i),this.adjustSize(-o,a,i+1),e.full_width=this.getSum(a)}},splitSize:function(t,e){for(var n=[],i=0;e>i;i++)n[i]=0;return this.adjustSize(t,n),n},adjustSize:function(t,e,n,i){n||(n=0),void 0===i&&(i=e.length-1);for(var a=i-n+1,s=this.getSum(e,n,i),r=0,o=n;i>=o;o++){var l=Math.floor(t*(s?e[o]/s:1/a));s-=e[o],t-=l,a--,e[o]+=l,r+=l}e[e.length-1]+=t},sortScales:function(t){function e(t,e){var n=new Date(1970,0,1);return gantt.date.add(n,e,t)-n}t.sort(function(t,n){return e(t.unit,t.step)e(n.unit,n.step)?-1:0; - -})},primaryScale:function(){return gantt._init_template("date_scale"),{unit:gantt.config.scale_unit,step:gantt.config.step,template:gantt.templates.date_scale,date:gantt.config.date_scale,css:gantt.templates.scale_cell_class}},prepareConfigs:function(t,e,n,i){for(var a=this.splitSize(i,t.length),s=n,r=[],o=t.length-1;o>=0;o--){var l=o==t.length-1,d=this.initScaleConfig(t[o]);l&&this.processIgnores(d),this.initColSizes(d,e,s,a[o]),this.limitVisibleRange(d),l&&(s=d.full_width),r.unshift(d)}for(var o=0;oe;e++)t.left.push((t.width[e-1]||0)+(t.left[e-1]||0))},_ignore_time_config:function(t){return this.config.skip_off_time?!this.isWorkTime(t):!1},processIgnores:function(t){t.ignore_x={},t.display_count=t.count},initColSizes:function(t,e,n,i){var a=n;t.height=i;var s=void 0===t.display_count?t.count:t.display_count;s||(s=1),t.col_width=Math.floor(a/s),e&&t.col_width=h;h++)+r[h]!=+s[_]||(a&&a.apply(this,[d,_,o,h]), -o=h,d=_)},alineScaleColumns:function(t,e,n,i){this.iterateScales(t,e,n,i,function(n,i,a,s){var r=this.getSum(t.width,a,s-1),o=this.getSum(e.width,n,i-1);o!=r&&this.setSumWidth(r,e,n,i-1)})},eachColumn:function(t,e,n){var i=new Date(gantt._min_date),a=new Date(gantt._max_date);gantt.date[t+"_start"]&&(i=gantt.date[t+"_start"](i));var s=new Date(i);for(+s>=+a&&(a=gantt.date.add(s,e,t));+a>+s;)n.call(this,new Date(s)),s=gantt.date.add(s,e,t),s=gantt.date[t+"_start"](s)},limitVisibleRange:function(t){ -var e=t.trace_x,n=0,i=t.width.length-1,a=0;if(+e[0]<+gantt._min_date&&n!=i){var s=Math.floor(t.width[0]*((e[1]-gantt._min_date)/(e[1]-e[0])));a+=t.width[0]-s,t.width[0]=s,e[0]=new Date(gantt._min_date)}var r=e.length-1,o=e[r],l=gantt.date.add(o,t.step,t.unit);if(+l>+gantt._max_date&&r>0){var s=t.width[r]-Math.floor(t.width[r]*((l-gantt._max_date)/(l-o)));a+=t.width[r]-s,t.width[r]=s}if(a){for(var d=this.getSum(t.width),_=0,h=0;ht.x?this.dirs.right:e.y>t.y?this.dirs.down:this.dirs.up; - -}},gantt._y_from_ind=function(t){return t*gantt.config.row_height},gantt._path_builder={path:[],clear:function(){this.path=[]},current:function(){return this.path[this.path.length-1]},point:function(t){return t?(this.path.push(dhtmlx.copy(t)),t):this.current()},point_to:function(t,e,n){n=n?{x:n.x,y:n.y}:dhtmlx.copy(this.point());var i=gantt._drawer.dirs;switch(t){case i.left:n.x-=e;break;case i.right:n.x+=e;break;case i.up:n.y-=e;break;case i.down:n.y+=e}return this.point(n)},get_points:function(t){ -var e=this.get_endpoint(t),n=gantt.config,i=e.e_y-e.y,a=e.e_x-e.x,s=gantt._drawer.dirs;this.clear(),this.point({x:e.x,y:e.y});var r=2*n.link_arrow_size,o=e.e_x>e.x;if(t.type==gantt.config.links.start_to_start)this.point_to(s.left,r),o?(this.point_to(s.down,i),this.point_to(s.right,a)):(this.point_to(s.right,a),this.point_to(s.down,i)),this.point_to(s.right,r);else if(t.type==gantt.config.links.finish_to_start)if(o=e.e_x>e.x+2*r,this.point_to(s.right,r),o)a-=r,this.point_to(s.down,i),this.point_to(s.right,a); -else{a-=2*r;var l=i>0?1:-1;this.point_to(s.down,l*(n.row_height/2)),this.point_to(s.right,a),this.point_to(s.down,l*(Math.abs(i)-n.row_height/2)),this.point_to(s.right,r)}else if(t.type==gantt.config.links.finish_to_finish)this.point_to(s.right,r),o?(this.point_to(s.right,a),this.point_to(s.down,i)):(this.point_to(s.down,i),this.point_to(s.right,a)),this.point_to(s.left,r);else if(t.type==gantt.config.links.start_to_finish)if(o=e.e_x>e.x-2*r,this.point_to(s.left,r),o){a+=2*r;var l=i>0?1:-1;this.point_to(s.down,l*(n.row_height/2)), -this.point_to(s.right,a),this.point_to(s.down,l*(Math.abs(i)-n.row_height/2)),this.point_to(s.left,r)}else a+=r,this.point_to(s.down,i),this.point_to(s.right,a);return this.path},get_endpoint:function(t){var e=gantt.config.links,n=!1,i=!1;t.type==e.start_to_start?n=i=!0:t.type==e.finish_to_finish?n=i=!1:t.type==e.finish_to_start?(n=!1,i=!0):t.type==e.start_to_finish?(n=!0,i=!1):dhtmlx.assert(!1,"Invalid link type");var a=gantt._get_task_visible_pos(gantt._pull[t.source],n),s=gantt._get_task_visible_pos(gantt._pull[t.target],i); - -return{x:a.x,e_x:s.x,y:a.y,e_y:s.y}}},gantt._init_links_dnd=function(){function t(t,e,n){var i=gantt._get_task_pos(t,!!e);return i.y+=gantt._get_task_height()/2,n=n||0,i.x+=(e?-1:1)*n,i}function e(t){var e=i(),n=["gantt_link_tooltip"];e.from&&e.to&&n.push(gantt.isLinkAllowed(e.from,e.to,e.from_start,e.to_start)?"gantt_allowed_link":"gantt_invalid_link");var a=gantt.templates.drag_link_class(e.from,e.from_start,e.to,e.to_start);a&&n.push(a);var s="
"+gantt.templates.drag_link(e.from,e.from_start,e.to,e.to_start)+"
"; - -t.innerHTML=s}function n(t,e){t.style.left=e.x+5+"px",t.style.top=e.y+5+"px"}function i(){return{from:gantt._link_source_task,to:gantt._link_target_task,from_start:gantt._link_source_task_start,to_start:gantt._link_target_task_start}}function a(){gantt._link_source_task=gantt._link_source_task_start=gantt._link_target_task=null,gantt._link_target_task_start=!0}function s(t,e,n,a){var s=l(),d=i(),_=["gantt_link_direction"];gantt.templates.link_direction_class&&_.push(gantt.templates.link_direction_class(d.from,d.from_start,d.to,d.to_start)); - -var h=Math.sqrt(Math.pow(n-t,2)+Math.pow(a-e,2));if(h=Math.max(0,h-3)){s.className=_.join(" ");var c=(a-e)/(n-t),g=Math.atan(c);2==o(t,n,e,a)?g+=Math.PI:3==o(t,n,e,a)&&(g-=Math.PI);var u=Math.sin(g),f=Math.cos(g),p=Math.round(e),v=Math.round(t),m=["-webkit-transform: rotate("+g+"rad)","-moz-transform: rotate("+g+"rad)","-ms-transform: rotate("+g+"rad)","-o-transform: rotate("+g+"rad)","transform: rotate("+g+"rad)","width:"+Math.round(h)+"px"];if(-1!=window.navigator.userAgent.indexOf("MSIE 8.0")){ -m.push('-ms-filter: "'+r(u,f)+'"');var k=Math.abs(Math.round(t-n)),x=Math.abs(Math.round(a-e));switch(o(t,n,e,a)){case 1:p-=x;break;case 2:v-=k,p-=x;break;case 3:v-=k}}m.push("top:"+p+"px"),m.push("left:"+v+"px"),s.style.cssText=m.join(";")}}function r(t,e){return"progid:DXImageTransform.Microsoft.Matrix(M11 = "+e+",M12 = -"+t+",M21 = "+t+",M22 = "+e+",SizingMethod = 'auto expand')"}function o(t,e,n,i){return e>=t?n>=i?1:4:n>=i?2:3}function l(){return _._direction||(_._direction=document.createElement("div"), -gantt.$task_links.appendChild(_._direction)),_._direction}function d(){_._direction&&(_._direction.parentNode&&_._direction.parentNode.removeChild(_._direction),_._direction=null)}var _=new dhtmlxDnD(this.$task_bars,{sensitivity:0,updates_per_second:60}),h="task_left",c="task_right",g="gantt_link_point",u="gantt_link_control";_.attachEvent("onBeforeDragStart",dhtmlx.bind(function(e,n){var i=n.target||n.srcElement;if(a(),gantt.getState().drag_id)return!1;if(gantt._locate_css(i,g)){gantt._locate_css(i,h)&&(gantt._link_source_task_start=!0); - -var s=gantt._link_source_task=this.locate(n),r=gantt.getTask(s);if(gantt._is_readonly(r))return a(),!1;var o=0;return gantt._get_safe_type(r.type)==gantt.config.types.milestone&&(o=(gantt._get_visible_milestone_width()-gantt._get_milestone_width())/2),this._dir_start=t(r,!!gantt._link_source_task_start,o),!0}return!1},this)),_.attachEvent("onAfterDragStart",dhtmlx.bind(function(){e(_.config.marker)},this)),_.attachEvent("onDragMove",dhtmlx.bind(function(i,a){var r=_.config,o=_.getPosition(a);n(r.marker,o); - -var l=gantt._is_link_drop_area(a),d=gantt._link_target_task,h=gantt._link_landing,g=gantt._link_target_task_start,f=gantt.locate(a),p=!0;if(l&&(p=!gantt._locate_css(a,c),l=!!f),gantt._link_target_task=f,gantt._link_landing=l,gantt._link_target_task_start=p,l){var v=gantt.getTask(f),m=gantt._locate_css(a,u),k=0;m&&(k=Math.floor(m.offsetWidth/2)),this._dir_end=t(v,!!gantt._link_target_task_start,k)}else this._dir_end=gantt._get_mouse_pos(a);var x=!(h==l&&d==f&&g==p);return x&&(d&&gantt.refreshTask(d,!1), -f&&gantt.refreshTask(f,!1)),x&&e(r.marker),s(this._dir_start.x,this._dir_start.y,this._dir_end.x,this._dir_end.y),!0},this)),_.attachEvent("onDragEnd",dhtmlx.bind(function(){var t=i();if(t.from&&t.to&&t.from!=t.to){var e=gantt._get_link_type(t.from_start,t.to_start),n={source:t.from,target:t.to,type:e};n.type&&gantt.isLinkAllowed(n)&&gantt.addLink(n)}a(),t.from&&gantt.refreshTask(t.from,!1),t.to&&gantt.refreshTask(t.to,!1),d()},this)),gantt._is_link_drop_area=function(t){return!!gantt._locate_css(t,u); - -}},gantt._get_link_state=function(){return{link_landing_area:this._link_landing,link_target_id:this._link_target_task,link_target_start:this._link_target_task_start,link_source_id:this._link_source_task,link_source_start:this._link_source_task_start}},gantt._init_tasks=function(){function t(t,e,n,i){for(var a=0;a-1?i.$target[0]:i.$source[0]),a&&this._delete_link_handler(a,t),!1},this),this._tasks_dnd.init(),this._init_links_dnd(),this._link_layers.clear();var e=this.addLinkLayer({renderer:this._render_link_element,container:this.$task_links,filter:gantt._create_filter(["_filter_link","_is_chart_visible"])});this._linkRenderer=this._link_layers.getRenderer(e),this._task_layers.clear(); - -var n=this.addTaskLayer({renderer:this._render_task_element,container:this.$task_bars,filter:gantt._create_filter(["_filter_task","_is_chart_visible"])});this._taskRenderer=this._task_layers.getRenderer(n),this.addTaskLayer({renderer:this._render_grid_item,container:this.$grid_data,filter:gantt._create_filter(["_filter_task","_is_grid_visible"])}),this.addTaskLayer({renderer:this._render_bg_line,container:this.$task_bg,filter:gantt._create_filter(["_filter_task","_is_chart_visible","_is_std_background"]) -}),this._onTaskIdChange&&this.detachEvent(this._onTaskIdChange),this._onTaskIdChange=this.attachEvent("onTaskIdChange",function(e,n){var i=this._get_task_renderers();t(i,e,n,this.getTask(n))}),this._onLinkIdChange&&this.detachEvent(this._onLinkIdChange),this._onLinkIdChange=this.attachEvent("onLinkIdChange",function(e,n){var i=this._get_link_renderers();t(i,e,n,this.getLink(n))})},gantt._create_filter=function(t){return t instanceof Array||(t=Array.prototype.slice.call(arguments,0)),function(e){for(var n=!0,i=0,a=t.length;a>i;i++){ -var s=t[i];gantt[s]&&(n=n&&gantt[s].apply(gantt,[e.id,e])!==!1)}return n}},gantt._is_chart_visible=function(){return!!this.config.show_chart},gantt._filter_task=function(t,e){var n=null,i=null;return this.config.start_date&&this.config.end_date&&(n=this.config.start_date.valueOf(),i=this.config.end_date.valueOf(),+e.start_date>i||+e.end_date<+n)?!1:!0},gantt._filter_link=function(t,e){return this.config.show_links&&gantt.isTaskVisible(e.source)&&gantt.isTaskVisible(e.target)?this.callEvent("onBeforeLinkDisplay",[t,e]):!1; - -},gantt._is_std_background=function(){return!this.config.static_background},gantt._delete_link_handler=function(t,e){if(t&&this.callEvent("onLinkDblClick",[t,e])){var n=gantt.getLink(t);if(gantt._is_readonly(n))return;var i="",a=gantt.locale.labels.link+" "+this.templates.link_description(this.getLink(t))+" "+gantt.locale.labels.confirm_link_deleting;window.setTimeout(function(){gantt._dhtmlx_confirm(a,i,function(){gantt.deleteLink(t)})},gantt.config.touch?300:1)}},gantt.getTaskNode=function(t){return this._taskRenderer.rendered[t]; - -},gantt.getLinkNode=function(t){return this._linkRenderer.rendered[t]},gantt._get_tasks_data=function(){for(var t=[],e=0;en;n++){var a=e[n];this._is_layer(a)&&a.style&&(a.style.width=t.full_width+"px")}if(this._is_grid_visible()){for(var s=this.getGridColumns(),r=0,n=0;n"+r+"";e.push(h)}}return e.join("")},gantt._get_scales=function(){var t=this._scale_helpers,e=[t.primaryScale()].concat(this.config.subscales);return t.sortScales(e),e},gantt._render_tasks_scales=function(){this._init_tasks_range(),this._scroll_resize(),this._set_sizes();var t="",e=0,n=0,i=0;if(this._is_chart_visible()){var a=this._scale_helpers,s=this._get_scales();i=this.config.scale_height-1;for(var r=this._get_resize_options(),o=r.x?Math.max(this.config.autosize_min_width,0):this.$task.offsetWidth,l=a.prepareConfigs(s,this.config.min_column_width,o,i),d=this._tasks=l[l.length-1],_=[],h=this.templates.scale_row_class,c=0;c'+this._prepare_scale_html(l[c])+"")}t=_.join(""),e=d.full_width+this.$scroll_ver.offsetWidth+"px",n=d.full_width+"px",i+="px"}this.$task.style.display=this._is_chart_visible()?"":"none",this.$task_scale.style.height=i,this.$task_data.style.width=this.$task_scale.style.width=e,this.$task_scale.innerHTML=t},gantt._render_bg_line=function(t){var e=gantt._tasks,n=e.count,i=document.createElement("div"); - -if(gantt.config.show_task_cells)for(var a=0;n>a;a++){var s=e.width[a],r="";if(s>0){var o=document.createElement("div");o.style.width=s+"px",r="gantt_task_cell"+(a==n-1?" gantt_last_cell":""),d=this.templates.task_cell_class(t,e.trace_x[a]),d&&(r+=" "+d),o.className=r,i.appendChild(o)}}var l=t.$index%2!==0,d=gantt.templates.task_row_class(t.start_date,t.end_date,t),_="gantt_task_row"+(l?" odd":"")+(d?" "+d:"");return this.getState().selected_task==t.id&&(_+=" gantt_selected"),i.className=_,i.style.height=gantt.config.row_height+"px", -i.setAttribute(this.config.task_attribute,t.id),i},gantt._render_bg_canvas=function(){},gantt._adjust_scales=function(){if(this.config.fit_tasks){var t=+this._min_date,e=+this._max_date;if(this._init_tasks_range(),+this._min_date!=t||+this._max_date!=e)return this.render(),this.callEvent("onScaleAdjusted",[]),!0}return!1},gantt.refreshTask=function(t,e){if(this._is_render_active()){var n=this._get_task_renderers(),i=this.getTask(t);if(i&&this.isTaskVisible(t)){for(var a=0;a=+a.min_date&&t.appendChild(i(e+" task_left"))},gantt._get_task_height=function(){ -var t=this.config.task_height;return"full"==t&&(t=this.config.row_height-5),t=Math.min(t,this.config.row_height),Math.max(t,0)},gantt._get_milestone_width=function(){return this._get_task_height()},gantt._get_visible_milestone_width=function(){var t=gantt._get_task_height();return Math.sqrt(2*t*t)},gantt.getTaskPosition=function(t,e,n){var i=this.posFromDate(e||t.start_date),a=this.posFromDate(n||t.end_date);a=Math.max(i,a);var s=this.getTaskTop(t.id),r=this.config.task_height;return{left:i,top:s, -height:r,width:Math.max(a-i,0)}},gantt._get_task_width=function(t){return Math.round(this._get_task_pos(t,!1).x-this._get_task_pos(t,!0).x)},gantt._is_readonly=function(t){return t&&t[this.config.editable_property]?!1:t&&t[this.config.readonly_property]||this.config.readonly},gantt._task_default_render=function(t){var e=this._get_task_pos(t),n=this.config,i=this._get_task_height(),a=Math.floor((this.config.row_height-i)/2);this._get_safe_type(t.type)==n.types.milestone&&n.link_line_width>1&&(a+=1); - -var s=document.createElement("div"),r=gantt._get_task_width(t),o=this._get_safe_type(t.type);s.setAttribute(this.config.task_attribute,t.id),n.show_progress&&o!=this.config.types.milestone&&this._render_task_progress(t,s,r);var l=gantt._render_task_content(t,r);t.textColor&&(l.style.color=t.textColor),s.appendChild(l);var d=this._combine_item_class("gantt_task_line",this.templates.task_class(t.start_date,t.end_date,t),t.id);(t.color||t.progressColor||t.textColor)&&(d+=" gantt_task_inline_color"), -s.className=d;var _=["left:"+e.x+"px","top:"+(a+e.y)+"px","height:"+i+"px","line-height:"+i+"px","width:"+r+"px"];t.color&&_.push("background-color:"+t.color),t.textColor&&_.push("color:"+t.textColor),s.style.cssText=_.join(";");var h=this._render_leftside_content(t);return h&&s.appendChild(h),h=this._render_rightside_content(t),h&&s.appendChild(h),this._is_readonly(t)||(n.drag_resize&&!this._is_flex_task(t)&&o!=this.config.types.milestone&&gantt._render_pair(s,"gantt_task_drag",t,function(t){var e=document.createElement("div"); - -return e.className=t,e}),n.drag_links&&this.config.show_links&&gantt._render_pair(s,"gantt_link_control",t,function(t){var e=document.createElement("div");e.className=t,e.style.cssText=["height:"+i+"px","line-height:"+i+"px"].join(";");var n=document.createElement("div");return n.className="gantt_link_point",e.appendChild(n),e})),s},gantt._render_task_element=function(t){var e=this.config.type_renderers,n=e[this._get_safe_type(t.type)],i=this._task_default_render;return n||(n=i),n.call(this,t,dhtmlx.bind(i,this)); - -},gantt._render_side_content=function(t,e,n){if(!e)return null;var i=e(t.start_date,t.end_date,t);if(!i)return null;var a=document.createElement("div");return a.className="gantt_side_content "+n,a.innerHTML=i,a},gantt._render_leftside_content=function(t){var e="gantt_left "+gantt._get_link_crossing_css(!0,t);return gantt._render_side_content(t,this.templates.leftside_text,e)},gantt._render_rightside_content=function(t){var e="gantt_right "+gantt._get_link_crossing_css(!1,t);return gantt._render_side_content(t,this.templates.rightside_text,e); - -},gantt._get_conditions=function(t){return t?{$source:[gantt.config.links.start_to_start],$target:[gantt.config.links.start_to_start,gantt.config.links.finish_to_start]}:{$source:[gantt.config.links.finish_to_start,gantt.config.links.finish_to_finish],$target:[gantt.config.links.finish_to_finish]}},gantt._get_link_crossing_css=function(t,e){var n=gantt._get_conditions(t);for(var i in n)for(var a=e[i],s=0;st||t>e.full_width||!e.full_width)return null; - -var n=this._findBinary(this._tasks.left,t),i=this._tasks.left[n],a=e.width[n]||e.col_width,s=0;a&&(s=(t-i)/a);var r=0;s&&(r=gantt._get_coll_duration(e,e.trace_x[n]));var o=new Date(e.trace_x[n].valueOf()+Math.round(s*r));return o},gantt.posFromDate=function(t){var e=gantt._day_index_by_date(t);dhtmlx.assert(e>=0,"Invalid day index");var n=Math.floor(e),i=e%1,a=gantt._tasks.left[Math.min(n,gantt._tasks.width.length-1)];return n==gantt._tasks.width.length&&(a+=gantt._tasks.width[gantt._tasks.width.length-1]), -i&&(a+=n=this._max_date)return n.length;for(var a=gantt._findBinary(n,e),s=+gantt._tasks.trace_x[a];i[s];)s=gantt._tasks.trace_x[++a];return s?a+(t-n[a])/gantt._get_coll_duration(gantt._tasks,n[a]):0},gantt._findBinary=function(t,e){for(var n,i,a,s=0,r=t.length-1;r>=s;)if(n=Math.floor((s+r)/2), -i=+t[n],a=+t[n-1],e>i)s=n+1;else{if(!(i>e))return n;if(!isNaN(a)&&e>a)return n-1;r=n-1}return t.length-1},gantt._get_coll_duration=function(t,e){return gantt.date.add(e,t.step,t.unit)-e},gantt._get_x_pos=function(t,e){e=e!==!1;gantt.posFromDate(e?t.start_date:t.end_date)},gantt.getTaskTop=function(t){return this._y_from_ind(this._get_visible_order(t))},gantt._get_task_coord=function(t,e,n){e=e!==!1,n=n||0;var i=this._get_safe_type(t.type)==this.config.types.milestone,a=null;a=e||i?t.start_date||this._default_task_date(t):t.end_date||this.calculateEndDate(this._default_task_date(t)); - -var s=this.posFromDate(a),r=this.getTaskTop(t.id);return i&&(e?s-=n:s+=n),{x:s,y:r}},gantt._get_task_pos=function(t,e){e=e!==!1;var n=gantt._get_milestone_width()/2;return this._get_task_coord(t,e,n)},gantt._get_task_visible_pos=function(t,e){e=e!==!1;var n=gantt._get_visible_milestone_width()/2;return this._get_task_coord(t,e,n)},gantt._correct_shift=function(t,e){return t-=6e4*(new Date(gantt._min_date).getTimezoneOffset()-new Date(t).getTimezoneOffset())*(e?-1:1)},gantt._get_mouse_pos=function(t){ -if(t.pageX||t.pageY)var e={x:t.pageX,y:t.pageY};var n=_isIE?document.documentElement:document.body,e={x:t.clientX+n.scrollLeft-n.clientLeft,y:t.clientY+n.scrollTop-n.clientTop},i=gantt._get_position(gantt.$task_data);return e.x=e.x-i.x+gantt.$task_data.scrollLeft,e.y=e.y-i.y+gantt.$task_data.scrollTop,e},gantt._is_layer=function(t){return t&&t.hasAttribute&&t.hasAttribute(this.config.layer_attribute)},gantt._task_renderer=function(t,e,n,i){return this._task_area_pulls||(this._task_area_pulls={}), -this._task_area_renderers||(this._task_area_renderers={}),this._task_area_renderers[t]?this._task_area_renderers[t]:(e||dhtmlx.assert(!1,"Invalid renderer call"),n&&n.setAttribute(this.config.layer_attribute,!0),this._task_area_renderers[t]={render_item:function(a,s){var r=gantt._task_area_pulls[t];if(s=s||n,i&&!i(a))return void this.remove_item(a.id);var o=e.call(gantt,a);o&&(r[a.id]?this.replace_item(a.id,o):(r[a.id]=o,s.appendChild(o)))},clear:function(e){this.rendered=gantt._task_area_pulls[t]={}, -e=e||n,e&&(e.innerHTML="")},render_items:function(t,e){e=e||n,this.clear(e);for(var i=document.createDocumentFragment(),a=0,s=t.length;s>a;a++)this.render_item(t[a],i);e.appendChild(i)},replace_item:function(t,e){var n=this.rendered[t];n&&n.parentNode&&n.parentNode.replaceChild(e,n),this.rendered[t]=e},remove_item:function(t){var e=this.rendered[t];e&&e.parentNode&&e.parentNode.removeChild(e),delete this.rendered[t]},change_id:function(t,e){this.rendered[e]=this.rendered[t],delete this.rendered[t]; - -},rendered:this._task_area_pulls[t],node:n,unload:function(){this.clear(),delete gantt._task_area_renderers[t],delete gantt._task_area_pulls[t]}},this._task_area_renderers[t])},gantt._clear_renderers=function(){for(var t in this._task_area_renderers)this._task_renderer(t).unload()},gantt.attachEvent("onGanttReady",function(){gantt._task_layers.add(),gantt._link_layers.add()}),gantt._layers={prepareConfig:function(t){"function"==typeof t&&(t={renderer:t});t.id=dhtmlx.uid();return t.container||(t.container=document.createElement("div")), -t},create:function(t,e){return{tempCollection:[],renderers:{},container:t,getRenderers:function(){var t=[];for(var e in this.renderers)t.push(this.renderers[e]);return t},getRenderer:function(t){return this.renderers[t]},add:function(t){if(t&&this.tempCollection.push(t),this.container())for(var n=this.container(),i=this.tempCollection,a=0;ai;i++){var s=t[i];gantt[s]&&(n=n&&gantt[s].call(gantt,e.id,e)!==!1)}return n}},gantt._add_generic_layer=function(t,e){ -return function(n){return void 0===n.filter&&(n.filter=gantt._create_filter(e)),n=gantt._layers.prepareConfig(n),t.add(n),n.id}},gantt._task_layers=gantt._layers.create(function(){return gantt.$task_data},function(){return gantt.$task_links}),gantt._link_layers=gantt._layers.create(function(){return gantt.$task_data}),gantt.addTaskLayer=gantt._add_generic_layer(gantt._task_layers,["_filter_task","_is_chart_visible"]),gantt.removeTaskLayer=function(t){gantt._task_layers.remove(t)},gantt.addLinkLayer=gantt._add_generic_layer(gantt._link_layers,["_filter_link","_is_chart_visible"]), -gantt.removeLinkLayer=function(t){gantt._link_layers.remove(t)},gantt._get_task_renderers=function(){return this._task_layers.getRenderers()},gantt._get_link_renderers=function(){return this._link_layers.getRenderers()},gantt._pull={},gantt._branches={},gantt._order=[],gantt._lpull={},gantt.load=function(t,e,n){this._load_url=t,dhtmlx.assert(arguments.length,"Invalid load arguments"),this.callEvent("onLoadStart",[]);var i="json",a=null;arguments.length>=3?(i=e,a=n):"string"==typeof arguments[1]?i=arguments[1]:"function"==typeof arguments[1]&&(a=arguments[1]), -this._load_type=i,dhx4.ajax.get(t,dhtmlx.bind(function(t){this.on_load(t,i),this.callEvent("onLoadEnd",[]),"function"==typeof a&&a.call(this)},this))},gantt.parse=function(t,e){this.on_load({xmlDoc:{responseText:t}},e)},gantt.serialize=function(t){return t=t||"json",this[t].serialize()},gantt.on_load=function(t,e){this.callEvent("onBeforeParse",[]),e||(e="json"),dhtmlx.assert(this[e],"Invalid data type:'"+e+"'");var n=t.xmlDoc.responseText,i=this[e].parse(n,t);this._process_loading(i)},gantt._process_loading=function(t){ -t.collections&&this._load_collections(t.collections);for(var e,n=t.data,i=0;in;n++)if(e[n]==t)return n;return-1},gantt.eachTask=function(t,e,n){e=e||this.config.root_id,n=n||this;var i=this.getChildren(e);if(i)for(var a=0;a"},_copyObject:function(t){return""},serialize:function(){for(var t=[],e=[],n=gantt.json.serialize(),i=0,a=n.data.length;a>i;i++)t.push(this._copyObject(n.data[i])); - -for(var i=0,a=n.links.length;a>i;i++)e.push(this._copyLink(n.links[i]));return""+t.join("")+""+e.join("")+""}},gantt.oldxml={parse:function(t,e){e=gantt.xml._getXML(t,e,"projects");for(var n={collections:{links:[]}},i=n.data=[],a=dhx4.ajax.xpath("//task",e),s=0;se;e++)if(this.units[e]==t)return e;dhtmlx.assert(!1,"Incorrect duration unit")},_timestamp:function(t){var e=null;return t.day||0===t.day?e=t.day:t.date&&(e=gantt.date.date_part(new Date(t.date)).valueOf()),e},set_time:function(t){var e=void 0!==t.hours?t.hours:!0,n=this._timestamp(t);null!==n?this.dates[n]=e:this.hours=e,this._working_units_cache.clear()},unset_time:function(t){if(t){var e=this._timestamp(t);null!==e&&delete this.dates[e]; - -}else this.hours=[];this._working_units_cache.clear()},is_working_unit:function(t,e,n){if(!gantt.config.work_time)return!0;var i=this._working_units_cache.get(e,t);return-1==i&&(i=this._check_is_working_unit(t,e,n),this._working_units_cache.put(e,t,i)),i},_check_is_working_unit:function(t,e,n){return void 0===n&&(n=this._get_unit_order(e)),void 0===n?!1:n&&!this.is_working_unit(t,this.units[n-1],n-1)?!1:this["is_work_"+e]?this["is_work_"+e](t):!0},is_work_day:function(t){var e=this.get_working_hours(t); - -return e instanceof Array?e.length>0:!1},is_work_hour:function(t){for(var e=this.get_working_hours(t),n=t.getHours(),i=0;i=e[i]&&ns;){var r=gantt.date.add(a,i,n);this.is_working_unit(i>0?a:r,n)&&s++,a=r}return a}return gantt.date.add(a,i*e,n)},get_closest_worktime:function(t){if(this.is_working_unit(t.date,t.unit))return t.date; - -var e=t.unit,n=gantt.date[e+"_start"](t.date),i=new Date(n),a=new Date(n),s=!0,r=3e3,o=0,l="any"==t.dir||!t.dir,d=1;for("past"==t.dir&&(d=-1);!this.is_working_unit(n,e);)if(l&&(n=s?i:a,d=-1*d),n=gantt.date.add(n,d,e),n=gantt.date[e+"_start"](n),l&&(s?i=n:a=n),s=!s,o++,o>r)return dhtmlx.assert(!1,"Invalid working time check"),!1;return(n==a||"past"==t.dir)&&(n=gantt.date.add(n,1,e)),n}},gantt.getTask=function(t){return dhtmlx.assert(t,"Invalid argument for gantt.getTask"),dhtmlx.assert(this._pull[t],"Task not found id="+t), -this._pull[t]},gantt.getTaskByTime=function(t,e){var n=this._pull,i=[];if(t||e){t=+t||-(1/0),e=+e||1/0;for(var a in n){var s=n[a];+s.start_datet&&i.push(s)}}else for(var a in n)i.push(n[a]);return i},gantt.isTaskExists=function(t){return dhtmlx.defined(this._pull[t])},gantt.isTaskVisible=function(t){if(!this._pull[t])return!1;if(!(+this._pull[t].start_date<+this._max_date&&+this._pull[t].end_date>+this._min_date))return!1;for(var e=0,n=this._order.length;n>e;e++)if(this._order[e]==t)return!0; - -return!1},gantt.updateTask=function(t,e){return dhtmlx.defined(e)||(e=this.getTask(t)),this.callEvent("onBeforeTaskUpdate",[t,e])===!1?!1:(this._pull[e.id]=e,this._is_parent_sync(e)||this._resync_parent(e),this._update_parents(e.id),this.refreshTask(e.id),this.callEvent("onAfterTaskUpdate",[t,e]),this._sync_order(),void this._adjust_scales())},gantt._add_branch=function(t,e){var n=this.getParent(t);this.hasChild(n)||(this._branches[n]=[]);for(var i=this.getChildren(n),a=!1,s=0,r=i.length;r>s;s++)if(i[s]==t.id){ -a=!0;break}a||i.push(t.id),this._sync_parent(t),this._sync_order(e)},gantt._move_branch=function(t,e,n){this.setParent(t,n),this._sync_parent(t),this._replace_branch_child(e,t.id),this.isTaskExists(n)||n==this.config.root_id?this._add_branch(t):delete this._branches[t.id],t.$level=this.calculateTaskLevel(t),this._sync_order()},gantt._resync_parent=function(t){this._move_branch(t,t.$rendered_parent,this.getParent(t))},gantt._sync_parent=function(t){t.$rendered_parent=this.getParent(t)},gantt._is_parent_sync=function(t){ -return t.$rendered_parent==this.getParent(t)},gantt._replace_branch_child=function(t,e,n){var i=this.getChildren(t);if(i){for(var a=[],s=0;s=0?1:-1;return i.add_worktime(t,Math.abs(e),n||this.config.duration_unit,a*this.config.duration_step)},gantt._init_task=function(t){return dhtmlx.defined(t.id)||(t.id=dhtmlx.uid()),t.start_date&&(t.start_date=gantt.date.parseDate(t.start_date,"xml_date")),t.end_date&&(t.end_date=gantt.date.parseDate(t.end_date,"xml_date")),t.start_date&&!t.end_date&&t.duration&&(t.end_date=this.calculateEndDate(t.start_date,t.duration)), -gantt._init_task_timing(t),t.start_date&&t.end_date&&gantt.correctTaskWorkTime(t),t.$source=[],t.$target=[],void 0===t.parent&&this.setParent(t,this.config.root_id),t.$open=dhtmlx.defined(t.open)?t.open:this.config.open_tree_initially,t.$level=this.calculateTaskLevel(t),t},gantt._init_task_timing=function(t){var e=this._get_safe_type(t.type);void 0===t.$rendered_type?t.$rendered_type=e:t.$rendered_type!=e&&(delete t.$no_end,delete t.$no_start,t.$rendered_type=e),void 0!==t.$no_end&&void 0!==t.$no_start||e==this.config.types.milestone||(e==this.config.types.project?(t.$no_end=t.$no_start=!0, -this._set_default_task_timing(t)):(t.$no_end=!(t.end_date||t.duration),t.$no_start=!t.start_date)),e==this.config.types.milestone&&(t.end_date=t.start_date),t.start_date&&t.end_date&&(t.duration=this.calculateDuration(t.start_date,t.end_date)),t.duration=t.duration||0},gantt._is_flex_task=function(t){return!(!t.$no_end&&!t.$no_start)},gantt.resetProjectDates=function(t){if(t.$no_end||t.$no_start){var e=this.getSubtaskDates(t.id);this._assign_project_dates(t,e.start_date,e.end_date)}},gantt.getSubtaskDates=function(t){ -var e=null,n=null,i=void 0!==t?t:gantt.config.root_id;return this.eachTask(function(t){this._get_safe_type(t.type)!=gantt.config.types.project&&(t.start_date&&!t.$no_start&&(!e||e>t.start_date.valueOf())&&(e=t.start_date.valueOf()),t.end_date&&!t.$no_end&&(!n||n+a;)a=gantt.date[i+"_start"](gantt.date.add(a,n,i));var s=gantt.date.add(a,-1*n,i); - -return t.dir&&"future"==t.dir?a:t.dir&&"past"==t.dir?s:Math.abs(e-s)i[t];return e&&(a=!a),a?1:-1}:t,r=this.getChildren(n);if(r){for(var o=[],l=r.length-1;l>=0;l--)o[l]=this._pull[r[l]];o.sort(s);for(var l=0;ln;n++)if(e[n]==t)return e[n+1]||null;return null; - -},gantt.getPrevSibling=function(t){for(var e=this.getSiblings(t),n=0,i=e.length;i>n;n++)if(e[n]==t)return e[n-1]||null;return null},gantt._dp_init=function(t){t.setTransactionMode("POST",!0),t.serverProcessor+=(-1!=t.serverProcessor.indexOf("?")?"&":"?")+"editing=true",t._serverProcessor=t.serverProcessor,t.styles={updated:"gantt_updated",inserted:"gantt_inserted",deleted:"gantt_deleted",invalid:"gantt_invalid",error:"gantt_error",clear:""},t._methods=["_row_style","setCellTextStyle","_change_id","_delete_task"], -t.setGanttMode=function(e){var n=t.modes||{};t._ganttMode&&(n[t._ganttMode]={_in_progress:t._in_progress,_invalid:t._invalid,updatedRows:t.updatedRows});var i=n[e];i||(i=n[e]={_in_progress:{},_invalid:{},updatedRows:[]}),t._in_progress=i._in_progress,t._invalid=i._invalid,t.updatedRows=i.updatedRows,t.modes=n,t._ganttMode=e},this._sendTaskOrder=function(e,n){n.$drop_target&&(t.setGanttMode("tasks"),this.getTask(e).target=n.$drop_target,t.setUpdated(e,!0,"order"),delete this.getTask(e).$drop_target); - -},this.attachEvent("onAfterTaskAdd",function(e){t.setGanttMode("tasks"),t.setUpdated(e,!0,"inserted")}),this.attachEvent("onAfterTaskUpdate",function(e,n){t.setGanttMode("tasks"),t.setUpdated(e,!0),gantt._sendTaskOrder(e,n)}),this.attachEvent("onAfterTaskDelete",function(e){t.setGanttMode("tasks"),t.setUpdated(e,!0,"deleted"),"off"==t.updateMode||t._tSend||t.sendAllData()}),this.attachEvent("onAfterLinkUpdate",function(e){t.setGanttMode("links"),t.setUpdated(e,!0)}),this.attachEvent("onAfterLinkAdd",function(e){ -t.setGanttMode("links"),t.setUpdated(e,!0,"inserted")}),this.attachEvent("onAfterLinkDelete",function(e){t.setGanttMode("links"),t.setUpdated(e,!0,"deleted")}),this.attachEvent("onRowDragEnd",function(t){gantt._sendTaskOrder(t,gantt.getTask(t))}),t.attachEvent("onBeforeDataSending",function(){if("REST"==this._tMode){var t=this._ganttMode.substr(0,this._ganttMode.length-1);this.serverProcessor=this._serverProcessor+("/"==this._serverProcessor.slice(-1)?"":"/")+t}else this.serverProcessor=this._serverProcessor+window.dhtmlx.url(this._serverProcessor)+"gantt_mode="+this._ganttMode; - -return!0});var e=t.afterUpdate;t.afterUpdate=function(){var n;n=3==arguments.length?arguments[1]:arguments[4];var i=t._ganttMode,a=n.filePath||(n.xmlDoc?n.xmlDoc.responseURL:"");i="REST"!=this._tMode?-1!=a.indexOf("gantt_mode=links")?"links":"tasks":a.indexOf("/link")>a.indexOf("/task")?"links":"tasks",t.setGanttMode(i);var s=e.apply(t,arguments);return t.setGanttMode(i),s},t._getRowData=dhtmlx.bind(function(e){var n;n="tasks"==t._ganttMode?this.isTaskExists(e)?this.getTask(e):{id:e}:this.isLinkExists(e)?this.getLink(e):{ -id:e},n=dhtmlx.copy(n);var i={};for(var a in n)if("$"!=a.substr(0,1)){var s=n[a];i[a]=s instanceof Date?this.templates.xml_format(s):null===s?"":s}return n.$no_start&&(n.start_date="",n.duration=""),n.$no_end&&(n.end_date="",n.duration=""),i[t.action_param]=this.getUserData(e,t.action_param),i},this),this._change_id=dhtmlx.bind(function(e,n){"tasks"!=t._ganttMode?this.changeLinkId(e,n):this.changeTaskId(e,n)},this),this._row_style=function(e,n){if("tasks"==t._ganttMode){var i=gantt.getTaskRowNode(e); - -if(i)if(n)i.className+=" "+n;else{var a=/ (gantt_updated|gantt_inserted|gantt_deleted|gantt_invalid|gantt_error)/g;i.className=i.className.replace(a,"")}}},this._delete_task=function(){},this._dp=t},gantt.getUserData=function(t,e){return this.userdata||(this.userdata={}),this.userdata[t]&&this.userdata[t][e]?this.userdata[t][e]:""},gantt.setUserData=function(t,e,n){this.userdata||(this.userdata={}),this.userdata[t]||(this.userdata[t]={}),this.userdata[t][e]=n},gantt._init_link=function(t){return dhtmlx.defined(t.id)||(t.id=dhtmlx.uid()), -t},gantt._sync_links=function(){for(var t in this._pull)this._pull[t].$source=[],this._pull[t].$target=[];for(var t in this._lpull){var e=this._lpull[t];this._pull[e.source]&&this._pull[e.source].$source.push(t),this._pull[e.target]&&this._pull[e.target].$target.push(t)}},gantt.getLink=function(t){return dhtmlx.assert(this._lpull[t],"Link doesn't exist"),this._lpull[t]},gantt.getLinks=function(){var t=[];for(var e in gantt._lpull)t.push(gantt._lpull[e]);return t},gantt.isLinkExists=function(t){return dhtmlx.defined(this._lpull[t]); - -},gantt.addLink=function(t){return t=this._init_link(t),this.callEvent("onBeforeLinkAdd",[t.id,t])===!1?!1:(this._lpull[t.id]=t,this._sync_links(),this._render_link(t.id),this.callEvent("onAfterLinkAdd",[t.id,t]),t.id)},gantt.updateLink=function(t,e){return dhtmlx.defined(e)||(e=this.getLink(t)),this.callEvent("onBeforeLinkUpdate",[t,e])===!1?!1:(this._lpull[t]=e,this._sync_links(),this._render_link(t),this.callEvent("onAfterLinkUpdate",[t,e]),!0)},gantt.deleteLink=function(t){return this._deleteLink(t); - -},gantt._deleteLink=function(t,e){var n=this.getLink(t);return e||this.callEvent("onBeforeLinkDelete",[t,n])!==!1?(delete this._lpull[t],this._sync_links(),this.refreshLink(t),e||this.callEvent("onAfterLinkDelete",[t,n]),!0):!1},gantt.changeLinkId=function(t,e){this._lpull[e]=this._lpull[t],this._lpull[e].id=e,delete this._lpull[t],this._sync_links(),this.callEvent("onLinkIdChange",[t,e])},gantt.getChildren=function(t){return dhtmlx.defined(this._branches[t])?this._branches[t]:[]},gantt.hasChild=function(t){ -return dhtmlx.defined(this._branches[t])&&this._branches[t].length},gantt.refreshData=function(){this._render_data()},gantt._configure=function(t,e,n){for(var i in e)("undefined"==typeof t[i]||n)&&(t[i]=e[i])},gantt._init_skin=function(){gantt._get_skin(!1),gantt._init_skin=function(){}},gantt._get_skin=function(t){if(!gantt.skin||t)for(var e=document.getElementsByTagName("link"),n=0;n 
", -gantt.showLightbox=function(t){if(t&&!gantt._is_readonly(this.getTask(t))&&this.callEvent("onBeforeLightbox",[t])){var e=this.getTask(t),n=this.getLightbox(this._get_safe_type(e.type));this._center_lightbox(n),this.showCover(),this._fill_lightbox(t,n),this.callEvent("onLightbox",[t])}},gantt._get_timepicker_step=function(){if(this.config.round_dnd_dates){var t=gantt._tasks,e=this._get_line(t.unit)*t.step/60;return(e>=1440||!this._is_chart_visible())&&(e=this.config.time_step),e}return this.config.time_step; - -},gantt.getLabel=function(t,e){for(var n=this._get_typed_lightbox_config(),i=0;i
"+this.locale.labels[r]+"
"}a=this.config.buttons_right;for(var s=0;s
"+this.locale.labels[r]+"
"}i+="",e.innerHTML=i,gantt.config.drag_lightbox&&(e.firstChild.onmousedown=gantt._ready_to_dnd, -e.firstChild.onselectstart=function(){return!1},e.firstChild.style.cursor="pointer",gantt._init_dnd_events()),document.body.insertBefore(e,document.body.firstChild),this._lightbox=e;var o=this._get_typed_lightbox_config(t);i=this._render_sections(o);for(var l=e.getElementsByTagName("div"),s=0;s
"+this.locale.labels["button_"+t[n].button]+"
"),this.config.wide_form&&(e+="
"),e+="
"+s+this.locale.labels["section_"+t[n].name]+"
"+i.render.call(this,t[n]), -e+="
"}}return e},gantt.resizeLightbox=function(){var t=this._lightbox;if(t){var e=t.childNodes[1];e.style.height="0px",e.style.height=e.scrollHeight+"px",t.style.height=e.scrollHeight+this.config.lightbox_additional_height+"px",e.style.height=e.scrollHeight+"px"}},gantt._center_lightbox=function(t){if(t){t.style.display="block";var e=window.pageYOffset||document.body.scrollTop||document.documentElement.scrollTop,n=window.pageXOffset||document.body.scrollLeft||document.documentElement.scrollLeft,i=window.innerHeight||document.documentElement.clientHeight; - -t.style.top=e?Math.round(e+Math.max((i-t.offsetHeight)/2,0))+"px":Math.round(Math.max((i-t.offsetHeight)/2,0)+9)+"px",t.style.left=document.documentElement.scrollWidth>document.body.offsetWidth?Math.round(n+(document.body.offsetWidth-t.offsetWidth)/2)+"px":Math.round((document.body.offsetWidth-t.offsetWidth)/2)+"px"}},gantt.showCover=function(){if(!this._cover){this._cover=document.createElement("DIV"),this._cover.className="gantt_cal_cover";var t=void 0!==document.height?document.height:document.body.offsetHeight,e=document.documentElement?document.documentElement.scrollHeight:0; - -this._cover.style.height=Math.max(t,e)+"px",document.body.appendChild(this._cover)}},gantt._init_lightbox_events=function(){gantt.lightbox_events={},gantt.lightbox_events.gantt_save_btn=function(){gantt._save_lightbox()},gantt.lightbox_events.gantt_delete_btn=function(){gantt.callEvent("onLightboxDelete",[gantt._lightbox_id])&&(gantt.isTaskExists(gantt._lightbox_id)?gantt.$click.buttons["delete"](gantt._lightbox_id):gantt.hideLightbox())},gantt.lightbox_events.gantt_cancel_btn=function(){gantt._cancel_lightbox(); - -},gantt.lightbox_events["default"]=function(t,e){if(e.getAttribute("dhx_button"))gantt.callEvent("onLightboxButton",[e.className,e,t]);else{var n,i,a;-1!=e.className.indexOf("gantt_custom_button")&&(-1!=e.className.indexOf("gantt_custom_button_")?(n=e.parentNode.getAttribute("index"),a=e.parentNode.parentNode):(n=e.getAttribute("index"),a=e.parentNode,e=e.firstChild));var s=gantt._get_typed_lightbox_config();n&&(i=gantt.form_blocks[s[n].type],i.button_click(n,e,a,a.nextSibling))}},dhtmlxEvent(gantt.getLightbox(),"click",function(t){ -t=t||window.event;var e=t.target?t.target:t.srcElement;if(e.className||(e=e.previousSibling),e&&e.className&&0===e.className.indexOf("gantt_btn_set")&&(e=e.firstChild),e&&e.className){var n=dhtmlx.defined(gantt.lightbox_events[e.className])?gantt.lightbox_events[e.className]:gantt.lightbox_events["default"];return n(t,e)}return!1}),gantt.getLightbox().onkeydown=function(t){switch((t||event).keyCode){case gantt.keys.edit_save:if((t||event).shiftKey)return;gantt._save_lightbox();break;case gantt.keys.edit_cancel: -gantt._cancel_lightbox()}}},gantt._cancel_lightbox=function(){var t=this.getLightboxValues();this.callEvent("onLightboxCancel",[this._lightbox_id,t.$new]),gantt.isTaskExists(t.id)&&t.$new&&this._deleteTask(t.id,!0),this.refreshData(),this.hideLightbox()},gantt._save_lightbox=function(){var t=this.getLightboxValues();this.callEvent("onLightboxSave",[this._lightbox_id,t,!!t.$new])&&(t.$new?(delete t.$new,this.addTask(t)):this.isTaskExists(t.id)&&(dhtmlx.mixin(this.getTask(t.id),t,!0),this.updateTask(t.id)), -this.refreshData(),this.hideLightbox())},gantt._resolve_default_mapping=function(t){var e=t.map_to,n={time:!0,duration:!0};return n[t.type]&&("auto"==t.map_to?e={start_date:"start_date",end_date:"end_date",duration:"duration"}:"string"==typeof t.map_to&&(e={start_date:t.map_to})),e},gantt.getLightboxValues=function(){var t={};gantt.isTaskExists(this._lightbox_id)&&(t=dhtmlx.mixin({},this.getTask(this._lightbox_id)));for(var e=this._get_typed_lightbox_config(),n=0;n0&&(o+=" ");var _="";switch(d){case"%Y":t._time_format_order[2]=l,t._time_format_order.size++;var h,c,g,u;t.year_range&&(isNaN(t.year_range)?t.year_range.push&&(g=t.year_range[0],u=t.year_range[1]):h=t.year_range),h=h||10,c=c||Math.floor(h/2), -g=g||a.getFullYear()-c,u=u||g+h;for(var f=g;u>f;f++)_+="";break;case"%m":t._time_format_order[1]=l,t._time_format_order.size++;for(var f=0;12>f;f++)_+="";break;case"%d":t._time_format_order[0]=l,t._time_format_order.size++;for(var f=1;32>f;f++)_+="";break;case"%H:%i":t._time_format_order[3]=l,t._time_format_order.size++;var f=r,p=a.getDate();for(t._time_values=[];s>f;){ -var v=this.templates.time_picker(a);_+="",t._time_values.push(f),a.setTime(a.valueOf()+60*this._get_timepicker_step()*1e3);var m=a.getDate()!=p?1:0;f=24*m*60+60*a.getHours()+a.getMinutes()}}if(_){var k=t.readonly?"disabled='disabled'":"",x=e?" style='display:none'":"";o+=""}}return o},_fill_lightbox_select:function(t,e,n,i){if(t[e+i[0]].value=n.getDate(),t[e+i[1]].value=n.getMonth(),t[e+i[2]].value=n.getFullYear(),dhtmlx.defined(i[3])){ -var a=60*n.getHours()+n.getMinutes();a=Math.round(a/gantt._get_timepicker_step())*gantt._get_timepicker_step();var s=t[e+i[3]];s.value=a,s.setAttribute("data-value",a)}},template:{render:function(t){var e=(t.height||"30")+"px";return"
"},set_value:function(t,e){t.innerHTML=e||""},get_value:function(t){return t.innerHTML||""},focus:function(){}},textarea:{render:function(t){var e=(t.height||"130")+"px";return"
"; - -},set_value:function(t,e){t.firstChild.value=e||""},get_value:function(t){return t.firstChild.value},focus:function(t){var e=t.firstChild;gantt._focus(e,!0)}},select:{render:function(t){for(var e=(t.height||"23")+"px",n="
"},set_value:function(t,e,n,i){var a=t.firstChild;!a._dhx_onchange&&i.onchange&&(a.onchange=i.onchange, -a._dhx_onchange=!0),"undefined"==typeof e&&(e=(a.options[0]||{}).value),a.value=e||""},get_value:function(t){return t.firstChild.value},focus:function(t){var e=t.firstChild;gantt._focus(e,!0)}},time:{render:function(t){var e=this.form_blocks.getTimePicker.call(this,t),n=["
"];return n.push(e),t.single_date?(e=this.form_blocks.getTimePicker.call(this,t,!0),n.push("")):n.push("  –  "), -n.push(e),n.push("
"),n.join("")},set_value:function(t,e,n,i){{var a=i,s=t.getElementsByTagName("select"),r=i._time_format_order;i._time_format_size}if(a.auto_end_date)for(var o=function(){_=new Date(s[r[2]].value,s[r[1]].value,s[r[0]].value,0,0),h=gantt.calculateEndDate(_,1),this.form_blocks._fill_lightbox_select(s,r.size,h,r,a)},l=0;4>l;l++)s[l].onchange=o;var d=gantt._resolve_default_mapping(i);"string"==typeof d&&(d={start_date:d});var _=n[d.start_date]||new Date,h=n[d.end_date]||gantt.calculateEndDate(_,1); - -this.form_blocks._fill_lightbox_select(s,0,_,r,a),this.form_blocks._fill_lightbox_select(s,r.size,h,r,a)},get_value:function(t,e,n){var i=t.getElementsByTagName("select"),a=n._time_format_order,s=0,r=0;if(dhtmlx.defined(a[3])){var o=parseInt(i[a[3]].value,10);s=Math.floor(o/60),r=o%60}var l=new Date(i[a[2]].value,i[a[1]].value,i[a[0]].value,s,r);if(s=r=0,dhtmlx.defined(a[3])){var o=parseInt(i[a.size+a[3]].value,10);s=Math.floor(o/60),r=o%60}var d=new Date(i[a[2]+a.size].value,i[a[1]+a.size].value,i[a[0]+a.size].value,s,r); - -l>=d&&(d=gantt.date.add(l,gantt._get_timepicker_step(),"minute"));var _=gantt._resolve_default_mapping(n),h={start_date:new Date(l),end_date:new Date(d)};return"string"==typeof _?h.start_date:h},focus:function(t){gantt._focus(t.getElementsByTagName("select")[0])}},duration:{render:function(t){var e=this.form_blocks.getTimePicker.call(this,t);e="
"+e+"
";var n=this.locale.labels[this.config.duration_unit+"s"],i=t.single_date?' style="display:none"':"",a=t.readonly?" disabled='disabled'":"",s="
"+n+"
",r="
"+e+" "+s+"
"; - -return r},set_value:function(t,e,n,i){function a(){var e=gantt.form_blocks.duration._get_start_date.call(gantt,t,i),n=gantt.form_blocks.duration._get_duration.call(gantt,t,i),a=gantt.calculateEndDate(e,n);h.innerHTML=gantt.templates.task_date(a)}function s(t){var e=d.value;e=parseInt(e,10),window.isNaN(e)&&(e=0),e+=t,1>e&&(e=1),d.value=e,a()}var r=i,o=t.getElementsByTagName("select"),l=t.getElementsByTagName("input"),d=l[1],_=[l[0],l[2]],h=t.getElementsByTagName("span")[0],c=i._time_format_order; -_[0].onclick=dhtmlx.bind(function(){s(-1*this.config.duration_step)},this),_[1].onclick=dhtmlx.bind(function(){s(1*this.config.duration_step)},this),o[0].onchange=a,o[1].onchange=a,o[2].onchange=a,o[3]&&(o[3].onchange=a),d.onkeydown=dhtmlx.bind(function(t){t=t||window.event;var e=t.charCode||t.keyCode||t.which;return 40==e?(s(-1*this.config.duration_step),!1):38==e?(s(1*this.config.duration_step),!1):void window.setTimeout(function(){a()},1)},this),d.onchange=dhtmlx.bind(function(){a()},this);var g=gantt._resolve_default_mapping(i); - -"string"==typeof g&&(g={start_date:g});var u=n[g.start_date]||new Date,f=n[g.end_date]||gantt.calculateEndDate(u,1),p=Math.round(n[g.duration])||gantt.calculateDuration(u,f);gantt.form_blocks._fill_lightbox_select(o,0,u,c,r),d.value=p,a()},_get_start_date:function(t,e){var n=t.getElementsByTagName("select"),i=e._time_format_order,a=0,s=0;if(dhtmlx.defined(i[3])){var r=n[i[3]],o=parseInt(r.value,10);isNaN(o)&&r.hasAttribute("data-value")&&(o=parseInt(r.getAttribute("data-value"),10)),a=Math.floor(o/60), -s=o%60}return new Date(n[i[2]].value,n[i[1]].value,n[i[0]].value,a,s)},_get_duration:function(t){var e=t.getElementsByTagName("input")[1];return e=parseInt(e.value,10),(!e||window.isNaN(e))&&(e=1),0>e&&(e*=-1),e},get_value:function(t,e,n){var i=gantt.form_blocks.duration._get_start_date(t,n),a=gantt.form_blocks.duration._get_duration(t,n),s=gantt.calculateEndDate(i,a),r=gantt._resolve_default_mapping(n),o={start_date:new Date(i),end_date:new Date(s),duration:a};return"string"==typeof r?o.start_date:o; - -},focus:function(t){gantt._focus(t.getElementsByTagName("select")[0])}},parent:{_filter:function(t,e,n){var i=e.filter||function(){return!0};t=t.slice(0);for(var a=0;a
",this.$grid_scale=this.$grid.childNodes[0],this.$grid_data=this.$grid.childNodes[1],this.$task.innerHTML="
",this.$task_scale=this.$task.childNodes[0],this.$task_data=this.$task.childNodes[1], -this.$task_bg=this.$task_data.childNodes[0],this.$task_links=this.$task_data.childNodes[1],this.$task_bars=this.$task_data.childNodes[2]},gantt.$click={buttons:{edit:function(t){gantt.showLightbox(t)},"delete":function(t){var e=gantt.locale.labels.confirm_deleting,n=gantt.locale.labels.confirm_deleting_title;gantt._dhtmlx_confirm(e,n,function(){var e=gantt.getTask(t);e.$new?(gantt._deleteTask(t,!0),gantt.refreshData()):gantt.deleteTask(t),gantt.hideLightbox()})}}},gantt._calculate_content_height=function(){ -var t=this.config.scale_height,e=this._order.length*this.config.row_height,n=this._scroll_hor?this.config.scroll_size+1:0;return this._is_grid_visible()||this._is_chart_visible()?t+e+2+n:0},gantt._calculate_content_width=function(){{var t=this._get_grid_width(),e=this._tasks?this._tasks.full_width:0;this._scroll_ver?this.config.scroll_size+1:0}return this._is_chart_visible()||(e=0),this._is_grid_visible()||(t=0),t+e+1},gantt._get_resize_options=function(){var t={x:!1,y:!1};return"xy"==this.config.autosize?t.x=t.y=!0:"y"==this.config.autosize||this.config.autosize===!0?t.y=!0:"x"==this.config.autosize&&(t.x=!0), -t},gantt._clean_el_size=function(t){return 1*(t||"").toString().replace("px","")||0},gantt._get_box_styles=function(){var t=null;t=window.getComputedStyle?window.getComputedStyle(this._obj,null):{width:this._obj.clientWidth,height:this._obj.clientHeight};var e=["width","height","paddingTop","paddingBottom","paddingLeft","paddingRight","borderLeftWidth","borderRightWidth","borderTopWidth","borderBottomWidth"],n={boxSizing:"border-box"==t.boxSizing};t.MozBoxSizing&&(n.boxSizing="border-box"==t.MozBoxSizing); - -for(var i=0;iMath.abs(a)){ -if(n.x)return!0;var s=i/-40,r=gantt.$task.scrollLeft+30*s;gantt.scrollTo(r,null),gantt.$scroll_hor.scrollTop=o}else{if(n.y)return!0;var s=a/-40;"undefined"==typeof a&&(s=t.detail);var o=gantt.$scroll_ver.scrollTop+30*s;if(!gantt.config.prevent_default_scroll&&gantt._cached_scroll_pos&&gantt._cached_scroll_pos.y==o)return!0;gantt.scrollTo(null,o),gantt.$scroll_ver.scrollTop=o}return t.preventDefault&&t.preventDefault(),t.cancelBubble=!0,!1}dhtmlxEvent(this.$scroll_hor,"scroll",function(){if(new Date-(gantt._wheel_time||0)<100)return!0; - -if(!gantt._touch_scroll_active){var t=gantt.$scroll_hor.scrollLeft;gantt.scrollTo(t)}}),dhtmlxEvent(this.$scroll_ver,"scroll",function(){if(!gantt._touch_scroll_active){var t=gantt.$scroll_ver.scrollTop;gantt.$grid_data.scrollTop=t,gantt.scrollTo(null,t)}}),dhtmlxEvent(this.$task,"scroll",function(){var t=gantt.$task.scrollLeft,e=gantt.$scroll_hor.scrollLeft;e!=t&&(gantt.$scroll_hor.scrollLeft=t)}),dhtmlxEvent(this.$task_data,"scroll",function(){var t=gantt.$task_data.scrollTop,e=gantt.$scroll_ver.scrollTop; - -e!=t&&(gantt.$scroll_ver.scrollTop=t)});var e=_isFF&&!window._KHTMLrv;e?dhtmlxEvent(gantt.$container,"wheel",t):dhtmlxEvent(gantt.$container,"mousewheel",t)},gantt._scroll_resize=function(){if(!(this._x<20||this._y<20)){var t=this._get_grid_width(),e=Math.max(this._x-t,0),n=Math.max(this._y-this.config.scale_height,0),i=this.config.scroll_size+1,a=Math.max(this.$task_data.offsetWidth-i,0),s=this.config.row_height*this._order.length,r=this._get_resize_options(),o=this._scroll_hor=r.x?!1:a>e,l=this._scroll_ver=r.y?!1:s>n; - -this.$scroll_hor.style.display=o?"block":"none",this.$scroll_hor.style.height=(o?i:0)+"px",this.$scroll_hor.style.width=Math.max(this._x-(l?i:2),0)+"px",this.$scroll_hor.firstChild.style.width=a+t+i+2+"px",this.$scroll_ver.style.display=l?"block":"none",this.$scroll_ver.style.width=(l?i:0)+"px",this.$scroll_ver.style.height=Math.max(this._y-(o?i:0)-this.config.scale_height,0)+"px",this.$scroll_ver.style.top=this.config.scale_height+"px",this.$scroll_ver.firstChild.style.height=this.config.scale_height+s+"px"; - -}},gantt.locate=function(t){var e=gantt._get_target_node(t);if((e.className||"").indexOf("gantt_task_cell")>=0)return null;for(var n=arguments[1]||this.config.task_attribute;e;){if(e.getAttribute){var i=e.getAttribute(n);if(i)return i}e=e.parentNode}return null},gantt._get_target_node=function(t){var e;return t.tagName?e=t:(t=t||window.event,e=t.target||t.srcElement),e},gantt._trim=function(t){var e=String.prototype.trim||function(){return this.replace(/^\s+|\s+$/g,"")};return e.apply(t)},gantt._locate_css=function(t,e,n){ -void 0===n&&(n=!0);for(var i=gantt._get_target_node(t),a="";i;){if(a=i.className){var s=a.indexOf(e);if(s>=0){if(!n)return i;var r=0===s||!gantt._trim(a.charAt(s-1)),o=s+e.length>=a.length||!gantt._trim(a.charAt(s+e.length));if(r&&o)return i}}i=i.parentNode}return null},gantt._locateHTML=function(t,e){var n=gantt._get_target_node(t);for(e=e||this.config.task_attribute;n;){if(n.getAttribute){var i=n.getAttribute(e);if(i)return n}n=n.parentNode}return null},gantt.getTaskRowNode=function(t){for(var e=this.$grid_data.childNodes,n=this.config.task_attribute,i=0;in?!0:t._on_timeout?!1:(setTimeout(function(){delete t._on_timeout},n), -t._on_timeout=!0,!0)},gantt.selectTask=function(t){if(!this.config.select_task)return!1;if(t){if(this._selected_task==t)return this._selected_task;if(!this.callEvent("onBeforeTaskSelected",[t]))return!1;this.unselectTask(),this._selected_task=t,this.refreshTask(t),this.callEvent("onTaskSelected",[t])}return this._selected_task},gantt.unselectTask=function(){var t=this._selected_task;t&&(this._selected_task=null,this.refreshTask(t),this.callEvent("onTaskUnselected",[t]))},gantt.getSelectedId=function(){ -return dhtmlx.defined(this._selected_task)?this._selected_task:null},gantt.changeLightboxType=function(t){return this.getLightboxType()==t?!0:void gantt._silent_redraw_lightbox(t)},gantt._is_render_active=function(){return!this._skip_render},gantt.batchUpdate=function(t){var e,n=this._dp&&"off"!=this._dp.updateMode;n&&(e=this._dp.updateMode,this._dp.setUpdateMode("off")),this._skip_render=!0;try{t()}catch(i){}this._skip_render=!1,this.render(),n&&(this._dp.setUpdateMode(e),this._dp.sendData())},gantt.date={ -init:function(){for(var t=gantt.locale.date.month_short,e=gantt.locale.date.month_short_hash={},n=0;n=0&&!t.getHours()&&n.getHours()&&(n.getDate()t?"0"+t:t},copy:function(t){return new Date(t.valueOf())},date_to_str:function(t,e){return t=t.replace(/%[a-zA-Z]/g,function(t){switch(t){case"%d":return'"+gantt.date.to_fixed(date.getDate())+"';case"%m":return'"+gantt.date.to_fixed((date.getMonth()+1))+"';case"%j":return'"+date.getDate()+"';case"%n":return'"+(date.getMonth()+1)+"'; - -case"%y":return'"+gantt.date.to_fixed(date.getFullYear()%100)+"';case"%Y":return'"+date.getFullYear()+"';case"%D":return'"+gantt.locale.date.day_short[date.getDay()]+"';case"%l":return'"+gantt.locale.date.day_full[date.getDay()]+"';case"%M":return'"+gantt.locale.date.month_short[date.getMonth()]+"';case"%F":return'"+gantt.locale.date.month_full[date.getMonth()]+"';case"%h":return'"+gantt.date.to_fixed((date.getHours()+11)%12+1)+"';case"%g":return'"+((date.getHours()+11)%12+1)+"';case"%G":return'"+date.getHours()+"'; - -case"%H":return'"+gantt.date.to_fixed(date.getHours())+"';case"%i":return'"+gantt.date.to_fixed(date.getMinutes())+"';case"%a":return'"+(date.getHours()>11?"pm":"am")+"';case"%A":return'"+(date.getHours()>11?"PM":"AM")+"';case"%s":return'"+gantt.date.to_fixed(date.getSeconds())+"';case"%W":return'"+gantt.date.to_fixed(gantt.date.getISOWeek(date))+"';default:return t}}),e&&(t=t.replace(/date\.get/g,"date.getUTC")),new Function("date",'return "'+t+'";')},str_to_date:function(t,e){for(var n="var temp=date.match(/[a-zA-Z]+|[0-9]+/g);",i=t.match(/%[a-zA-Z]/g),a=0;a50?1900:2000);";break;case"%g":case"%G":case"%h":case"%H":n+="set[3]=temp["+a+"]||0;";break;case"%i":n+="set[4]=temp["+a+"]||0;";break;case"%Y":n+="set[0]=temp["+a+"]||0;";break;case"%a":case"%A":n+="set[3]=set[3]%12+((temp["+a+"]||'').toLowerCase()=='am'?0:12);";break;case"%s":n+="set[5]=temp["+a+"]||0;";break;case"%M":n+="set[1]=gantt.locale.date.month_short_hash[temp["+a+"]]||0;"; - -break;case"%F":n+="set[1]=gantt.locale.date.month_full_hash[temp["+a+"]]||0;"}var s="set[0],set[1],set[2],set[3],set[4],set[5]";return e&&(s=" Date.UTC("+s+")"),new Function("date","var set=[0,0,1,0,0,0]; "+n+" return new Date("+s+");")},getISOWeek:function(t){if(!t)return!1;var e=t.getDay();0===e&&(e=7);var n=new Date(t.valueOf());n.setDate(t.getDate()+(4-e));var i=n.getFullYear(),a=Math.round((n.getTime()-new Date(i,0,1).getTime())/864e5),s=1+Math.floor(a/7);return s},getUTCISOWeek:function(t){ -return this.getISOWeek(t)},convert_to_utc:function(t){return new Date(t.getUTCFullYear(),t.getUTCMonth(),t.getUTCDate(),t.getUTCHours(),t.getUTCMinutes(),t.getUTCSeconds())},parseDate:function(t,e){return"string"==typeof t&&(dhtmlx.defined(e)&&(e="string"==typeof e?dhtmlx.defined(gantt.templates[e])?gantt.templates[e]:gantt.date.str_to_date(e):gantt.templates.xml_date),t=t?e(t):null),t}},gantt.date.quarter_start=function(t){gantt.date.month_start(t);var e,n=t.getMonth();return e=n>=9?9:n>=6?6:n>=3?3:0, -t.setMonth(e),t},gantt.date.add_quarter=function(t,e){return gantt.date.add(t,3*e,"month")},gantt.config||(gantt.config={}),gantt.config||(gantt.config={}),gantt.templates||(gantt.templates={}),function(){dhtmlx.mixin(gantt.config,{links:{finish_to_start:"0",start_to_start:"1",finish_to_finish:"2",start_to_finish:"3"},types:{task:"task",project:"project",milestone:"milestone"},duration_unit:"day",work_time:!1,correct_work_time:!1,skip_off_time:!1,autosize:!1,autosize_min_width:0,show_links:!0,show_task_cells:!0, -static_background:!1,branch_loading:!1,show_loading:!1,show_chart:!0,show_grid:!0,min_duration:36e5,xml_date:"%d-%m-%Y %H:%i",api_date:"%d-%m-%Y %H:%i",start_on_monday:!0,server_utc:!1,show_progress:!0,fit_tasks:!1,select_task:!0,scroll_on_click:!0,preserve_scroll:!0,readonly:!1,date_grid:"%Y-%m-%d",drag_links:!0,drag_progress:!0,drag_resize:!0,drag_move:!0,drag_mode:{resize:"resize",progress:"progress",move:"move",ignore:"ignore"},round_dnd_dates:!0,link_wrapper_width:20,root_id:0,autofit:!1,columns:[{ -name:"text",tree:!0,width:"*",resize:!0},{name:"start_date",align:"center",resize:!0},{name:"duration",align:"center"},{name:"add",width:"44"}],step:1,scale_unit:"day",scale_offset_minimal:!0,subscales:[],inherit_scale_class:!1,time_step:60,duration_step:1,date_scale:"%d %M",task_date:"%d %F %Y",time_picker:"%H:%i",task_attribute:"task_id",link_attribute:"link_id",layer_attribute:"data-layer",buttons_left:["gantt_save_btn","gantt_cancel_btn"],_migrate_buttons:{dhx_save_btn:"gantt_save_btn",dhx_cancel_btn:"gantt_cancel_btn", -dhx_delete_btn:"gantt_delete_btn"},buttons_right:["gantt_delete_btn"],lightbox:{sections:[{name:"description",height:70,map_to:"text",type:"textarea",focus:!0},{name:"time",type:"duration",map_to:"auto"}],project_sections:[{name:"description",height:70,map_to:"text",type:"textarea",focus:!0},{name:"type",type:"typeselect",map_to:"type"},{name:"time",type:"duration",readonly:!0,map_to:"auto"}],milestone_sections:[{name:"description",height:70,map_to:"text",type:"textarea",focus:!0},{name:"type",type:"typeselect", -map_to:"type"},{name:"time",type:"duration",single_date:!0,map_to:"auto"}]},drag_lightbox:!0,sort:!1,details_on_create:!0,details_on_dblclick:!0,initial_scroll:!0,task_scroll_offset:100,task_height:"full",min_column_width:70,min_grid_column_width:70,grid_resizer_column_attribute:"column_index",grid_resizer_attribute:"grid_resizer",keep_grid_width:!1,grid_resize:!1,readonly_property:"readonly",editable_property:"editable",type_renderers:{},open_tree_initially:!1,optimize_render:"auto",prevent_default_scroll:!1 -}),gantt.keys={edit_save:13,edit_cancel:27},gantt._init_template=function(t,e){var n=this._reg_templates||{};this.config[t]&&n[t]!=this.config[t]&&(e&&this.templates[t]||(this.templates[t]=this.date.date_to_str(this.config[t]),n[t]=this.config[t])),this._reg_templates=n},gantt._init_templates=function(){var t=gantt.locale.labels;t.gantt_save_btn=t.icon_save,t.gantt_cancel_btn=t.icon_cancel,t.gantt_delete_btn=t.icon_delete;var e=this.date.date_to_str,n=this.config;gantt._init_template("date_scale",!0), -gantt._init_template("date_grid",!0),gantt._init_template("task_date",!0),dhtmlx.mixin(this.templates,{xml_date:this.date.str_to_date(n.xml_date,n.server_utc),xml_format:e(n.xml_date,n.server_utc),api_date:this.date.str_to_date(n.api_date),progress_text:function(){return""},grid_header_class:function(){return""},task_text:function(t,e,n){return n.text},task_class:function(){return""},grid_row_class:function(){return""},task_row_class:function(){return""},task_cell_class:function(){return""},scale_cell_class:function(){ -return""},scale_row_class:function(){return""},grid_indent:function(){return"
"},grid_folder:function(t){return"
"},grid_file:function(){return"
"},grid_open:function(t){return"
"},grid_blank:function(){return"
"},task_time:function(t,e){ -return gantt.templates.task_date(t)+" - "+gantt.templates.task_date(e)},time_picker:e(n.time_picker),link_class:function(){return""},link_description:function(t){var e=gantt.getTask(t.source),n=gantt.getTask(t.target);return""+e.text+""+n.text+""},drag_link:function(t,e,n,i){t=gantt.getTask(t);var a=gantt.locale.labels,s=""+t.text+" "+(e?a.link_start:a.link_end)+"
";return n&&(n=gantt.getTask(n),s+=" "+n.text+" "+(i?a.link_start:a.link_end)+"
"),s},drag_link_class:function(t,e,n,i){ -var a="";if(t&&n){var s=gantt.isLinkAllowed(t,n,e,i);a=" "+(s?"gantt_link_allow":"gantt_link_deny")}return"gantt_link_tooltip"+a}}),this.callEvent("onTemplatesReady",[])}}(),window.jQuery&&!function(t){var e=[];t.fn.dhx_gantt=function(n){if(n=n||{},"string"!=typeof n){var i=[];return this.each(function(){if(this&&this.getAttribute&&!this.getAttribute("dhxgantt")){for(var t in n)"data"!=t&&(gantt.config[t]=n[t]);gantt.init(this),n.data&&gantt.parse(n.data),i.push(gantt)}}),1===i.length?i[0]:i}return e[n]?e[n].apply(this,[]):void t.error("Method "+n+" does not exist on jQuery.dhx_gantt"); - -}}(jQuery),window.dhtmlx&&(dhtmlx.attaches||(dhtmlx.attaches={}),dhtmlx.attaches.attachGantt=function(t,e){var n=document.createElement("DIV");n.id="gantt_"+dhtmlx.uid(),n.style.width="100%",n.style.height="100%",n.cmp="grid",document.body.appendChild(n),this.attachObject(n.id);var i=this.vs[this.av];i.grid=gantt,gantt.init(n.id,t,e),n.firstChild.style.border="none",i.gridId=n.id,i.gridObj=n;var a="_viewRestore";return this.vs[this[a]()].grid}),gantt.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:{new_task:"New task",icon_save:"Save",icon_cancel:"Cancel",icon_details:"Details",icon_edit:"Edit",icon_delete:"Delete",confirm_closing:"",confirm_deleting:"Task will be deleted permanently, are you sure?",section_description:"Description",section_time:"Time period",section_type:"Type", -column_text:"Task name",column_start_date:"Start time",column_duration:"Duration",column_add:"",link:"Link",confirm_link_deleting:"will be deleted",link_start:" (start)",link_end:" (end)",type_task:"Task",type_project:"Project",type_milestone:"Milestone",minutes:"Minutes",hours:"Hours",days:"Days",weeks:"Week",months:"Months",years:"Years"}},gantt.skins.skyblue={config:{grid_width:350,row_height:27,scale_height:27,link_line_width:1,link_arrow_size:8,lightbox_additional_height:75},_second_column_width:95, -_third_column_width:80},gantt.skins.meadow={config:{grid_width:350,row_height:27,scale_height:30,link_line_width:2,link_arrow_size:6,lightbox_additional_height:72},_second_column_width:95,_third_column_width:80},gantt.skins.terrace={config:{grid_width:360,row_height:35,scale_height:35,link_line_width:2,link_arrow_size:6,lightbox_additional_height:75},_second_column_width:90,_third_column_width:70},gantt.skins.broadway={config:{grid_width:360,row_height:35,scale_height:35,link_line_width:1,link_arrow_size:7, -lightbox_additional_height:86},_second_column_width:90,_third_column_width:80,_lightbox_template:"
 
",_config_buttons_left:{},_config_buttons_right:{gantt_delete_btn:"icon_delete",gantt_save_btn:"icon_save"}},gantt.config.touch_drag=500,gantt.config.touch=!0,gantt.config.touch_feedback=!0,gantt._touch_feedback=function(){ -gantt.config.touch_feedback&&navigator.vibrate&&navigator.vibrate(1)},gantt._init_touch_events=function(){"force"!=this.config.touch&&(this.config.touch=this.config.touch&&(-1!=navigator.userAgent.indexOf("Mobile")||-1!=navigator.userAgent.indexOf("iPad")||-1!=navigator.userAgent.indexOf("Android")||-1!=navigator.userAgent.indexOf("Touch"))),this.config.touch&&(window.navigator.msPointerEnabled?this._touch_events(["MSPointerMove","MSPointerDown","MSPointerUp"],function(t){return t.pointerType==t.MSPOINTER_TYPE_MOUSE?null:t; - -},function(t){return!t||t.pointerType==t.MSPOINTER_TYPE_MOUSE}):this._touch_events(["touchmove","touchstart","touchend"],function(t){return t.touches&&t.touches.length>1?null:t.touches[0]?{target:t.target,pageX:t.touches[0].pageX,pageY:t.touches[0].pageY,clientX:t.touches[0].clientX,clientY:t.touches[0].clientY}:t},function(){return!1}))},gantt._touch_events=function(t,e,n){function i(t){return t&&t.preventDefault&&t.preventDefault(),(t||event).cancelBubble=!0,!1}function a(t){var e=gantt._task_area_pulls,n=gantt.getTask(t); - -if(n&&gantt.isTaskVisible(t))for(var i in e)if(n=e[i][t],n&&n.getAttribute("task_id")&&n.getAttribute("task_id")==t){var a=n.cloneNode(!0);return h=n,e[i][t]=a,n.style.display="none",a.className+=" gantt_drag_move ",n.parentNode.appendChild(a),a}}var s,r=0,o=!1,l=!1,d=null,_=null,h=null;this._gantt_touch_event_ready||(this._gantt_touch_event_ready=1,dhtmlxEvent(gantt.$container,t[0],function(t){if(!n(t)&&o){_&&clearTimeout(_);var a=e(t);if(gantt._tasks_dnd.drag.id||gantt._tasks_dnd.drag.start_drag)return gantt._tasks_dnd.on_mouse_move(a), -t.preventDefault&&t.preventDefault(),t.cancelBubble=!0,!1;if(a&&d){var h=d.pageX-a.pageX,c=d.pageY-a.pageY;!l&&(Math.abs(h)>5||Math.abs(c)>5)&&(gantt._touch_scroll_active=l=!0,r=0,s=gantt.getScrollState()),l&&gantt.scrollTo(s.x+h,s.y+c)}return i(t)}})),dhtmlxEvent(this.$container,"contextmenu",function(t){return o?i(t):void 0}),dhtmlxEvent(this.$container,t[1],function(t){if(!n(t)){if(t.touches&&t.touches.length>1)return void(o=!1);if(o=!0,d=e(t),d&&r){var s=new Date;500>s-r?(gantt._on_dblclick(d), -i(t)):r=s}else r=new Date;_=setTimeout(function(){var t=gantt.locate(d);t&&-1==d.target.className.indexOf("gantt_link_point")&&(gantt._tasks_dnd.on_mouse_down(d),gantt._tasks_dnd._start_dnd(d),gantt._touch_drag=!0,a(t),gantt.refreshTask(t),gantt._touch_feedback()),_=null},gantt.config.touch_drag)}}),dhtmlxEvent(this.$container,t[2],function(t){if(!n(t)){_&&clearTimeout(_),gantt._touch_drag=!1,o=!1;var i=e(t);gantt._tasks_dnd.on_mouse_up(i),h&&(gantt.refreshTask(gantt.locate(h)),h.parentNode.removeChild(h), -gantt._touch_feedback()),gantt._touch_scroll_active=o=l=!1,h=null}})}; -//# sourceMappingURL=sources/dhtmlxgantt.js.map \ No newline at end of file diff --git a/libraries/dhtmlxgantt/ext/dhtmlxgantt_marker.js b/libraries/dhtmlxgantt/ext/dhtmlxgantt_marker.js deleted file mode 100644 index f419467..0000000 --- a/libraries/dhtmlxgantt/ext/dhtmlxgantt_marker.js +++ /dev/null @@ -1,15 +0,0 @@ -/* -@license - -dhtmlxGantt v.3.2.0 Stardard -This software is covered by GPL license. You also can obtain Commercial or Enterprise license to use it in non-GPL project - please contact sales@dhtmlx.com. Usage without proper license is prohibited. - -(c) Dinamenta, UAB. -*/ -gantt._markers||(gantt._markers={}),gantt.config.show_markers=!0,gantt.attachEvent("onClear",function(){gantt._markers={}}),gantt.attachEvent("onGanttReady",function(){function t(t){if(!gantt.config.show_markers)return!1;if(!t.start_date)return!1;var e=gantt.getState();if(!(+t.start_date>+e.max_date||+t.end_date&&+t.end_date<+e.min_date||+t.start_date<+e.min_date)){var r=document.createElement("div");r.setAttribute("marker_id",t.id);var a="gantt_marker";gantt.templates.marker_class&&(a+=" "+gantt.templates.marker_class(t)), -t.css&&(a+=" "+t.css),t.title&&(r.title=t.title),r.className=a;var n=gantt.posFromDate(t.start_date);if(r.style.left=n+"px",r.style.height=Math.max(gantt._y_from_ind(gantt._order.length),0)+"px",t.end_date){var s=gantt.posFromDate(t.end_date);r.style.width=Math.max(s-n,0)+"px"}return t.text&&(r.innerHTML="
"+t.text+"
"),r}}var e=document.createElement("div");e.className="gantt_marker_area",gantt.$task_data.appendChild(e),gantt.$marker_area=e,gantt._markerRenderer=gantt._task_renderer("markers",t,gantt.$marker_area,null); - -}),gantt.attachEvent("onDataRender",function(){gantt.renderMarkers()}),gantt.getMarker=function(t){return this._markers?this._markers[t]:null},gantt.addMarker=function(t){return t.id=t.id||dhtmlx.uid(),this._markers[t.id]=t,t.id},gantt.deleteMarker=function(t){return this._markers&&this._markers[t]?(delete this._markers[t],!0):!1},gantt.updateMarker=function(t){this._markerRenderer&&this._markerRenderer.render_item(t)},gantt.renderMarkers=function(){if(!this._markers)return!1;if(!this._markerRenderer)return!1; - -var t=[];for(var e in this._markers)t.push(this._markers[e]);return this._markerRenderer.render_items(t),!0}; -//# sourceMappingURL=../sources/ext/dhtmlxgantt_marker.js.map \ No newline at end of file diff --git a/libraries/dhtmlxgantt/ext/dhtmlxgantt_multiselect.js b/libraries/dhtmlxgantt/ext/dhtmlxgantt_multiselect.js deleted file mode 100644 index b754190..0000000 --- a/libraries/dhtmlxgantt/ext/dhtmlxgantt_multiselect.js +++ /dev/null @@ -1,21 +0,0 @@ -/* -@license - -dhtmlxGantt v.3.2.0 Stardard -This software is covered by GPL license. You also can obtain Commercial or Enterprise license to use it in non-GPL project - please contact sales@dhtmlx.com. Usage without proper license is prohibited. - -(c) Dinamenta, UAB. -*/ -gantt.config.multiselect=!0,gantt.config.multiselect_one_level=!1,gantt._multiselect={selected:{},one_level:!0,active:!0,isActive:function(){return this.update_state(),this.active},update_state:function(){this.one_level=gantt.config.multiselect_one_level;var t=this.active;this.active=gantt.config.multiselect,this.active!=t&&this.reset()},reset:function(){this.selected={}},set_last_selected:function(t){this.last_selected=t},getLastSelected:function(){return this.last_selected?this.last_selected:null; - -},select:function(t,e){gantt.callEvent("onBeforeTaskMultiSelect",[t,!0,e])&&(this.selected[t]=!0,this.set_last_selected(t),gantt.callEvent("onTaskMultiSelect",[t,!0,e]))},toggle:function(t,e){this.selected[t]?this.unselect(t,e):this.select(t,e)},unselect:function(t,e){gantt.callEvent("onBeforeTaskMultiSelect",[t,!1,e])&&(this.selected[t]=!1,this.last_selected==t&&(this.last_selected=null),gantt.callEvent("onTaskMultiSelect",[t,!0,e]))},isSelected:function(t){return!!this.selected[t]},getSelected:function(){ -var t=[];for(var e in this.selected)this.selected[e]&&t.push(e);return t.sort(function(t,e){return gantt.calculateTaskLevel(gantt.getTask(t))>gantt.calculateTaskLevel(gantt.getTask(e))?1:-1}),t},forSelected:function(t){for(var e=this.getSelected(),n=0;nl?gantt.getNext(r):gantt.getPrev(r);this.forSelected(dhtmlx.bind(function(t){var e=gantt.getGlobalTaskIndex(t);(e>s&&e>l||s>e&&l>e)&&(this.unselect(t),gantt.refreshTask(t))},this))}}else this.forSelected(dhtmlx.bind(function(t){t!=e&&(this.unselect(t),gantt.refreshTask(t))},this)),this.isSelected(e)||(this.select(e),this._after_select(e));return this.isSelected(e)?!0:!1}},function(){var t=gantt.selectTask;gantt.selectTask=function(e){var n=t.call(this,e);return this.config.multiselect&&this._multiselect.select(e), -n};var e=gantt.unselectTask;gantt.unselectTask=function(t){var n=e.call(this,t);return this.config.multiselect&&this._multiselect.unselect(t),n},gantt.toggleTaskSelection=function(t){this.config.multiselect&&this._multiselect.toggle(t)},gantt.getSelectedTasks=function(){return this._multiselect.getSelected()},gantt.eachSelectedTask=function(t){return this._multiselect.forSelected(t)},gantt.isSelectedTask=function(t){return this._multiselect.isSelected(t)},gantt.getLastSelectedTask=function(){return this._multiselect.getLastSelected(); - -}}(),gantt.attachEvent("onTaskIdChange",function(t,e){var n=gantt._multiselect;return n.isActive()?void(gantt.isSelectedTask(t)&&(n.unselect(t,null),n.select(e,null),gantt.refreshTask(e))):!0}),gantt.attachEvent("onAfterTaskDelete",function(t){var e=gantt._multiselect;return e.isActive()?(e.selected[t]&&e.unselect(t,null),void e.forSelected(function(t){gantt.isTaskExists(t)||e.unselect(t,null)})):!0}),gantt.attachEvent("onBeforeTaskMultiSelect",function(t,e){var n=gantt._multiselect;return e&&n.isActive()?n.is_same_level(t):!0; - -}),gantt.attachEvent("onTaskClick",function(t,e){var n=gantt._multiselect._do_selection(e);return gantt.callEvent("onMultiSelect",[e]),n}),gantt.attachEvent("onEmptyClick",function(t){return gantt._multiselect._do_selection(t),gantt.callEvent("onMultiSelect",[t]),!0}); -//# sourceMappingURL=../sources/ext/dhtmlxgantt_multiselect.js.map \ No newline at end of file diff --git a/libraries/dhtmlxgantt/ext/dhtmlxgantt_quick_info.js b/libraries/dhtmlxgantt/ext/dhtmlxgantt_quick_info.js deleted file mode 100644 index dc5d60a..0000000 --- a/libraries/dhtmlxgantt/ext/dhtmlxgantt_quick_info.js +++ /dev/null @@ -1,22 +0,0 @@ -/* -@license - -dhtmlxGantt v.3.2.0 Stardard -This software is covered by GPL license. You also can obtain Commercial or Enterprise license to use it in non-GPL project - please contact sales@dhtmlx.com. Usage without proper license is prohibited. - -(c) Dinamenta, UAB. -*/ -gantt.config.quickinfo_buttons=["icon_delete","icon_edit"],gantt.config.quick_info_detached=!0,gantt.config.show_quick_info=!0,gantt.attachEvent("onTaskClick",function(t){return gantt.showQuickInfo(t),!0}),function(){for(var t=["onEmptyClick","onViewChange","onLightbox","onBeforeTaskDelete","onBeforeDrag"],e=function(){return gantt._hideQuickInfo(),!0},n=0;n
';a+='
';for(var s=gantt.config.quickinfo_buttons,r={icon_delete:!0,icon_edit:!0},o=0;o
"+gantt.locale.labels[s[o]]+"
"); - -a+="",i.innerHTML=a,dhtmlxEvent(i,"click",function(t){t=t||event,gantt._qi_button_click(t.target||t.srcElement)}),gantt.config.quick_info_detached&&dhtmlxEvent(gantt.$task_data,"scroll",function(){gantt.hideQuickInfo()})}return this._quick_info_box},gantt._qi_button_click=function(t){var e=gantt._quick_info_box;if(t&&t!=e){var n=t.className;if(-1!=n.indexOf("_icon")){var i=gantt._quick_info_box_id;gantt.$click.buttons[n.split(" ")[1].replace("icon_","")](i)}else gantt._qi_button_click(t.parentNode); - -}},gantt._get_event_counter_part=function(t){for(var e=gantt.getTaskNode(t),n=0,i=0,a=e;a&&"gantt_task"!=a.className;)n+=a.offsetLeft,i+=a.offsetTop,a=a.offsetParent;var s=this.getScrollState();if(a){var r=n+e.offsetWidth/2-s.x>gantt._x/2?1:0,o=i+e.offsetHeight/2-s.y>gantt._y/2?1:0;return{left:n,top:i,dx:r,dy:o,width:e.offsetWidth,height:e.offsetHeight}}return 0},gantt._fill_quick_data=function(t){var e=gantt.getTask(t),n=gantt._quick_info_box;gantt._quick_info_box_id=t;var i=n.firstChild.firstChild; - -i.innerHTML=gantt.templates.quick_info_title(e.start_date,e.end_date,e);var a=i.nextSibling;a.innerHTML=gantt.templates.quick_info_date(e.start_date,e.end_date,e);var s=n.firstChild.nextSibling;s.innerHTML=gantt.templates.quick_info_content(e.start_date,e.end_date,e)}; -//# sourceMappingURL=../sources/ext/dhtmlxgantt_quick_info.js.map \ No newline at end of file diff --git a/libraries/dhtmlxgantt/ext/dhtmlxgantt_tooltip.js b/libraries/dhtmlxgantt/ext/dhtmlxgantt_tooltip.js deleted file mode 100644 index 34fb639..0000000 --- a/libraries/dhtmlxgantt/ext/dhtmlxgantt_tooltip.js +++ /dev/null @@ -1,17 +0,0 @@ -/* -@license - -dhtmlxGantt v.3.2.0 Stardard -This software is covered by GPL license. You also can obtain Commercial or Enterprise license to use it in non-GPL project - please contact sales@dhtmlx.com. Usage without proper license is prohibited. - -(c) Dinamenta, UAB. -*/ -gantt._tooltip={},gantt._tooltip_class="gantt_tooltip",gantt.config.tooltip_timeout=30,gantt.config.tooltip_offset_y=20,gantt.config.tooltip_offset_x=10,gantt._create_tooltip=function(){return this._tooltip_html||(this._tooltip_html=document.createElement("div"),this._tooltip_html.className=gantt._tooltip_class),this._tooltip_html},gantt._is_cursor_under_tooltip=function(t,e){return t.x>=e.pos.x&&t.x<=e.pos.x+e.width?!0:t.y>=e.pos.y&&t.y<=e.pos.y+e.height?!0:!1},gantt._show_tooltip=function(t,e){ -if(!gantt.config.touch||gantt.config.touch_tooltip){var n=this._create_tooltip();n.innerHTML=t,gantt.$task_data.appendChild(n);var i=n.offsetWidth+20,a=n.offsetHeight+40,s=this.$task.offsetHeight,r=this.$task.offsetWidth,o=this.getScrollState();e.y+=o.y;var l={x:e.x,y:e.y};e.x+=1*gantt.config.tooltip_offset_x||0,e.y+=1*gantt.config.tooltip_offset_y||0,e.y=Math.min(Math.max(o.y,e.y),o.y+s-a),e.x=Math.min(Math.max(o.x,e.x),o.x+r-i),gantt._is_cursor_under_tooltip(l,{pos:e,width:i,height:a})&&(l.x+i>r+o.x&&(e.x=l.x-(i-20)-(1*gantt.config.tooltip_offset_x||0)), -l.y+a>s+o.y&&(e.y=l.y-(a-40)-(1*gantt.config.tooltip_offset_y||0))),n.style.left=e.x+"px",n.style.top=e.y+"px"}},gantt._hide_tooltip=function(){this._tooltip_html&&this._tooltip_html.parentNode&&this._tooltip_html.parentNode.removeChild(this._tooltip_html),this._tooltip_id=0},gantt._is_tooltip=function(t){var e=t.target||t.srcElement;return gantt._is_node_child(e,function(t){return t.className==this._tooltip_class})},gantt._is_task_line=function(t){var e=t.target||t.srcElement;return gantt._is_node_child(e,function(t){ -return t==this.$task_data})},gantt._is_node_child=function(t,e){for(var n=!1;t&&!n;)n=e.call(gantt,t),t=t.parentNode;return n},gantt._tooltip_pos=function(t){if(t.pageX||t.pageY)var e={x:t.pageX,y:t.pageY};var n=_isIE?document.documentElement:document.body,e={x:t.clientX+n.scrollLeft-n.clientLeft,y:t.clientY+n.scrollTop-n.clientTop},i=gantt._get_position(gantt.$task_data);return e.x=e.x-i.x,e.y=e.y-i.y,e},gantt.attachEvent("onMouseMove",function(t,e){if(this.config.tooltip_timeout){document.createEventObject&&!document.createEvent&&(e=document.createEventObject(e)); - -var n=this.config.tooltip_timeout;this._tooltip_id&&!t&&(isNaN(this.config.tooltip_hide_timeout)||(n=this.config.tooltip_hide_timeout)),clearTimeout(gantt._tooltip_ev_timer),gantt._tooltip_ev_timer=setTimeout(function(){gantt._init_tooltip(t,e)},n)}else gantt._init_tooltip(t,e)}),gantt._init_tooltip=function(t,e){if(!this._is_tooltip(e)&&(t!=this._tooltip_id||this._is_task_line(e))){if(!t)return this._hide_tooltip();this._tooltip_id=t;var n=this.getTask(t),i=this.templates.tooltip_text(n.start_date,n.end_date,n); - -return i?void this._show_tooltip(i,this._tooltip_pos(e)):void this._hide_tooltip()}},gantt.attachEvent("onMouseLeave",function(t){gantt._is_tooltip(t)||this._hide_tooltip()}),gantt.templates.tooltip_date_format=gantt.date.date_to_str("%Y-%m-%d"),gantt.templates.tooltip_text=function(t,e,n){return"Task: "+n.text+"
Start date: "+gantt.templates.tooltip_date_format(t)+"
End date: "+gantt.templates.tooltip_date_format(e)}; -//# sourceMappingURL=../sources/ext/dhtmlxgantt_tooltip.js.map \ No newline at end of file diff --git a/libraries/dhtmlxgantt/locale/locale.js b/libraries/dhtmlxgantt/locale/locale.js deleted file mode 100644 index c14377f..0000000 --- a/libraries/dhtmlxgantt/locale/locale.js +++ /dev/null @@ -1,11 +0,0 @@ -/* -@license - -dhtmlxGantt v.3.2.0 Stardard -This software is covered by GPL license. You also can obtain Commercial or Enterprise license to use it in non-GPL project - please contact sales@dhtmlx.com. Usage without proper license is prohibited. - -(c) Dinamenta, UAB. -*/ -gantt.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:{new_task:"New task",icon_save:"Save",icon_cancel:"Cancel",icon_details:"Details",icon_edit:"Edit",icon_delete:"Delete",confirm_closing:"", -confirm_deleting:"Task will be deleted permanently, are you sure?",section_description:"Description",section_time:"Time period",section_type:"Type",column_text:"Task name",column_start_date:"Start time",column_duration:"Duration",column_add:"",link:"Link",confirm_link_deleting:"will be deleted",link_start:" (start)",link_end:" (end)",type_task:"Task",type_project:"Project",type_milestone:"Milestone",minutes:"Minutes",hours:"Hours",days:"Days",weeks:"Week",months:"Months",years:"Years"}}; -//# sourceMappingURL=../sources/locale/locale.js.map \ No newline at end of file diff --git a/libraries/dhtmlxgantt/locale/locale_ar.js b/libraries/dhtmlxgantt/locale/locale_ar.js deleted file mode 100644 index d59ed1c..0000000 --- a/libraries/dhtmlxgantt/locale/locale_ar.js +++ /dev/null @@ -1,12 +0,0 @@ -/* -@license - -dhtmlxGantt v.3.2.0 Stardard -This software is covered by GPL license. You also can obtain Commercial or Enterprise license to use it in non-GPL project - please contact sales@dhtmlx.com. Usage without proper license is prohibited. - -(c) Dinamenta, UAB. -*/ -gantt.locale={date:{month_full:["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول"],month_short:["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر"],day_full:["الأحد","الأثنين","ألثلاثاء","الأربعاء","ألحميس","ألجمعة","السبت"],day_short:["احد","اثنين","ثلاثاء","اربعاء","خميس","جمعة","سبت"]},labels:{dhx_cal_today_button:"اليوم",day_tab:"يوم",week_tab:"أسبوع",month_tab:"شهر",new_event:"حدث جديد", -icon_save:"اخزن",icon_cancel:"الغاء",icon_details:"تفاصيل",icon_edit:"تحرير",icon_delete:"حذف",confirm_closing:"التغييرات سوف تضيع, هل انت متأكد؟",confirm_deleting:"الحدث سيتم حذفها نهائيا ، هل أنت متأكد؟",section_description:"الوصف",section_time:"الفترة الزمنية",section_type:"Type",column_text:"Task name",column_start_date:"Start time",column_duration:"Duration",column_add:"",link:"Link",confirm_link_deleting:"will be deleted",link_start:" (start)",link_end:" (end)",type_task:"Task",type_project:"Project", -type_milestone:"Milestone",minutes:"Minutes",hours:"Hours",days:"Days",weeks:"Week",months:"Months",years:"Years"}}; -//# sourceMappingURL=../sources/locale/locale_ar.js.map \ No newline at end of file diff --git a/libraries/dhtmlxgantt/locale/locale_be.js b/libraries/dhtmlxgantt/locale/locale_be.js deleted file mode 100644 index d80b92b..0000000 --- a/libraries/dhtmlxgantt/locale/locale_be.js +++ /dev/null @@ -1,12 +0,0 @@ -/* -@license - -dhtmlxGantt v.3.2.0 Stardard -This software is covered by GPL license. You also can obtain Commercial or Enterprise license to use it in non-GPL project - please contact sales@dhtmlx.com. Usage without proper license is prohibited. - -(c) Dinamenta, UAB. -*/ -gantt.locale={date:{month_full:["Студзень","Люты","Сакавік","Красавік","Maй","Чэрвень","Ліпень","Жнівень","Верасень","Кастрычнік","Лістапад","Снежань"],month_short:["Студз","Лют","Сак","Крас","Maй","Чэр","Ліп","Жнів","Вер","Каст","Ліст","Снеж"],day_full:["Нядзеля","Панядзелак","Аўторак","Серада","Чацвер","Пятніца","Субота"],day_short:["Нд","Пн","Аўт","Ср","Чцв","Пт","Сб"]},labels:{dhx_cal_today_button:"Сёння",day_tab:"Дзень",week_tab:"Тыдзень",month_tab:"Месяц",new_event:"Новая падзея",icon_save:"Захаваць", -icon_cancel:"Адмяніць",icon_details:"Дэталі",icon_edit:"Змяніць",icon_delete:"Выдаліць",confirm_closing:"",confirm_deleting:"Падзея будзе выдалена незваротна, працягнуць?",section_description:"Апісанне",section_time:"Перыяд часу",section_type:"Тып",column_text:"Задача",column_start_date:"Пачатак",column_duration:"Працяг",column_add:"",link:"Сувязь",confirm_link_deleting:"будзе выдалена",link_start:"(пачатак)",link_end:"(канец)",type_task:"Task",type_project:"Project",type_milestone:"Milestone",minutes:"Хвiлiна", -hours:"Гадзiна",days:"Дзень",weeks:"Тыдзень",months:"Месяц",years:"Год"}}; -//# sourceMappingURL=../sources/locale/locale_be.js.map \ No newline at end of file diff --git a/libraries/dhtmlxgantt/locale/locale_ca.js b/libraries/dhtmlxgantt/locale/locale_ca.js deleted file mode 100644 index 29bfbdf..0000000 --- a/libraries/dhtmlxgantt/locale/locale_ca.js +++ /dev/null @@ -1,12 +0,0 @@ -/* -@license - -dhtmlxGantt v.3.2.0 Stardard -This software is covered by GPL license. You also can obtain Commercial or Enterprise license to use it in non-GPL project - please contact sales@dhtmlx.com. Usage without proper license is prohibited. - -(c) Dinamenta, UAB. -*/ -gantt.locale={date:{month_full:["Gener","Febrer","Març","Abril","Maig","Juny","Juliol","Agost","Setembre","Octubre","Novembre","Desembre"],month_short:["Gen","Feb","Mar","Abr","Mai","Jun","Jul","Ago","Set","Oct","Nov","Des"],day_full:["Diumenge","Dilluns","Dimarts","Dimecres","Dijous","Divendres","Dissabte"],day_short:["Dg","Dl","Dm","Dc","Dj","Dv","Ds"]},labels:{dhx_cal_today_button:"Hui",day_tab:"Dia",week_tab:"Setmana",month_tab:"Mes",new_event:"Nou esdeveniment",icon_save:"Guardar",icon_cancel:"Cancel·lar", -icon_details:"Detalls",icon_edit:"Editar",icon_delete:"Esborrar",confirm_closing:"",confirm_deleting:"L'esdeveniment s'esborrarà definitivament, continuar ?",section_description:"Descripció",section_time:"Periode de temps",section_type:"Type",column_text:"Task name",column_start_date:"Start time",column_duration:"Duration",column_add:"",link:"Link",confirm_link_deleting:"will be deleted",link_start:" (start)",link_end:" (end)",type_task:"Task",type_project:"Project",type_milestone:"Milestone",minutes:"Minutes", -hours:"Hours",days:"Days",weeks:"Week",months:"Months",years:"Years"}}; -//# sourceMappingURL=../sources/locale/locale_ca.js.map \ No newline at end of file diff --git a/libraries/dhtmlxgantt/locale/locale_cn.js b/libraries/dhtmlxgantt/locale/locale_cn.js deleted file mode 100644 index 3f8e7b2..0000000 --- a/libraries/dhtmlxgantt/locale/locale_cn.js +++ /dev/null @@ -1,11 +0,0 @@ -/* -@license - -dhtmlxGantt v.3.2.0 Stardard -This software is covered by GPL license. You also can obtain Commercial or Enterprise license to use it in non-GPL project - please contact sales@dhtmlx.com. Usage without proper license is prohibited. - -(c) Dinamenta, UAB. -*/ -gantt.config.day_date="%M %d日 %D",gantt.config.default_date="%Y年 %M %d日",gantt.config.month_date="%Y年 %M",gantt.locale={date:{month_full:["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],month_short:["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"],day_full:["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],day_short:["日","一","二","三","四","五","六"]},labels:{dhx_cal_today_button:"今天",day_tab:"日",week_tab:"周",month_tab:"月",new_event:"新建日程",icon_save:"保存",icon_cancel:"关闭",icon_details:"详细", -icon_edit:"编辑",icon_delete:"删除",confirm_closing:"请确认是否撤销修改!",confirm_deleting:"是否删除日程?",section_description:"描述",section_time:"时间范围",section_type:"Type",column_text:"Task name",column_start_date:"Start time",column_duration:"Duration",column_add:"",link:"Link",confirm_link_deleting:"will be deleted",link_start:" (start)",link_end:" (end)",type_task:"Task",type_project:"Project",type_milestone:"Milestone",minutes:"Minutes",hours:"Hours",days:"Days",weeks:"Week",months:"Months",years:"Years"}}; -//# sourceMappingURL=../sources/locale/locale_cn.js.map \ No newline at end of file diff --git a/libraries/dhtmlxgantt/locale/locale_cs.js b/libraries/dhtmlxgantt/locale/locale_cs.js deleted file mode 100644 index cc7d286..0000000 --- a/libraries/dhtmlxgantt/locale/locale_cs.js +++ /dev/null @@ -1,12 +0,0 @@ -/* -@license - -dhtmlxGantt v.3.2.0 Stardard -This software is covered by GPL license. You also can obtain Commercial or Enterprise license to use it in non-GPL project - please contact sales@dhtmlx.com. Usage without proper license is prohibited. - -(c) Dinamenta, UAB. -*/ -gantt.locale={date:{month_full:["Leden","Únor","Březen","Duben","Květen","Červen","Červenec","Srpen","Září","Říjen","Listopad","Prosinec"],month_short:["Led","Ún","Bře","Dub","Kvě","Čer","Čec","Srp","Září","Říj","List","Pro"],day_full:["Neděle","Pondělí","Úterý","Středa","Čtvrtek","Pátek","Sobota"],day_short:["Ne","Po","Út","St","Čt","Pá","So"]},labels:{dhx_cal_today_button:"Dnes",day_tab:"Den",week_tab:"Týden",month_tab:"Měsíc",new_event:"Nová událost",icon_save:"Uložit",icon_cancel:"Zpět",icon_details:"Detail", -icon_edit:"Edituj",icon_delete:"Smazat",confirm_closing:"",confirm_deleting:"Událost bude trvale smazána, opravdu?",section_description:"Poznámky",section_time:"Doba platnosti",section_type:"Type",column_text:"Task name",column_start_date:"Start time",column_duration:"Duration",column_add:"",link:"Link",confirm_link_deleting:"will be deleted",link_start:" (start)",link_end:" (end)",type_task:"Task",type_project:"Project",type_milestone:"Milestone",minutes:"Minutes",hours:"Hours",days:"Days",weeks:"Week", -months:"Months",years:"Years"}}; -//# sourceMappingURL=../sources/locale/locale_cs.js.map \ No newline at end of file diff --git a/libraries/dhtmlxgantt/locale/locale_da.js b/libraries/dhtmlxgantt/locale/locale_da.js deleted file mode 100644 index 88265b3..0000000 --- a/libraries/dhtmlxgantt/locale/locale_da.js +++ /dev/null @@ -1,12 +0,0 @@ -/* -@license - -dhtmlxGantt v.3.2.0 Stardard -This software is covered by GPL license. You also can obtain Commercial or Enterprise license to use it in non-GPL project - please contact sales@dhtmlx.com. Usage without proper license is prohibited. - -(c) Dinamenta, UAB. -*/ -gantt.locale={date:{month_full:["Januar","Februar","Marts","April","Maj","Juni","Juli","August","September","Oktober","November","December"],month_short:["Jan","Feb","Mar","Apr","Maj","Jun","Jul","Aug","Sep","Okt","Nov","Dec"],day_full:["Søndag","Mandag","Tirsdag","Onsdag","Torsdag","Fredag","Lørdag"],day_short:["Søn","Man","Tir","Ons","Tor","Fre","Lør"]},labels:{dhx_cal_today_button:"Idag",day_tab:"Dag",week_tab:"Uge",month_tab:"Måned",new_event:"Ny begivenhed",icon_save:"Gem",icon_cancel:"Fortryd", -icon_details:"Detaljer",icon_edit:"Tilret",icon_delete:"Slet",confirm_closing:"Dine rettelser vil gå tabt.. Er dy sikker?",confirm_deleting:"Bigivenheden vil blive slettet permanent. Er du sikker?",section_description:"Beskrivelse",section_time:"Tidsperiode",section_type:"Type",column_text:"Task name",column_start_date:"Start time",column_duration:"Duration",column_add:"",link:"Link",confirm_link_deleting:"will be deleted",link_start:" (start)",link_end:" (end)",type_task:"Task",type_project:"Project", -type_milestone:"Milestone",minutes:"Minutes",hours:"Hours",days:"Days",weeks:"Week",months:"Months",years:"Years"}}; -//# sourceMappingURL=../sources/locale/locale_da.js.map \ No newline at end of file diff --git a/libraries/dhtmlxgantt/locale/locale_de.js b/libraries/dhtmlxgantt/locale/locale_de.js deleted file mode 100644 index 0b316e8..0000000 --- a/libraries/dhtmlxgantt/locale/locale_de.js +++ /dev/null @@ -1,12 +0,0 @@ -/* -@license - -dhtmlxGantt v.3.2.0 Stardard -This software is covered by GPL license. You also can obtain Commercial or Enterprise license to use it in non-GPL project - please contact sales@dhtmlx.com. Usage without proper license is prohibited. - -(c) Dinamenta, UAB. -*/ -gantt.locale={date:{month_full:[" Januar"," Februar"," März "," April"," Mai"," Juni"," Juli"," August"," September "," Oktober"," November "," Dezember"],month_short:["Jan","Feb","Mär","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dec"],day_full:["Sonntag","Montag","Dienstag"," Mittwoch"," Donnerstag","Freitag","Samstag"],day_short:["So","Mo","Di","Mi","Do","Fr","Sa"]},labels:{dhx_cal_today_button:"Heute",day_tab:"Tag",week_tab:"Woche",month_tab:"Monat",new_event:"neuer Eintrag",icon_save:"Speichern", -icon_cancel:"Abbrechen",icon_details:"Details",icon_edit:"Ändern",icon_delete:"Löschen",confirm_closing:"",confirm_deleting:"Der Eintrag wird gelöscht",section_description:"Beschreibung",section_time:"Zeitspanne",section_type:"Type",column_text:"Task-Namen",column_start_date:"Startzeit",column_duration:"Dauer",column_add:"",link:"Link",confirm_link_deleting:"werden gelöscht",link_start:"(starten)",link_end:"(ende)",type_task:"Task",type_project:"Project",type_milestone:"Milestone",minutes:"Minuten", -hours:"Stunden",days:"Tage",weeks:"Wochen",months:"Monate",years:"Jahre"}}; -//# sourceMappingURL=../sources/locale/locale_de.js.map \ No newline at end of file diff --git a/libraries/dhtmlxgantt/locale/locale_el.js b/libraries/dhtmlxgantt/locale/locale_el.js deleted file mode 100644 index 9b791ad..0000000 --- a/libraries/dhtmlxgantt/locale/locale_el.js +++ /dev/null @@ -1,12 +0,0 @@ -/* -@license - -dhtmlxGantt v.3.2.0 Stardard -This software is covered by GPL license. You also can obtain Commercial or Enterprise license to use it in non-GPL project - please contact sales@dhtmlx.com. Usage without proper license is prohibited. - -(c) Dinamenta, UAB. -*/ -gantt.locale={date:{month_full:["Ιανουάριος","Φεβρουάριος","Μάρτιος","Απρίλιος","Μάϊος","Ιούνιος","Ιούλιος","Αύγουστος","Σεπτέμβριος","Οκτώβριος","Νοέμβριος","Δεκέμβριος"],month_short:["ΙΑΝ","ΦΕΒ","ΜΑΡ","ΑΠΡ","ΜΑΙ","ΙΟΥΝ","ΙΟΥΛ","ΑΥΓ","ΣΕΠ","ΟΚΤ","ΝΟΕ","ΔΕΚ"],day_full:["Κυριακή","Δευτέρα","Τρίτη","Τετάρτη","Πέμπτη","Παρασκευή","Κυριακή"],day_short:["ΚΥ","ΔΕ","ΤΡ","ΤΕ","ΠΕ","ΠΑ","ΣΑ"]},labels:{dhx_cal_today_button:"Σήμερα",day_tab:"Ημέρα",week_tab:"Εβδομάδα",month_tab:"Μήνας",new_event:"Νέο έργο", -icon_save:"Αποθήκευση",icon_cancel:"Άκυρο",icon_details:"Λεπτομέρειες",icon_edit:"Επεξεργασία",icon_delete:"Διαγραφή",confirm_closing:"",confirm_deleting:"Το έργο θα διαγραφεί οριστικά. Θέλετε να συνεχίσετε;",section_description:"Περιγραφή",section_time:"Χρονική περίοδος",section_type:"Type",column_text:"Task name",column_start_date:"Start time",column_duration:"Duration",column_add:"",link:"Link",confirm_link_deleting:"will be deleted",link_start:" (start)",link_end:" (end)",type_task:"Task",type_project:"Project", -type_milestone:"Milestone",minutes:"Minutes",hours:"Hours",days:"Days",weeks:"Week",months:"Months",years:"Years"}}; -//# sourceMappingURL=../sources/locale/locale_el.js.map \ No newline at end of file diff --git a/libraries/dhtmlxgantt/locale/locale_es.js b/libraries/dhtmlxgantt/locale/locale_es.js deleted file mode 100644 index 104180c..0000000 --- a/libraries/dhtmlxgantt/locale/locale_es.js +++ /dev/null @@ -1,12 +0,0 @@ -/* -@license - -dhtmlxGantt v.3.2.0 Stardard -This software is covered by GPL license. You also can obtain Commercial or Enterprise license to use it in non-GPL project - please contact sales@dhtmlx.com. Usage without proper license is prohibited. - -(c) Dinamenta, UAB. -*/ -gantt.locale={date:{month_full:["Enero","Febrero","Marzo","Abril","Mayo","Junio","Julio","Agosto","Septiembre","Octubre","Noviembre","Diciembre"],month_short:["Ene","Feb","Mar","Abr","May","Jun","Jul","Ago","Sep","Oct","Nov","Dic"],day_full:["Domingo","Lunes","Martes","Miércoles","Jueves","Viernes","Sábado"],day_short:["Dom","Lun","Mar","Mié","Jue","Vie","Sáb"]},labels:{dhx_cal_today_button:"Hoy",day_tab:"Día",week_tab:"Semana",month_tab:"Mes",new_event:"Nuevo evento",icon_save:"Guardar",icon_cancel:"Cancelar", -icon_details:"Detalles",icon_edit:"Editar",icon_delete:"Eliminar",confirm_closing:"",confirm_deleting:"El evento se borrará definitivamente, ¿continuar?",section_description:"Descripción",section_time:"Período",section_type:"Type",column_text:"Tarea",column_start_date:"Inicio",column_duration:"Dur.",column_add:"",link:"Link",confirm_link_deleting:"will be deleted",link_start:" (start)",link_end:" (end)",type_task:"Task",type_project:"Project",type_milestone:"Milestone",minutes:"Minutes", -hours:"Hours",days:"Days",weeks:"Week",months:"Months",years:"Years"}}; -//# sourceMappingURL=../sources/locale/locale_es.js.map \ No newline at end of file diff --git a/libraries/dhtmlxgantt/locale/locale_fi.js b/libraries/dhtmlxgantt/locale/locale_fi.js deleted file mode 100644 index f02fa3e..0000000 --- a/libraries/dhtmlxgantt/locale/locale_fi.js +++ /dev/null @@ -1,12 +0,0 @@ -/* -@license - -dhtmlxGantt v.3.2.0 Stardard -This software is covered by GPL license. You also can obtain Commercial or Enterprise license to use it in non-GPL project - please contact sales@dhtmlx.com. Usage without proper license is prohibited. - -(c) Dinamenta, UAB. -*/ -gantt.locale={date:{month_full:["Tammikuu","Helmikuu","Maaliskuu","Huhtikuu","Toukokuu","Kesäkuu","Heinäkuu","Elokuu","Syyskuu","Lokakuu","Marraskuu","Joulukuu"],month_short:["Tam","Hel","Maa","Huh","Tou","Kes","Hei","Elo","Syy","Lok","Mar","Jou"],day_full:["Sunnuntai","Maanantai","Tiistai","Keskiviikko","Torstai","Perjantai","Lauantai"],day_short:["Su","Ma","Ti","Ke","To","Pe","La"]},labels:{dhx_cal_today_button:"Tänään",day_tab:"Päivä",week_tab:"Viikko",month_tab:"Kuukausi",new_event:"Uusi tapahtuma", -icon_save:"Tallenna",icon_cancel:"Peru",icon_details:"Tiedot",icon_edit:"Muokkaa",icon_delete:"Poista",confirm_closing:"",confirm_deleting:"Haluatko varmasti poistaa tapahtuman?",section_description:"Kuvaus",section_time:"Aikajakso",section_type:"Type",column_text:"Task name",column_start_date:"Start time",column_duration:"Duration",column_add:"",link:"Link",confirm_link_deleting:"will be deleted",link_start:" (start)",link_end:" (end)",type_task:"Task",type_project:"Project",type_milestone:"Milestone", -minutes:"Minutes",hours:"Hours",days:"Days",weeks:"Week",months:"Months",years:"Years"}}; -//# sourceMappingURL=../sources/locale/locale_fi.js.map \ No newline at end of file diff --git a/libraries/dhtmlxgantt/locale/locale_fr.js b/libraries/dhtmlxgantt/locale/locale_fr.js deleted file mode 100644 index 51a9de9..0000000 --- a/libraries/dhtmlxgantt/locale/locale_fr.js +++ /dev/null @@ -1,12 +0,0 @@ -/* -@license - -dhtmlxGantt v.3.2.0 Stardard -This software is covered by GPL license. You also can obtain Commercial or Enterprise license to use it in non-GPL project - please contact sales@dhtmlx.com. Usage without proper license is prohibited. - -(c) Dinamenta, UAB. -*/ -gantt.locale={date:{month_full:["Janvier","Février","Mars","Avril","Mai","Juin","Juillet","Août","Septembre","Octobre","Novembre","Décembre"],month_short:["Jan","Fév","Mar","Avr","Mai","Juin","Juil","Aoû","Sep","Oct","Nov","Déc"],day_full:["Dimanche","Lundi","Mardi","Mercredi","Jeudi","Vendredi","Samedi"],day_short:["Dim","Lun","Mar","Mer","Jeu","Ven","Sam"]},labels:{new_task:"Nouvelle tâche",icon_save:"Enregistrer",icon_cancel:"Annuler",icon_details:"Détails",icon_edit:"Modifier",icon_delete:"Effacer", -confirm_closing:"",confirm_deleting:"L'événement sera effacé sans appel, êtes-vous sûr ?",section_description:"Description",section_time:"Période",section_type:"Type",column_text:"Nom de la tâche",column_start_date:"Date initiale",column_duration:"Durée",column_add:"",link:"Le lien",confirm_link_deleting:"sera supprimé",link_start:"(début)",link_end:"(fin)",type_task:"Task",type_project:"Project",type_milestone:"Milestone",minutes:"Minutes",hours:"Heures",days:"Jours",weeks:"Semaines",months:"Mois", -years:"Années"}}; -//# sourceMappingURL=../sources/locale/locale_fr.js.map \ No newline at end of file diff --git a/libraries/dhtmlxgantt/locale/locale_he.js b/libraries/dhtmlxgantt/locale/locale_he.js deleted file mode 100644 index 669fba3..0000000 --- a/libraries/dhtmlxgantt/locale/locale_he.js +++ /dev/null @@ -1,11 +0,0 @@ -/* -@license - -dhtmlxGantt v.3.2.0 Stardard -This software is covered by GPL license. You also can obtain Commercial or Enterprise license to use it in non-GPL project - please contact sales@dhtmlx.com. Usage without proper license is prohibited. - -(c) Dinamenta, UAB. -*/ -gantt.locale={date:{month_full:["ינואר","פברואר","מרץ","אפריל","מאי","יוני","יולי","אוגוסט","ספטמבר","אוקטובר","נובמבר","דצמבר"],month_short:["ינו","פבר","מרץ","אפר","מאי","יונ","יול","אוג","ספט","אוק","נוב","דצמ"],day_full:["ראשון","שני","שלישי","רביעי","חמישי","שישי","שבת"],day_short:["א","ב","ג","ד","ה","ו","ש"]},labels:{dhx_cal_today_button:"היום",day_tab:"יום",week_tab:"שבוע",month_tab:"חודש",new_event:"ארוע חדש",icon_save:"שמור",icon_cancel:"בטל",icon_details:"פרטים",icon_edit:"ערוך",icon_delete:"מחק", -confirm_closing:"",confirm_deleting:"ארוע ימחק סופית.להמשיך?",section_description:"הסבר",section_time:"תקופה",section_type:"Type",column_text:"Task name",column_start_date:"Start time",column_duration:"Duration",column_add:"",link:"Link",confirm_link_deleting:"will be deleted",link_start:" (start)",link_end:" (end)",type_task:"Task",type_project:"Project",type_milestone:"Milestone",minutes:"Minutes",hours:"Hours",days:"Days",weeks:"Week",months:"Months",years:"Years"}}; -//# sourceMappingURL=../sources/locale/locale_he.js.map \ No newline at end of file diff --git a/libraries/dhtmlxgantt/locale/locale_hu.js b/libraries/dhtmlxgantt/locale/locale_hu.js deleted file mode 100644 index 005b9b9..0000000 --- a/libraries/dhtmlxgantt/locale/locale_hu.js +++ /dev/null @@ -1,12 +0,0 @@ -/* -@license - -dhtmlxGantt v.3.2.0 Stardard -This software is covered by GPL license. You also can obtain Commercial or Enterprise license to use it in non-GPL project - please contact sales@dhtmlx.com. Usage without proper license is prohibited. - -(c) Dinamenta, UAB. -*/ -gantt.locale={date:{month_full:["Január","Február","Március","Április","Május","Június","Július","Augusztus","Szeptember","Október","November","December"],month_short:["Jan","Feb","Már","Ápr","Máj","Jún","Júl","Aug","Sep","Okt","Nov","Dec"],day_full:["Vasárnap","Hétfõ","Kedd","Szerda","Csütörtök","Péntek","szombat"],day_short:["Va","Hé","Ke","Sze","Csü","Pé","Szo"]},labels:{dhx_cal_today_button:"Ma",day_tab:"Nap",week_tab:"Hét",month_tab:"Hónap",new_event:"Új esemény",icon_save:"Mentés",icon_cancel:"Mégse", -icon_details:"Részletek",icon_edit:"Szerkesztés",icon_delete:"Törlés",confirm_closing:"",confirm_deleting:"Az esemény törölve lesz, biztosan folytatja?",section_description:"Leírás",section_time:"Idõszak",section_type:"Type",column_text:"Task name",column_start_date:"Start time",column_duration:"Duration",column_add:"",link:"Link",confirm_link_deleting:"will be deleted",link_start:" (start)",link_end:" (end)",type_task:"Task",type_project:"Project",type_milestone:"Milestone",minutes:"Minutes",hours:"Hours", -days:"Days",weeks:"Week",months:"Months",years:"Years"}}; -//# sourceMappingURL=../sources/locale/locale_hu.js.map \ No newline at end of file diff --git a/libraries/dhtmlxgantt/locale/locale_id.js b/libraries/dhtmlxgantt/locale/locale_id.js deleted file mode 100644 index 1871c5f..0000000 --- a/libraries/dhtmlxgantt/locale/locale_id.js +++ /dev/null @@ -1,12 +0,0 @@ -/* -@license - -dhtmlxGantt v.3.2.0 Stardard -This software is covered by GPL license. You also can obtain Commercial or Enterprise license to use it in non-GPL project - please contact sales@dhtmlx.com. Usage without proper license is prohibited. - -(c) Dinamenta, UAB. -*/ -gantt.locale={date:{month_full:["Januari","Februari","Maret","April","Mei","Juni","Juli","Agustus","September","Oktober","November","Desember"],month_short:["Jan","Feb","Mar","Apr","Mei","Jun","Jul","Ags","Sep","Okt","Nov","Des"],day_full:["Minggu","Senin","Selasa","Rabu","Kamis","Jumat","Sabtu"],day_short:["Ming","Sen","Sel","Rab","Kam","Jum","Sab"]},labels:{dhx_cal_today_button:"Hari Ini",day_tab:"Hari",week_tab:"Minggu",month_tab:"Bulan",new_event:"Acara Baru",icon_save:"Simpan",icon_cancel:"Batal", -icon_details:"Detail",icon_edit:"Edit",icon_delete:"Hapus",confirm_closing:"",confirm_deleting:"Acara akan dihapus",section_description:"Keterangan",section_time:"Periode",section_type:"Type",column_text:"Task name",column_start_date:"Start time",column_duration:"Duration",column_add:"",link:"Link",confirm_link_deleting:"will be deleted",link_start:" (start)",link_end:" (end)",type_task:"Task",type_project:"Project",type_milestone:"Milestone",minutes:"Minutes",hours:"Hours",days:"Days",weeks:"Week", -months:"Months",years:"Years"}}; -//# sourceMappingURL=../sources/locale/locale_id.js.map \ No newline at end of file diff --git a/libraries/dhtmlxgantt/locale/locale_it.js b/libraries/dhtmlxgantt/locale/locale_it.js deleted file mode 100644 index 55c1fcc..0000000 --- a/libraries/dhtmlxgantt/locale/locale_it.js +++ /dev/null @@ -1,12 +0,0 @@ -/* -@license - -dhtmlxGantt v.3.2.0 Stardard -This software is covered by GPL license. You also can obtain Commercial or Enterprise license to use it in non-GPL project - please contact sales@dhtmlx.com. Usage without proper license is prohibited. - -(c) Dinamenta, UAB. -*/ -gantt.locale={date:{month_full:["Gennaio","Febbraio","Marzo","Aprile","Maggio","Giugno","Luglio","Agosto","Settembre","Ottobre","Novembre","Dicembre"],month_short:["Gen","Feb","Mar","Apr","Mag","Giu","Lug","Ago","Set","Ott","Nov","Dic"],day_full:["Domenica","Lunedì","Martedì","Mercoledì","Giovedì","Venerdì","Sabato"],day_short:["Dom","Lun","Mar","Mer","Gio","Ven","Sab"]},labels:{dhx_cal_today_button:"Oggi",day_tab:"Giorno",week_tab:"Settimana",month_tab:"Mese",new_event:"Nuovo evento",icon_save:"Salva", -icon_cancel:"Chiudi",icon_details:"Dettagli",icon_edit:"Modifica",icon_delete:"Elimina",confirm_closing:"",confirm_deleting:"L'evento sarà eliminato, siete sicuri?",section_description:"Descrizione",section_time:"Periodo di tempo",section_type:"Type",column_text:"Task name",column_start_date:"Start time",column_duration:"Duration",column_add:"",link:"Link",confirm_link_deleting:"will be deleted",link_start:" (start)",link_end:" (end)",type_task:"Task",type_project:"Project",type_milestone:"Milestone", -minutes:"Minutes",hours:"Hours",days:"Days",weeks:"Week",months:"Months",years:"Years"}}; -//# sourceMappingURL=../sources/locale/locale_it.js.map \ No newline at end of file diff --git a/libraries/dhtmlxgantt/locale/locale_jp.js b/libraries/dhtmlxgantt/locale/locale_jp.js deleted file mode 100644 index f59fe5e..0000000 --- a/libraries/dhtmlxgantt/locale/locale_jp.js +++ /dev/null @@ -1,11 +0,0 @@ -/* -@license - -dhtmlxGantt v.3.2.0 Stardard -This software is covered by GPL license. You also can obtain Commercial or Enterprise license to use it in non-GPL project - please contact sales@dhtmlx.com. Usage without proper license is prohibited. - -(c) Dinamenta, UAB. -*/ -gantt.locale={date:{month_full:["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"],month_short:["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"],day_full:["日曜日","月曜日","火曜日","水曜日","木曜日","金曜日","土曜日"],day_short:["日","月","火","水","木","金","土"]},labels:{dhx_cal_today_button:"今日",day_tab:"日",week_tab:"週",month_tab:"月",new_event:"新イベント",icon_save:"保存",icon_cancel:"キャンセル",icon_details:"詳細",icon_edit:"編集",icon_delete:"削除",confirm_closing:"",confirm_deleting:"イベント完全に削除されます、宜しいですか?", -section_description:"デスクリプション",section_time:"期間",section_type:"Type",column_text:"Task name",column_start_date:"Start time",column_duration:"Duration",column_add:"",link:"Link",confirm_link_deleting:"will be deleted",link_start:" (start)",link_end:" (end)",type_task:"Task",type_project:"Project",type_milestone:"Milestone",minutes:"Minutes",hours:"Hours",days:"Days",weeks:"Week",months:"Months",years:"Years"}}; -//# sourceMappingURL=../sources/locale/locale_jp.js.map \ No newline at end of file diff --git a/libraries/dhtmlxgantt/locale/locale_kr.js b/libraries/dhtmlxgantt/locale/locale_kr.js deleted file mode 100644 index 3668a4f..0000000 --- a/libraries/dhtmlxgantt/locale/locale_kr.js +++ /dev/null @@ -1,11 +0,0 @@ -/* -@license - -dhtmlxGantt v.3.2.0 Stardard -This software is covered by GPL license. You also can obtain Commercial or Enterprise license to use it in non-GPL project - please contact sales@dhtmlx.com. Usage without proper license is prohibited. - -(c) Dinamenta, UAB. -*/ -gantt.locale={date:{month_full:["1월","2월","3월","4월","5월","6월","7월","8월","9월","10월","11월","12월"],month_short:["1월","2월","3월","4월","5월","6월","7월","8월","9월","10월","11월","12월"],day_full:["일요일","월요일","화요일","수요일","목요일","금요일","토요일"],day_short:["일","월","화","수","목","금","토"]},labels:{new_task:"이름없는 작업",icon_save:"저장",icon_cancel:"취소",icon_details:"세부 사항",icon_edit:"수정",icon_delete:"삭제",confirm_closing:"",confirm_deleting:"작업을 삭제하시겠습니까?",section_description:"설명",section_time:"기간",section_type:"Type",column_text:"작업명", -column_start_date:"시작일",column_duration:"기간",column_add:"",link:"전제",confirm_link_deleting:"삭제 하시겠습니까?",link_start:" (start)",link_end:" (end)",type_task:"작업",type_project:"프로젝트",type_milestone:"마일스톤",minutes:"분",hours:"시간",days:"일",weeks:"주",months:"달",years:"년"}}; -//# sourceMappingURL=../sources/locale/locale_kr.js.map \ No newline at end of file diff --git a/libraries/dhtmlxgantt/locale/locale_nb.js b/libraries/dhtmlxgantt/locale/locale_nb.js deleted file mode 100644 index 6e05718..0000000 --- a/libraries/dhtmlxgantt/locale/locale_nb.js +++ /dev/null @@ -1,12 +0,0 @@ -/* -@license - -dhtmlxGantt v.3.2.0 Stardard -This software is covered by GPL license. You also can obtain Commercial or Enterprise license to use it in non-GPL project - please contact sales@dhtmlx.com. Usage without proper license is prohibited. - -(c) Dinamenta, UAB. -*/ -gantt.locale={date:{month_full:["Januar","Februar","Mars","April","Mai","Juni","Juli","August","September","Oktober","November","Desember"],month_short:["Jan","Feb","Mar","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Des"],day_full:["Søndag","Mandag","Tirsdag","Onsdag","Torsdag","Fredag","Lørdag"],day_short:["Søn","Mon","Tir","Ons","Tor","Fre","Lør"]},labels:{dhx_cal_today_button:"I dag",day_tab:"Dag",week_tab:"Uke",month_tab:"Måned",new_event:"Ny hendelse",icon_save:"Lagre",icon_cancel:"Avbryt", -icon_details:"Detaljer",icon_edit:"Rediger",icon_delete:"Slett",confirm_closing:"",confirm_deleting:"Hendelsen vil bli slettet permanent. Er du sikker?",section_description:"Beskrivelse",section_time:"Tidsperiode",section_type:"Type",column_text:"Task name",column_start_date:"Start time",column_duration:"Duration",column_add:"",link:"Link",confirm_link_deleting:"will be deleted",link_start:" (start)",link_end:" (end)",type_task:"Task",type_project:"Project",type_milestone:"Milestone",minutes:"Minutes", -hours:"Hours",days:"Days",weeks:"Week",months:"Months",years:"Years"}}; -//# sourceMappingURL=../sources/locale/locale_nb.js.map \ No newline at end of file diff --git a/libraries/dhtmlxgantt/locale/locale_nl.js b/libraries/dhtmlxgantt/locale/locale_nl.js deleted file mode 100644 index 583c9f3..0000000 --- a/libraries/dhtmlxgantt/locale/locale_nl.js +++ /dev/null @@ -1,12 +0,0 @@ -/* -@license - -dhtmlxGantt v.3.2.0 Stardard -This software is covered by GPL license. You also can obtain Commercial or Enterprise license to use it in non-GPL project - please contact sales@dhtmlx.com. Usage without proper license is prohibited. - -(c) Dinamenta, UAB. -*/ -gantt.locale={date:{month_full:["Januari","Februari","Maart","April","Mei","Juni","Juli","Augustus","September","Oktober","November","December"],month_short:["Jan","Feb","mrt","Apr","Mei","Jun","Jul","Aug","Sep","Okt","Nov","Dec"],day_full:["Zondag","Maandag","Dinsdag","Woensdag","Donderdag","Vrijdag","Zaterdag"],day_short:["Zo","Ma","Di","Wo","Do","Vr","Za"]},labels:{dhx_cal_today_button:"Vandaag",day_tab:"Dag",week_tab:"Week",month_tab:"Maand",new_event:"Nieuw item",icon_save:"Opslaan",icon_cancel:"Annuleren", -icon_details:"Details",icon_edit:"Bewerken",icon_delete:"Verwijderen",confirm_closing:"",confirm_deleting:"Item zal permanent worden verwijderd, doorgaan?",section_description:"Beschrijving",section_time:"Tijd periode",section_type:"Type",column_text:"Taak omschrijving",column_start_date:"Startdatum",column_duration:"Duur",column_add:"",link:"Koppeling",confirm_link_deleting:"zal worden verwijderd",link_start:" (start)",link_end:" (eind)",type_task:"Task",type_project:"Project",type_milestone:"Milestone", -minutes:"minuten",hours:"uren",days:"dagen",weeks:"weken",months:"maanden",years:"jaren"}}; -//# sourceMappingURL=../sources/locale/locale_nl.js.map \ No newline at end of file diff --git a/libraries/dhtmlxgantt/locale/locale_no.js b/libraries/dhtmlxgantt/locale/locale_no.js deleted file mode 100644 index c3ae154..0000000 --- a/libraries/dhtmlxgantt/locale/locale_no.js +++ /dev/null @@ -1,12 +0,0 @@ -/* -@license - -dhtmlxGantt v.3.2.0 Stardard -This software is covered by GPL license. You also can obtain Commercial or Enterprise license to use it in non-GPL project - please contact sales@dhtmlx.com. Usage without proper license is prohibited. - -(c) Dinamenta, UAB. -*/ -gantt.locale={date:{month_full:["Januar","Februar","Mars","April","Mai","Juni","Juli","August","September","Oktober","November","Desember"],month_short:["Jan","Feb","Mar","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Des"],day_full:["Søndag","Mandag","Tirsdag","Onsdag","Torsdag","Fredag","Lørdag"],day_short:["Søn","Man","Tir","Ons","Tor","Fre","Lør"]},labels:{dhx_cal_today_button:"Idag",day_tab:"Dag",week_tab:"Uke",month_tab:"Måned",new_event:"Ny",icon_save:"Lagre",icon_cancel:"Avbryt",icon_details:"Detaljer", -icon_edit:"Endre",icon_delete:"Slett",confirm_closing:"Endringer blir ikke lagret, er du sikker?",confirm_deleting:"Oppføringen vil bli slettet, er du sikker?",section_description:"Beskrivelse",section_time:"Tidsperiode",section_type:"Type",column_text:"Task name",column_start_date:"Start time",column_duration:"Duration",column_add:"",link:"Link",confirm_link_deleting:"will be deleted",link_start:" (start)",link_end:" (end)",type_task:"Task",type_project:"Project",type_milestone:"Milestone",minutes:"Minutes", -hours:"Hours",days:"Days",weeks:"Week",months:"Months",years:"Years"}}; -//# sourceMappingURL=../sources/locale/locale_no.js.map \ No newline at end of file diff --git a/libraries/dhtmlxgantt/locale/locale_pl.js b/libraries/dhtmlxgantt/locale/locale_pl.js deleted file mode 100644 index c7926c5..0000000 --- a/libraries/dhtmlxgantt/locale/locale_pl.js +++ /dev/null @@ -1,12 +0,0 @@ -/* -@license - -dhtmlxGantt v.3.2.0 Stardard -This software is covered by GPL license. You also can obtain Commercial or Enterprise license to use it in non-GPL project - please contact sales@dhtmlx.com. Usage without proper license is prohibited. - -(c) Dinamenta, UAB. -*/ -gantt.locale={date:{month_full:["Styczeń","Luty","Marzec","Kwiecień","Maj","Czerwiec","Lipiec","Sierpień","Wrzesień","Październik","Listopad","Grudzień"],month_short:["Sty","Lut","Mar","Kwi","Maj","Cze","Lip","Sie","Wrz","Paź","Lis","Gru"],day_full:["Niedziela","Poniedziałek","Wtorek","Środa","Czwartek","Piątek","Sobota"],day_short:["Nie","Pon","Wto","Śro","Czw","Pią","Sob"]},labels:{dhx_cal_today_button:"Dziś",day_tab:"Dzień",week_tab:"Tydzień",month_tab:"Miesiąc",new_event:"Nowe zdarzenie",icon_save:"Zapisz", -icon_cancel:"Anuluj",icon_details:"Szczegóły",icon_edit:"Edytuj",icon_delete:"Usuń",confirm_closing:"",confirm_deleting:"Zdarzenie zostanie usunięte na zawsze, kontynuować?",section_description:"Opis",section_time:"Okres czasu",section_type:"Typ",column_text:"Nazwa zadania",column_start_date:"Początek",column_duration:"Czas trwania",column_add:"",link:"Link",confirm_link_deleting:"zostanie usunięty",link_start:" (początek)",link_end:" (koniec)",type_task:"Zadanie",type_project:"Projekt",type_milestone:"Milestone", -minutes:"Minuty",hours:"Godziny",days:"Dni",weeks:"Tydzień",months:"Miesiące",years:"Lata"}}; -//# sourceMappingURL=../sources/locale/locale_pl.js.map \ No newline at end of file diff --git a/libraries/dhtmlxgantt/locale/locale_pt.js b/libraries/dhtmlxgantt/locale/locale_pt.js deleted file mode 100644 index 96feb40..0000000 --- a/libraries/dhtmlxgantt/locale/locale_pt.js +++ /dev/null @@ -1,12 +0,0 @@ -/* -@license - -dhtmlxGantt v.3.2.0 Stardard -This software is covered by GPL license. You also can obtain Commercial or Enterprise license to use it in non-GPL project - please contact sales@dhtmlx.com. Usage without proper license is prohibited. - -(c) Dinamenta, UAB. -*/ -gantt.locale={date:{month_full:["Janeiro","Fevereiro","Março","Abril","Maio","Junho","Julho","Agosto","Setembro","Outubro","Novembro","Dezembro"],month_short:["Jan","Fev","Mar","Abr","Mai","Jun","Jul","Ago","Set","Out","Nov","Dez"],day_full:["Domingo","Segunda","Terça","Quarta","Quinta","Sexta","Sábado"],day_short:["Dom","Seg","Ter","Qua","Qui","Sex","Sab"]},labels:{dhx_cal_today_button:"Hoje",day_tab:"Dia",week_tab:"Semana",month_tab:"Mês",new_event:"Novo evento",icon_save:"Salvar",icon_cancel:"Cancelar", -icon_details:"Detalhes",icon_edit:"Editar",icon_delete:"Deletar",confirm_closing:"Suas alterações serão perdidas. Você tem certeza?",confirm_deleting:"Tem certeza que deseja excluir?",section_description:"Descrição",section_time:"Período de tempo",section_type:"Type",column_text:"Nome tarefa",column_start_date:"Data início",column_duration:"Duração",column_add:"",link:"Link",confirm_link_deleting:"será apagado",link_start:" (início)",link_end:" (fim)",type_task:"Task",type_project:"Project",type_milestone:"Milestone", -minutes:"Minutos",hours:"Horas",days:"Dias",weeks:"Semanas",months:"Meses",years:"Anos"}}; -//# sourceMappingURL=../sources/locale/locale_pt.js.map \ No newline at end of file diff --git a/libraries/dhtmlxgantt/locale/locale_ro.js b/libraries/dhtmlxgantt/locale/locale_ro.js deleted file mode 100644 index fb9eb15..0000000 --- a/libraries/dhtmlxgantt/locale/locale_ro.js +++ /dev/null @@ -1,12 +0,0 @@ -/* -@license - -dhtmlxGantt v.3.2.0 Stardard -This software is covered by GPL license. You also can obtain Commercial or Enterprise license to use it in non-GPL project - please contact sales@dhtmlx.com. Usage without proper license is prohibited. - -(c) Dinamenta, UAB. -*/ -gantt.locale={date:{month_full:["Ianuarie","Februarie","Martie","Aprilie","Mai","Iunie","Iulie","August","Septembrie","Octombrie","November","December"],month_short:["Ian","Feb","Mar","Apr","Mai","Iun","Iul","Aug","Sep","Oct","Nov","Dec"],day_full:["Duminica","Luni","Marti","Miercuri","Joi","Vineri","Sambata"],day_short:["Du","Lu","Ma","Mi","Jo","Vi","Sa"]},labels:{dhx_cal_today_button:"Astazi",day_tab:"Zi",week_tab:"Saptamana",month_tab:"Luna",new_event:"Eveniment nou",icon_save:"Salveaza",icon_cancel:"Anuleaza", -icon_details:"Detalii",icon_edit:"Editeaza",icon_delete:"Sterge",confirm_closing:"Schimbarile nu vor fi salvate, esti sigur?",confirm_deleting:"Evenimentul va fi sters permanent, esti sigur?",section_description:"Descriere",section_time:"Interval",section_type:"Type",column_text:"Task name",column_start_date:"Start time",column_duration:"Duration",column_add:"",link:"Link",confirm_link_deleting:"will be deleted",link_start:" (start)",link_end:" (end)",type_task:"Task",type_project:"Project",type_milestone:"Milestone", -minutes:"Minutes",hours:"Hours",days:"Days",weeks:"Week",months:"Months",years:"Years"}}; -//# sourceMappingURL=../sources/locale/locale_ro.js.map \ No newline at end of file diff --git a/libraries/dhtmlxgantt/locale/locale_ru.js b/libraries/dhtmlxgantt/locale/locale_ru.js deleted file mode 100644 index 97d7ab1..0000000 --- a/libraries/dhtmlxgantt/locale/locale_ru.js +++ /dev/null @@ -1,12 +0,0 @@ -/* -@license - -dhtmlxGantt v.3.2.0 Stardard -This software is covered by GPL license. You also can obtain Commercial or Enterprise license to use it in non-GPL project - please contact sales@dhtmlx.com. Usage without proper license is prohibited. - -(c) Dinamenta, UAB. -*/ -gantt.locale={date:{month_full:["Январь","Февраль","Март","Апрель","Maй","Июнь","Июль","Август","Сентябрь","Oктябрь","Ноябрь","Декабрь"],month_short:["Янв","Фев","Maр","Aпр","Maй","Июн","Июл","Aвг","Сен","Окт","Ноя","Дек"],day_full:["Воскресенье","Понедельник","Вторник","Среда","Четверг","Пятница","Суббота"],day_short:["Вс","Пн","Вт","Ср","Чт","Пт","Сб"]},labels:{dhx_cal_today_button:"Сегодня",day_tab:"День",week_tab:"Неделя",month_tab:"Месяц",new_event:"Новое событие",icon_save:"Сохранить",icon_cancel:"Отменить", -icon_details:"Детали",icon_edit:"Изменить",icon_delete:"Удалить",confirm_closing:"",confirm_deleting:"Событие будет удалено безвозвратно, продолжить?",section_description:"Описание",section_time:"Период времени",section_type:"Тип",column_text:"Задача",column_start_date:"Начало",column_duration:"Длительность",column_add:"",link:"Связь",confirm_link_deleting:"будет удалена",link_start:" (начало)",link_end:" (конец)",type_task:"Task",type_project:"Project",type_milestone:"Milestone",minutes:"Минута", -hours:"Час",days:"День",weeks:"Неделя",months:"Месяц",years:"Год"}}; -//# sourceMappingURL=../sources/locale/locale_ru.js.map \ No newline at end of file diff --git a/libraries/dhtmlxgantt/locale/locale_si.js b/libraries/dhtmlxgantt/locale/locale_si.js deleted file mode 100644 index 6a079cf..0000000 --- a/libraries/dhtmlxgantt/locale/locale_si.js +++ /dev/null @@ -1,12 +0,0 @@ -/* -@license - -dhtmlxGantt v.3.2.0 Stardard -This software is covered by GPL license. You also can obtain Commercial or Enterprise license to use it in non-GPL project - please contact sales@dhtmlx.com. Usage without proper license is prohibited. - -(c) Dinamenta, UAB. -*/ -gantt.locale={date:{month_full:["Januar","Februar","Marec","April","Maj","Junij","Julij","Avgust","September","Oktober","November","December"],month_short:["Jan","Feb","Mar","Apr","Maj","Jun","Jul","Aug","Sep","Okt","Nov","Dec"],day_full:["Nedelja","Ponedeljek","Torek","Sreda","Četrtek","Petek","Sobota"],day_short:["Ned","Pon","Tor","Sre","Čet","Pet","Sob"]},labels:{dhx_cal_today_button:"Danes",day_tab:"Dan",week_tab:"Teden",month_tab:"Mesec",new_event:"Nov dogodek",icon_save:"Shrani",icon_cancel:"Prekliči", -icon_details:"Podrobnosti",icon_edit:"Uredi",icon_delete:"Izbriši",confirm_closing:"",confirm_deleting:"Dogodek bo izbrisan. Želite nadaljevati?",section_description:"Opis",section_time:"Časovni okvir",section_type:"Type",column_text:"Task name",column_start_date:"Start time",column_duration:"Duration",column_add:"",link:"Link",confirm_link_deleting:"will be deleted",link_start:" (start)",link_end:" (end)",type_task:"Task",type_project:"Project",type_milestone:"Milestone",minutes:"Minutes",hours:"Hours", -days:"Days",weeks:"Week",months:"Months",years:"Years"}}; -//# sourceMappingURL=../sources/locale/locale_si.js.map \ No newline at end of file diff --git a/libraries/dhtmlxgantt/locale/locale_sk.js b/libraries/dhtmlxgantt/locale/locale_sk.js deleted file mode 100644 index a6fe071..0000000 --- a/libraries/dhtmlxgantt/locale/locale_sk.js +++ /dev/null @@ -1,12 +0,0 @@ -/* -@license - -dhtmlxGantt v.3.2.0 Stardard -This software is covered by GPL license. You also can obtain Commercial or Enterprise license to use it in non-GPL project - please contact sales@dhtmlx.com. Usage without proper license is prohibited. - -(c) Dinamenta, UAB. -*/ -gantt.locale={date:{month_full:["Január","Február","Marec","Apríl","Máj","Jún","Júl","August","September","Október","November","December"],month_short:["Jan","Feb","Mar","Apr","Máj","Jún","Júl","Aug","Sept","Okt","Nov","Dec"],day_full:["Nedeľa","Pondelok","Utorok","Streda","Štvrtok","Piatok","Sobota"],day_short:["Ne","Po","Ut","St","Št","Pi","So"]},labels:{dhx_cal_today_button:"Dnes",day_tab:"Deň",week_tab:"Týždeň",month_tab:"Mesiac",new_event:"Nová udalosť",icon_save:"Uložiť",icon_cancel:"Späť", -icon_details:"Detail",icon_edit:"Edituj",icon_delete:"Zmazať",confirm_closing:"Vaše zmeny nebudú uložené. Skutočne?",confirm_deleting:"Udalosť bude natrvalo vymazaná. Skutočne?",section_description:"Poznámky",section_time:"Doba platnosti",section_type:"Type",column_text:"Task name",column_start_date:"Start time",column_duration:"Duration",column_add:"",link:"Link",confirm_link_deleting:"will be deleted",link_start:" (start)",link_end:" (end)",type_task:"Task",type_project:"Project",type_milestone:"Milestone", -minutes:"Minutes",hours:"Hours",days:"Days",weeks:"Week",months:"Months",years:"Years"}}; -//# sourceMappingURL=../sources/locale/locale_sk.js.map \ No newline at end of file diff --git a/libraries/dhtmlxgantt/locale/locale_sv.js b/libraries/dhtmlxgantt/locale/locale_sv.js deleted file mode 100644 index b1adfc6..0000000 --- a/libraries/dhtmlxgantt/locale/locale_sv.js +++ /dev/null @@ -1,12 +0,0 @@ -/* -@license - -dhtmlxGantt v.3.2.0 Stardard -This software is covered by GPL license. You also can obtain Commercial or Enterprise license to use it in non-GPL project - please contact sales@dhtmlx.com. Usage without proper license is prohibited. - -(c) Dinamenta, UAB. -*/ -gantt.locale={date:{month_full:["Januari","Februari","Mars","April","Maj","Juni","Juli","Augusti","September","Oktober","November","December"],month_short:["Jan","Feb","Mar","Apr","Maj","Jun","Jul","Aug","Sep","Okt","Nov","Dec"],day_full:["Söndag","Måndag","Tisdag","Onsdag","Torsdag","Fredag","Lördag"],day_short:["Sön","Mån","Tis","Ons","Tor","Fre","Lör"]},labels:{dhx_cal_today_button:"Idag",day_tab:"Dag",week_tab:"Vecka",month_tab:"Månad",new_event:"Ny händelse",icon_save:"Spara",icon_cancel:"Avbryt", -icon_details:"Detajer",icon_edit:"Ändra",icon_delete:"Ta bort",confirm_closing:"",confirm_deleting:"Är du säker på att du vill ta bort händelsen permanent?",section_description:"Beskrivning",section_time:"Tid",section_type:"Typ",column_text:"Uppgiftsnamn",column_start_date:"Starttid",column_duration:"Varaktighet",column_add:"",link:"Länk",confirm_link_deleting:"kommer tas bort",link_start:" (start)",link_end:" (slut)",type_task:"Uppgift",type_project:"Projekt",type_milestone:"Milstolpe",minutes:"Minuter", -hours:"Timmar",days:"Dagar",weeks:"Veckor",months:"Månader",years:"År"}}; -//# sourceMappingURL=../sources/locale/locale_sv.js.map \ No newline at end of file diff --git a/libraries/dhtmlxgantt/locale/locale_tr.js b/libraries/dhtmlxgantt/locale/locale_tr.js deleted file mode 100644 index 0dc70db..0000000 --- a/libraries/dhtmlxgantt/locale/locale_tr.js +++ /dev/null @@ -1,12 +0,0 @@ -/* -@license - -dhtmlxGantt v.3.2.0 Stardard -This software is covered by GPL license. You also can obtain Commercial or Enterprise license to use it in non-GPL project - please contact sales@dhtmlx.com. Usage without proper license is prohibited. - -(c) Dinamenta, UAB. -*/ -gantt.locale={date:{month_full:["Ocak","Þubat","Mart","Nisan","Mayýs","Haziran","Temmuz","Aðustos","Eylül","Ekim","Kasým","Aralýk"],month_short:["Oca","Þub","Mar","Nis","May","Haz","Tem","Aðu","Eyl","Eki","Kas","Ara"],day_full:["Pazar","Pazartes,","Salý","Çarþamba","Perþembe","Cuma","Cumartesi"],day_short:["Paz","Pts","Sal","Çar","Per","Cum","Cts"]},labels:{dhx_cal_today_button:"Bugün",day_tab:"Gün",week_tab:"Hafta",month_tab:"Ay",new_event:"Uygun",icon_save:"Kaydet",icon_cancel:"Ýptal",icon_details:"Detaylar", -icon_edit:"Düzenle",icon_delete:"Sil",confirm_closing:"",confirm_deleting:"Etkinlik silinecek, devam?",section_description:"Açýklama",section_time:"Zaman aralýðý",section_type:"Type",column_text:"Task name",column_start_date:"Start time",column_duration:"Duration",column_add:"",link:"Link",confirm_link_deleting:"will be deleted",link_start:" (start)",link_end:" (end)",type_task:"Task",type_project:"Project",type_milestone:"Milestone",minutes:"Minutes",hours:"Hours",days:"Days",weeks:"Week",months:"Months", -years:"Years"}}; -//# sourceMappingURL=../sources/locale/locale_tr.js.map \ No newline at end of file diff --git a/libraries/dhtmlxgantt/locale/locale_ua.js b/libraries/dhtmlxgantt/locale/locale_ua.js deleted file mode 100644 index 3305c0a..0000000 --- a/libraries/dhtmlxgantt/locale/locale_ua.js +++ /dev/null @@ -1,12 +0,0 @@ -/* -@license - -dhtmlxGantt v.3.2.0 Stardard -This software is covered by GPL license. You also can obtain Commercial or Enterprise license to use it in non-GPL project - please contact sales@dhtmlx.com. Usage without proper license is prohibited. - -(c) Dinamenta, UAB. -*/ -gantt.locale={date:{month_full:["Січень","Лютий","Березень","Квітень","Травень","Червень","Липень","Серпень","Вересень","Жовтень","Листопад","Грудень"],month_short:["Січ","Лют","Бер","Кві","Тра","Чер","Лип","Сер","Вер","Жов","Лис","Гру"],day_full:["Неділя","Понеділок","Вівторок","Середа","Четвер","П'ятниця","Субота"],day_short:["Нед","Пон","Вів","Сер","Чет","Птн","Суб"]},labels:{dhx_cal_today_button:"Сьогодні",day_tab:"День",week_tab:"Тиждень",month_tab:"Місяць",new_event:"Нова подія",icon_save:"Зберегти", -icon_cancel:"Відміна",icon_details:"Деталі",icon_edit:"Редагувати",icon_delete:"Вилучити",confirm_closing:"",confirm_deleting:"Подія вилучиться назавжди. Ви впевнені?",section_description:"Опис",section_time:"Часовий проміжок",section_type:"Тип",column_text:"Task name",column_start_date:"Start time",column_duration:"Duration",column_add:"",link:"Link",confirm_link_deleting:"will be deleted",link_start:" (start)",link_end:" (end)",type_task:"Task",type_project:"Project",type_milestone:"Milestone", -minutes:"Minutes",hours:"Hours",days:"Days",weeks:"Week",months:"Months",years:"Years"}}; -//# sourceMappingURL=../sources/locale/locale_ua.js.map \ No newline at end of file diff --git a/libraries/dhtmlxgantt/skins/dhtmlxgantt_broadway.css b/libraries/dhtmlxgantt/skins/dhtmlxgantt_broadway.css deleted file mode 100644 index 7dc4c1d..0000000 --- a/libraries/dhtmlxgantt/skins/dhtmlxgantt_broadway.css +++ /dev/null @@ -1,9 +0,0 @@ -/* -@license - -dhtmlxGantt v.3.2.0 Stardard -This software is covered by GPL license. You also can obtain Commercial or Enterprise license to use it in non-GPL project - please contact sales@dhtmlx.com. Usage without proper license is prohibited. - -(c) Dinamenta, UAB. -*/ -.gantt_grid{background-color:#d6d6d6;border-right:1px solid #d6d6d6!important}.gantt_grid_scale .gantt_grid_head_cell{border-top:none!important;border-right:1px solid #4f4f4f!important;border-left:1px solid #5b5b5b!important}.gantt_grid_data .gantt_row,.gantt_grid_data .gantt_row.odd{background-color:#dbdbdb;border-top:1px solid #f6f6f6;border-bottom:1px solid #bababa}.gantt_grid_data .gantt_row .gantt_cell,.gantt_grid_data .gantt_row.odd .gantt_cell{border-right:none}.gridHoverStyle{border-top:1px solid #ededed;background-color:#ededed}.gridSelection{background-color:#fff3a1;border-top-color:#fff087}.timelineSelection{background-color:#fff3a1}.gantt_cell .gantt_tree_icon.gantt_folder_closed,.gantt_cell .gantt_tree_icon.gantt_folder_open{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAPCAYAAAACsSQRAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6ODhBMDIwQzhDRUI3MTFFMjg4RUJDNUMzQkZEREM2RDIiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6ODhBMDIwQzlDRUI3MTFFMjg4RUJDNUMzQkZEREM2RDIiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo4OEEwMjBDNkNFQjcxMUUyODhFQkM1QzNCRkREQzZEMiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo4OEEwMjBDN0NFQjcxMUUyODhFQkM1QzNCRkREQzZEMiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PntuzoIAAACySURBVHjaYmTAAjo6Ov4z4AAVFRWM6GJM6ALt7e0OUCYjFowsDwfIEjDbDRgZGSf8//8fUzEj4wGgeAGQeQFJ+CIj0IALQEl9BjIB0NADTJQYAHWdAxMDFQBVDGEB+ukgxYYAcQNSzCCnh4NY0o89VkOAAbMfV5gBNR0AytuDXAs01AEUxbhcwoAj1c4HaUTi9wMNwWnb/0ERO0xA/z6k0IyP4NgBGpRApgEfgHgBQIABAAcyQOF3e6FiAAAAAElFTkSuQmCC)}.gantt_cell .gantt_tree_icon.gantt_file{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6RkQ2NjJFM0ZDRUI3MTFFMkFGNzc4M0YxNUM2NzkwMTIiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6RkQ2NjJFNDBDRUI3MTFFMkFGNzc4M0YxNUM2NzkwMTIiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpGRDY2MkUzRENFQjcxMUUyQUY3NzgzRjE1QzY3OTAxMiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpGRDY2MkUzRUNFQjcxMUUyQUY3NzgzRjE1QzY3OTAxMiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PhnnqLUAAAExSURBVHjanFPtUcMwDI28AB0BJkg6AWEEJqAbxPxLJkh+phuUDdiAbtAwAYxAJ0jf60k51ecWDt3pZFtPn5akSKjv+3uIBlyLSMW3eZ4niD1423Xdt8dLYjzCqCluEJyNcPJq9+CMJzMGaAtet20rZJ7Bb+eIIhHYw0UGLvIRwBoRplx04CrgWModgwAXhTXj8Usjr73xMAwzJbNInBwU/8ASoqV9LbInYqwc2tJBrZdd8XcaVT4GpFOa52topL1Ks9CGVuGXL/vU40fqZPlGA7E5GX1NvQ7U4sSw1AWdMNIm07CfxIn1K6rcB2sI5yCXhXPyjPO7fuOLNfNikAAi+OnWILEUYFfLICWjXGptO12cyRk20G+sduiq/y7TOXJ2G906R13n0n0nmz2m63wSYAB0aMIyVTQbywAAAABJRU5ErkJggg==)}.chartHeaderBg{background-color:#dbdbdb}.gantt_task .gantt_task_scale .gantt_scale_cell{border-left:1px solid #f6f6f6;border-right:1px solid #bababa;color:#494949;font-size:14px}.taskProgressStyle{border-right:1px solid #1cb3fb;box-shadow:-1px 0 0 1px #04a1eb inset}.gantt_task_line{background-size:4px 4px;background-image:-webkit-linear-gradient(-45deg,rgba(255,255,255,.2) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.2) 50%,rgba(255,255,255,.2) 75%,transparent 75%,transparent);background-image:linear-gradient(135deg,rgba(255,255,255,.2) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.2) 50%,rgba(255,255,255,.2) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(0deg,transparent,transparent)}.gantt_task_line .gantt_task_content{text-align:left;font-weight:700;padding:0 8px;box-sizing:border-box}.gantt_task_link .gantt_link_arrow_right{border-width:5px;margin-top:-2px}.gantt_task_link .gantt_link_arrow_left{border-width:5px;margin-left:-7px;margin-top:-2px}.gantt_task_link .gantt_link_arrow_down,.gantt_task_link .gantt_link_arrow_top{border-width:5px}.gantt_task_line .gantt_task_progress_drag{bottom:-4px;height:16px;margin-left:-8px;width:16px}.gantt_row.gantt_project,.gantt_row.odd.gantt_project{background-color:#edffef}.gantt_task_row.gantt_project,.gantt_task_row.odd.gantt_project{background-color:#f5fff6}.gantt_task_line.gantt_project{background-color:#65c16f;border:1px solid #3c9445}.gantt_task_line.gantt_project .gantt_task_progress{background-color:#46ad51;border-right:1px solid #5abc65;box-shadow:-1px 0 0 1px #45a94f inset}.gantt_cal_light{background-color:#fff;border:none!important}.gantt_cal_light .gantt_cal_lsection{color:#959595}.gantt_cal_light .gantt_cal_larea{border-bottom:none}.gantt_cal_light .gantt_cal_ltitle{background-color:#4f4f4f;background-size:4px 4px;background-position:0 0,2px 2px;background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.05) 25%,transparent 25%,transparent 75%,rgba(255,255,255,.05) 75%,rgba(255,255,255,.05)),linear-gradient(45deg,rgba(255,255,255,.05) 25%,transparent 25%,transparent 75%,rgba(255,255,255,.05) 75%,rgba(255,255,255,.05));background-image:-moz-linear-gradient(45deg,rgba(255,255,255,.05) 25%,transparent 25%,transparent 75%,rgba(255,255,255,.05) 75%,rgba(255,255,255,.05)),linear-gradient(45deg,rgba(255,255,255,.05) 25%,transparent 25%,transparent 75%,rgba(255,255,255,.05) 75%,rgba(255,255,255,.05));background-image:linear-gradient(45deg,rgba(255,255,255,.05) 25%,transparent 25%,transparent 75%,rgba(255,255,255,.05) 75%,rgba(255,255,255,.05)),linear-gradient(45deg,rgba(255,255,255,.05) 25%,transparent 25%,transparent 75%,rgba(255,255,255,.05) 75%,rgba(255,255,255,.05));font-size:14px;color:#e1e1e1;position:relative;padding-top:12px;padding-bottom:12px;font-weight:400}.gantt_cal_light .gantt_cal_ltitle .gantt_title{font-size:13px}.gantt_cal_light .gantt_btn_set{margin:5px 10px}.buttonBg{background:#fff}.gantt_btn_set.gantt_save_btn_set{background:#46ad51;text-shadow:0 -1px 0 #307738;color:#fff}.gantt_btn_set.gantt_delete_btn_set{margin-left:0;background:#ec8e00;text-shadow:0 -1px 0 #a60;color:#fff}.gantt_cal_light_wide{padding-left:0!important;padding-right:0!important}.gantt_cal_light_wide .gantt_cal_larea{border-left:none!important;border-right:none!important}.gantt_cal_ltitle .gantt_cancel_btn{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAMCAYAAABbayygAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3QYLEgAjh/DRnAAAAMdJREFUGNN1kcsNwjAQRF9iCkgJdJCUkBJQpDkDFUALdBAqAM6WQglQAlxzSglQgAUH1tIKgS9ezzztz0Vd18QYW0lXfpzsFeM49sAGOEpaf0FHYAnsS6evYoy9g3qDAB6Flb4BtYk568Huu6RmBhBCaFNKV4MPrso9hNAClABd1z2ABfB00BNYmEf5NeTrT/wBh2GogDNQOa8CzuZ9QOuvccPkgZqU0gXA7xFgL2nr1pP1ne/xlCEAi0/5nfc4lzT9+cK5pOkNX8hRT8hMyVwAAAAASUVORK5CYII=);width:30px;top:0;right:0;background-position:6px 12px;background-repeat:no-repeat;position:absolute;height:100%}.dhtmlx_popup_button.dhtmlx_ok_button{background:#46ad51;text-shadow:0 -1px 0 #307738;color:#fff;font-weight:700}.dhtmlx_popup_button.dhtmlx_cancel_button{font-weight:700}.gantt_qi_big_icon.icon_edit{color:#454544}.gantt_qi_big_icon.icon_delete{background:#ec8e00;text-shadow:0 -1px 0 #a60;color:#fff;font-weight:700}.gantt_container{font-family:Arial;font-size:13px;border:1px solid #bababa;position:relative;white-space:nowrap}.gantt_task_scroll{overflow-x:scroll}.gantt_task{position:relative}.gantt_grid,.gantt_task{overflow-x:hidden;overflow-y:hidden;display:inline-block;vertical-align:top}.gantt_grid_scale,.gantt_task_scale{color:#494949;font-size:12px;border-bottom:1px solid #bababa}.gantt_grid_scale{background-color:#4f4f4f;background-size:4px 4px;background-position:0 0,2px 2px;background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.05) 25%,transparent 25%,transparent 75%,rgba(255,255,255,.05) 75%,rgba(255,255,255,.05)),linear-gradient(45deg,rgba(255,255,255,.05) 25%,transparent 25%,transparent 75%,rgba(255,255,255,.05) 75%,rgba(255,255,255,.05));background-image:-moz-linear-gradient(45deg,rgba(255,255,255,.05) 25%,transparent 25%,transparent 75%,rgba(255,255,255,.05) 75%,rgba(255,255,255,.05)),linear-gradient(45deg,rgba(255,255,255,.05) 25%,transparent 25%,transparent 75%,rgba(255,255,255,.05) 75%,rgba(255,255,255,.05));background-image:linear-gradient(45deg,rgba(255,255,255,.05) 25%,transparent 25%,transparent 75%,rgba(255,255,255,.05) 75%,rgba(255,255,255,.05)),linear-gradient(45deg,rgba(255,255,255,.05) 25%,transparent 25%,transparent 75%,rgba(255,255,255,.05) 75%,rgba(255,255,255,.05));color:#e1e1e1;font-size:14px}.gantt_task_scale{background-color:#dbdbdb}.gantt_scale_line{box-sizing:border-box;-moz-box-sizing:border-box;border-top:1px solid #bababa}.gantt_scale_line:first-child{border-top:none}.gantt_grid_head_cell{display:inline-block;vertical-align:top;border-right:1px solid #bababa;text-align:center;position:relative;cursor:default;height:100%;-moz-user-select:-moz-none;-webkit-user-select:none;-user-select:none;overflow:hidden}.gantt_scale_line{clear:both}.gantt_grid_data{width:100%;overflow:hidden}.gantt_row{position:relative;-webkit-user-select:none;-moz-user-select:none;-moz-user-select:-moz-none}.gantt_add,.gantt_grid_head_add{width:100%;height:100%;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3QYHCygkHejN0gAAAD1JREFUOMtjtN15mYESwIJLwvHo6v/I/P3WoYzY1DExUAiGgQGMtjsvYwQYsWC/dSjjcAmD0YREo0AkFgAASgkTQxnJ6ggAAAAASUVORK5CYII=);background-position:center center;background-repeat:no-repeat;cursor:pointer;position:relative;-moz-opacity:.3;opacity:.3}.gantt_grid_head_cell.gantt_grid_head_add{-moz-opacity:.6;opacity:.6;top:0}.gantt_grid_head_cell.gantt_grid_head_add:hover{-moz-opacity:1;opacity:1}.gantt_grid_data .gantt_row.odd:hover,.gantt_grid_data .gantt_row:hover{border-top:1px solid #ededed;background-color:#ededed}.gantt_grid_data .gantt_row.odd:hover .gantt_add,.gantt_grid_data .gantt_row:hover .gantt_add{-moz-opacity:1;opacity:1}.gantt_row,.gantt_task_row{border-bottom:1px solid #ebebeb;background-color:#fff}.gantt_row.odd,.gantt_task_row.odd{background-color:#fff}.gantt_cell,.gantt_grid_head_cell,.gantt_row,.gantt_scale_cell,.gantt_task_cell,.gantt_task_row{box-sizing:border-box;-moz-box-sizing:border-box}.gantt_grid_head_cell,.gantt_scale_cell{line-height:inherit}.gantt_grid_scale .gantt_grid_column_resize_wrap{cursor:col-resize;position:absolute;width:13px}.gantt_grid_column_resize_wrap .gantt_grid_column_resize{background-color:#bababa;height:100%;width:1px;margin:0 auto}.gantt_grid .gantt_grid_resize_wrap{cursor:col-resize;position:absolute;width:13px;z-index:1}.gantt_grid_resize_wrap .gantt_grid_resize{background-color:#bababa;width:1px;margin:0 auto}.gantt_drag_marker.gantt_grid_resize_area{background-color:rgba(231,231,231,.5);border-left:1px solid #bababa;border-right:1px solid #bababa;height:100%;width:100%;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.gantt_cell{display:inline-block;vertical-align:top;border-right:1px solid #ebebeb;padding-left:6px;padding-right:6px;height:100%;overflow:hidden;white-space:nowrap;font-size:13px}.gantt_grid_data .gantt_last_cell,.gantt_grid_scale .gantt_last_cell,.gantt_task_bg .gantt_last_cell,.gantt_task_scale .gantt_last_cell{border-right-width:0}.gantt_task_bg{overflow:hidden}.gantt_scale_cell{display:inline-block;white-space:nowrap;overflow:hidden;border-right:1px solid #bababa;text-align:center;height:100%}.gantt_task_cell{display:inline-block;height:100%;border-right:1px solid #ebebeb}.gantt_ver_scroll{width:0;background-color:transparent;height:1px;overflow-x:hidden;overflow-y:scroll;display:none;position:absolute;right:0}.gantt_ver_scroll>div{width:1px;height:1px}.gantt_hor_scroll{height:0;background-color:transparent;width:100%;clear:both;overflow-x:scroll;overflow-y:hidden;display:none}.gantt_hor_scroll>div{width:5000px;height:1px}.gantt_tree_indent{width:15px;height:100%;display:inline-block}.gantt_tree_content,.gantt_tree_icon{vertical-align:top}.gantt_tree_icon{width:28px;height:100%;display:inline-block;background-repeat:no-repeat;background-position:center center}.gantt_tree_content{height:100%;display:inline-block}.gantt_tree_icon.gantt_open{background-image:url(data:image/gif;base64,R0lGODlhEgASAOMHAMrKyt3d3ejp6d7f3+/v75aWlvf39////wAAAP///////////////////////////yH5BAEKAA8ALAAAAAASABIAAAQt8MlJq704672L/x9WZKNVXieVIipKsVMaS0hdSzL+tuY+9yJXEAUCcY7IJCUCADs=);width:18px;cursor:pointer}.gantt_tree_icon.gantt_close{background-image:url(data:image/gif;base64,R0lGODlhEgASAOMIAMrKyt3d3ejp6d7f3+/v75aWlvf39wAAAP///////////////////////////////yH5BAEKAAYALAAAAAASABIAAAQp0MhJq704672L/x9WZKNVXieVVqvUTm95zLOLkreY7yqOgiCOcEikRAAAOw==);width:18px;cursor:pointer}.gantt_tree_icon.gantt_blank{width:18px}.gantt_tree_icon.gantt_folder_open{background-image:url(data:image/gif;base64,R0lGODlhEgASAJECAJeXl7Gvrf///wAAACH/C1hNUCBEYXRhWE1QPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS4wLWMwNjAgNjEuMTM0Nzc3LCAyMDEwLzAyLzEyLTE3OjMyOjAwICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdFJlZj0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlUmVmIyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M1IFdpbmRvd3MiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NTdDRDM3QzVDMDZEMTFFMUJGMzhFMDhCN0RGRjBGQ0YiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NTdDRDM3QzZDMDZEMTFFMUJGMzhFMDhCN0RGRjBGQ0YiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo1N0NEMzdDM0MwNkQxMUUxQkYzOEUwOEI3REZGMEZDRiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo1N0NEMzdDNEMwNkQxMUUxQkYzOEUwOEI3REZGMEZDRiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PgH//v38+/r5+Pf29fTz8vHw7+7t7Ovq6ejn5uXk4+Lh4N/e3dzb2tnY19bV1NPS0dDPzs3My8rJyMfGxcTDwsHAv769vLu6ubi3trW0s7KxsK+urayrqqmop6alpKOioaCfnp2cm5qZmJeWlZSTkpGQj46NjIuKiYiHhoWEg4KBgH9+fXx7enl4d3Z1dHNycXBvbm1sa2ppaGdmZWRjYmFgX15dXFtaWVhXVlVUU1JRUE9OTUxLSklIR0ZFRENCQUA/Pj08Ozo5ODc2NTQzMjEwLy4tLCsqKSgnJiUkIyIhIB8eHRwbGhkYFxYVFBMSERAPDg0MCwoJCAcGBQQDAgEAACH5BAEAAAIALAAAAAASABIAAAIzlI+pywcPm3mhWgkCsjBOvVkimElG9ZlCBlXd+2XjjLKg5GqoeZXqvsOQXK/ijUZTKVUFADs=)}.gantt_tree_icon.gantt_folder_closed{background-image:url(data:image/gif;base64,R0lGODlhEgASAJECAJeXl7Gvrf///wAAACH/C1hNUCBEYXRhWE1QPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS4wLWMwNjAgNjEuMTM0Nzc3LCAyMDEwLzAyLzEyLTE3OjMyOjAwICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdFJlZj0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlUmVmIyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M1IFdpbmRvd3MiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NTAyMTU1RTNDMDZEMTFFMUJGNzZCRThBRkFCRjg4MTIiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NTAyMTU1RTRDMDZEMTFFMUJGNzZCRThBRkFCRjg4MTIiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo1MDIxNTVFMUMwNkQxMUUxQkY3NkJFOEFGQUJGODgxMiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo1MDIxNTVFMkMwNkQxMUUxQkY3NkJFOEFGQUJGODgxMiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PgH//v38+/r5+Pf29fTz8vHw7+7t7Ovq6ejn5uXk4+Lh4N/e3dzb2tnY19bV1NPS0dDPzs3My8rJyMfGxcTDwsHAv769vLu6ubi3trW0s7KxsK+urayrqqmop6alpKOioaCfnp2cm5qZmJeWlZSTkpGQj46NjIuKiYiHhoWEg4KBgH9+fXx7enl4d3Z1dHNycXBvbm1sa2ppaGdmZWRjYmFgX15dXFtaWVhXVlVUU1JRUE9OTUxLSklIR0ZFRENCQUA/Pj08Ozo5ODc2NTQzMjEwLy4tLCsqKSgnJiUkIyIhIB8eHRwbGhkYFxYVFBMSERAPDg0MCwoJCAcGBQQDAgEAACH5BAEAAAIALAAAAAASABIAAAIwlI+pywcPm3mhWgkCsjBOvVkimElG9ZlCuYIY6TYs+6bmHDO4igfdD3GNhheV0VQAADs=)}.gantt_tree_icon.gantt_file{background-image:url(data:image/gif;base64,R0lGODlhEgASAJECAJeXl7Gvrf///wAAACH/C1hNUCBEYXRhWE1QPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS4wLWMwNjAgNjEuMTM0Nzc3LCAyMDEwLzAyLzEyLTE3OjMyOjAwICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdFJlZj0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlUmVmIyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M1IFdpbmRvd3MiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NzkxQzI4RjZDMDZEMTFFMTgwRjhBQURDQzI3NDU3QUEiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NzkxQzI4RjdDMDZEMTFFMTgwRjhBQURDQzI3NDU3QUEiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo3OTFDMjhGNEMwNkQxMUUxODBGOEFBRENDMjc0NTdBQSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo3OTFDMjhGNUMwNkQxMUUxODBGOEFBRENDMjc0NTdBQSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PgH//v38+/r5+Pf29fTz8vHw7+7t7Ovq6ejn5uXk4+Lh4N/e3dzb2tnY19bV1NPS0dDPzs3My8rJyMfGxcTDwsHAv769vLu6ubi3trW0s7KxsK+urayrqqmop6alpKOioaCfnp2cm5qZmJeWlZSTkpGQj46NjIuKiYiHhoWEg4KBgH9+fXx7enl4d3Z1dHNycXBvbm1sa2ppaGdmZWRjYmFgX15dXFtaWVhXVlVUU1JRUE9OTUxLSklIR0ZFRENCQUA/Pj08Ozo5ODc2NTQzMjEwLy4tLCsqKSgnJiUkIyIhIB8eHRwbGhkYFxYVFBMSERAPDg0MCwoJCAcGBQQDAgEAACH5BAEAAAIALAAAAAASABIAAAIylI+pwN16QJiUQiFThRlJm3RRFYSlR5qXMKmXaMDuuMoyOi8n/e6xn8NMHETgh5RaKQsAOw==)}.gantt_grid_head_cell .gantt_sort{position:absolute;right:5px;top:8px;width:7px;height:13px;background-repeat:no-repeat;background-position:center center}.gantt_grid_head_cell .gantt_sort.gantt_asc{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAANCAYAAABlyXS1AAAARUlEQVR42mNgQAL1/VP/M2ADIIntF2/9x1AAlrh0C47hCmA60DFYwX88gIFGwNDY5D8uDFbg7hvwHx2jmIBTAlkB0e4BAEjlaNtBWJPnAAAAAElFTkSuQmCC)}.gantt_grid_head_cell .gantt_sort.gantt_desc{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAANCAYAAABlyXS1AAAARUlEQVR4nGNgQAKGxib/GbABkIS7b8B/DAUwCRiGK0CXwFBAb1DfP/U/LszwHwi2X7qFgUEArBtdAVwCBmAKMCSQFSDzAWXXaOHsXeqkAAAAAElFTkSuQmCC)}.gantt_inserted,.gantt_updated{font-weight:700}.gantt_deleted{text-decoration:line-through}.gantt_invalid{background-color:FFE0E0}.gantt_error{color:red}.gantt_status{right:1px;padding:5px 10px;background:rgba(155,155,155,.1);position:absolute;top:1px;-webkit-transition:opacity .2s;transition:opacity .2s;opacity:0}.gantt_status.gantt_status_visible{opacity:1}#gantt_ajax_dots span{-webkit-transition:opacity .2s;transition:opacity .2s;background-repeat:no-repeat;opacity:0}#gantt_ajax_dots span.gantt_dot_visible{opacity:1}.dhtmlx_message_area{position:fixed;right:5px;width:250px;z-index:1000}.dhtmlx-info{min-width:120px;font-family:Arial;z-index:10000;margin:5px 5px 10px;-webkit-transition:all .5s ease;-moz-transition:all .5s ease;-o-transition:all .5s ease;transition:all .5s ease}.dhtmlx-info.hidden{height:0;padding:0;border-width:0;margin:0;overflow:hidden}.dhtmlx_modal_box{overflow:hidden;display:inline-block;min-width:250px;width:250px;text-align:center;position:fixed;z-index:20000;box-shadow:3px 3px 3px rgba(0,0,0,.07);font-family:Arial;border-radius:6px;border:1px solid #bababa;background:#fff}.dhtmlx_popup_title{border-top-left-radius:6px;border-top-right-radius:6px;border-width:0}.dhtmlx_button,.dhtmlx_popup_button{border:1px solid #bababa;height:30px;line-height:30px;display:inline-block;margin:0 5px;border-radius:4px;background:#fff}.dhtmlx-info,.dhtmlx_button,.dhtmlx_popup_button{user-select:none;-webkit-user-select:none;-moz-user-select:-moz-none;cursor:pointer}.dhtmlx_popup_text{overflow:hidden}.dhtmlx_popup_controls{border-radius:6px;padding:10px}.dhtmlx_popup_button{min-width:100px}div.dhx_modal_cover{background-color:#000;cursor:default;filter:alpha(opacity=20);opacity:.2;position:fixed;z-index:19999;left:0;top:0;width:100%;height:100%;border:none;zoom:1}.dhtmlx-info img,.dhtmlx_modal_box img{float:left;margin-right:20px}.dhtmlx-alert-error,.dhtmlx-confirm-error{border:1px solid red}.dhtmlx_button input,.dhtmlx_popup_button div{border-radius:4px;font-size:14px;-moz-box-sizing:content-box;box-sizing:content-box;padding:0;margin:0;vertical-align:top}.dhtmlx_popup_title{color:#fff;text-shadow:1px 1px #000;height:40px;line-height:40px;font-size:20px}.dhtmlx_popup_text{margin:15px 15px 5px;font-size:14px;color:#000;min-height:30px;border-radius:6px}.dhtmlx-error,.dhtmlx-info{font-size:14px;color:#000;box-shadow:3px 3px 3px rgba(0,0,0,.07);padding:0;background-color:#FFF;border-radius:3px;border:1px solid #fff}.dhtmlx-info div{padding:5px 10px;background-color:#fff;border-radius:3px;border:1px solid #bababa}.dhtmlx-error{background-color:#d81b1b;border:1px solid #ff3c3c;box-shadow:3px 3px 3px rgba(0,0,0,.07)}.dhtmlx-error div{background-color:#d81b1b;border:1px solid #940000;color:#FFF}.gantt_data_area div,.gantt_grid div{-ms-touch-action:none;-webkit-tap-highlight-color:transparent}.gantt_data_area{position:relative;overflow-x:hidden;overflow-y:hidden;-moz-user-select:-moz-none;-webkit-user-select:none;-user-select:none}.gantt_links_area{position:absolute;left:0;top:0}.gantt_side_content,.gantt_task_content,.gantt_task_progress{line-height:inherit;overflow:hidden;height:100%}.gantt_task_content{font-size:13px;color:#fff;width:100%;top:0;position:absolute;white-space:nowrap;text-align:center}.gantt_task_progress{text-align:center;z-index:0;background:#04a4f0;border-right:1px solid #1cb3fb;box-shadow:-1px 0 0 1px #04a1eb inset}.gantt_task_line{-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px;position:absolute;-moz-box-sizing:border-box;box-sizing:border-box;background-color:#17b2fb;border:1px solid #049ae1;-webkit-user-select:none;-moz-user-select:none;-moz-user-select:-moz-none}.gantt_task_line.gantt_drag_move div{cursor:move}.gantt_touch_move,.gantt_touch_progress .gantt_touch_resize{-moz-transform:scale(1.02,1.1);-o-transform:scale(1.02,1.1);-webkit-transform:scale(1.02,1.1);transform:scale(1.02,1.1);-moz-transform-origin:50%;-o-transform-origin:50%;-webkit-transform-origin:50%;transform-origin:50%}.gantt_touch_progress .gantt_task_progress_drag,.gantt_touch_resize .gantt_task_drag{-moz-transform:scaleY(1.3);-o-transform:scaleY(1.3);-webkit-transform:scaleY(1.3);transform:scaleY(1.3);-moz-transform-origin:50%;-o-transform-origin:50%;-webkit-transform-origin:50%;transform-origin:50%}.gantt_side_content{position:absolute;white-space:nowrap;color:#6e6e6e;bottom:7px;font-size:11px;font-size:12px}.gantt_side_content.gantt_left{right:100%;padding-right:15px}.gantt_side_content.gantt_right{left:100%;padding-left:15px}.gantt_side_content.gantt_link_crossing{bottom:8.75px}.gantt_link_arrow,.gantt_task_link .gantt_line_wrapper{position:absolute;cursor:pointer}.gantt_line_wrapper div{background-color:#ffa011}.gantt_task_link:hover .gantt_line_wrapper div{box-shadow:0 0 5px 0 #ffa011}.gantt_task_link div.gantt_link_arrow{background-color:transparent;border-style:solid;width:0;height:0}.gantt_link_control{position:absolute;width:13px;top:0}.gantt_link_control div{display:none;cursor:pointer;box-sizing:border-box;position:relative;top:50%;margin-top:-7.5px;vertical-align:middle;border:1px solid #929292;-webkit-border-radius:6.5px;-moz-border-radius:6.5px;border-radius:6.5px;height:13px;width:13px;background-color:#f0f0f0}.gantt_link_control div:hover{background-color:#fff}.gantt_link_control.task_left{left:-13px}.gantt_link_control.task_right{right:-13px}.gantt_link_target .gantt_link_control div,.gantt_task_line.gantt_selected .gantt_link_control div,.gantt_task_line:hover .gantt_link_control div{display:block}.gantt_link_source,.gantt_link_target{box-shadow:0 0 3px #04a4f0}.gantt_link_target.link_finish_allow,.gantt_link_target.link_start_allow{box-shadow:0 0 3px #ffbf5e}.gantt_link_target.link_finish_deny,.gantt_link_target.link_start_deny{box-shadow:0 0 3px #e87e7b}.link_finish_allow .gantt_link_control.task_right div,.link_start_allow .gantt_link_control.task_left div{background-color:#ffbf5e;border-color:#ffa011}.link_finish_deny .gantt_link_control.task_right div,.link_start_deny .gantt_link_control.task_left div{background-color:#e87e7b;border-color:#dd3e3a}.gantt_link_arrow_right{border-width:2.5px 0 2.5px 5px;border-top-color:transparent!important;border-right-color:transparent!important;border-bottom-color:transparent!important;border-color:#ffa011;margin-top:-1px}.gantt_link_arrow_left{border-width:2.5px 5px 2.5px 0;margin-top:-1px;border-top-color:transparent!important;border-color:#ffa011;border-bottom-color:transparent!important;border-left-color:transparent!important}.gantt_link_arrow_top{border-width:0 2.5px 5px;border-color:#ffa011;border-top-color:transparent!important;border-right-color:transparent!important;border-left-color:transparent!important}.gantt_link_arrow_down{border-width:2.5px 5px 0 2.5px;border-color:#ffa011;border-right-color:transparent!important;border-bottom-color:transparent!important;border-left-color:transparent!important}.gantt_task_drag,.gantt_task_progress_drag{cursor:w-resize;height:100%;display:none;position:absolute}.gantt_task_line.gantt_selected .gantt_task_drag,.gantt_task_line.gantt_selected .gantt_task_progress_drag,.gantt_task_line:hover .gantt_task_drag,.gantt_task_line:hover .gantt_task_progress_drag{display:block}.gantt_task_drag{width:6px;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAACCAYAAAB7Xa1eAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3QYDDjkw3UJvAwAAABRJREFUCNdj/P//PwM2wASl/6PTAKrrBf4+lD8LAAAAAElFTkSuQmCC);z-index:1;top:0}.gantt_task_drag.task_left{left:0}.gantt_task_drag.task_right{right:0}.gantt_task_progress_drag{height:8px;width:8px;bottom:-4px;margin-left:-4px;background-position:bottom;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAALCAYAAAB24g05AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MkY3Rjk0RUVDMkYzMTFFMkI1OThEQTA3ODU0OTkzMEEiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MkY3Rjk0RUZDMkYzMTFFMkI1OThEQTA3ODU0OTkzMEEiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDoyRjdGOTRFQ0MyRjMxMUUyQjU5OERBMDc4NTQ5OTMwQSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDoyRjdGOTRFREMyRjMxMUUyQjU5OERBMDc4NTQ5OTMwQSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PobPBzIAAADkSURBVHjaYpk2bRoDDsAExL1QdjEQ/8OmiAWHZk4gXqymqhQM4ty6fU8OSMUA8XdiDBAB4k0a6iqWRga6EKcwMQXduHlnL5DpB8Rv0J2JDFSA+JiOtgZcMwiA2CAxkBxUDVYDLEAKgIpV9XQ0MZwFEgPJAZnHoWpRDAgC4n2W5saiQKfjClQGkBxQDciL+6B6wAbkA/EqJwdrTkUFOQZCAKQGpBbIXA3SCzJggo+XK7OEuBgDsQCkFqgHrBfsBT5eHgZSAUwP2IBfv36TbABMDygdtK1Zv6UESLORaAbIhG6AAAMAKN8wE24DXWcAAAAASUVORK5CYII=);background-repeat:no-repeat;z-index:2}.gantt_link_tooltip{box-shadow:3px 3px 3px #888;background-color:#fff;border-left:1px dotted #cecece;border-top:1px dotted #cecece;font-family:Tahoma;font-size:8pt;color:#444;padding:6px;line-height:20px}.gantt_link_direction{height:0;border:0 #ffa011;border-bottom-style:dashed;border-bottom-width:2px;transform-origin:0 0;-ms-transform-origin:0 0;-webkit-transform-origin:0 0;z-index:2;margin-left:1px;position:absolute}.gantt_grid_data .gantt_row.gantt_selected,.gantt_grid_data .gantt_row.odd.gantt_selected{background-color:#fff3a1;border-top-color:#fff087}.gantt_task_row.gantt_selected{background-color:#fff3a1}.gantt_task_row.gantt_selected .gantt_task_cell{border-right-color:#ffec6e}.gantt_task_line.gantt_selected{box-shadow:0 0 5px #04a4f0}.gantt_task_line.gantt_project.gantt_selected{box-shadow:0 0 5px #46ad51}.gantt_task_line.gantt_milestone{visibility:hidden;background-color:#db7dc5;border:0 solid #cd49ae;box-sizing:content-box;-moz-box-sizing:content-box}.gantt_task_line.gantt_milestone div{visibility:visible}.gantt_task_line.gantt_milestone .gantt_task_content{background:inherit;border:inherit;border-width:1px;border-radius:inherit;box-sizing:border-box;-moz-box-sizing:border-box;-webkit-transform:rotate(45deg);-moz-transform:rotate(45deg);-ms-transform:rotate(45deg);-o-transform:rotate(45deg);transform:rotate(45deg)}.gantt_task_line.gantt_task_inline_color{border-color:#999}.gantt_task_line.gantt_task_inline_color .gantt_task_progress{background-color:#363636;opacity:.2}.gantt_task_line.gantt_task_inline_color.gantt_project.gantt_selected,.gantt_task_line.gantt_task_inline_color.gantt_selected{box-shadow:0 0 5px #999}.gantt_task_link.gantt_link_inline_color:hover .gantt_line_wrapper div{box-shadow:0 0 5px 0 #999}.gantt_critical_task{background-color:#e63030;border-color:#9d3a3a}.gantt_critical_task .gantt_task_progress{background-color:rgba(0,0,0,.4)}.gantt_critical_link .gantt_line_wrapper>div{background-color:#e63030}.gantt_critical_link .gantt_link_arrow{border-color:#e63030}.gantt_unselectable,.gantt_unselectable div{-webkit-user-select:none;-moz-user-select:none;-moz-user-select:-moz-none}.gantt_cal_light{-webkit-tap-highlight-color:transparent;border-radius:6px;font-family:Arial;color:#494949;font-size:12px;position:absolute;z-index:10001;width:550px;height:250px;box-shadow:3px 3px 3px rgba(0,0,0,.07)}.gantt_cal_light select{font-family:Arial;border:1px solid #bababa;font-size:13px;padding:2px;margin:0}.gantt_cal_ltitle{padding:7px 10px;overflow:hidden;white-space:nowrap;-webkit-border-radius:6px 6px 0 0;-moz-border-radius-topleft:6px;-moz-border-radius-bottomleft:0;-moz-border-radius-topright:6px;-moz-border-radius-bottomright:0;border-radius:6px 6px 0 0}.gantt_cal_ltitle span{white-space:nowrap}.gantt_cal_lsection{color:#727272;font-weight:700;padding:12px 0 5px 10px}.gantt_cal_lsection .gantt_fullday{float:right;margin-right:5px;font-size:12px;font-weight:400;line-height:20px;vertical-align:top;cursor:pointer}.gantt_cal_lsection{font-size:13px}.gantt_cal_ltext{padding:2px 10px;overflow:hidden}.gantt_cal_ltext textarea{overflow:auto;font-family:Arial;font-size:13px;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;border:1px solid #bababa;height:100%;width:100%;outline:0!important;resize:none}.gantt_time{font-weight:700}.gantt_cal_light .gantt_title{padding-left:10px}.gantt_cal_larea{border:1px solid #bababa;border-left:none;border-right:none;background-color:#fff;overflow:hidden;height:1px}.gantt_btn_set{margin:10px 7px 5px 10px;padding:5px 15px 5px 10px;float:left;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;border-width:0;border-color:#bababa;border-style:solid;height:32px;font-weight:700;background:#fff;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;cursor:pointer}.gantt_btn_set div{float:left;font-size:13px;height:22px;line-height:22px;background-repeat:no-repeat;vertical-align:middle}.gantt_save_btn{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAPCAYAAAACsSQRAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6QTBBQUI0RDhDRUJEMTFFMjhFM0ZENTlERUM1OEQzRTYiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6QTBBQUI0RDlDRUJEMTFFMjhFM0ZENTlERUM1OEQzRTYiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpBMEFBQjRENkNFQkQxMUUyOEUzRkQ1OURFQzU4RDNFNiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpBMEFBQjREN0NFQkQxMUUyOEUzRkQ1OURFQzU4RDNFNiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PjdPZV0AAACtSURBVHjanJPbDYUgEESvtwJKoQRLoRNL0RK0ArUCS9AOpAMclDVkw0s2mQ9XcpwJY2OM+VWMgDQ9/CsAEtoh9W6skw+S0Akd5hl1J6kADJBwADs9j9MmIszQ5GJo793qf2nwLUYc0E7xONbaBmloZKAsgCCLW0p2qCsBEEQ6F33gcBbg304I1JYA+BWHQFlAqCcclAXEykaguQSQaiyBVEmbm8RfLFgzo3MJMACZSGxiH8QaMAAAAABJRU5ErkJggg==);margin-top:2px;width:21px}.gantt_cancel_btn{margin-top:2px;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MDkzMDA3MzlDMzA0MTFFMjg2QTVFMzFEQzgwRkJERDYiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MDkzMDA3M0FDMzA0MTFFMjg2QTVFMzFEQzgwRkJERDYiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDowOTMwMDczN0MzMDQxMUUyODZBNUUzMURDODBGQkRENiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDowOTMwMDczOEMzMDQxMUUyODZBNUUzMURDODBGQkRENiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PmYuYOUAAAEdSURBVHjaYvz//z8DJYAFXWDlypU8QKoIiD2A2AwqfAqIdwBxX3h4+Bdk9YzILgBqtgdS84FYEYeF94E4EWjIQZgAE5LmQCB1AKoZZKMPEAtAMYh9GSp3AKjWD8UFQAEhIPshEIOc3wHENUBb/qJ57SyQMoJyPwKxElDNO1gYFEE17wMKVmIJlzNQzeegrjaA6qmBecEbSvfh0GwMxGeBhoPoemQ9MAO0kEIbl2YTqPAFKK2IbMB3AjabYIkRZmQD7kNpMyI0G0PpO8gGbIUFJj7NQDk2INWIrIcJKfBAKcwJqvkcDs0TgFgXGo19KCkRmpDWQdWDEk0NUoCBoq0FqhkE/IEWbKJKUmZEz43QzFSKIzN1481M5ACAAAMAlfl/lCwRpagAAAAASUVORK5CYII=);width:20px}.gantt_delete_btn{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAQCAYAAAAmlE46AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6QzQzRjMxM0NDRUJEMTFFMjlCNDZDQzhFQUM0ODRCMEIiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6QzQzRjMxM0RDRUJEMTFFMjlCNDZDQzhFQUM0ODRCMEIiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpDNDNGMzEzQUNFQkQxMUUyOUI0NkNDOEVBQzQ4NEIwQiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpDNDNGMzEzQkNFQkQxMUUyOUI0NkNDOEVBQzQ4NEIwQiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PoU+5FoAAACMSURBVHja7JPdDYAgDIQLE+gmjuAIbOIKjMRIbAAb1BZLUozgz7OXfIbWKxeCAiKCwmNfXnsNP5S4mIkMrSYiEaY2LOFloO6QVF1JamPGc2IvpaeSbqXY4LkOLwU6OTyvgzBasxwnBnivYOGj/sEXg27gbd/JpWZiOf0pV7Anlq9UGqs07hTFC7sAAwCbSNs8SyqFMAAAAABJRU5ErkJggg==);margin-top:2px;width:20px}.gantt_cal_cover{width:100%;height:100%;position:absolute;z-index:10000;top:0;left:0;background-color:#000;opacity:.1;filter:alpha(opacity=10)}.gantt_custom_button{padding:0 3px;font-family:Arial;font-size:13px;font-weight:400;margin-right:10px;margin-top:-5px;cursor:pointer;float:right;height:21px;width:90px;border:1px solid #CECECE;text-align:center;-webkit-border-radius:4px;-moz-border-radius:4px;-ms-border-radius:4px;-o-border-radius:4px;border-radius:4px}.gantt_custom_button div{cursor:pointer;float:none;height:21px;line-height:21px;vertical-align:middle}.gantt_custom_button div:first-child{display:none}.gantt_cal_light_wide{width:580px;padding:2px 4px}.gantt_cal_light_wide .gantt_cal_larea{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;border:1px solid #bababa}.gantt_cal_light_wide .gantt_cal_lsection{border:0;float:left;text-align:right;width:80px;height:20px;padding:5px 10px 0 0}.gantt_cal_light_wide .gantt_wrap_section{position:relative;padding:10px 0;overflow:hidden;border-bottom:1px solid #ebebeb}.gantt_cal_light_wide .gantt_section_time{overflow:hidden;padding-top:2px!important;padding-right:0;height:20px!important}.gantt_cal_light_wide .gantt_cal_ltext{padding-right:0}.gantt_cal_light_wide .gantt_cal_larea{padding:0 10px;width:100%}.gantt_cal_light_wide .gantt_section_time{background:0 0}.gantt_cal_light_wide .gantt_cal_checkbox label{padding-left:0}.gantt_cal_light_wide .gantt_cal_lsection .gantt_fullday{float:none;margin-right:0;font-weight:700;cursor:pointer}.gantt_cal_light_wide .gantt_custom_button{position:absolute;top:0;right:0;margin-top:2px}.gantt_cal_light_wide .gantt_repeat_right{margin-right:55px}.gantt_cal_light_wide.gantt_cal_light_full{width:738px}.gantt_cal_wide_checkbox input{margin-top:8px;margin-left:14px}.gantt_cal_light input{font-size:13px}.gantt_section_time{background-color:#fff;white-space:nowrap;padding:5px 10px;padding-top:2px!important}.gantt_section_time .gantt_time_selects{float:left;height:25px}.gantt_section_time .gantt_time_selects select{height:23px;padding:2px;border:1px solid #bababa}.gantt_duration{width:100px;height:23px;float:left;white-space:nowrap;margin-left:20px;line-height:23px}.gantt_duration .gantt_duration_dec,.gantt_duration .gantt_duration_inc,.gantt_duration .gantt_duration_value{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;text-align:center;vertical-align:top;height:100%;border:1px solid #bababa}.gantt_duration .gantt_duration_value{width:40px;padding:3px 4px;border-left-width:0;border-right-width:0}.gantt_duration .gantt_duration_dec,.gantt_duration .gantt_duration_inc{width:20px;padding:1px 1px 3px;background:#fff}.gantt_duration .gantt_duration_dec{-moz-border-top-left-radius:4px;-moz-border-bottom-left-radius:4px;-webkit-border-top-left-radius:4px;-webkit-border-bottom-left-radius:4px;border-top-left-radius:4px;border-bottom-left-radius:4px}.gantt_duration .gantt_duration_inc{margin-right:4px;-moz-border-top-right-radius:4px;-moz-border-bottom-right-radius:4px;-webkit-border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:4px}.gantt_cal_quick_info{border:1px solid #bababa;border-radius:6px;position:absolute;z-index:300;box-shadow:3px 3px 3px rgba(0,0,0,.07);background-color:#fff;width:300px;transition:left .5s ease,right .5s;-moz-transition:left .5s ease,right .5s;-webkit-transition:left .5s ease,right .5s;-o-transition:left .5s ease,right .5s}.gantt_no_animate{transition:none;-moz-transition:none;-webkit-transition:none;-o-transition:none}.gantt_cal_quick_info.gantt_qi_left .gantt_qi_big_icon{float:right}.gantt_cal_qi_title{-webkit-border-radius:6px 6px 0 0;-moz-border-radius-topleft:6px;-moz-border-radius-bottomleft:0;-moz-border-radius-topright:6px;-moz-border-radius-bottomright:0;border-radius:6px 6px 0 0;padding:5px 0 8px 12px;color:#494949;background-color:#dbdbdb;border-bottom:1px solid #bababa}.gantt_cal_qi_tdate{font-size:14px;font-weight:700}.gantt_cal_qi_tcontent{font-size:13px}.gantt_cal_qi_content{padding:16px 8px;font-size:13px;color:#494949;overflow:hidden}.gantt_cal_qi_controls{-webkit-border-radius:0 0 6px 6px;-moz-border-radius-topleft:0;-moz-border-radius-bottomleft:6px;-moz-border-radius-topright:0;-moz-border-radius-bottomright:6px;border-radius:0 0 6px 6px;padding-left:7px}.gantt_cal_qi_controls .gantt_menu_icon{margin-top:6px;background-repeat:no-repeat}.gantt_cal_qi_controls .gantt_menu_icon.icon_edit{width:20px;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH3QYFCjI5ZQj5bAAAAFNJREFUOMvt0zEOACAIA0DkwTymH8bJTRTKZGJXyaWEKPKTCQAH4Ls37cItcDUzsxHNDLZNhCq7Gt1wh9ErV7EjyGAhyGLphlnsClWuS32rn0czAV+vNGrM/LBtAAAAAElFTkSuQmCC)}.gantt_cal_qi_controls .gantt_menu_icon.icon_delete{width:20px;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAQCAYAAAAmlE46AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6QzQzRjMxM0NDRUJEMTFFMjlCNDZDQzhFQUM0ODRCMEIiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6QzQzRjMxM0RDRUJEMTFFMjlCNDZDQzhFQUM0ODRCMEIiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpDNDNGMzEzQUNFQkQxMUUyOUI0NkNDOEVBQzQ4NEIwQiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpDNDNGMzEzQkNFQkQxMUUyOUI0NkNDOEVBQzQ4NEIwQiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PoU+5FoAAACMSURBVHja7JPdDYAgDIQLE+gmjuAIbOIKjMRIbAAb1BZLUozgz7OXfIbWKxeCAiKCwmNfXnsNP5S4mIkMrSYiEaY2LOFloO6QVF1JamPGc2IvpaeSbqXY4LkOLwU6OTyvgzBasxwnBnivYOGj/sEXg27gbd/JpWZiOf0pV7Anlq9UGqs07hTFC7sAAwCbSNs8SyqFMAAAAABJRU5ErkJggg==)}.gantt_qi_big_icon{font-size:13px;border-radius:4px;font-weight:700;background:#fff;margin:5px 9px 8px 0;min-width:60px;line-height:32px;vertical-align:middle;padding:0 10px 0 5px;cursor:pointer;border:1px solid #bababa}.gantt_cal_qi_controls div{float:left;height:32px;text-align:center;line-height:32px}.gantt_tooltip{box-shadow:3px 3px 3px rgba(0,0,0,.07);background-color:#fff;border-left:1px solid rgba(0,0,0,.07);border-top:1px solid rgba(0,0,0,.07);font-family:Arial;font-size:8pt;color:#494949;padding:10px;position:absolute;z-index:50}.gantt_marker{height:100%;width:2px;top:0;position:absolute;text-align:center;background-color:rgba(255,0,0,.4);-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.gantt_marker .gantt_marker_content{padding:5px;background:inherit;color:#fff;position:absolute;font-size:12px;line-height:12px;opacity:.8}.gantt_marker_area{position:absolute;top:0;left:0}.gantt_noselect{-moz-user-select:-moz-none;-webkit-user-select:none;-user-select:none}.gantt_drag_marker{position:absolute;font-family:Arial;font-size:13px}.gantt_drag_marker .gantt_tree_icon.gantt_blank,.gantt_drag_marker .gantt_tree_icon.gantt_close,.gantt_drag_marker .gantt_tree_icon.gantt_open,.gantt_drag_marker .gantt_tree_indent{display:none}.gantt_drag_marker,.gantt_drag_marker .gantt_row.odd{background-color:#fff}.gantt_drag_marker .gantt_row{border-left:1px solid #d2d2d2;border-top:1px solid #d2d2d2}.gantt_drag_marker .gantt_cell{border-color:#d2d2d2}.gantt_row.gantt_over,.gantt_task_row.gantt_over{background-color:#0070fe}.gantt_row.gantt_transparent .gantt_cell{opacity:.7}.gantt_task_row.gantt_transparent{background-color:#dbf3fe}.dhtmlx_popup_button.dhtmlx_delete_button{background:#46ad51;text-shadow:0 -1px 0 #307738;color:#fff;font-weight:700} \ No newline at end of file diff --git a/libraries/dhtmlxgantt/skins/dhtmlxgantt_meadow.css b/libraries/dhtmlxgantt/skins/dhtmlxgantt_meadow.css deleted file mode 100644 index a8fa890..0000000 --- a/libraries/dhtmlxgantt/skins/dhtmlxgantt_meadow.css +++ /dev/null @@ -1,9 +0,0 @@ -/* -@license - -dhtmlxGantt v.3.2.0 Stardard -This software is covered by GPL license. You also can obtain Commercial or Enterprise license to use it in non-GPL project - please contact sales@dhtmlx.com. Usage without proper license is prohibited. - -(c) Dinamenta, UAB. -*/ -.chartHeaderBg{background-color:#f4f2ea}.gridHoverStyle{background-color:#ffebbc!important}.gantt_grid_scale .gantt_grid_head_cell{border-top:none!important;border-right:none!important}.gantt_grid_data .gantt_cell{border-right:none}.gridSelection,.timelineSelection{background-color:#ffebbc!important}.gantt_task_line .gantt_task_progress_drag{bottom:-4px;height:16px;margin-left:-8px;width:16px}.gantt_task .gantt_task_scale .gantt_scale_cell{border-right:1px solid #cac8bd}.gantt_row.gantt_project .gantt_cell,.gantt_row.odd.gantt_project .gantt_cell{background-color:#edf4ff}.gantt_task_row.gantt_project .gantt_task_cell,.gantt_task_row.odd.gantt_project .gantt_task_cell{background-color:#f5f8ff}.gantt_task_line.gantt_project{background-color:#c7d8f7;border:1px solid #7ba3ed}.gantt_task_line.gantt_project .gantt_task_progress{background-color:#9ab9f1}.gantt_cal_light .gantt_cal_ltitle{padding:7px 10px}.gantt_cal_light .gantt_cal_ltext textarea{border:1px solid #d8d6ce}.gantt_cal_light .gantt_cal_larea{border-color:#d8d6ce!important;background-color:#fcfaf3}.gantt_cal_light .gantt_cal_larea .gantt_section_time{background-color:#fcfaf3}.buttonBg{background:#e0ded7}.gantt_cal_light .gantt_btn_set{height:27px;margin:5px 10px;padding:0 15px 0 10px}.gantt_cal_light .gantt_btn_set div{height:25px;margin-top:0;background-position:center center;line-height:25px}.gantt_btn_set.gantt_save_btn_set{border:1px solid #98d27e;background:#a7d991}.gantt_btn_set.gantt_cancel_btn_set{background:#e0ded7;border:1px solid #cac8bd}.gantt_btn_set.gantt_delete_btn_set{border:1px solid #ffad54;background:#ffb96d}.gantt_cal_light_wide{padding:0!important}.gantt_cal_light_wide .gantt_cal_larea{border-left:none!important;border-right:none!important}.gantt_cal_light_wide .gantt_cal_larea .gantt_cal_lsection{width:90px}.gantt_cal_light_wide .gantt_btn_set{margin:7px 10px}.dhtmlx_popup_button.dhtmlx_ok_button{border:1px solid #98d27e;background:#a7d991}.gantt_data_area .gantt_cal_quick_info{background-color:#f4f2ea}.gantt_data_area .gantt_cal_qi_content{background:#fcfaf3;border-bottom:1px solid #cac8bd}.gantt_qi_big_icon.icon_delete{border-color:#ffad54;background:#ffb96d}.gantt_container{font-family:Verdana;font-size:11px;border:1px solid #cac8bd;position:relative;white-space:nowrap}.gantt_grid{border-right:1px solid #cac8bd}.gantt_task_scroll{overflow-x:scroll}.gantt_task{position:relative}.gantt_grid,.gantt_task{overflow-x:hidden;overflow-y:hidden;display:inline-block;vertical-align:top}.gantt_grid_scale,.gantt_task_scale{color:#3f3f3f;font-size:8pt;border-bottom:1px solid #cac8bd;background-color:#f4f2ea}.gantt_scale_line{box-sizing:border-box;-moz-box-sizing:border-box;border-top:1px solid #cac8bd}.gantt_scale_line:first-child{border-top:none}.gantt_grid_head_cell{display:inline-block;vertical-align:top;border-right:1px solid #cac8bd;text-align:center;position:relative;cursor:default;height:100%;-moz-user-select:-moz-none;-webkit-user-select:none;-user-select:none;overflow:hidden}.gantt_scale_line{clear:both}.gantt_grid_data{width:100%;overflow:hidden}.gantt_row{position:relative;-webkit-user-select:none;-moz-user-select:none;-moz-user-select:-moz-none}.gantt_add,.gantt_grid_head_add{width:100%;height:100%;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MDAzOTZDREFDN0FGMTFFMkE1MDhCNkFCRDk3RkY4NTkiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MDAzOTZDREJDN0FGMTFFMkE1MDhCNkFCRDk3RkY4NTkiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDowMDM5NkNEOEM3QUYxMUUyQTUwOEI2QUJEOTdGRjg1OSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDowMDM5NkNEOUM3QUYxMUUyQTUwOEI2QUJEOTdGRjg1OSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PnzqpNoAAAEFSURBVHjapJPPDsFAEMbHZqXSi1ZC3Dg7O9bbeA7v4czZE4hLSRwkbiI4cCAN4Uyqs/pPs1vbrTDJHL7Mb77sbr8WeuMu/FOEMQaStplYdgYHFBnKjK1atZqI8+ViZZ2AMmS5x1QxFNHLNVAx1EPMNVAxBBFtvxnfuq4LUKDTTLwXXsFqNprKE1RMM2y+9oe9FV3Bw5++/3svfMRWpS0MV7fFx0Ka2e62kQEhBEbzoTA0DAPqtXqinbMD643IFGkR3KcL1Cib0yA4/DBY4A2u15ug45oFHD05x44sO+kc+FwhI0j4RZBQlUT5kH+0JS4VBpKfqaSVYDDpJ1rz9eNxlxq8BBgAcMHBu6BPeX8AAAAASUVORK5CYII=);background-position:center center;background-repeat:no-repeat;cursor:pointer;position:relative;-moz-opacity:.3;opacity:.3}.gantt_grid_head_cell.gantt_grid_head_add{-moz-opacity:.6;opacity:.6;top:0}.gantt_grid_head_cell.gantt_grid_head_add:hover{-moz-opacity:1;opacity:1}.gantt_grid_data .gantt_row.odd:hover,.gantt_grid_data .gantt_row:hover{background-color:#ffebbc!important}.gantt_grid_data .gantt_row.odd:hover .gantt_add,.gantt_grid_data .gantt_row:hover .gantt_add{-moz-opacity:1;opacity:1}.gantt_row,.gantt_task_row{border-bottom:1px solid #eae9e5;background-color:#fff}.gantt_row.odd,.gantt_task_row.odd{background-color:#fff}.gantt_cell,.gantt_grid_head_cell,.gantt_row,.gantt_scale_cell,.gantt_task_cell,.gantt_task_row{box-sizing:border-box;-moz-box-sizing:border-box}.gantt_grid_head_cell,.gantt_scale_cell{line-height:inherit}.gantt_grid_scale .gantt_grid_column_resize_wrap{cursor:col-resize;position:absolute;width:13px}.gantt_grid_column_resize_wrap .gantt_grid_column_resize{background-color:#cac8bd;height:100%;width:1px;margin:0 auto}.gantt_grid .gantt_grid_resize_wrap{cursor:col-resize;position:absolute;width:13px;z-index:1}.gantt_grid_resize_wrap .gantt_grid_resize{background-color:#cac8bd;width:1px;margin:0 auto}.gantt_drag_marker.gantt_grid_resize_area{background-color:rgba(231,231,231,.5);border-left:1px solid #cac8bd;border-right:1px solid #cac8bd;height:100%;width:100%;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.gantt_cell{display:inline-block;vertical-align:top;border-right:1px solid #eae9e5;padding-left:6px;padding-right:6px;height:100%;overflow:hidden;white-space:nowrap;font-size:8pt}.gantt_grid_data .gantt_last_cell,.gantt_grid_scale .gantt_last_cell,.gantt_task_bg .gantt_last_cell,.gantt_task_scale .gantt_last_cell{border-right-width:0}.gantt_task_bg{overflow:hidden}.gantt_scale_cell{display:inline-block;white-space:nowrap;overflow:hidden;border-right:1px solid #cac8bd;text-align:center;height:100%}.gantt_task_cell{display:inline-block;height:100%;border-right:1px solid #eae9e5}.gantt_ver_scroll{width:0;background-color:transparent;height:1px;overflow-x:hidden;overflow-y:scroll;display:none;position:absolute;right:0}.gantt_ver_scroll>div{width:1px;height:1px}.gantt_hor_scroll{height:0;background-color:transparent;width:100%;clear:both;overflow-x:scroll;overflow-y:hidden;display:none}.gantt_hor_scroll>div{width:5000px;height:1px}.gantt_tree_indent{width:15px;height:100%;display:inline-block}.gantt_tree_content,.gantt_tree_icon{vertical-align:top}.gantt_tree_icon{width:28px;height:100%;display:inline-block;background-repeat:no-repeat;background-position:center center}.gantt_tree_content{height:100%;display:inline-block}.gantt_tree_icon.gantt_open{background-image:url(data:image/gif;base64,R0lGODlhEgASAJEAAP///4SEhAAAAP///yH5BAUUAAMALAAAAAASABIAAAIqnI+py+0Powq01haA3iDgLWwek2mhNi6ZwLLdZ4owcL4kJ5OWJfX+DykAADs=);width:18px;cursor:pointer}.gantt_tree_icon.gantt_close{background-image:url(data:image/gif;base64,R0lGODlhEgASAJEAAP///4SEhAAAAP///yH5BAUUAAMALAAAAAASABIAAAImnI+py+0Powq01haA3iBgvnlMBnafgKLmWK4LCYpvK0+WJeX6DhUAOw==);width:18px;cursor:pointer}.gantt_tree_icon.gantt_blank{width:18px}.gantt_tree_icon.gantt_folder_open{background-image:url(data:image/gif;base64,R0lGODlhEgASAMQfAPXMWPK9N/fipOzLbPrVaP/89frqwv3tuvvprfLES+7PdP7xyP7z0vPAQfvtyMuaIv/32/735OSqFv3de+7ReP7lmf7gh/nv0v/67unFXfb29vK/PenFSaGEPfLnyv///yH5BAEAAB8ALAAAAAASABIAAAWS4Cc+ZGk+YvqZRVtgGiag6sNBThlFWnTQqQcE4sqRFj/VashsYR6HZI0JWSAjDwQCOGIgERULg/EQzJRQsGVCYHTK51qYTQDkFPj4iA4AJHIUgQoGQA8EdX4NhHgKAxeFfQkJGwGLeI6Fkg2UlQ8Dn5hBCZuchKChIxKkGw05Ga8DHlwkqg2tJ1xBtDlKvTUkviEAOw==)}.gantt_tree_icon.gantt_folder_closed{background-image:url(data:image/gif;base64,R0lGODlhEgASAMQfAPvjpP/24fPHVvnUdvzotdSiKv/23vvrw/LCS/C+RfnelvPMaf/88/nbi/rsyerYq/TLYv7y1v7wzeCsLO+8P86dJfvv0MuaIsydKPPOc+SqGKGEPe/AS+zVneWwLf///yH5BAEAAB8ALAAAAAASABIAAAWZ4CdeZGleYvpdA+O+zNUBqHoZOB4EceHUqVtuF+n9VCtdQCI5BC6FA3BkCEQkBALAACVMV9eDVhGJQGnIixigaAwiG6jie2G7BxDLpVJozG13EAICPxUeGRleQQMLgggJUhiHC3pBggKPFJETGZRAF5gJCRSaFxgTC55BCByioz+nEKojGgmtHBwPJAUCELo2J8FfSMTFxsUhADs=)}.gantt_tree_icon.gantt_file{background-image:url(data:image/gif;base64,R0lGODlhEgASAMQVAPv7+2RkZPf39/r6+vj4+Pn5+fT09Pb29vX19fHx8fDw8Onp6fLy8u7u7uzs7PPz8+vr6+rq6uXl5ejo6O/v7////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAABUALAAAAAASABIAAAV4YCWOZGkGaKqaVSAMQCwLQnAOj6ErzUTXpQDgQDgcGJTFDzgSEp4HRCKytDUBMKzAoIAsJACrSCjTGhINR5hELg8ECEZifS3HCgQEgj62xwZPAnwtbgMDBQU0g21Yh4iIi3aGkzBihH52lgEEmDIEli0qoigspSYhADs=)}.gantt_grid_head_cell .gantt_sort{position:absolute;right:5px;top:8px;width:7px;height:13px;background-repeat:no-repeat;background-position:center center}.gantt_grid_head_cell .gantt_sort.gantt_asc{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAANCAYAAABlyXS1AAAARUlEQVR42mNgQAL1/VP/M2ADIIntF2/9x1AAlrh0C47hCmA60DFYwX88gIFGwNDY5D8uDFbg7hvwHx2jmIBTAlkB0e4BAEjlaNtBWJPnAAAAAElFTkSuQmCC)}.gantt_grid_head_cell .gantt_sort.gantt_desc{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAANCAYAAABlyXS1AAAARUlEQVR4nGNgQAKGxib/GbABkIS7b8B/DAUwCRiGK0CXwFBAb1DfP/U/LszwHwi2X7qFgUEArBtdAVwCBmAKMCSQFSDzAWXXaOHsXeqkAAAAAElFTkSuQmCC)}.gantt_inserted,.gantt_updated{font-weight:700}.gantt_deleted{text-decoration:line-through}.gantt_invalid{background-color:FFE0E0}.gantt_error{color:red}.gantt_status{right:1px;padding:5px 10px;background:rgba(155,155,155,.1);position:absolute;top:1px;-webkit-transition:opacity .2s;transition:opacity .2s;opacity:0}.gantt_status.gantt_status_visible{opacity:1}#gantt_ajax_dots span{-webkit-transition:opacity .2s;transition:opacity .2s;background-repeat:no-repeat;opacity:0}#gantt_ajax_dots span.gantt_dot_visible{opacity:1}.dhtmlx_message_area{position:fixed;right:5px;width:250px;z-index:1000}.dhtmlx-info{min-width:120px;font-family:Verdana;z-index:10000;margin:5px 5px 10px;-webkit-transition:all .5s ease;-moz-transition:all .5s ease;-o-transition:all .5s ease;transition:all .5s ease}.dhtmlx-info.hidden{height:0;padding:0;border-width:0;margin:0;overflow:hidden}.dhtmlx_modal_box{overflow:hidden;display:inline-block;min-width:250px;width:250px;text-align:center;position:fixed;z-index:20000;box-shadow:3px 3px 3px rgba(0,0,0,.07);font-family:Verdana;border-radius:6px;border:1px solid #cac8bd;background:#fcfaf3}.dhtmlx_popup_title{border-top-left-radius:6px;border-top-right-radius:6px;border-width:0}.dhtmlx_button,.dhtmlx_popup_button{border:1px solid #cac8bd;height:25px;line-height:25px;display:inline-block;margin:0 5px;border-radius:4px;background:#e0ded7}.dhtmlx-info,.dhtmlx_button,.dhtmlx_popup_button{user-select:none;-webkit-user-select:none;-moz-user-select:-moz-none;cursor:pointer}.dhtmlx_popup_text{overflow:hidden}.dhtmlx_popup_controls{border-radius:6px;padding:10px}.dhtmlx_popup_button{min-width:100px}div.dhx_modal_cover{background-color:#000;cursor:default;filter:alpha(opacity=20);opacity:.2;position:fixed;z-index:19999;left:0;top:0;width:100%;height:100%;border:none;zoom:1}.dhtmlx-info img,.dhtmlx_modal_box img{float:left;margin-right:20px}.dhtmlx-alert-error,.dhtmlx-confirm-error{border:1px solid red}.dhtmlx_button input,.dhtmlx_popup_button div{border-radius:4px;font-size:14px;-moz-box-sizing:content-box;box-sizing:content-box;padding:0;margin:0;vertical-align:top}.dhtmlx_popup_title{color:#fff;text-shadow:1px 1px #000;height:40px;line-height:40px;font-size:20px}.dhtmlx_popup_text{margin:15px 15px 5px;font-size:14px;color:#000;min-height:30px;border-radius:6px}.dhtmlx-error,.dhtmlx-info{font-size:14px;color:#000;box-shadow:3px 3px 3px rgba(0,0,0,.07);padding:0;background-color:#FFF;border-radius:3px;border:1px solid #fff}.dhtmlx-info div{padding:5px 10px;background-color:#fff;border-radius:3px;border:1px solid #cac8bd}.dhtmlx-error{background-color:#d81b1b;border:1px solid #ff3c3c;box-shadow:3px 3px 3px rgba(0,0,0,.07)}.dhtmlx-error div{background-color:#d81b1b;border:1px solid #940000;color:#FFF}.gantt_data_area div,.gantt_grid div{-ms-touch-action:none;-webkit-tap-highlight-color:transparent}.gantt_data_area{position:relative;overflow-x:hidden;overflow-y:hidden;-moz-user-select:-moz-none;-webkit-user-select:none;-user-select:none}.gantt_links_area{position:absolute;left:0;top:0}.gantt_side_content,.gantt_task_content,.gantt_task_progress{line-height:inherit;overflow:hidden;height:100%}.gantt_task_content{font-size:11px;color:#3f3f3f;width:100%;top:0;position:absolute;white-space:nowrap;text-align:center}.gantt_task_progress{text-align:center;z-index:0;background:#a7d991}.gantt_task_line{-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px;position:absolute;-moz-box-sizing:border-box;box-sizing:border-box;background-color:#e1ffd4;border:1px solid #7fbc64;-webkit-user-select:none;-moz-user-select:none;-moz-user-select:-moz-none}.gantt_task_line.gantt_drag_move div{cursor:move}.gantt_touch_move,.gantt_touch_progress .gantt_touch_resize{-moz-transform:scale(1.02,1.1);-o-transform:scale(1.02,1.1);-webkit-transform:scale(1.02,1.1);transform:scale(1.02,1.1);-moz-transform-origin:50%;-o-transform-origin:50%;-webkit-transform-origin:50%;transform-origin:50%}.gantt_touch_progress .gantt_task_progress_drag,.gantt_touch_resize .gantt_task_drag{-moz-transform:scaleY(1.3);-o-transform:scaleY(1.3);-webkit-transform:scaleY(1.3);transform:scaleY(1.3);-moz-transform-origin:50%;-o-transform-origin:50%;-webkit-transform-origin:50%;transform-origin:50%}.gantt_side_content{position:absolute;white-space:nowrap;color:#6e6e6e;bottom:7px;font-size:11px;font-size:10px}.gantt_side_content.gantt_left{right:100%;padding-right:15px}.gantt_side_content.gantt_right{left:100%;padding-left:15px}.gantt_side_content.gantt_link_crossing{bottom:6.75px}.gantt_link_arrow,.gantt_task_link .gantt_line_wrapper{position:absolute;cursor:pointer}.gantt_line_wrapper div{background-color:#ffb96d}.gantt_task_link:hover .gantt_line_wrapper div{box-shadow:0 0 5px 0 #ffb96d}.gantt_task_link div.gantt_link_arrow{background-color:transparent;border-style:solid;width:0;height:0}.gantt_link_control{position:absolute;width:13px;top:0}.gantt_link_control div{display:none;cursor:pointer;box-sizing:border-box;position:relative;top:50%;margin-top:-7.5px;vertical-align:middle;border:1px solid #929292;-webkit-border-radius:6.5px;-moz-border-radius:6.5px;border-radius:6.5px;height:13px;width:13px;background-color:#f0f0f0}.gantt_link_control div:hover{background-color:#fff}.gantt_link_control.task_left{left:-13px}.gantt_link_control.task_right{right:-13px}.gantt_link_target .gantt_link_control div,.gantt_task_line.gantt_selected .gantt_link_control div,.gantt_task_line:hover .gantt_link_control div{display:block}.gantt_link_source,.gantt_link_target{box-shadow:0 0 3px #a7d991}.gantt_link_target.link_finish_allow,.gantt_link_target.link_start_allow{box-shadow:0 0 3px #ffdeba}.gantt_link_target.link_finish_deny,.gantt_link_target.link_start_deny{box-shadow:0 0 3px #e87e7b}.link_finish_allow .gantt_link_control.task_right div,.link_start_allow .gantt_link_control.task_left div{background-color:#ffdeba;border-color:#ffb96d}.link_finish_deny .gantt_link_control.task_right div,.link_start_deny .gantt_link_control.task_left div{background-color:#e87e7b;border-color:#dd3e3a}.gantt_link_arrow_right{border-width:4px 0 4px 6px;border-top-color:transparent!important;border-right-color:transparent!important;border-bottom-color:transparent!important;border-color:#ffb96d;margin-top:-1px}.gantt_link_arrow_left{border-width:4px 6px 4px 0;margin-top:-1px;border-top-color:transparent!important;border-color:#ffb96d;border-bottom-color:transparent!important;border-left-color:transparent!important}.gantt_link_arrow_top{border-width:0 4px 6px;border-color:#ffb96d;border-top-color:transparent!important;border-right-color:transparent!important;border-left-color:transparent!important}.gantt_link_arrow_down{border-width:4px 6px 0 4px;border-color:#ffb96d;border-right-color:transparent!important;border-bottom-color:transparent!important;border-left-color:transparent!important}.gantt_task_drag,.gantt_task_progress_drag{cursor:w-resize;height:100%;display:none;position:absolute}.gantt_task_line.gantt_selected .gantt_task_drag,.gantt_task_line.gantt_selected .gantt_task_progress_drag,.gantt_task_line:hover .gantt_task_drag,.gantt_task_line:hover .gantt_task_progress_drag{display:block}.gantt_task_drag{width:6px;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAACCAYAAACUn8ZgAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6OTgyOEUzQzJDODQ3MTFFMjg3NDRCMUFBMTM1M0U1OTYiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6OTgyOEUzQzNDODQ3MTFFMjg3NDRCMUFBMTM1M0U1OTYiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo5ODI4RTNDMEM4NDcxMUUyODc0NEIxQUExMzUzRTU5NiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo5ODI4RTNDMUM4NDcxMUUyODc0NEIxQUExMzUzRTU5NiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pj3qIQcAAAAaSURBVHjaYvz//z8DLsAEIhoaGv5jowECDAASbgp+4xzYLgAAAABJRU5ErkJggg==);z-index:1;top:0}.gantt_task_drag.task_left{left:0}.gantt_task_drag.task_right{right:0}.gantt_task_progress_drag{height:8px;width:8px;bottom:-4px;margin-left:-4px;background-position:bottom;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAJCAYAAAAGuM1UAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6Q0JCMkQyRDhDOTFDMTFFMjg3RTFCNUEzNUQwRDMxNjEiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6Q0JCMkQyRDlDOTFDMTFFMjg3RTFCNUEzNUQwRDMxNjEiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpDQkIyRDJENkM5MUMxMUUyODdFMUI1QTM1RDBEMzE2MSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpDQkIyRDJEN0M5MUMxMUUyODdFMUI1QTM1RDBEMzE2MSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Ppy3ICwAAADsSURBVHjafFBbaoNQEB1vghtIPlJX4Z/iX/cSsoZQGl80JZvIAvxVf1yNX6EFH+ADK8Y6nblQaGzagXNnmHPODHMVRIR5+L7/Sqm2bfv0i2TDT3ied4zjGBlU7+f8XPzCwrZtsSzLb9PTXQMRfhRFWFUVdl0nURQFco+45xsDNdwwDOVUNuR5LlHXNWZZhsyR5sDahRDC1XXdsSwLFCHgo+/hc5okhusVVFUFTdNgHMfHIAhQ0N2OaZowkbtpGhiG4Qa0RX6OYRicvCU9b2maPqzWa/grKtpE93D5zoZtkiRnyhv4Py6E3ZcAAwDb89Sl5rtPtAAAAABJRU5ErkJggg==);background-repeat:no-repeat;z-index:2}.gantt_link_tooltip{box-shadow:3px 3px 3px #888;background-color:#fff;border-left:1px dotted #cecece;border-top:1px dotted #cecece;font-family:Tahoma;font-size:8pt;color:#444;padding:6px;line-height:20px}.gantt_link_direction{height:0;border:0 #ffb96d;border-bottom-style:dashed;border-bottom-width:2px;transform-origin:0 0;-ms-transform-origin:0 0;-webkit-transform-origin:0 0;z-index:2;margin-left:1px;position:absolute}.gantt_grid_data .gantt_row.gantt_selected,.gantt_grid_data .gantt_row.odd.gantt_selected,.gantt_task_row.gantt_selected{background-color:#ffebbc!important}.gantt_task_row.gantt_selected .gantt_task_cell{border-right-color:#ffdc89}.gantt_task_line.gantt_selected{box-shadow:0 0 5px #a7d991}.gantt_task_line.gantt_project.gantt_selected{box-shadow:0 0 5px #9ab9f1}.gantt_task_line.gantt_milestone{visibility:hidden;background-color:#db7dc5;border:0 solid #cd49ae;box-sizing:content-box;-moz-box-sizing:content-box}.gantt_task_line.gantt_milestone div{visibility:visible}.gantt_task_line.gantt_milestone .gantt_task_content{background:inherit;border:inherit;border-width:1px;border-radius:inherit;box-sizing:border-box;-moz-box-sizing:border-box;-webkit-transform:rotate(45deg);-moz-transform:rotate(45deg);-ms-transform:rotate(45deg);-o-transform:rotate(45deg);transform:rotate(45deg)}.gantt_task_line.gantt_task_inline_color{border-color:#999}.gantt_task_line.gantt_task_inline_color .gantt_task_progress{background-color:#363636;opacity:.2}.gantt_task_line.gantt_task_inline_color.gantt_project.gantt_selected,.gantt_task_line.gantt_task_inline_color.gantt_selected{box-shadow:0 0 5px #999}.gantt_task_link.gantt_link_inline_color:hover .gantt_line_wrapper div{box-shadow:0 0 5px 0 #999}.gantt_critical_task{background-color:#e63030;border-color:#9d3a3a}.gantt_critical_task .gantt_task_progress{background-color:rgba(0,0,0,.4)}.gantt_critical_link .gantt_line_wrapper>div{background-color:#e63030}.gantt_critical_link .gantt_link_arrow{border-color:#e63030}.gantt_unselectable,.gantt_unselectable div{-webkit-user-select:none;-moz-user-select:none;-moz-user-select:-moz-none}.gantt_cal_light{-webkit-tap-highlight-color:transparent;background:#f4f2ea;border-radius:6px;font-family:Verdana;border:1px solid #cac8bd;color:#3f3f3f;font-size:8pt;position:absolute;z-index:10001;width:550px;height:250px;box-shadow:3px 3px 3px rgba(0,0,0,.07)}.gantt_cal_light select{font-family:Verdana;border:1px solid #cac8bd;font-size:11px;padding:2px;margin:0}.gantt_cal_ltitle{padding:7px 10px;overflow:hidden;white-space:nowrap;-webkit-border-radius:6px 6px 0 0;-moz-border-radius-topleft:6px;-moz-border-radius-bottomleft:0;-moz-border-radius-topright:6px;-moz-border-radius-bottomright:0;border-radius:6px 6px 0 0}.gantt_cal_ltitle span{white-space:nowrap}.gantt_cal_lsection{color:#727272;font-weight:700;padding:12px 0 5px 10px}.gantt_cal_lsection .gantt_fullday{float:right;margin-right:5px;font-size:12px;font-weight:400;line-height:20px;vertical-align:top;cursor:pointer}.gantt_cal_lsection{font-size:13px}.gantt_cal_ltext{padding:2px 10px;overflow:hidden}.gantt_cal_ltext textarea{overflow:auto;font-family:Verdana;font-size:11px;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;border:1px solid #cac8bd;height:100%;width:100%;outline:0!important;resize:none}.gantt_time{font-weight:700}.gantt_cal_light .gantt_title{padding-left:10px}.gantt_cal_larea{border:1px solid #cac8bd;border-left:none;border-right:none;background-color:#fff;overflow:hidden;height:1px}.gantt_btn_set{margin:10px 7px 5px 10px;padding:5px 15px 5px 10px;float:left;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;border-width:0;border-color:#cac8bd;border-style:solid;height:27px;color:#4f4f4f;background:#e0ded7;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;cursor:pointer}.gantt_btn_set div{float:left;font-size:13px;height:17px;line-height:17px;background-repeat:no-repeat;vertical-align:middle}.gantt_save_btn{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6QUUzMDA3NzlDOTFEMTFFMkJBQTNFMTU1NTdFNUNFMTMiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6QUUzMDA3N0FDOTFEMTFFMkJBQTNFMTU1NTdFNUNFMTMiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpBRTMwMDc3N0M5MUQxMUUyQkFBM0UxNTU1N0U1Q0UxMyIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpBRTMwMDc3OEM5MUQxMUUyQkFBM0UxNTU1N0U1Q0UxMyIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PtHrmoUAAAF4SURBVHjaYvr//z8DNTATA5UA1QxiIUdTQEAAG5CaA8S6QGyyYcOGvyzkGMLIyLgSGC4BHBwcr1RUVBhJdhHQEGagIctAhjAzM/9OSkrqd3Nz+ws3CKjAA0hNA+JcoDO34jIESC0FGhIM4tvb2y8FGjIbyPwPD2wNDQ1RIKUItG09UIM3LkOAOBzEB3rnaF5eXieQ+RYl1jo6Og4oKCicAtrGCjXMA82Q+TBD+Pj4HtfU1NQDmTewRf/jjIyMNmDgfYAatgnJMFDsxIIYrKysX7Ozs9sFBAT240xHQO/t8PT0BGliQHLZdiA3AabGz89vlrm5+RIg8x++BPkzPj5+Msj/UMM4gBTciwYGBttiY2MnAJmfiUnZj4CB2MzFxfUGWVBcXPx6WVlZE0ie6CwiJye3D+il6UCvgZ0PCreCggKQ4adIzWu/w8LCpoO8wsLC8j0yMnKipqbmelh6wQUYQUUADmACxDpADArwl4RSPT6DBqYYAQgwANyusz7jloxAAAAAAElFTkSuQmCC);margin-top:2px;width:21px}.gantt_cancel_btn{margin-top:2px;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6QjQxN0VEOUZDOTFEMTFFMkFFMjE4MDI4MUJDNDQ1NDkiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6QjQxN0VEQTBDOTFEMTFFMkFFMjE4MDI4MUJDNDQ1NDkiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpCNDE3RUQ5REM5MUQxMUUyQUUyMTgwMjgxQkM0NDU0OSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpCNDE3RUQ5RUM5MUQxMUUyQUUyMTgwMjgxQkM0NDU0OSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pq9E2PUAAAH/SURBVHjaYvz//z8DNQAjTQ0KCAjgAVJFQOwBxGZQ4VNAvAOI+zZs2PCFoEFAQ+wZGRkXAMUVsNrMyPgAKJcANOwgToOAhgQCqXUgtqCg4ANXV9ctzs7Od0D8vXv3quzYsSPw06dP0lDl/kDDNmEYBDRECGjbYyCfS09Pb0dNTc1sNja2M0CpF1C1EjExMfu/fPmiBHXZZ5CrgYa9A/FZYCaysLCU/vnzh0tUVPRGU1NTPVDoNBD/R3ItyKVKAgICj/79+8cIdJksSA9QrBIkz4RkUBCINjU1XQUNWGRDQC4zBhrycMGCBYW2trbLkPWgGPTz50+wk6WlpTegBT6yIaCYXMfJybkRJPf7928ZDIOYmZl/g+jjx4+/xmcISPz27dsfYNowDOLi4gIb8PDhQ1N8hkDVGIBobm7ulxgGAb0EClyGX79+leAzBCjH9vXr13pkPSgGhYeHTwd6DxhUP62ghjzCZggw2icCw0YdGNDfQXrgkQVjGBgYHPHx8Zm9cePGHGhA/gdq/ANkysGUAHELMO3ogji+vr6zQXpwZREFkEErV66M//btmwi2LAIMyzdAlyz09/efDAoufJlW8tWrVx7Tp08PevDggc779+8VYFlGQUHhSmZm5joxMTFQ5n1OTDHCCsT6QAxKJ2JQsVdA/ASIL4J8TrPyCCDAAK8E80CvM3cMAAAAAElFTkSuQmCC);width:20px}.gantt_delete_btn{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6QjkzQUQ0MjVDOTFEMTFFMkEwRERFNzQ5NzZCRjlBODgiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6QjkzQUQ0MjZDOTFEMTFFMkEwRERFNzQ5NzZCRjlBODgiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpCOTNBRDQyM0M5MUQxMUUyQTBEREU3NDk3NkJGOUE4OCIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpCOTNBRDQyNEM5MUQxMUUyQTBEREU3NDk3NkJGOUE4OCIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pmbo+yIAAAB9SURBVHjaYvz//z8DNQALPsmAgAC4LRs2bGDEaxLIRdiwv78/kPqfBsNQPk71jDCvIdtOLEB2JRMDlQAjUmCnkaF/FtYwgoUDsTQypprXRg0a0QYhp2yGpqamzefOnfMhpMnIyGhLXV2dL06DgMAYigmBs1CM0yCyAUCAAQAlK4lJjSOjGQAAAABJRU5ErkJggg==);margin-top:2px;width:20px}.gantt_cal_cover{width:100%;height:100%;position:absolute;z-index:10000;top:0;left:0;background-color:#000;opacity:.1;filter:alpha(opacity=10)}.gantt_custom_button{padding:0 3px;font-family:Verdana;font-size:11px;font-weight:400;margin-right:10px;margin-top:-5px;cursor:pointer;float:right;height:21px;width:90px;border:1px solid #CECECE;text-align:center;-webkit-border-radius:4px;-moz-border-radius:4px;-ms-border-radius:4px;-o-border-radius:4px;border-radius:4px}.gantt_custom_button div{cursor:pointer;float:none;height:21px;line-height:21px;vertical-align:middle}.gantt_custom_button div:first-child{display:none}.gantt_cal_light_wide{width:580px}.gantt_cal_light_wide .gantt_cal_larea{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;border:1px solid #cac8bd}.gantt_cal_light_wide .gantt_cal_lsection{border:0;float:left;text-align:right;width:80px;height:20px;padding:5px 10px 0 0}.gantt_cal_light_wide .gantt_wrap_section{position:relative;padding:10px 0;overflow:hidden;border-bottom:1px solid #eae9e5}.gantt_cal_light_wide .gantt_section_time{overflow:hidden;padding-top:2px!important;padding-right:0;height:20px!important}.gantt_cal_light_wide .gantt_cal_ltext{padding-right:0}.gantt_cal_light_wide .gantt_cal_larea{padding:0 10px;width:100%}.gantt_cal_light_wide .gantt_section_time{background:0 0}.gantt_cal_light_wide .gantt_cal_checkbox label{padding-left:0}.gantt_cal_light_wide .gantt_cal_lsection .gantt_fullday{float:none;margin-right:0;font-weight:700;cursor:pointer}.gantt_cal_light_wide .gantt_custom_button{position:absolute;top:0;right:0;margin-top:2px}.gantt_cal_light_wide .gantt_repeat_right{margin-right:55px}.gantt_cal_light_wide.gantt_cal_light_full{width:738px}.gantt_cal_wide_checkbox input{margin-top:8px;margin-left:14px}.gantt_cal_light input{font-size:11px}.gantt_section_time{background-color:#fff;white-space:nowrap;padding:5px 10px;padding-top:2px!important}.gantt_section_time .gantt_time_selects{float:left;height:25px}.gantt_section_time .gantt_time_selects select{height:23px;padding:2px;border:1px solid #cac8bd}.gantt_duration{width:100px;height:23px;float:left;white-space:nowrap;margin-left:20px;line-height:23px}.gantt_duration .gantt_duration_dec,.gantt_duration .gantt_duration_inc,.gantt_duration .gantt_duration_value{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;text-align:center;vertical-align:top;height:100%;border:1px solid #cac8bd}.gantt_duration .gantt_duration_value{width:40px;padding:3px 4px;border-left-width:0;border-right-width:0}.gantt_duration .gantt_duration_dec,.gantt_duration .gantt_duration_inc{width:20px;padding:1px 1px 3px;background:#e0ded7}.gantt_duration .gantt_duration_dec{-moz-border-top-left-radius:4px;-moz-border-bottom-left-radius:4px;-webkit-border-top-left-radius:4px;-webkit-border-bottom-left-radius:4px;border-top-left-radius:4px;border-bottom-left-radius:4px}.gantt_duration .gantt_duration_inc{margin-right:4px;-moz-border-top-right-radius:4px;-moz-border-bottom-right-radius:4px;-webkit-border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:4px}.gantt_cal_quick_info{border:1px solid #cac8bd;border-radius:6px;position:absolute;z-index:300;box-shadow:3px 3px 3px rgba(0,0,0,.07);background-color:#fcfaf3;width:300px;transition:left .5s ease,right .5s;-moz-transition:left .5s ease,right .5s;-webkit-transition:left .5s ease,right .5s;-o-transition:left .5s ease,right .5s}.gantt_no_animate{transition:none;-moz-transition:none;-webkit-transition:none;-o-transition:none}.gantt_cal_quick_info.gantt_qi_left .gantt_qi_big_icon{float:right}.gantt_cal_qi_title{-webkit-border-radius:6px 6px 0 0;-moz-border-radius-topleft:6px;-moz-border-radius-bottomleft:0;-moz-border-radius-topright:6px;-moz-border-radius-bottomright:0;border-radius:6px 6px 0 0;padding:5px 0 8px 12px;color:#3f3f3f;background-color:#f4f2ea;border-bottom:1px solid #cac8bd}.gantt_cal_qi_tdate{font-size:14px;font-weight:700}.gantt_cal_qi_tcontent{font-size:11px}.gantt_cal_qi_content{padding:16px 8px;font-size:13px;color:#3f3f3f;overflow:hidden}.gantt_cal_qi_controls{-webkit-border-radius:0 0 6px 6px;-moz-border-radius-topleft:0;-moz-border-radius-bottomleft:6px;-moz-border-radius-topright:0;-moz-border-radius-bottomright:6px;border-radius:0 0 6px 6px;padding-left:7px}.gantt_cal_qi_controls .gantt_menu_icon{margin-top:3.5px;background-repeat:no-repeat}.gantt_cal_qi_controls .gantt_menu_icon.icon_edit{width:20px;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH3QYFDgcMloNXJQAAAFNJREFUOMvt0zEOACAIA0Dkg30rL8TJTRTKZGJXyaWEKPKTCQAH4Ls37cItcDUzsxHNDLZNhCq7Gt1wh9ErV7EjyGAhyGLphlnsClWuS32rn0czAT/KLVk9yshBAAAAAElFTkSuQmCC)}.gantt_cal_qi_controls .gantt_menu_icon.icon_delete{width:20px;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6QjkzQUQ0MjVDOTFEMTFFMkEwRERFNzQ5NzZCRjlBODgiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6QjkzQUQ0MjZDOTFEMTFFMkEwRERFNzQ5NzZCRjlBODgiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpCOTNBRDQyM0M5MUQxMUUyQTBEREU3NDk3NkJGOUE4OCIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpCOTNBRDQyNEM5MUQxMUUyQTBEREU3NDk3NkJGOUE4OCIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pmbo+yIAAAB9SURBVHjaYvz//z8DNQALPsmAgAC4LRs2bGDEaxLIRdiwv78/kPqfBsNQPk71jDCvIdtOLEB2JRMDlQAjUmCnkaF/FtYwgoUDsTQypprXRg0a0QYhp2yGpqamzefOnfMhpMnIyGhLXV2dL06DgMAYigmBs1CM0yCyAUCAAQAlK4lJjSOjGQAAAABJRU5ErkJggg==)}.gantt_qi_big_icon{font-size:13px;border-radius:4px;color:#4f4f4f;background:#e0ded7;margin:5px 9px 8px 0;min-width:60px;line-height:27px;vertical-align:middle;padding:0 10px 0 5px;cursor:pointer;border:1px solid #cac8bd}.gantt_cal_qi_controls div{float:left;height:27px;text-align:center;line-height:27px}.gantt_tooltip{box-shadow:3px 3px 3px rgba(0,0,0,.07);background-color:#fff;border-left:1px solid rgba(0,0,0,.07);border-top:1px solid rgba(0,0,0,.07);font-family:Verdana;font-size:8pt;color:#3f3f3f;padding:10px;position:absolute;z-index:50}.gantt_marker{height:100%;width:2px;top:0;position:absolute;text-align:center;background-color:rgba(255,0,0,.4);-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.gantt_marker .gantt_marker_content{padding:5px;background:inherit;color:#fff;position:absolute;font-size:12px;line-height:12px;opacity:.8}.gantt_marker_area{position:absolute;top:0;left:0}.gantt_noselect{-moz-user-select:-moz-none;-webkit-user-select:none;-user-select:none}.gantt_drag_marker{position:absolute;font-family:Verdana;font-size:11px}.gantt_drag_marker .gantt_tree_icon.gantt_blank,.gantt_drag_marker .gantt_tree_icon.gantt_close,.gantt_drag_marker .gantt_tree_icon.gantt_open,.gantt_drag_marker .gantt_tree_indent{display:none}.gantt_drag_marker,.gantt_drag_marker .gantt_row.odd{background-color:#fff}.gantt_drag_marker .gantt_row{border-left:1px solid #d3d1c8;border-top:1px solid #d3d1c8}.gantt_drag_marker .gantt_cell{border-color:#d3d1c8}.gantt_row.gantt_over,.gantt_task_row.gantt_over{background-color:#0070fe}.gantt_row.gantt_transparent .gantt_cell{opacity:.7}.gantt_task_row.gantt_transparent{background-color:#fff}.dhtmlx_popup_button.dhtmlx_delete_button{border:1px solid #98d27e;background:#a7d991} \ No newline at end of file diff --git a/libraries/dhtmlxgantt/skins/dhtmlxgantt_skyblue.css b/libraries/dhtmlxgantt/skins/dhtmlxgantt_skyblue.css deleted file mode 100644 index 1b22fa2..0000000 --- a/libraries/dhtmlxgantt/skins/dhtmlxgantt_skyblue.css +++ /dev/null @@ -1,9 +0,0 @@ -/* -@license - -dhtmlxGantt v.3.2.0 Stardard -This software is covered by GPL license. You also can obtain Commercial or Enterprise license to use it in non-GPL project - please contact sales@dhtmlx.com. Usage without proper license is prohibited. - -(c) Dinamenta, UAB. -*/ -.gridHoverStyle{background-color:#ffe6b1!important;background-image:-webkit-linear-gradient(top,#ffe09d 0,#ffeabb 100%);background-image:-moz-linear-gradient(top,#ffe09d 0,#ffeabb 100%);background-image:-ms-linear-gradient(top,#ffe09d 0,#ffeabb 100%);background-image:linear-gradient(to top,#ffe09d 0,#ffeabb 100%);border-top-color:#ffc341;border-bottom-color:#ffc341}.gridSelection{background-color:#ffe6b1!important;border-bottom-color:#ffc341}.timelineSelection{background-color:#ffe6b1!important;background-image:-webkit-linear-gradient(top,#ffe09d 0,#ffeabb 100%);background-image:-moz-linear-gradient(top,#ffe09d 0,#ffeabb 100%);background-image:-ms-linear-gradient(top,#ffe09d 0,#ffeabb 100%);background-image:linear-gradient(to top,#ffe09d 0,#ffeabb 100%);border-top-color:#ffc341;border-bottom-color:#ffc341}.timelineSelection .gantt_task_cell{border-right-color:#ffce65}.gantt_cal_quick_info .gantt_cal_qi_title{background:#fff}.gantt_cal_qi_controls .gantt_qi_big_icon .gantt_menu_icon.icon_delete{margin-top:5px}.gantt_container{font-family:Tahoma;font-size:11px;border:1px solid #a4bed4;position:relative;white-space:nowrap}.gantt_grid{border-right:1px solid #a4bed4}.gantt_task_scroll{overflow-x:scroll}.gantt_task{position:relative}.gantt_grid,.gantt_task{overflow-x:hidden;overflow-y:hidden;display:inline-block;vertical-align:top}.gantt_grid_scale,.gantt_task_scale{color:#42464b;border-bottom:1px solid #a4bed4;box-shadow:0 1px 1px #fff inset;background:-webkit-gradient(linear,left top,left bottom,color-stop(0,#e4f0ff),color-stop(50%,#dfedff),color-stop(100%,#d5e8ff)) 0 1px repeat-x;background-image:-webkit-linear-gradient(top,#e4f0ff 0,#dfedff 50%,#d5e8ff 100%);background-image:-moz-linear-gradient(top,#e4f0ff 0,#dfedff 60%,#d5e8ff 100%);background-image:-ms-linear-gradient(top,#e4f0ff 0,#dfedff 60%,#d5e8ff 100%);background-image:-o-linear-gradient(top,#e4f0ff 0,#dfedff 60%,#d5e8ff 100%)}.gantt_scale_line{box-sizing:border-box;-moz-box-sizing:border-box;border-top:1px solid #a4bed4}.gantt_scale_line:first-child{border-top:none}.gantt_grid_head_cell{display:inline-block;vertical-align:top;border-right:1px solid #a4bed4;text-align:center;position:relative;cursor:default;height:100%;-moz-user-select:-moz-none;-webkit-user-select:none;-user-select:none;overflow:hidden}.gantt_scale_line{clear:both}.gantt_grid_data{width:100%;overflow:hidden}.gantt_row{position:relative;-webkit-user-select:none;-moz-user-select:none;-moz-user-select:-moz-none}.gantt_add,.gantt_grid_head_add{width:100%;height:100%;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NzZCMThBRUFCRTQ0MTFFMkFFMEFGMEFBMzJEN0RBRTIiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NzZCMThBRUJCRTQ0MTFFMkFFMEFGMEFBMzJEN0RBRTIiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo3NkIxOEFFOEJFNDQxMUUyQUUwQUYwQUEzMkQ3REFFMiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo3NkIxOEFFOUJFNDQxMUUyQUUwQUYwQUEzMkQ3REFFMiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PkVHygEAAAEpSURBVHjaYgzeGcyABfxnwA4Y0QVY/v79i1VlsUMxCr/3QC9WdTgN+P//P8Ohr4fAbDtuOwZc6lj+/PmDVeLfv39wTSA2LnU4DQC5AGYAiI1LHRNQ4j861pfSZ3j36x1YEwiD2CAxbGoZbRbZ/K/3qUcx9cPvDwzXv11n+PL3C5jPw8zDoMmlySDAKoCirnFLI8QLID/ufLOTARf48OcDw/Gfx1HE3EXcwa5j+f37N95AwgVAekB64QaATISB97/fM1z5dIXh85/PYD4vCy+DDp8OgyCrIIYBjFoTtDBSnYWyBYO9rj3DsbfHwHwrYSuGg5cPMpy4ewIzFoCmMKLjwzcOMwiwCMBjAcQGiWFTizchweRompDwuiBANoCgCxjFasQoys4AAQYARt4I/K036xQAAAAASUVORK5CYII=);background-position:center center;background-repeat:no-repeat;cursor:pointer;position:relative;-moz-opacity:.3;opacity:.3}.gantt_grid_head_cell.gantt_grid_head_add{-moz-opacity:.6;opacity:.6;top:0}.gantt_grid_head_cell.gantt_grid_head_add:hover{-moz-opacity:1;opacity:1}.gantt_grid_data .gantt_row.odd:hover,.gantt_grid_data .gantt_row:hover{background-color:#ffe6b1!important;background-image:-webkit-linear-gradient(top,#ffe09d 0,#ffeabb 100%);background-image:-moz-linear-gradient(top,#ffe09d 0,#ffeabb 100%);background-image:-ms-linear-gradient(top,#ffe09d 0,#ffeabb 100%);background-image:linear-gradient(to top,#ffe09d 0,#ffeabb 100%);border-top-color:#ffc341;border-bottom-color:#ffc341}.gantt_grid_data .gantt_row.odd:hover .gantt_add,.gantt_grid_data .gantt_row:hover .gantt_add{-moz-opacity:1;opacity:1}.gantt_row,.gantt_task_row{border-bottom:1px solid #ebebeb;background-color:#fff}.gantt_row.odd,.gantt_task_row.odd{background-color:#fff}.gantt_cell,.gantt_grid_head_cell,.gantt_row,.gantt_scale_cell,.gantt_task_cell,.gantt_task_row{box-sizing:border-box;-moz-box-sizing:border-box}.gantt_grid_head_cell,.gantt_scale_cell{line-height:inherit}.gantt_grid_scale .gantt_grid_column_resize_wrap{cursor:col-resize;position:absolute;width:13px}.gantt_grid_column_resize_wrap .gantt_grid_column_resize{background-color:#a4bed4;height:100%;width:1px;margin:0 auto}.gantt_grid .gantt_grid_resize_wrap{cursor:col-resize;position:absolute;width:13px;z-index:1}.gantt_grid_resize_wrap .gantt_grid_resize{background-color:#a4bed4;width:1px;margin:0 auto}.gantt_drag_marker.gantt_grid_resize_area{background-color:rgba(231,231,231,.5);border-left:1px solid #a4bed4;border-right:1px solid #a4bed4;height:100%;width:100%;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.gantt_cell{display:inline-block;vertical-align:top;border-right:1px solid #ebebeb;padding-left:6px;padding-right:6px;height:100%;overflow:hidden;white-space:nowrap}.gantt_grid_data .gantt_last_cell,.gantt_grid_scale .gantt_last_cell,.gantt_task_bg .gantt_last_cell,.gantt_task_scale .gantt_last_cell{border-right-width:0}.gantt_task_bg{overflow:hidden}.gantt_scale_cell{display:inline-block;white-space:nowrap;overflow:hidden;border-right:1px solid #a4bed4;text-align:center;height:100%}.gantt_task_cell{display:inline-block;height:100%;border-right:1px solid #ebebeb}.gantt_ver_scroll{width:0;background-color:transparent;height:1px;overflow-x:hidden;overflow-y:scroll;display:none;position:absolute;right:0}.gantt_ver_scroll>div{width:1px;height:1px}.gantt_hor_scroll{height:0;background-color:transparent;width:100%;clear:both;overflow-x:scroll;overflow-y:hidden;display:none}.gantt_hor_scroll>div{width:5000px;height:1px}.gantt_tree_indent{width:15px;height:100%;display:inline-block}.gantt_tree_content,.gantt_tree_icon{vertical-align:top}.gantt_tree_icon{width:28px;height:100%;display:inline-block;background-repeat:no-repeat;background-position:center center}.gantt_tree_content{height:100%;display:inline-block}.gantt_tree_icon.gantt_open{background-image:url(data:image/gif;base64,R0lGODlhEgASAJEAAP///4SEhAAAAP///yH5BAUUAAMALAAAAAASABIAAAIqnI+py+0Powq01haA3iDgLWwek2mhNi6ZwLLdZ4owcL4kJ5OWJfX+DykAADs=);width:18px;cursor:pointer}.gantt_tree_icon.gantt_close{background-image:url(data:image/gif;base64,R0lGODlhEgASAJEAAP///4SEhAAAAP///yH5BAUUAAMALAAAAAASABIAAAImnI+py+0Powq01haA3iBgvnlMBnafgKLmWK4LCYpvK0+WJeX6DhUAOw==);width:18px;cursor:pointer}.gantt_tree_icon.gantt_blank{width:18px}.gantt_tree_icon.gantt_folder_open{background-image:url(data:image/gif;base64,R0lGODlhEgASAMQfAPXMWPK9N/fipOzLbPrVaP/89frqwv3tuvvprfLES+7PdP7xyP7z0vPAQfvtyMuaIv/32/735OSqFv3de+7ReP7lmf7gh/nv0v/67unFXfb29vK/PenFSaGEPfLnyv///yH5BAEAAB8ALAAAAAASABIAAAWS4Cc+ZGk+YvqZRVtgGiag6sNBThlFWnTQqQcE4sqRFj/VashsYR6HZI0JWSAjDwQCOGIgERULg/EQzJRQsGVCYHTK51qYTQDkFPj4iA4AJHIUgQoGQA8EdX4NhHgKAxeFfQkJGwGLeI6Fkg2UlQ8Dn5hBCZuchKChIxKkGw05Ga8DHlwkqg2tJ1xBtDlKvTUkviEAOw==)}.gantt_tree_icon.gantt_folder_closed{background-image:url(data:image/gif;base64,R0lGODlhEgASAMQfAPvjpP/24fPHVvnUdvzotdSiKv/23vvrw/LCS/C+RfnelvPMaf/88/nbi/rsyerYq/TLYv7y1v7wzeCsLO+8P86dJfvv0MuaIsydKPPOc+SqGKGEPe/AS+zVneWwLf///yH5BAEAAB8ALAAAAAASABIAAAWZ4CdeZGleYvpdA+O+zNUBqHoZOB4EceHUqVtuF+n9VCtdQCI5BC6FA3BkCEQkBALAACVMV9eDVhGJQGnIixigaAwiG6jie2G7BxDLpVJozG13EAICPxUeGRleQQMLgggJUhiHC3pBggKPFJETGZRAF5gJCRSaFxgTC55BCByioz+nEKojGgmtHBwPJAUCELo2J8FfSMTFxsUhADs=)}.gantt_tree_icon.gantt_file{background-image:url(data:image/gif;base64,R0lGODlhEgASAMQVAPv7+2RkZPf39/r6+vj4+Pn5+fT09Pb29vX19fHx8fDw8Onp6fLy8u7u7uzs7PPz8+vr6+rq6uXl5ejo6O/v7////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAABUALAAAAAASABIAAAV4YCWOZGkGaKqaVSAMQCwLQnAOj6ErzUTXpQDgQDgcGJTFDzgSEp4HRCKytDUBMKzAoIAsJACrSCjTGhINR5hELg8ECEZifS3HCgQEgj62xwZPAnwtbgMDBQU0g21Yh4iIi3aGkzBihH52lgEEmDIEli0qoigspSYhADs=)}.gantt_grid_head_cell .gantt_sort{position:absolute;right:5px;top:8px;width:7px;height:13px;background-repeat:no-repeat;background-position:center center}.gantt_grid_head_cell .gantt_sort.gantt_asc{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAANCAYAAABlyXS1AAAARUlEQVR4nGNgQAKGxib/GbABkIS7b8B/DAUwCRiGK0CXwFBAb1DfP/U/LszwHwi2X7qFgUEArBtdAVwCBmAKMCSQFSDzAWXXaOHsXeqkAAAAAElFTkSuQmCC)}.gantt_grid_head_cell .gantt_sort.gantt_desc{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAANCAYAAABlyXS1AAAARUlEQVR42mNgQAL1/VP/M2ADIIntF2/9x1AAlrh0C47hCmA60DFYwX88gIFGwNDY5D8uDFbg7hvwHx2jmIBTAlkB0e4BAEjlaNtBWJPnAAAAAElFTkSuQmCC)}.gantt_inserted,.gantt_updated{font-weight:700}.gantt_deleted{text-decoration:line-through}.gantt_invalid{background-color:FFE0E0}.gantt_error{color:red}.gantt_status{right:1px;padding:5px 10px;background:rgba(155,155,155,.1);position:absolute;top:1px;-webkit-transition:opacity .2s;transition:opacity .2s;opacity:0}.gantt_status.gantt_status_visible{opacity:1}#gantt_ajax_dots span{-webkit-transition:opacity .2s;transition:opacity .2s;background-repeat:no-repeat;opacity:0}#gantt_ajax_dots span.gantt_dot_visible{opacity:1}.dhtmlx_message_area{position:fixed;right:5px;width:250px;z-index:1000}.dhtmlx-info{min-width:120px;font-family:Tahoma;z-index:10000;margin:5px 5px 10px;-webkit-transition:all .5s ease;-moz-transition:all .5s ease;-o-transition:all .5s ease;transition:all .5s ease}.dhtmlx-info.hidden{height:0;padding:0;border-width:0;margin:0;overflow:hidden}.dhtmlx_modal_box{overflow:hidden;display:inline-block;min-width:250px;width:250px;text-align:center;position:fixed;z-index:20000;box-shadow:3px 3px 3px rgba(0,0,0,.07);font-family:Tahoma;border-radius:0;border:1px solid #a4bed4;background:#fff}.dhtmlx_popup_title{border-top-left-radius:0;border-top-right-radius:0;border-width:0}.dhtmlx_button,.dhtmlx_popup_button{border:1px solid #a4bed4;height:24px;line-height:24px;display:inline-block;margin:0 5px;border-radius:4px;background-color:#f8f8f8;background-image:-webkit-linear-gradient(top,#e6e6e6 0,#fff 100%);background-image:-moz-linear-gradient(top,#e6e6e6 0,#fff 100%);background-image:-ms-linear-gradient(top,#e6e6e6 0,#fff 100%);background-image:linear-gradient(to top,#e6e6e6 0,#fff 100%)}.dhtmlx-info,.dhtmlx_button,.dhtmlx_popup_button{user-select:none;-webkit-user-select:none;-moz-user-select:-moz-none;cursor:pointer}.dhtmlx_popup_text{overflow:hidden}.dhtmlx_popup_controls{border-radius:6px;padding:10px}.dhtmlx_popup_button{min-width:100px}div.dhx_modal_cover{background-color:#000;cursor:default;filter:alpha(opacity=20);opacity:.2;position:fixed;z-index:19999;left:0;top:0;width:100%;height:100%;border:none;zoom:1}.dhtmlx-info img,.dhtmlx_modal_box img{float:left;margin-right:20px}.dhtmlx-alert-error,.dhtmlx-confirm-error{border:1px solid red}.dhtmlx_button input,.dhtmlx_popup_button div{border-radius:4px;font-size:15px;-moz-box-sizing:content-box;box-sizing:content-box;padding:0;margin:0;vertical-align:top}.dhtmlx_popup_title{color:#fff;text-shadow:1px 1px #000;height:40px;line-height:40px;font-size:20px}.dhtmlx_popup_text{margin:15px 15px 5px;font-size:14px;color:#000;min-height:30px;border-radius:0}.dhtmlx-error,.dhtmlx-info{font-size:14px;color:#000;box-shadow:3px 3px 3px rgba(0,0,0,.07);padding:0;background-color:#FFF;border-radius:3px;border:1px solid #fff}.dhtmlx-info div{padding:5px 10px;background-color:#fff;border-radius:3px;border:1px solid #a4bed4}.dhtmlx-error{background-color:#d81b1b;border:1px solid #ff3c3c;box-shadow:3px 3px 3px rgba(0,0,0,.07)}.dhtmlx-error div{background-color:#d81b1b;border:1px solid #940000;color:#FFF}.gantt_data_area div,.gantt_grid div{-ms-touch-action:none;-webkit-tap-highlight-color:transparent}.gantt_data_area{position:relative;overflow-x:hidden;overflow-y:hidden;-moz-user-select:-moz-none;-webkit-user-select:none;-user-select:none}.gantt_links_area{position:absolute;left:0;top:0}.gantt_side_content,.gantt_task_content,.gantt_task_progress{line-height:inherit;overflow:hidden;height:100%}.gantt_task_content{font-size:12px;color:#1e2022;width:100%;top:0;position:absolute;white-space:nowrap;text-align:center}.gantt_task_progress{text-align:center;z-index:0;background:#82b7de;background-image:-webkit-linear-gradient(top,#abcee8 0,#5aa0d3 36%,#bfdaee 100%);background-image:-moz-linear-gradient(top,#abcee8 0,#5aa0d3 36%,#bfdaee 100%);background-image:-ms-linear-gradient(top,#abcee8 0,#5aa0d3 36%,#bfdaee 100%);background-image:linear-gradient(to top,#abcee8 0,#5aa0d3 36%,#bfdaee 100%)}.gantt_task_line{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;position:absolute;-moz-box-sizing:border-box;box-sizing:border-box;background-color:#eff6fb;border:1px solid #3588c5;-webkit-user-select:none;-moz-user-select:none;-moz-user-select:-moz-none}.gantt_task_line.gantt_drag_move div{cursor:move}.gantt_touch_move,.gantt_touch_progress .gantt_touch_resize{-moz-transform:scale(1.02,1.1);-o-transform:scale(1.02,1.1);-webkit-transform:scale(1.02,1.1);transform:scale(1.02,1.1);-moz-transform-origin:50%;-o-transform-origin:50%;-webkit-transform-origin:50%;transform-origin:50%}.gantt_touch_progress .gantt_task_progress_drag,.gantt_touch_resize .gantt_task_drag{-moz-transform:scaleY(1.3);-o-transform:scaleY(1.3);-webkit-transform:scaleY(1.3);transform:scaleY(1.3);-moz-transform-origin:50%;-o-transform-origin:50%;-webkit-transform-origin:50%;transform-origin:50%}.gantt_side_content{position:absolute;white-space:nowrap;color:#6e6e6e;bottom:7px;font-size:11px}.gantt_side_content.gantt_left{right:100%;padding-right:15px}.gantt_side_content.gantt_right{left:100%;padding-left:15px}.gantt_side_content.gantt_link_crossing{bottom:6.75px}.gantt_link_arrow,.gantt_task_link .gantt_line_wrapper{position:absolute;cursor:pointer}.gantt_line_wrapper div{background-color:#4a8f43}.gantt_task_link:hover .gantt_line_wrapper div{box-shadow:0 0 5px 0 #4a8f43}.gantt_task_link div.gantt_link_arrow{background-color:transparent;border-style:solid;width:0;height:0}.gantt_link_control{position:absolute;width:13px;top:0}.gantt_link_control div{display:none;cursor:pointer;box-sizing:border-box;position:relative;top:50%;margin-top:-7.5px;vertical-align:middle;border:1px solid #929292;-webkit-border-radius:6.5px;-moz-border-radius:6.5px;border-radius:6.5px;height:13px;width:13px;background-color:#f0f0f0}.gantt_link_control div:hover{background-color:#fff}.gantt_link_control.task_left{left:-13px}.gantt_link_control.task_right{right:-13px}.gantt_link_target .gantt_link_control div,.gantt_task_line.gantt_selected .gantt_link_control div,.gantt_task_line:hover .gantt_link_control div{display:block}.gantt_link_source,.gantt_link_target{box-shadow:0 0 3px #0070fe}.gantt_link_target.link_finish_allow,.gantt_link_target.link_start_allow{box-shadow:0 0 3px #6eb867}.gantt_link_target.link_finish_deny,.gantt_link_target.link_start_deny{box-shadow:0 0 3px #e87e7b}.link_finish_allow .gantt_link_control.task_right div,.link_start_allow .gantt_link_control.task_left div{background-color:#6eb867;border-color:#4a8f43}.link_finish_deny .gantt_link_control.task_right div,.link_start_deny .gantt_link_control.task_left div{background-color:#e87e7b;border-color:#dd3e3a}.gantt_link_arrow_right{border-width:4px 0 4px 8px;border-top-color:transparent!important;border-right-color:transparent!important;border-bottom-color:transparent!important;border-color:#4a8f43;margin-top:-1px}.gantt_link_arrow_left{border-width:4px 8px 4px 0;margin-top:-1px;border-top-color:transparent!important;border-color:#4a8f43;border-bottom-color:transparent!important;border-left-color:transparent!important}.gantt_link_arrow_top{border-width:0 4px 8px;border-color:#4a8f43;border-top-color:transparent!important;border-right-color:transparent!important;border-left-color:transparent!important}.gantt_link_arrow_down{border-width:4px 8px 0 4px;border-color:#4a8f43;border-right-color:transparent!important;border-bottom-color:transparent!important;border-left-color:transparent!important}.gantt_task_drag,.gantt_task_progress_drag{cursor:w-resize;height:100%;display:none;position:absolute}.gantt_task_line.gantt_selected .gantt_task_drag,.gantt_task_line.gantt_selected .gantt_task_progress_drag,.gantt_task_line:hover .gantt_task_drag,.gantt_task_line:hover .gantt_task_progress_drag{display:block}.gantt_task_drag{width:6px;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAACCAYAAACUn8ZgAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MDEyNDQ5RDdCRTQ5MTFFMjhBQzlGRDA2RDIyNDc5NzEiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MDEyNDQ5RDhCRTQ5MTFFMjhBQzlGRDA2RDIyNDc5NzEiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDowMTI0NDlENUJFNDkxMUUyOEFDOUZEMDZEMjI0Nzk3MSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDowMTI0NDlENkJFNDkxMUUyOEFDOUZEMDZEMjI0Nzk3MSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pv8NECcAAAAaSURBVHjaYvz//z8DLsAEIsw6j/3HRgMEGAARnwqNiuFmdQAAAABJRU5ErkJggg==);z-index:1;top:0}.gantt_task_drag.task_left{left:0}.gantt_task_drag.task_right{right:0}.gantt_task_progress_drag{height:8px;width:8px;bottom:-4px;margin-left:-4px;background-position:bottom;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NDNGNzQ1MTZCQkRBMTFFMjlBMjRBRkU0RkNCMTUzNkUiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NDNGNzQ1MTdCQkRBMTFFMjlBMjRBRkU0RkNCMTUzNkUiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo0M0Y3NDUxNEJCREExMUUyOUEyNEFGRTRGQ0IxNTM2RSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo0M0Y3NDUxNUJCREExMUUyOUEyNEFGRTRGQ0IxNTM2RSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PrBLI3EAAACISURBVHjafE07DkMhDAuftQdgYuCWbZ9a0WtwGJC4BgMbYmVGaZLpqWpryZFjOwrACSmlSLzCN1DwrLUik/TtM3yUUnDOiWMMZE3enTNF4gghRO89KKXkABGh9w6ttcPSHp1zsNaCvbcUjDHAHhVemg1rrVxprYWs2ZOMR84ZfoGfXuAP3gIMABorQUvC1invAAAAAElFTkSuQmCC);background-repeat:no-repeat;z-index:2}.gantt_link_tooltip{box-shadow:3px 3px 3px #888;background-color:#fff;border-left:1px dotted #cecece;border-top:1px dotted #cecece;font-family:Tahoma;font-size:8pt;color:#444;padding:6px;line-height:20px}.gantt_link_direction{height:0;border:0 #4a8f43;border-bottom-style:dashed;border-bottom-width:2px;transform-origin:0 0;-ms-transform-origin:0 0;-webkit-transform-origin:0 0;z-index:2;margin-left:1px;position:absolute}.gantt_grid_data .gantt_row.gantt_selected,.gantt_grid_data .gantt_row.odd.gantt_selected{background-color:#ffe6b1!important;border-bottom-color:#ffc341}.gantt_task_row.gantt_selected{background-color:#ffe6b1!important;background-image:-webkit-linear-gradient(top,#ffe09d 0,#ffeabb 100%);background-image:-moz-linear-gradient(top,#ffe09d 0,#ffeabb 100%);background-image:-ms-linear-gradient(top,#ffe09d 0,#ffeabb 100%);background-image:linear-gradient(to top,#ffe09d 0,#ffeabb 100%);border-top-color:#ffc341;border-bottom-color:#ffc341}.gantt_task_row.gantt_selected .gantt_task_cell{border-right-color:#ffce65}.gantt_task_line.gantt_selected{box-shadow:0 0 5px #5aa0d3}.gantt_task_line.gantt_project.gantt_selected{box-shadow:0 0 5px #9ab9f1}.gantt_task_line.gantt_milestone{visibility:hidden;background-color:#db7dc5;border:0 solid #cd49ae;box-sizing:content-box;-moz-box-sizing:content-box}.gantt_task_line.gantt_milestone div{visibility:visible}.gantt_task_line.gantt_milestone .gantt_task_content{background:inherit;border:inherit;border-width:1px;border-radius:inherit;box-sizing:border-box;-moz-box-sizing:border-box;-webkit-transform:rotate(45deg);-moz-transform:rotate(45deg);-ms-transform:rotate(45deg);-o-transform:rotate(45deg);transform:rotate(45deg)}.gantt_task_line.gantt_task_inline_color{border-color:#999}.gantt_task_line.gantt_task_inline_color .gantt_task_progress{background-color:#363636;opacity:.2}.gantt_task_line.gantt_task_inline_color.gantt_project.gantt_selected,.gantt_task_line.gantt_task_inline_color.gantt_selected{box-shadow:0 0 5px #999}.gantt_task_link.gantt_link_inline_color:hover .gantt_line_wrapper div{box-shadow:0 0 5px 0 #999}.gantt_critical_task{background-color:#e63030;border-color:#9d3a3a}.gantt_critical_task .gantt_task_progress{background-color:rgba(0,0,0,.4)}.gantt_critical_link .gantt_line_wrapper>div{background-color:#e63030}.gantt_critical_link .gantt_link_arrow{border-color:#e63030}.gantt_unselectable,.gantt_unselectable div{-webkit-user-select:none;-moz-user-select:none;-moz-user-select:-moz-none}.gantt_cal_light{-webkit-tap-highlight-color:transparent;background-color:#eff6fb;border-radius:0;font-family:Tahoma;font-size:11px;border:1px solid #a4bed4;color:#42464b;position:absolute;z-index:10001;width:550px;height:250px;box-shadow:3px 3px 3px rgba(0,0,0,.07)}.gantt_cal_light select{font-family:Tahoma;border:1px solid #a4bed4;font-size:11px;padding:2px;margin:0}.gantt_cal_ltitle{padding:7px 10px;overflow:hidden;white-space:nowrap;-webkit-border-radius:0;-moz-border-radius-topleft:0;-moz-border-radius-bottomleft:0;-moz-border-radius-topright:0;-moz-border-radius-bottomright:0;border-radius:0}.gantt_cal_ltitle span{white-space:nowrap}.gantt_cal_lsection{color:#727272;font-weight:700;padding:12px 0 5px 10px}.gantt_cal_lsection .gantt_fullday{float:right;margin-right:5px;font-size:12px;font-weight:400;line-height:20px;vertical-align:top;cursor:pointer}.gantt_cal_lsection{font-size:13px}.gantt_cal_ltext{padding:2px 10px;overflow:hidden}.gantt_cal_ltext textarea{overflow:auto;font-family:Tahoma;font-size:11px;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;border:1px solid #a4bed4;height:100%;width:100%;outline:0!important;resize:none}.gantt_time{font-weight:700}.gantt_cal_light .gantt_title{padding-left:10px}.gantt_cal_larea{border:1px solid #a4bed4;border-left:none;border-right:none;background-color:#fff;overflow:hidden;height:1px}.gantt_btn_set{margin:10px 7px 5px 10px;padding:2px 25px 2px 10px;float:left;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;border-width:1px;border-color:#a4bed4;border-style:solid;height:26px;color:#42464b;background-color:#f8f8f8;background-image:-webkit-linear-gradient(top,#e6e6e6 0,#fff 100%);background-image:-moz-linear-gradient(top,#e6e6e6 0,#fff 100%);background-image:-ms-linear-gradient(top,#e6e6e6 0,#fff 100%);background-image:linear-gradient(to top,#e6e6e6 0,#fff 100%);-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;cursor:pointer}.gantt_btn_set div{float:left;font-size:13px;height:20px;line-height:20px;background-repeat:no-repeat;vertical-align:middle}.gantt_save_btn{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6QkE5Nzc4RENDMzAzMTFFMjk4QjNBODhDMUM4QUUwNEQiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6QkE5Nzc4RERDMzAzMTFFMjk4QjNBODhDMUM4QUUwNEQiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpCQTk3NzhEQUMzMDMxMUUyOThCM0E4OEMxQzhBRTA0RCIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpCQTk3NzhEQkMzMDMxMUUyOThCM0E4OEMxQzhBRTA0RCIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pr5Ot2UAAAFoSURBVHjapFO7SgNRED0rxkjEELbcQksLBUMg4EfkG7YV/AFTpBAUfNQisVDQD7CQlBaWwoZ8gNEiFttmg3GTfbF6JtzFTUJYyIHhDnfOnJm5Dy2OYywDjQJnF5ex/dXDweENNtaAzT/jur46IY1D4McHvv3J+nZ7BGNrG436sSaU3ucHqtUqzP1sVcflMizLEl8EwjBEFEXwomwC5DInEeDGaDSC62cTIJc5iUAQBGJukE1A8YkVNYLv++h232WMRUYOuakRlOLTwzU8z1tYPZ/Po1QqJR0kAgQDWTEjwLaIWq0GwzDmJtm2jVarNSvAeeQQXVe6ME1Tgs1mMyXA2GAwQKFQmH8G/X4fjuOgWCxKkP40yMnlcukO1MNgAivoui5B+tMgh3H1DuQa66fnaLfbGA6HMgY7oNGfNnL+v0RN/cbnl9f46qSBSqUiM9J4ZQSvVgl0Oh1pf2d3D4/3d5q27Hf+FWAAc90EKSR5k78AAAAASUVORK5CYII=);margin-top:2px;width:21px}.gantt_cancel_btn{margin-top:2px;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6QzU4NTQ3NUZDMzAzMTFFMkE0MjRGNTQzQjE0MTNDQkIiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6QzU4NTQ3NjBDMzAzMTFFMkE0MjRGNTQzQjE0MTNDQkIiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpDNTg1NDc1REMzMDMxMUUyQTQyNEY1NDNCMTQxM0NCQiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpDNTg1NDc1RUMzMDMxMUUyQTQyNEY1NDNCMTQxM0NCQiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PkVB3hoAAAEYSURBVHjapJM9CsJAEIUTFStbQRA8gKCNKSIIeohUVraC9oKiGBRsBDvBylbwEkJQCys9gJUgeIOAxDfwEpYNpsmDL7PZ+cn+TMwgCIw0yhgplZPH3bbVuRqYgiYogxe4ABc8wqD69RpbQR6MwQ04TDZoHc6LP/tvC2uw4Fi+Vgcmrct58W9iW4BaYAB80OGSQ8my7xz7jDsAT11Bn3alJYvUa1pp8VGBNu0uIVm2s9fiowJF8OWJ/0sWPRlX1At8eLqlhGRRhXEfvcCJtpeQLOpq8VGBLe04Ibmh+Ld6AY8HWOBVzUCVvio780z/LrxCtQ9EQ+5tBOZElRzeUmmqWCfKlyfAAkfw5vyb7xb9vlrATPs7/wQYAISgQGDaq6hUAAAAAElFTkSuQmCC);width:20px}.gantt_delete_btn{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6RTA3M0M1MzJDMzAzMTFFMkE5ODZDRjhENzQ2MUZFNzkiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6RTA3M0M1MzNDMzAzMTFFMkE5ODZDRjhENzQ2MUZFNzkiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpFMDczQzUzMEMzMDMxMUUyQTk4NkNGOEQ3NDYxRkU3OSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpFMDczQzUzMUMzMDMxMUUyQTk4NkNGOEQ3NDYxRkU3OSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pplu0sEAAAErSURBVHja3FOxboMwED0nIQNbJoaOZM0YyMhGqwz8BOQ3mm5I/AHwCayoGVlhZUSMHTIhsSCEhOtzawRIlZDY+qTTs893z6fzmVBKYQ12YhEEweB0HAf3tCxLUFUVXWSeiDGIzW/ynRE9HA7coihCBtd1AVn40TCO2X1ewbthGCBJEiiKAtvtFggh0HUdWJYFfd9zez6f3JckiS1EhEDmeZ623+9BlmWejCaAfWqahou0bQumab7MK9DP5zM9nU5c4Hg8ch4nF0XBOc9zuF6vg/pm3pw0TSdNDcPwp8QsG2LiOIY/BZagqqp1AmP8M4Gvuq5B1/XJqNq2zVnTNMBzjBsLEHxnHBrf91/Z/nPBpW+32+0hPuFODAt79wtbfiwQuLD4x6SCNfgWYAAfQYJFsOV+5AAAAABJRU5ErkJggg==);margin-top:2px;width:20px}.gantt_cal_cover{width:100%;height:100%;position:absolute;z-index:10000;top:0;left:0;background-color:#000;opacity:.1;filter:alpha(opacity=10)}.gantt_custom_button{padding:0 3px;font-family:Tahoma;font-size:11px;font-weight:400;margin-right:10px;margin-top:-5px;cursor:pointer;float:right;height:21px;width:90px;border:1px solid #CECECE;text-align:center;-webkit-border-radius:4px;-moz-border-radius:4px;-ms-border-radius:4px;-o-border-radius:4px;border-radius:4px}.gantt_custom_button div{cursor:pointer;float:none;height:21px;line-height:21px;vertical-align:middle}.gantt_custom_button div:first-child{display:none}.gantt_cal_light_wide{width:580px;padding:2px 4px}.gantt_cal_light_wide .gantt_cal_larea{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;border:1px solid #a4bed4}.gantt_cal_light_wide .gantt_cal_lsection{border:0;float:left;text-align:right;width:80px;height:20px;padding:5px 10px 0 0}.gantt_cal_light_wide .gantt_wrap_section{position:relative;padding:10px 0;overflow:hidden;border-bottom:1px solid #ebebeb}.gantt_cal_light_wide .gantt_section_time{overflow:hidden;padding-top:2px!important;padding-right:0;height:20px!important}.gantt_cal_light_wide .gantt_cal_ltext{padding-right:0}.gantt_cal_light_wide .gantt_cal_larea{padding:0 10px;width:100%}.gantt_cal_light_wide .gantt_section_time{background:0 0}.gantt_cal_light_wide .gantt_cal_checkbox label{padding-left:0}.gantt_cal_light_wide .gantt_cal_lsection .gantt_fullday{float:none;margin-right:0;font-weight:700;cursor:pointer}.gantt_cal_light_wide .gantt_custom_button{position:absolute;top:0;right:0;margin-top:2px}.gantt_cal_light_wide .gantt_repeat_right{margin-right:55px}.gantt_cal_light_wide.gantt_cal_light_full{width:738px}.gantt_cal_wide_checkbox input{margin-top:8px;margin-left:14px}.gantt_cal_light input{font-size:11px}.gantt_section_time{background-color:#fff;white-space:nowrap;padding:5px 10px;padding-top:2px!important}.gantt_section_time .gantt_time_selects{float:left;height:25px}.gantt_section_time .gantt_time_selects select{height:23px;padding:2px;border:1px solid #a4bed4}.gantt_duration{width:100px;height:23px;float:left;white-space:nowrap;margin-left:20px;line-height:23px}.gantt_duration .gantt_duration_dec,.gantt_duration .gantt_duration_inc,.gantt_duration .gantt_duration_value{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;text-align:center;vertical-align:top;height:100%;border:1px solid #a4bed4}.gantt_duration .gantt_duration_value{width:40px;padding:3px 4px;border-left-width:0;border-right-width:0}.gantt_duration .gantt_duration_dec,.gantt_duration .gantt_duration_inc{width:20px;padding:1px 1px 3px;background-color:#f8f8f8;background-image:-webkit-linear-gradient(top,#e6e6e6 0,#fff 100%);background-image:-moz-linear-gradient(top,#e6e6e6 0,#fff 100%);background-image:-ms-linear-gradient(top,#e6e6e6 0,#fff 100%);background-image:linear-gradient(to top,#e6e6e6 0,#fff 100%)}.gantt_duration .gantt_duration_dec{-moz-border-top-left-radius:4px;-moz-border-bottom-left-radius:4px;-webkit-border-top-left-radius:4px;-webkit-border-bottom-left-radius:4px;border-top-left-radius:4px;border-bottom-left-radius:4px}.gantt_duration .gantt_duration_inc{margin-right:4px;-moz-border-top-right-radius:4px;-moz-border-bottom-right-radius:4px;-webkit-border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:4px}.gantt_cal_quick_info{border:1px solid #a4bed4;border-radius:0;position:absolute;z-index:300;box-shadow:3px 3px 3px rgba(0,0,0,.07);background-color:#fff;width:300px;transition:left .5s ease,right .5s;-moz-transition:left .5s ease,right .5s;-webkit-transition:left .5s ease,right .5s;-o-transition:left .5s ease,right .5s}.gantt_no_animate{transition:none;-moz-transition:none;-webkit-transition:none;-o-transition:none}.gantt_cal_quick_info.gantt_qi_left .gantt_qi_big_icon{float:right}.gantt_cal_qi_title{-webkit-border-radius:0;-moz-border-radius-topleft:0;-moz-border-radius-bottomleft:0;-moz-border-radius-topright:0;-moz-border-radius-bottomright:0;border-radius:0;padding:5px 0 8px 12px;color:#1e2022;box-shadow:0 1px 1px #fff inset;background:-webkit-gradient(linear,left top,left bottom,color-stop(0,#e4f0ff),color-stop(50%,#dfedff),color-stop(100%,#d5e8ff)) 0 1px repeat-x;background-image:-webkit-linear-gradient(top,#e4f0ff 0,#dfedff 50%,#d5e8ff 100%);background-image:-moz-linear-gradient(top,#e4f0ff 0,#dfedff 60%,#d5e8ff 100%);background-image:-ms-linear-gradient(top,#e4f0ff 0,#dfedff 60%,#d5e8ff 100%);background-image:-o-linear-gradient(top,#e4f0ff 0,#dfedff 60%,#d5e8ff 100%);border-bottom:1px solid #a4bed4}.gantt_cal_qi_tdate{font-size:14px;font-weight:700}.gantt_cal_qi_tcontent{font-size:11px}.gantt_cal_qi_content{padding:16px 8px;font-size:13px;color:#1e2022;overflow:hidden}.gantt_cal_qi_controls{-webkit-border-radius:0;-moz-border-radius-topleft:0;-moz-border-radius-bottomleft:0;-moz-border-radius-topright:0;-moz-border-radius-bottomright:0;border-radius:0;padding-left:7px}.gantt_cal_qi_controls .gantt_menu_icon{margin-top:3px;background-repeat:no-repeat}.gantt_cal_qi_controls .gantt_menu_icon.icon_edit{width:20px;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH3QYFDhEuX3ujFgAAAFNJREFUOMvt0zEOACAIA0DksTyqn8XJTRTKZGJXyaWEKPKTCQAH4Ls37cItcDUzsxHNDLZNhCq7Gt1wh9ErV7EjyGAhyGLphlnsClWuS32rn0czAV+sNUIROnQoAAAAAElFTkSuQmCC)}.gantt_cal_qi_controls .gantt_menu_icon.icon_delete{width:20px;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6RTA3M0M1MzJDMzAzMTFFMkE5ODZDRjhENzQ2MUZFNzkiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6RTA3M0M1MzNDMzAzMTFFMkE5ODZDRjhENzQ2MUZFNzkiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpFMDczQzUzMEMzMDMxMUUyQTk4NkNGOEQ3NDYxRkU3OSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpFMDczQzUzMUMzMDMxMUUyQTk4NkNGOEQ3NDYxRkU3OSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pplu0sEAAAErSURBVHja3FOxboMwED0nIQNbJoaOZM0YyMhGqwz8BOQ3mm5I/AHwCayoGVlhZUSMHTIhsSCEhOtzawRIlZDY+qTTs893z6fzmVBKYQ12YhEEweB0HAf3tCxLUFUVXWSeiDGIzW/ynRE9HA7coihCBtd1AVn40TCO2X1ewbthGCBJEiiKAtvtFggh0HUdWJYFfd9zez6f3JckiS1EhEDmeZ623+9BlmWejCaAfWqahou0bQumab7MK9DP5zM9nU5c4Hg8ch4nF0XBOc9zuF6vg/pm3pw0TSdNDcPwp8QsG2LiOIY/BZagqqp1AmP8M4Gvuq5B1/XJqNq2zVnTNMBzjBsLEHxnHBrf91/Z/nPBpW+32+0hPuFODAt79wtbfiwQuLD4x6SCNfgWYAAfQYJFsOV+5AAAAABJRU5ErkJggg==)}.gantt_qi_big_icon{font-size:13px;border-radius:4px;color:#42464b;background-color:#f8f8f8;background-image:-webkit-linear-gradient(top,#e6e6e6 0,#fff 100%);background-image:-moz-linear-gradient(top,#e6e6e6 0,#fff 100%);background-image:-ms-linear-gradient(top,#e6e6e6 0,#fff 100%);background-image:linear-gradient(to top,#e6e6e6 0,#fff 100%);margin:5px 9px 8px 0;min-width:60px;line-height:26px;vertical-align:middle;padding:0 10px 0 5px;cursor:pointer;border:1px solid #a4bed4}.gantt_cal_qi_controls div{float:left;height:26px;text-align:center;line-height:26px}.gantt_tooltip{box-shadow:3px 3px 3px rgba(0,0,0,.07);background-color:#fff;border-left:1px solid rgba(0,0,0,.07);border-top:1px solid rgba(0,0,0,.07);font-family:Tahoma;font-size:8pt;color:#1e2022;padding:10px;position:absolute;z-index:50}.gantt_marker{height:100%;width:2px;top:0;position:absolute;text-align:center;background-color:rgba(255,0,0,.4);-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.gantt_marker .gantt_marker_content{padding:5px;background:inherit;color:#fff;position:absolute;font-size:12px;line-height:12px;opacity:.8}.gantt_marker_area{position:absolute;top:0;left:0}.gantt_noselect{-moz-user-select:-moz-none;-webkit-user-select:none;-user-select:none}.gantt_drag_marker{position:absolute;font-family:Tahoma;font-size:11px}.gantt_drag_marker .gantt_tree_icon.gantt_blank,.gantt_drag_marker .gantt_tree_icon.gantt_close,.gantt_drag_marker .gantt_tree_icon.gantt_open,.gantt_drag_marker .gantt_tree_indent{display:none}.gantt_drag_marker,.gantt_drag_marker .gantt_row.odd{background-color:#fff}.gantt_drag_marker .gantt_row{border-left:1px solid #d2d2d2;border-top:1px solid #d2d2d2}.gantt_drag_marker .gantt_cell{border-color:#d2d2d2}.gantt_row.gantt_over,.gantt_task_row.gantt_over{background-color:#0070fe}.gantt_row.gantt_transparent .gantt_cell{opacity:.7}.gantt_task_row.gantt_transparent{background-color:#e4f0ff} \ No newline at end of file diff --git a/libraries/dhtmlxgantt/skins/dhtmlxgantt_terrace.css b/libraries/dhtmlxgantt/skins/dhtmlxgantt_terrace.css deleted file mode 100644 index 7ca01eb..0000000 --- a/libraries/dhtmlxgantt/skins/dhtmlxgantt_terrace.css +++ /dev/null @@ -1,9 +0,0 @@ -/* -@license - -dhtmlxGantt v.3.2.0 Stardard -This software is covered by GPL license. You also can obtain Commercial or Enterprise license to use it in non-GPL project - please contact sales@dhtmlx.com. Usage without proper license is prohibited. - -(c) Dinamenta, UAB. -*/ -.gridHoverStyle,.gridSelection,.timelineSelection{background-color:#fff3a1}.gantt_grid_scale .gantt_grid_head_cell{color:#a6a6a6;border-top:none!important;border-right:none!important}.gantt_grid_data .gantt_cell{border-right:none;color:#454545}.gantt_task_link .gantt_link_arrow_right{border-width:6px;margin-top:-3px}.gantt_task_link .gantt_link_arrow_left{border-width:6px;margin-left:-6px;margin-top:-3px}.gantt_task_link .gantt_link_arrow_down,.gantt_task_link .gantt_link_arrow_top{border-width:6px}.gantt_task_line .gantt_task_progress_drag{bottom:-4px;height:16px;margin-left:-8px;width:16px}.chartHeaderBg{background-color:#fff}.gantt_task .gantt_task_scale .gantt_scale_cell{color:#a6a6a6;border-right:1px solid #ebebeb}.gantt_row.gantt_project,.gantt_row.odd.gantt_project{background-color:#edffef}.gantt_task_row.gantt_project,.gantt_task_row.odd.gantt_project{background-color:#f5fff6}.gantt_task_line.gantt_project{background-color:#65c16f;border:1px solid #3c9445}.gantt_task_line.gantt_project .gantt_task_progress{background-color:#46ad51}.buttonBg{background:#fff}.gantt_cal_light .gantt_btn_set{margin:5px 10px}.gantt_btn_set.gantt_cancel_btn_set{background:#fff;color:#454545;border:1px solid #cecece}.gantt_btn_set.gantt_save_btn_set{background:#3db9d3;text-shadow:0 -1px 0 #248a9f;color:#fff}.gantt_btn_set.gantt_delete_btn_set{background:#ec8e00;text-shadow:0 -1px 0 #a60;color:#fff}.gantt_cal_light_wide{padding-left:0!important;padding-right:0!important}.gantt_cal_light_wide .gantt_cal_larea{border-left:none!important;border-right:none!important}.dhtmlx_popup_button.dhtmlx_ok_button{background:#3db9d3;text-shadow:0 -1px 0 #248a9f;color:#fff;font-weight:700;border-width:0}.dhtmlx_popup_button.dhtmlx_cancel_button{font-weight:700;color:#454544}.gantt_qi_big_icon.icon_edit{color:#454545;background:#fff}.gantt_qi_big_icon.icon_delete{text-shadow:0 -1px 0 #a60;background:#ec8e00;color:#fff;border-width:0}.gantt_container{font-family:Arial;font-size:13px;border:1px solid #cecece;position:relative;white-space:nowrap}.gantt_grid{border-right:1px solid #cecece}.gantt_task_scroll{overflow-x:scroll}.gantt_task{position:relative}.gantt_grid,.gantt_task{overflow-x:hidden;overflow-y:hidden;display:inline-block;vertical-align:top}.gantt_grid_scale,.gantt_task_scale{color:#6b6b6b;font-size:12px;border-bottom:1px solid #cecece;background-color:#fff}.gantt_scale_line{box-sizing:border-box;-moz-box-sizing:border-box;border-top:1px solid #cecece}.gantt_scale_line:first-child{border-top:none}.gantt_grid_head_cell{display:inline-block;vertical-align:top;border-right:1px solid #cecece;text-align:center;position:relative;cursor:default;height:100%;-moz-user-select:-moz-none;-webkit-user-select:none;-user-select:none;overflow:hidden}.gantt_scale_line{clear:both}.gantt_grid_data{width:100%;overflow:hidden}.gantt_row{position:relative;-webkit-user-select:none;-moz-user-select:none;-moz-user-select:-moz-none}.gantt_add,.gantt_grid_head_add{width:100%;height:100%;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NTQ3MjMyMENDNkI0MTFFMjk4MTI5QTg3MDhFNDVDQTkiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NTQ3MjMyMERDNkI0MTFFMjk4MTI5QTg3MDhFNDVDQTkiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo1NDcyMzIwQUM2QjQxMUUyOTgxMjlBODcwOEU0NUNBOSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo1NDcyMzIwQkM2QjQxMUUyOTgxMjlBODcwOEU0NUNBOSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PshZT8UAAABbSURBVHjaYrTdeZmBEsCER+4wEP+H4sPkGGCDg020ARR7gb4GIAcYDKMDdPnDyAbYkGG5DVW9cIQMvUdBBAuUY4vDz8iAcZinA2zgCHqAYQMseAywJcYFAAEGAM+UFGuohFczAAAAAElFTkSuQmCC);background-position:center center;background-repeat:no-repeat;cursor:pointer;position:relative;-moz-opacity:.3;opacity:.3}.gantt_grid_head_cell.gantt_grid_head_add{-moz-opacity:.6;opacity:.6;top:0}.gantt_grid_head_cell.gantt_grid_head_add:hover{-moz-opacity:1;opacity:1}.gantt_grid_data .gantt_row.odd:hover,.gantt_grid_data .gantt_row:hover{background-color:#fff3a1}.gantt_grid_data .gantt_row.odd:hover .gantt_add,.gantt_grid_data .gantt_row:hover .gantt_add{-moz-opacity:1;opacity:1}.gantt_row,.gantt_task_row{border-bottom:1px solid #ebebeb;background-color:#fff}.gantt_row.odd,.gantt_task_row.odd{background-color:#fff}.gantt_cell,.gantt_grid_head_cell,.gantt_row,.gantt_scale_cell,.gantt_task_cell,.gantt_task_row{box-sizing:border-box;-moz-box-sizing:border-box}.gantt_grid_head_cell,.gantt_scale_cell{line-height:inherit}.gantt_grid_scale .gantt_grid_column_resize_wrap{cursor:col-resize;position:absolute;width:13px}.gantt_grid_column_resize_wrap .gantt_grid_column_resize{background-color:#cecece;height:100%;width:1px;margin:0 auto}.gantt_grid .gantt_grid_resize_wrap{cursor:col-resize;position:absolute;width:13px;z-index:1}.gantt_grid_resize_wrap .gantt_grid_resize{background-color:#cecece;width:1px;margin:0 auto}.gantt_drag_marker.gantt_grid_resize_area{background-color:rgba(231,231,231,.5);border-left:1px solid #cecece;border-right:1px solid #cecece;height:100%;width:100%;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.gantt_cell{display:inline-block;vertical-align:top;border-right:1px solid #ebebeb;padding-left:6px;padding-right:6px;height:100%;overflow:hidden;white-space:nowrap;font-size:13px}.gantt_grid_data .gantt_last_cell,.gantt_grid_scale .gantt_last_cell,.gantt_task_bg .gantt_last_cell,.gantt_task_scale .gantt_last_cell{border-right-width:0}.gantt_task_bg{overflow:hidden}.gantt_scale_cell{display:inline-block;white-space:nowrap;overflow:hidden;border-right:1px solid #cecece;text-align:center;height:100%}.gantt_task_cell{display:inline-block;height:100%;border-right:1px solid #ebebeb}.gantt_ver_scroll{width:0;background-color:transparent;height:1px;overflow-x:hidden;overflow-y:scroll;display:none;position:absolute;right:0}.gantt_ver_scroll>div{width:1px;height:1px}.gantt_hor_scroll{height:0;background-color:transparent;width:100%;clear:both;overflow-x:scroll;overflow-y:hidden;display:none}.gantt_hor_scroll>div{width:5000px;height:1px}.gantt_tree_indent{width:15px;height:100%;display:inline-block}.gantt_tree_content,.gantt_tree_icon{vertical-align:top}.gantt_tree_icon{width:28px;height:100%;display:inline-block;background-repeat:no-repeat;background-position:center center}.gantt_tree_content{height:100%;display:inline-block}.gantt_tree_icon.gantt_open{background-image:url(data:image/gif;base64,R0lGODlhEgASALMJAMrKyt3d3ejp6d7f3+/v75aWlvf39////wAAAP///wAAAAAAAAAAAAAAAAAAAAAAACH/C1hNUCBEYXRhWE1QPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS4wLWMwNjAgNjEuMTM0Nzc3LCAyMDEwLzAyLzEyLTE3OjMyOjAwICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdFJlZj0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlUmVmIyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M1IFdpbmRvd3MiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6M0I5RTczQjVDMDdBMTFFMTgxRjc4Mzk4M0Q3MjVFQzAiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6M0I5RTczQjZDMDdBMTFFMTgxRjc4Mzk4M0Q3MjVFQzAiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDozQjlFNzNCM0MwN0ExMUUxODFGNzgzOTgzRDcyNUVDMCIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDozQjlFNzNCNEMwN0ExMUUxODFGNzgzOTgzRDcyNUVDMCIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PgH//v38+/r5+Pf29fTz8vHw7+7t7Ovq6ejn5uXk4+Lh4N/e3dzb2tnY19bV1NPS0dDPzs3My8rJyMfGxcTDwsHAv769vLu6ubi3trW0s7KxsK+urayrqqmop6alpKOioaCfnp2cm5qZmJeWlZSTkpGQj46NjIuKiYiHhoWEg4KBgH9+fXx7enl4d3Z1dHNycXBvbm1sa2ppaGdmZWRjYmFgX15dXFtaWVhXVlVUU1JRUE9OTUxLSklIR0ZFRENCQUA/Pj08Ozo5ODc2NTQzMjEwLy4tLCsqKSgnJiUkIyIhIB8eHRwbGhkYFxYVFBMSERAPDg0MCwoJCAcGBQQDAgEAACH5BAEAAAkALAAAAAASABIAAARJMMlJq704661B+SAIXAVhnKhBFKSZnmuLImhslXPN3ibi+6pdBXc4IIpB2YkGE1IKAoL0ICUInJNCYMDtDgJYiScUGnHO6LQkAgA7);width:18px;cursor:pointer}.gantt_tree_icon.gantt_close{background-image:url(data:image/gif;base64,R0lGODlhEgASALMJAMrKyt3d3ejp6d7f3+/v75aWlvf39wAAAP///////wAAAAAAAAAAAAAAAAAAAAAAACH/C1hNUCBEYXRhWE1QPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS4wLWMwNjAgNjEuMTM0Nzc3LCAyMDEwLzAyLzEyLTE3OjMyOjAwICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdFJlZj0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlUmVmIyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M1IFdpbmRvd3MiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MzY0QzNGM0VDMDdBMTFFMUE3MDlCNUM2QjU1NDA5RjgiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MzY0QzNGM0ZDMDdBMTFFMUE3MDlCNUM2QjU1NDA5RjgiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDozNjRDM0YzQ0MwN0ExMUUxQTcwOUI1QzZCNTU0MDlGOCIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDozNjRDM0YzREMwN0ExMUUxQTcwOUI1QzZCNTU0MDlGOCIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PgH//v38+/r5+Pf29fTz8vHw7+7t7Ovq6ejn5uXk4+Lh4N/e3dzb2tnY19bV1NPS0dDPzs3My8rJyMfGxcTDwsHAv769vLu6ubi3trW0s7KxsK+urayrqqmop6alpKOioaCfnp2cm5qZmJeWlZSTkpGQj46NjIuKiYiHhoWEg4KBgH9+fXx7enl4d3Z1dHNycXBvbm1sa2ppaGdmZWRjYmFgX15dXFtaWVhXVlVUU1JRUE9OTUxLSklIR0ZFRENCQUA/Pj08Ozo5ODc2NTQzMjEwLy4tLCsqKSgnJiUkIyIhIB8eHRwbGhkYFxYVFBMSERAPDg0MCwoJCAcGBQQDAgEAACH5BAEAAAkALAAAAAASABIAAARDMMlJq704661B+SAIXAVhnKhBFKSZnmv7wqxVzmpd3Uff5zKEUAi0uV4xm4DAbBIEOkohMKhaB4HoxBMKjTjgsFgSAQA7);width:18px;cursor:pointer}.gantt_tree_icon.gantt_blank{width:18px}.gantt_tree_icon.gantt_folder_open{background-image:url(data:image/gif;base64,R0lGODlhEgASAJECAJeXl7Gvrf///wAAACH/C1hNUCBEYXRhWE1QPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS4wLWMwNjAgNjEuMTM0Nzc3LCAyMDEwLzAyLzEyLTE3OjMyOjAwICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdFJlZj0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlUmVmIyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M1IFdpbmRvd3MiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NTdDRDM3QzVDMDZEMTFFMUJGMzhFMDhCN0RGRjBGQ0YiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NTdDRDM3QzZDMDZEMTFFMUJGMzhFMDhCN0RGRjBGQ0YiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo1N0NEMzdDM0MwNkQxMUUxQkYzOEUwOEI3REZGMEZDRiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo1N0NEMzdDNEMwNkQxMUUxQkYzOEUwOEI3REZGMEZDRiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PgH//v38+/r5+Pf29fTz8vHw7+7t7Ovq6ejn5uXk4+Lh4N/e3dzb2tnY19bV1NPS0dDPzs3My8rJyMfGxcTDwsHAv769vLu6ubi3trW0s7KxsK+urayrqqmop6alpKOioaCfnp2cm5qZmJeWlZSTkpGQj46NjIuKiYiHhoWEg4KBgH9+fXx7enl4d3Z1dHNycXBvbm1sa2ppaGdmZWRjYmFgX15dXFtaWVhXVlVUU1JRUE9OTUxLSklIR0ZFRENCQUA/Pj08Ozo5ODc2NTQzMjEwLy4tLCsqKSgnJiUkIyIhIB8eHRwbGhkYFxYVFBMSERAPDg0MCwoJCAcGBQQDAgEAACH5BAEAAAIALAAAAAASABIAAAIzlI+pywcPm3mhWgkCsjBOvVkimElG9ZlCBlXd+2XjjLKg5GqoeZXqvsOQXK/ijUZTKVUFADs=)}.gantt_tree_icon.gantt_folder_closed{background-image:url(data:image/gif;base64,R0lGODlhEgASAJECAJeXl7Gvrf///wAAACH/C1hNUCBEYXRhWE1QPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS4wLWMwNjAgNjEuMTM0Nzc3LCAyMDEwLzAyLzEyLTE3OjMyOjAwICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdFJlZj0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlUmVmIyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M1IFdpbmRvd3MiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NTAyMTU1RTNDMDZEMTFFMUJGNzZCRThBRkFCRjg4MTIiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NTAyMTU1RTRDMDZEMTFFMUJGNzZCRThBRkFCRjg4MTIiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo1MDIxNTVFMUMwNkQxMUUxQkY3NkJFOEFGQUJGODgxMiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo1MDIxNTVFMkMwNkQxMUUxQkY3NkJFOEFGQUJGODgxMiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PgH//v38+/r5+Pf29fTz8vHw7+7t7Ovq6ejn5uXk4+Lh4N/e3dzb2tnY19bV1NPS0dDPzs3My8rJyMfGxcTDwsHAv769vLu6ubi3trW0s7KxsK+urayrqqmop6alpKOioaCfnp2cm5qZmJeWlZSTkpGQj46NjIuKiYiHhoWEg4KBgH9+fXx7enl4d3Z1dHNycXBvbm1sa2ppaGdmZWRjYmFgX15dXFtaWVhXVlVUU1JRUE9OTUxLSklIR0ZFRENCQUA/Pj08Ozo5ODc2NTQzMjEwLy4tLCsqKSgnJiUkIyIhIB8eHRwbGhkYFxYVFBMSERAPDg0MCwoJCAcGBQQDAgEAACH5BAEAAAIALAAAAAASABIAAAIwlI+pywcPm3mhWgkCsjBOvVkimElG9ZlCuYIY6TYs+6bmHDO4igfdD3GNhheV0VQAADs=)}.gantt_tree_icon.gantt_file{background-image:url(data:image/gif;base64,R0lGODlhEgASAJECAJeXl7Gvrf///wAAACH/C1hNUCBEYXRhWE1QPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS4wLWMwNjAgNjEuMTM0Nzc3LCAyMDEwLzAyLzEyLTE3OjMyOjAwICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdFJlZj0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlUmVmIyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M1IFdpbmRvd3MiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NzkxQzI4RjZDMDZEMTFFMTgwRjhBQURDQzI3NDU3QUEiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NzkxQzI4RjdDMDZEMTFFMTgwRjhBQURDQzI3NDU3QUEiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo3OTFDMjhGNEMwNkQxMUUxODBGOEFBRENDMjc0NTdBQSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo3OTFDMjhGNUMwNkQxMUUxODBGOEFBRENDMjc0NTdBQSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PgH//v38+/r5+Pf29fTz8vHw7+7t7Ovq6ejn5uXk4+Lh4N/e3dzb2tnY19bV1NPS0dDPzs3My8rJyMfGxcTDwsHAv769vLu6ubi3trW0s7KxsK+urayrqqmop6alpKOioaCfnp2cm5qZmJeWlZSTkpGQj46NjIuKiYiHhoWEg4KBgH9+fXx7enl4d3Z1dHNycXBvbm1sa2ppaGdmZWRjYmFgX15dXFtaWVhXVlVUU1JRUE9OTUxLSklIR0ZFRENCQUA/Pj08Ozo5ODc2NTQzMjEwLy4tLCsqKSgnJiUkIyIhIB8eHRwbGhkYFxYVFBMSERAPDg0MCwoJCAcGBQQDAgEAACH5BAEAAAIALAAAAAASABIAAAIylI+pwN16QJiUQiFThRlJm3RRFYSlR5qXMKmXaMDuuMoyOi8n/e6xn8NMHETgh5RaKQsAOw==)}.gantt_grid_head_cell .gantt_sort{position:absolute;right:5px;top:8px;width:7px;height:13px;background-repeat:no-repeat;background-position:center center}.gantt_grid_head_cell .gantt_sort.gantt_asc{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAANCAYAAABlyXS1AAAARUlEQVR4nGNgQAKGxib/GbABkIS7b8B/DAUwCRiGK0CXwFBAb1DfP/U/LszwHwi2X7qFgUEArBtdAVwCBmAKMCSQFSDzAWXXaOHsXeqkAAAAAElFTkSuQmCC)}.gantt_grid_head_cell .gantt_sort.gantt_desc{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAANCAYAAABlyXS1AAAARUlEQVR42mNgQAL1/VP/M2ADIIntF2/9x1AAlrh0C47hCmA60DFYwX88gIFGwNDY5D8uDFbg7hvwHx2jmIBTAlkB0e4BAEjlaNtBWJPnAAAAAElFTkSuQmCC)}.gantt_inserted,.gantt_updated{font-weight:700}.gantt_deleted{text-decoration:line-through}.gantt_invalid{background-color:FFE0E0}.gantt_error{color:red}.gantt_status{right:1px;padding:5px 10px;background:rgba(155,155,155,.1);position:absolute;top:1px;-webkit-transition:opacity .2s;transition:opacity .2s;opacity:0}.gantt_status.gantt_status_visible{opacity:1}#gantt_ajax_dots span{-webkit-transition:opacity .2s;transition:opacity .2s;background-repeat:no-repeat;opacity:0}#gantt_ajax_dots span.gantt_dot_visible{opacity:1}.dhtmlx_message_area{position:fixed;right:5px;width:250px;z-index:1000}.dhtmlx-info{min-width:120px;font-family:Arial;z-index:10000;margin:5px 5px 10px;-webkit-transition:all .5s ease;-moz-transition:all .5s ease;-o-transition:all .5s ease;transition:all .5s ease}.dhtmlx-info.hidden{height:0;padding:0;border-width:0;margin:0;overflow:hidden}.dhtmlx_modal_box{overflow:hidden;display:inline-block;min-width:250px;width:250px;text-align:center;position:fixed;z-index:20000;box-shadow:3px 3px 3px rgba(0,0,0,.07);font-family:Arial;border-radius:6px;border:1px solid #cecece;background:#fff}.dhtmlx_popup_title{border-top-left-radius:6px;border-top-right-radius:6px;border-width:0}.dhtmlx_button,.dhtmlx_popup_button{border:1px solid #cecece;height:30px;line-height:30px;display:inline-block;margin:0 5px;border-radius:4px;background:#fff}.dhtmlx-info,.dhtmlx_button,.dhtmlx_popup_button{user-select:none;-webkit-user-select:none;-moz-user-select:-moz-none;cursor:pointer}.dhtmlx_popup_text{overflow:hidden}.dhtmlx_popup_controls{border-radius:6px;padding:10px}.dhtmlx_popup_button{min-width:100px}div.dhx_modal_cover{background-color:#000;cursor:default;filter:alpha(opacity=20);opacity:.2;position:fixed;z-index:19999;left:0;top:0;width:100%;height:100%;border:none;zoom:1}.dhtmlx-info img,.dhtmlx_modal_box img{float:left;margin-right:20px}.dhtmlx-alert-error,.dhtmlx-confirm-error{border:1px solid red}.dhtmlx_button input,.dhtmlx_popup_button div{border-radius:4px;font-size:14px;-moz-box-sizing:content-box;box-sizing:content-box;padding:0;margin:0;vertical-align:top}.dhtmlx_popup_title{color:#fff;text-shadow:1px 1px #000;height:40px;line-height:40px;font-size:20px}.dhtmlx_popup_text{margin:15px 15px 5px;font-size:14px;color:#000;min-height:30px;border-radius:6px}.dhtmlx-error,.dhtmlx-info{font-size:14px;color:#000;box-shadow:3px 3px 3px rgba(0,0,0,.07);padding:0;background-color:#FFF;border-radius:3px;border:1px solid #fff}.dhtmlx-info div{padding:5px 10px;background-color:#fff;border-radius:3px;border:1px solid #cecece}.dhtmlx-error{background-color:#d81b1b;border:1px solid #ff3c3c;box-shadow:3px 3px 3px rgba(0,0,0,.07)}.dhtmlx-error div{background-color:#d81b1b;border:1px solid #940000;color:#FFF}.gantt_data_area div,.gantt_grid div{-ms-touch-action:none;-webkit-tap-highlight-color:transparent}.gantt_data_area{position:relative;overflow-x:hidden;overflow-y:hidden;-moz-user-select:-moz-none;-webkit-user-select:none;-user-select:none}.gantt_links_area{position:absolute;left:0;top:0}.gantt_side_content,.gantt_task_content,.gantt_task_progress{line-height:inherit;overflow:hidden;height:100%}.gantt_task_content{font-size:12px;color:#fff;width:100%;top:0;position:absolute;white-space:nowrap;text-align:center}.gantt_task_progress{text-align:center;z-index:0;background:#299cb4}.gantt_task_line{-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px;position:absolute;-moz-box-sizing:border-box;box-sizing:border-box;background-color:#3db9d3;border:1px solid #2898b0;-webkit-user-select:none;-moz-user-select:none;-moz-user-select:-moz-none}.gantt_task_line.gantt_drag_move div{cursor:move}.gantt_touch_move,.gantt_touch_progress .gantt_touch_resize{-moz-transform:scale(1.02,1.1);-o-transform:scale(1.02,1.1);-webkit-transform:scale(1.02,1.1);transform:scale(1.02,1.1);-moz-transform-origin:50%;-o-transform-origin:50%;-webkit-transform-origin:50%;transform-origin:50%}.gantt_touch_progress .gantt_task_progress_drag,.gantt_touch_resize .gantt_task_drag{-moz-transform:scaleY(1.3);-o-transform:scaleY(1.3);-webkit-transform:scaleY(1.3);transform:scaleY(1.3);-moz-transform-origin:50%;-o-transform-origin:50%;-webkit-transform-origin:50%;transform-origin:50%}.gantt_side_content{position:absolute;white-space:nowrap;color:#6e6e6e;bottom:7px;font-size:11px}.gantt_side_content.gantt_left{right:100%;padding-right:15px}.gantt_side_content.gantt_right{left:100%;padding-left:15px}.gantt_side_content.gantt_link_crossing{bottom:8.75px}.gantt_link_arrow,.gantt_task_link .gantt_line_wrapper{position:absolute;cursor:pointer}.gantt_line_wrapper div{background-color:#ffa011}.gantt_task_link:hover .gantt_line_wrapper div{box-shadow:0 0 5px 0 #ffa011}.gantt_task_link div.gantt_link_arrow{background-color:transparent;border-style:solid;width:0;height:0}.gantt_link_control{position:absolute;width:13px;top:0}.gantt_link_control div{display:none;cursor:pointer;box-sizing:border-box;position:relative;top:50%;margin-top:-7.5px;vertical-align:middle;border:1px solid #929292;-webkit-border-radius:6.5px;-moz-border-radius:6.5px;border-radius:6.5px;height:13px;width:13px;background-color:#f0f0f0}.gantt_link_control div:hover{background-color:#fff}.gantt_link_control.task_left{left:-13px}.gantt_link_control.task_right{right:-13px}.gantt_link_target .gantt_link_control div,.gantt_task_line.gantt_selected .gantt_link_control div,.gantt_task_line:hover .gantt_link_control div{display:block}.gantt_link_source,.gantt_link_target{box-shadow:0 0 3px #3db9d3}.gantt_link_target.link_finish_allow,.gantt_link_target.link_start_allow{box-shadow:0 0 3px #ffbf5e}.gantt_link_target.link_finish_deny,.gantt_link_target.link_start_deny{box-shadow:0 0 3px #e87e7b}.link_finish_allow .gantt_link_control.task_right div,.link_start_allow .gantt_link_control.task_left div{background-color:#ffbf5e;border-color:#ffa011}.link_finish_deny .gantt_link_control.task_right div,.link_start_deny .gantt_link_control.task_left div{background-color:#e87e7b;border-color:#dd3e3a}.gantt_link_arrow_right{border-width:4px 0 4px 6px;border-top-color:transparent!important;border-right-color:transparent!important;border-bottom-color:transparent!important;border-color:#ffa011;margin-top:-1px}.gantt_link_arrow_left{border-width:4px 6px 4px 0;margin-top:-1px;border-top-color:transparent!important;border-color:#ffa011;border-bottom-color:transparent!important;border-left-color:transparent!important}.gantt_link_arrow_top{border-width:0 4px 6px;border-color:#ffa011;border-top-color:transparent!important;border-right-color:transparent!important;border-left-color:transparent!important}.gantt_link_arrow_down{border-width:4px 6px 0 4px;border-color:#ffa011;border-right-color:transparent!important;border-bottom-color:transparent!important;border-left-color:transparent!important}.gantt_task_drag,.gantt_task_progress_drag{cursor:w-resize;height:100%;display:none;position:absolute}.gantt_task_line.gantt_selected .gantt_task_drag,.gantt_task_line.gantt_selected .gantt_task_progress_drag,.gantt_task_line:hover .gantt_task_drag,.gantt_task_line:hover .gantt_task_progress_drag{display:block}.gantt_task_drag{width:6px;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAACCAYAAAB7Xa1eAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3QYDDjkw3UJvAwAAABRJREFUCNdj/P//PwM2wASl/6PTAKrrBf4+lD8LAAAAAElFTkSuQmCC);z-index:1;top:0}.gantt_task_drag.task_left{left:0}.gantt_task_drag.task_right{right:0}.gantt_task_progress_drag{height:8px;width:8px;bottom:-4px;margin-left:-4px;background-position:bottom;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAALCAYAAAB24g05AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MkY3Rjk0RUVDMkYzMTFFMkI1OThEQTA3ODU0OTkzMEEiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MkY3Rjk0RUZDMkYzMTFFMkI1OThEQTA3ODU0OTkzMEEiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDoyRjdGOTRFQ0MyRjMxMUUyQjU5OERBMDc4NTQ5OTMwQSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDoyRjdGOTRFREMyRjMxMUUyQjU5OERBMDc4NTQ5OTMwQSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PobPBzIAAADkSURBVHjaYpk2bRoDDsAExL1QdjEQ/8OmiAWHZk4gXqymqhQM4ty6fU8OSMUA8XdiDBAB4k0a6iqWRga6EKcwMQXduHlnL5DpB8Rv0J2JDFSA+JiOtgZcMwiA2CAxkBxUDVYDLEAKgIpV9XQ0MZwFEgPJAZnHoWpRDAgC4n2W5saiQKfjClQGkBxQDciL+6B6wAbkA/EqJwdrTkUFOQZCAKQGpBbIXA3SCzJggo+XK7OEuBgDsQCkFqgHrBfsBT5eHgZSAUwP2IBfv36TbABMDygdtK1Zv6UESLORaAbIhG6AAAMAKN8wE24DXWcAAAAASUVORK5CYII=);background-repeat:no-repeat;z-index:2}.gantt_link_tooltip{box-shadow:3px 3px 3px #888;background-color:#fff;border-left:1px dotted #cecece;border-top:1px dotted #cecece;font-family:Tahoma;font-size:8pt;color:#444;padding:6px;line-height:20px}.gantt_link_direction{height:0;border:0 #ffa011;border-bottom-style:dashed;border-bottom-width:2px;transform-origin:0 0;-ms-transform-origin:0 0;-webkit-transform-origin:0 0;z-index:2;margin-left:1px;position:absolute}.gantt_grid_data .gantt_row.gantt_selected,.gantt_grid_data .gantt_row.odd.gantt_selected,.gantt_task_row.gantt_selected{background-color:#fff3a1}.gantt_task_row.gantt_selected .gantt_task_cell{border-right-color:#ffec6e}.gantt_task_line.gantt_selected{box-shadow:0 0 5px #299cb4}.gantt_task_line.gantt_project.gantt_selected{box-shadow:0 0 5px #46ad51}.gantt_task_line.gantt_milestone{visibility:hidden;background-color:#d33daf;border:0 solid #61164f;box-sizing:content-box;-moz-box-sizing:content-box}.gantt_task_line.gantt_milestone div{visibility:visible}.gantt_task_line.gantt_milestone .gantt_task_content{background:inherit;border:inherit;border-width:1px;border-radius:inherit;box-sizing:border-box;-moz-box-sizing:border-box;-webkit-transform:rotate(45deg);-moz-transform:rotate(45deg);-ms-transform:rotate(45deg);-o-transform:rotate(45deg);transform:rotate(45deg)}.gantt_task_line.gantt_task_inline_color{border-color:#999}.gantt_task_line.gantt_task_inline_color .gantt_task_progress{background-color:#363636;opacity:.2}.gantt_task_line.gantt_task_inline_color.gantt_project.gantt_selected,.gantt_task_line.gantt_task_inline_color.gantt_selected{box-shadow:0 0 5px #999}.gantt_task_link.gantt_link_inline_color:hover .gantt_line_wrapper div{box-shadow:0 0 5px 0 #999}.gantt_critical_task{background-color:#e63030;border-color:#9d3a3a}.gantt_critical_task .gantt_task_progress{background-color:rgba(0,0,0,.4)}.gantt_critical_link .gantt_line_wrapper>div{background-color:#e63030}.gantt_critical_link .gantt_link_arrow{border-color:#e63030}.gantt_unselectable,.gantt_unselectable div{-webkit-user-select:none;-moz-user-select:none;-moz-user-select:-moz-none}.gantt_cal_light{-webkit-tap-highlight-color:transparent;background:#fff;border-radius:6px;font-family:Arial;border:1px solid #cecece;color:#6b6b6b;font-size:12px;position:absolute;z-index:10001;width:550px;height:250px;box-shadow:3px 3px 3px rgba(0,0,0,.07)}.gantt_cal_light select{font-family:Arial;border:1px solid #cecece;font-size:13px;padding:2px;margin:0}.gantt_cal_ltitle{padding:7px 10px;overflow:hidden;white-space:nowrap;-webkit-border-radius:6px 6px 0 0;-moz-border-radius-topleft:6px;-moz-border-radius-bottomleft:0;-moz-border-radius-topright:6px;-moz-border-radius-bottomright:0;border-radius:6px 6px 0 0}.gantt_cal_ltitle span{white-space:nowrap}.gantt_cal_lsection{color:#727272;font-weight:700;padding:12px 0 5px 10px}.gantt_cal_lsection .gantt_fullday{float:right;margin-right:5px;font-size:12px;font-weight:400;line-height:20px;vertical-align:top;cursor:pointer}.gantt_cal_lsection{font-size:13px}.gantt_cal_ltext{padding:2px 10px;overflow:hidden}.gantt_cal_ltext textarea{overflow:auto;font-family:Arial;font-size:13px;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;border:1px solid #cecece;height:100%;width:100%;outline:0!important;resize:none}.gantt_time{font-weight:700}.gantt_cal_light .gantt_title{padding-left:10px}.gantt_cal_larea{border:1px solid #cecece;border-left:none;border-right:none;background-color:#fff;overflow:hidden;height:1px}.gantt_btn_set{margin:10px 7px 5px 10px;padding:5px 15px 5px 10px;float:left;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;border-width:0;border-color:#cecece;border-style:solid;height:32px;font-weight:700;background:#fff;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;cursor:pointer}.gantt_btn_set div{float:left;font-size:13px;height:22px;line-height:22px;background-repeat:no-repeat;vertical-align:middle}.gantt_save_btn{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MTk1OUU5RDFDMzA0MTFFMkExMUZBQTdDNDAzOUE5RjMiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MTk1OUU5RDJDMzA0MTFFMkExMUZBQTdDNDAzOUE5RjMiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDoxOTU5RTlDRkMzMDQxMUUyQTExRkFBN0M0MDM5QTlGMyIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDoxOTU5RTlEMEMzMDQxMUUyQTExRkFBN0M0MDM5QTlGMyIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PjDroXYAAAEXSURBVHjaYvz//z8DJYCRUgPIAUxAbAnEHiAHMIBcQCwGaRYXF3e6evXqoffv39/dv38/CymaGSUkJBzv3LlzCsj///fv3wdAihkkIQnEvkAshU8zLy+v7a1bt06ANP/79+87kDIAy505cybq06dPr3p7ezuwGQLTfOPGjWP/ESAZLg8kPKBO+g01RBJNszWyZqC6uSgWgIg/f/4shxnS2dnZBjMEqNkSFGBImi8CKTYMA4BYCGjIczRDHC5dunQQSfN7IKWI4UUkjjdMMdCwnw8ePLjwHxV4Yw1gZA5Q47z/2EELzhhCE+ABGvIQWSeQvwcU38QaAML2wHj+C/X3MyAlijeB4ZBoBOIPQGxJKIVSnBsBAgwABddBclWfcZUAAAAASUVORK5CYII=);margin-top:2px;width:21px}.gantt_cancel_btn{margin-top:2px;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MDkzMDA3MzlDMzA0MTFFMjg2QTVFMzFEQzgwRkJERDYiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MDkzMDA3M0FDMzA0MTFFMjg2QTVFMzFEQzgwRkJERDYiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDowOTMwMDczN0MzMDQxMUUyODZBNUUzMURDODBGQkRENiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDowOTMwMDczOEMzMDQxMUUyODZBNUUzMURDODBGQkRENiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PmYuYOUAAAEdSURBVHjaYvz//z8DJYAFXWDlypU8QKoIiD2A2AwqfAqIdwBxX3h4+Bdk9YzILgBqtgdS84FYEYeF94E4EWjIQZgAE5LmQCB1AKoZZKMPEAtAMYh9GSp3AKjWD8UFQAEhIPshEIOc3wHENUBb/qJ57SyQMoJyPwKxElDNO1gYFEE17wMKVmIJlzNQzeegrjaA6qmBecEbSvfh0GwMxGeBhoPoemQ9MAO0kEIbl2YTqPAFKK2IbMB3AjabYIkRZmQD7kNpMyI0G0PpO8gGbIUFJj7NQDk2INWIrIcJKfBAKcwJqvkcDs0TgFgXGo19KCkRmpDWQdWDEk0NUoCBoq0FqhkE/IEWbKJKUmZEz43QzFSKIzN1481M5ACAAAMAlfl/lCwRpagAAAAASUVORK5CYII=);width:20px}.gantt_delete_btn{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MjFENzI3NUNDMzA0MTFFMjhBNjJGQTc3MUIyQzYzNEYiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MjFENzI3NURDMzA0MTFFMjhBNjJGQTc3MUIyQzYzNEYiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDoyMUQ3Mjc1QUMzMDQxMUUyOEE2MkZBNzcxQjJDNjM0RiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDoyMUQ3Mjc1QkMzMDQxMUUyOEE2MkZBNzcxQjJDNjM0RiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PmUD0gAAAABvSURBVHjaYvz//z8DIyMjAxYQicReji4J0ofKQNP8HwmgGQbXB8IsWGwDSSwDuioKjY9uBthVjFAXYHUGAQA2kYmBUoAUBpGk0LAwgBvwH+YX4mkwptgLowYMRgOITUyYKRFIN/wnDjQgJySAAAMApryKzL8wjfUAAAAASUVORK5CYII=);margin-top:2px;width:20px}.gantt_cal_cover{width:100%;height:100%;position:absolute;z-index:10000;top:0;left:0;background-color:#000;opacity:.1;filter:alpha(opacity=10)}.gantt_custom_button{padding:0 3px;font-family:Arial;font-size:13px;font-weight:400;margin-right:10px;margin-top:-5px;cursor:pointer;float:right;height:21px;width:90px;border:1px solid #CECECE;text-align:center;-webkit-border-radius:4px;-moz-border-radius:4px;-ms-border-radius:4px;-o-border-radius:4px;border-radius:4px}.gantt_custom_button div{cursor:pointer;float:none;height:21px;line-height:21px;vertical-align:middle}.gantt_custom_button div:first-child{display:none}.gantt_cal_light_wide{width:580px;padding:2px 4px}.gantt_cal_light_wide .gantt_cal_larea{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;border:1px solid #cecece}.gantt_cal_light_wide .gantt_cal_lsection{border:0;float:left;text-align:right;width:80px;height:20px;padding:5px 10px 0 0}.gantt_cal_light_wide .gantt_wrap_section{position:relative;padding:10px 0;overflow:hidden;border-bottom:1px solid #ebebeb}.gantt_cal_light_wide .gantt_section_time{overflow:hidden;padding-top:2px!important;padding-right:0;height:20px!important}.gantt_cal_light_wide .gantt_cal_ltext{padding-right:0}.gantt_cal_light_wide .gantt_cal_larea{padding:0 10px;width:100%}.gantt_cal_light_wide .gantt_section_time{background:0 0}.gantt_cal_light_wide .gantt_cal_checkbox label{padding-left:0}.gantt_cal_light_wide .gantt_cal_lsection .gantt_fullday{float:none;margin-right:0;font-weight:700;cursor:pointer}.gantt_cal_light_wide .gantt_custom_button{position:absolute;top:0;right:0;margin-top:2px}.gantt_cal_light_wide .gantt_repeat_right{margin-right:55px}.gantt_cal_light_wide.gantt_cal_light_full{width:738px}.gantt_cal_wide_checkbox input{margin-top:8px;margin-left:14px}.gantt_cal_light input{font-size:13px}.gantt_section_time{background-color:#fff;white-space:nowrap;padding:5px 10px;padding-top:2px!important}.gantt_section_time .gantt_time_selects{float:left;height:25px}.gantt_section_time .gantt_time_selects select{height:23px;padding:2px;border:1px solid #cecece}.gantt_duration{width:100px;height:23px;float:left;white-space:nowrap;margin-left:20px;line-height:23px}.gantt_duration .gantt_duration_dec,.gantt_duration .gantt_duration_inc,.gantt_duration .gantt_duration_value{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;text-align:center;vertical-align:top;height:100%;border:1px solid #cecece}.gantt_duration .gantt_duration_value{width:40px;padding:3px 4px;border-left-width:0;border-right-width:0}.gantt_duration .gantt_duration_dec,.gantt_duration .gantt_duration_inc{width:20px;padding:1px 1px 3px;background:#fff}.gantt_duration .gantt_duration_dec{-moz-border-top-left-radius:4px;-moz-border-bottom-left-radius:4px;-webkit-border-top-left-radius:4px;-webkit-border-bottom-left-radius:4px;border-top-left-radius:4px;border-bottom-left-radius:4px}.gantt_duration .gantt_duration_inc{margin-right:4px;-moz-border-top-right-radius:4px;-moz-border-bottom-right-radius:4px;-webkit-border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:4px}.gantt_cal_quick_info{border:1px solid #cecece;border-radius:6px;position:absolute;z-index:300;box-shadow:3px 3px 3px rgba(0,0,0,.07);background-color:#fff;width:300px;transition:left .5s ease,right .5s;-moz-transition:left .5s ease,right .5s;-webkit-transition:left .5s ease,right .5s;-o-transition:left .5s ease,right .5s}.gantt_no_animate{transition:none;-moz-transition:none;-webkit-transition:none;-o-transition:none}.gantt_cal_quick_info.gantt_qi_left .gantt_qi_big_icon{float:right}.gantt_cal_qi_title{-webkit-border-radius:6px 6px 0 0;-moz-border-radius-topleft:6px;-moz-border-radius-bottomleft:0;-moz-border-radius-topright:6px;-moz-border-radius-bottomright:0;border-radius:6px 6px 0 0;padding:5px 0 8px 12px;color:#454545;background-color:#fff;border-bottom:1px solid #cecece}.gantt_cal_qi_tdate{font-size:14px;font-weight:700}.gantt_cal_qi_tcontent{font-size:13px}.gantt_cal_qi_content{padding:16px 8px;font-size:13px;color:#454545;overflow:hidden}.gantt_cal_qi_controls{-webkit-border-radius:0 0 6px 6px;-moz-border-radius-topleft:0;-moz-border-radius-bottomleft:6px;-moz-border-radius-topright:0;-moz-border-radius-bottomright:6px;border-radius:0 0 6px 6px;padding-left:7px}.gantt_cal_qi_controls .gantt_menu_icon{margin-top:6px;background-repeat:no-repeat}.gantt_cal_qi_controls .gantt_menu_icon.icon_edit{width:20px;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH3QYFCjI5ZQj5bAAAAFNJREFUOMvt0zEOACAIA0DkwTymH8bJTRTKZGJXyaWEKPKTCQAH4Ls37cItcDUzsxHNDLZNhCq7Gt1wh9ErV7EjyGAhyGLphlnsClWuS32rn0czAV+vNGrM/LBtAAAAAElFTkSuQmCC)}.gantt_cal_qi_controls .gantt_menu_icon.icon_delete{width:20px;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MjFENzI3NUNDMzA0MTFFMjhBNjJGQTc3MUIyQzYzNEYiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MjFENzI3NURDMzA0MTFFMjhBNjJGQTc3MUIyQzYzNEYiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDoyMUQ3Mjc1QUMzMDQxMUUyOEE2MkZBNzcxQjJDNjM0RiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDoyMUQ3Mjc1QkMzMDQxMUUyOEE2MkZBNzcxQjJDNjM0RiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PmUD0gAAAABvSURBVHjaYvz//z8DIyMjAxYQicReji4J0ofKQNP8HwmgGQbXB8IsWGwDSSwDuioKjY9uBthVjFAXYHUGAQA2kYmBUoAUBpGk0LAwgBvwH+YX4mkwptgLowYMRgOITUyYKRFIN/wnDjQgJySAAAMApryKzL8wjfUAAAAASUVORK5CYII=)}.gantt_qi_big_icon{font-size:13px;border-radius:4px;font-weight:700;background:#fff;margin:5px 9px 8px 0;min-width:60px;line-height:32px;vertical-align:middle;padding:0 10px 0 5px;cursor:pointer;border:1px solid #cecece}.gantt_cal_qi_controls div{float:left;height:32px;text-align:center;line-height:32px}.gantt_tooltip{box-shadow:3px 3px 3px rgba(0,0,0,.07);background-color:#fff;border-left:1px solid rgba(0,0,0,.07);border-top:1px solid rgba(0,0,0,.07);font-family:Arial;font-size:8pt;color:#454545;padding:10px;position:absolute;z-index:50}.gantt_marker{height:100%;width:2px;top:0;position:absolute;text-align:center;background-color:rgba(255,0,0,.4);-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.gantt_marker .gantt_marker_content{padding:5px;background:inherit;color:#fff;position:absolute;font-size:12px;line-height:12px;opacity:.8}.gantt_marker_area{position:absolute;top:0;left:0}.gantt_noselect{-moz-user-select:-moz-none;-webkit-user-select:none;-user-select:none}.gantt_drag_marker{position:absolute;font-family:Arial;font-size:13px}.gantt_drag_marker .gantt_tree_icon.gantt_blank,.gantt_drag_marker .gantt_tree_icon.gantt_close,.gantt_drag_marker .gantt_tree_icon.gantt_open,.gantt_drag_marker .gantt_tree_indent{display:none}.gantt_drag_marker,.gantt_drag_marker .gantt_row.odd{background-color:#fff}.gantt_drag_marker .gantt_row{border-left:1px solid #d2d2d2;border-top:1px solid #d2d2d2}.gantt_drag_marker .gantt_cell{border-color:#d2d2d2}.gantt_row.gantt_over,.gantt_task_row.gantt_over{background-color:#0070fe}.gantt_row.gantt_transparent .gantt_cell{opacity:.7}.gantt_task_row.gantt_transparent{background-color:#f8fdfd}.dhtmlx_popup_button.dhtmlx_delete_button{background:#3db9d3;text-shadow:0 -1px 0 #248a9f;color:#fff;font-weight:700;border-width:0} \ No newline at end of file diff --git a/libraries/dhtmlxgantt/sources/dhtmlxgantt.js b/libraries/dhtmlxgantt/sources/dhtmlxgantt.js deleted file mode 100644 index 26403b6..0000000 --- a/libraries/dhtmlxgantt/sources/dhtmlxgantt.js +++ /dev/null @@ -1,9424 +0,0 @@ -/* -@license - -dhtmlxGantt v.3.2.0 Stardard -This software is covered by GPL license. You also can obtain Commercial or Enterprise license to use it in non-GPL project - please contact sales@dhtmlx.com. Usage without proper license is prohibited. - -(c) Dinamenta, UAB. -*/ -if (typeof(window.dhx4) == "undefined") { - - window.dhx4 = { - - version: "4.1.3", - - skin: null, // allow to be set by user - - skinDetect: function(comp) { - return {10:"dhx_skyblue",20:"dhx_web",30:"dhx_terrace"}[this.readFromCss(comp+"_skin_detect")]||null; - }, - - // read value from css - readFromCss: function(className, property) { - var t = document.createElement("DIV"); - t.className = className; - if (document.body.firstChild != null) document.body.insertBefore(t, document.body.firstChild); else document.body.appendChild(t); - var w = t[property||"offsetWidth"]; - t.parentNode.removeChild(t); - t = null; - return w; - }, - - // id manager - lastId: 1, - newId: function() { - return this.lastId++; - }, - - // z-index manager - zim: { - data: {}, - step: 5, - first: function() { - return 100; - }, - last: function() { - var t = this.first(); - for (var a in this.data) t = Math.max(t, this.data[a]); - return t; - }, - reserve: function(id) { - this.data[id] = this.last()+this.step; - return this.data[id]; - }, - clear: function(id) { - if (this.data[id] != null) { - this.data[id] = null; - delete this.data[id]; - } - } - }, - - // string to boolean - s2b: function(r) { - if (typeof(r) == "string") r = r.toLowerCase(); - return (r == true || r == 1 || r == "true" || r == "1" || r == "yes" || r == "y"); - }, - - // string to json - s2j: function(s) { - var obj = null; - dhx4.temp = null; - try { eval("dhx4.temp="+s); } catch(e) { dhx4.temp = null; } - obj = dhx4.temp; - dhx4.temp = null; - return obj; - }, - - // absolute top/left position on screen - absLeft: function(obj) { - if (typeof(obj) == "string") obj = document.getElementById(obj); - return this.getOffset(obj).left; - }, - absTop: function(obj) { - if (typeof(obj) == "string") obj = document.getElementById(obj); - return this.getOffset(obj).top; - }, - _aOfs: function(elem) { - var top = 0, left = 0; - while (elem) { - top = top + parseInt(elem.offsetTop); - left = left + parseInt(elem.offsetLeft); - elem = elem.offsetParent; - } - return {top: top, left: left}; - }, - _aOfsRect: function(elem) { - var box = elem.getBoundingClientRect(); - var body = document.body; - var docElem = document.documentElement; - var scrollTop = window.pageYOffset || docElem.scrollTop || body.scrollTop; - var scrollLeft = window.pageXOffset || docElem.scrollLeft || body.scrollLeft; - var clientTop = docElem.clientTop || body.clientTop || 0; - var clientLeft = docElem.clientLeft || body.clientLeft || 0; - var top = box.top + scrollTop - clientTop; - var left = box.left + scrollLeft - clientLeft; - return { top: Math.round(top), left: Math.round(left) }; - }, - getOffset: function(elem) { - if (elem.getBoundingClientRect) { - return this._aOfsRect(elem); - } else { - return this._aOfs(elem); - } - }, - - // copy obj - _isObj: function(k) { - return (k != null && typeof(k) == "object" && typeof(k.length) == "undefined"); - }, - _copyObj: function(r) { - if (this._isObj(r)) { - var t = {}; - for (var a in r) { - if (typeof(r[a]) == "object" && r[a] != null) t[a] = this._copyObj(r[a]); else t[a] = r[a]; - } - } else { - var t = []; - for (var a=0; a= 0); - var dim = {}; - dim.left = document.body.scrollLeft; - dim.right = dim.left+(window.innerWidth||document.body.clientWidth); - dim.top = Math.max((isIE?document.documentElement:document.getElementsByTagName("html")[0]).scrollTop, document.body.scrollTop); - dim.bottom = dim.top+(isIE?Math.max(document.documentElement.clientHeight||0,document.documentElement.offsetHeight||0):window.innerHeight); - return dim; - }, - - // input/textarea range selection - selectTextRange: function(inp, start, end) { - - inp = (typeof(inp)=="string"?document.getElementById(inp):inp); - - var len = inp.value.length; - start = Math.max(Math.min(start, len), 0); - end = Math.min(end, len); - - if (inp.setSelectionRange) { - try {inp.setSelectionRange(start, end);} catch(e){}; // combo in grid under IE requires try/catch - } else if (inp.createTextRange) { - var range = inp.createTextRange(); - range.moveStart("character", start); - range.moveEnd("character", end-len); - try {range.select();} catch(e){}; - } - }, - // transition - transData: null, - transDetect: function() { - - if (this.transData == null) { - - this.transData = {transProp: false, transEv: null}; - - // transition, MozTransition, WebkitTransition, msTransition, OTransition - var k = { - "MozTransition": "transitionend", - "WebkitTransition": "webkitTransitionEnd", - "OTransition": "oTransitionEnd", - "msTransition": "transitionend", - "transition": "transitionend" - }; - - for (var a in k) { - if (this.transData.transProp == false && document.documentElement.style[a] != null) { - this.transData.transProp = a; - this.transData.transEv = k[a]; - } - } - k = null; - } - - return this.transData; - - }, - - // xml parser - _xmlNodeValue: function(node) { - var value = ""; - for (var q=0; q= 0 || navigator.userAgent.indexOf("Trident") >= 0); - window.dhx4.isIE6 = (window.XMLHttpRequest == null && navigator.userAgent.indexOf("MSIE") >= 0); - window.dhx4.isIE7 = (navigator.userAgent.indexOf("MSIE 7.0") >= 0 && navigator.userAgent.indexOf("Trident") < 0); - window.dhx4.isIE8 = (navigator.userAgent.indexOf("MSIE 8.0") >= 0 && navigator.userAgent.indexOf("Trident") >= 0); - window.dhx4.isOpera = (navigator.userAgent.indexOf("Opera") >= 0); - window.dhx4.isChrome = (navigator.userAgent.indexOf("Chrome") >= 0); - window.dhx4.isKHTML = (navigator.userAgent.indexOf("Safari") >= 0 || navigator.userAgent.indexOf("Konqueror") >= 0); - window.dhx4.isFF = (navigator.userAgent.indexOf("Firefox") >= 0); - window.dhx4.isIPad = (navigator.userAgent.search(/iPad/gi) >= 0); -}; - - - - -if (typeof(window.dhx4.ajax) == "undefined") { - - window.dhx4.ajax = { - - // if false - dhxr param will added to prevent caching on client side (default), - // if true - do not add extra params - cache: false, - - // default method for load/loadStruct, post/get allowed - // get - since 4.1.1, this should fix 412 error for macos safari - method: "get", - - parse: function(data) { - if (typeof data !== "string") return data; - - data = data.replace(/^[\s]+/,""); - if (window.DOMParser && !dhx4.isIE) { // ff,ie9 - var obj = (new window.DOMParser()).parseFromString(data, "text/xml"); - } else if (window.ActiveXObject !== window.undefined) { - var obj = new window.ActiveXObject("Microsoft.XMLDOM"); - obj.async = "false"; - obj.loadXML(data); - } - return obj; - }, - xmltop: function(tagname, xhr, obj) { - if (typeof xhr.status == "undefined" || xhr.status < 400) { - var xml = (!xhr.responseXML) ? dhx4.ajax.parse(xhr.responseText || xhr) : (xhr.responseXML || xhr); - if (xml && xml.documentElement !== null && !xml.getElementsByTagName("parsererror").length) { - return xml.getElementsByTagName(tagname)[0]; - } - } - if (obj !== -1) dhx4.callEvent("onLoadXMLError",["Incorrect XML", arguments[1], obj]); - return document.createElement("DIV"); - }, - xpath: function(xpathExp, docObj) { - if (!docObj.nodeName) docObj = docObj.responseXML || docObj; - if (dhx4.isIE) { - return docObj.selectNodes(xpathExp)||[]; - } else { - var rows = []; - var first; - var col = (docObj.ownerDocument||docObj).evaluate(xpathExp, docObj, null, XPathResult.ANY_TYPE, null); - while (first = col.iterateNext()) rows.push(first); - return rows; - } - }, - query: function(config) { - dhx4.ajax._call( - (config.method || "GET"), - config.url, - config.data || "", - (config.async || true), - config.callback, - null, - config.headers - ); - }, - get: function(url, onLoad) { - this._call("GET", url, null, true, onLoad); - }, - getSync: function(url) { - return this._call("GET", url, null, false); - }, - put: function(url, postData, onLoad) { - this._call("PUT", url, postData, true, onLoad); - }, - del: function(url, postData, onLoad) { - this._call("DELETE", url, postData, true, onLoad); - }, - post: function(url, postData, onLoad) { - if (arguments.length == 1) { - postData = ""; - } else if (arguments.length == 2 && (typeof(postData) == "function" || typeof(window[postData]) == "function")) { - onLoad = postData; - postData = ""; - } else { - postData = String(postData); - } - this._call("POST", url, postData, true, onLoad); - }, - postSync: function(url, postData) { - postData = (postData == null ? "" : String(postData)); - return this._call("POST", url, postData, false); - }, - getLong: function(url, onLoad) { - this._call("GET", url, null, true, onLoad, {url:url}); - }, - postLong: function(url, postData, onLoad) { - if (arguments.length == 2 && (typeof(postData) == "function" || typeof(window[postData]))) { - onLoad = postData; - postData = ""; - } - this._call("POST", url, postData, true, onLoad, {url:url, postData:postData}); - }, - _call: function(method, url, postData, async, onLoad, longParams, headers) { - - var t = (window.XMLHttpRequest && !dhx4.isIE ? new XMLHttpRequest() : new ActiveXObject("Microsoft.XMLHTTP")); - var isQt = (navigator.userAgent.match(/AppleWebKit/) != null && navigator.userAgent.match(/Qt/) != null && navigator.userAgent.match(/Safari/) != null); - - if (async == true) { - t.onreadystatechange = function() { - if ((t.readyState == 4) || (isQt == true && t.readyState == 3)) { // what for long response and status 404? - if (t.status != 200 || t.responseText == "") - if (!dhx4.callEvent("onAjaxError", [t])) return; - - window.setTimeout(function(){ - if (typeof(onLoad) == "function") { - onLoad.apply(window, [{xmlDoc:t}]); // dhtmlx-compat, response.xmlDoc.responseXML/responseText - } - if (longParams != null) { - if (typeof(longParams.postData) != "undefined") { - dhx4.ajax.postLong(longParams.url, longParams.postData, onLoad); - } else { - dhx4.ajax.getLong(longParams.url, onLoad); - } - } - onLoad = null; - t = null; - },1); - } - } - } - - if (method == "GET" && this.cache != true) { - url += (url.indexOf("?")>=0?"&":"?")+"dhxr"+new Date().getTime()+"=1"; - } - - t.open(method, url, async); - - if (headers){ - for (var key in headers) - t.setRequestHeader(key, headers[key]); - } else if (method.toUpperCase() == "POST" || method == "PUT" || method == "DELETE") { - t.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); - } else if (method == "GET") { - postData = null; - } - - t.setRequestHeader("X-Requested-With", "XMLHttpRequest"); - - t.send(postData); - - if (!async) return {xmlDoc:t}; // dhtmlx-compat, response.xmlDoc.responseXML/responseText - - } - }; - -}; - - -if (typeof(window.dhx4._eventable) == "undefined") { - - window.dhx4._eventable = function(obj, mode) { - - if (mode == "clear") { - - obj.detachAllEvents(); - - obj.dhxevs = null; - - obj.attachEvent = null; - obj.detachEvent = null; - obj.checkEvent = null; - obj.callEvent = null; - obj.detachAllEvents = null; - - obj = null; - - return; - - } - - obj.dhxevs = { data: {} }; - - obj.attachEvent = function(name, func) { - name = String(name).toLowerCase(); - if (!this.dhxevs.data[name]) this.dhxevs.data[name] = {}; - var eventId = window.dhx4.newId(); - this.dhxevs.data[name][eventId] = func; - return eventId; - } - - obj.detachEvent = function(eventId) { - for (var a in this.dhxevs.data) { - var k = 0; - for (var b in this.dhxevs.data[a]) { - if (b == eventId) { - this.dhxevs.data[a][b] = null; - delete this.dhxevs.data[a][b]; - } else { - k++; - } - } - if (k == 0) { - this.dhxevs.data[a] = null; - delete this.dhxevs.data[a]; - } - } - } - - obj.checkEvent = function(name) { - name = String(name).toLowerCase(); - return (this.dhxevs.data[name] != null); - } - - obj.callEvent = function(name, params) { - name = String(name).toLowerCase(); - if (this.dhxevs.data[name] == null) return true; - var r = true; - for (var a in this.dhxevs.data[name]) { - r = this.dhxevs.data[name][a].apply(this, params) && r; - } - return r; - } - - obj.detachAllEvents = function() { - for (var a in this.dhxevs.data) { - for (var b in this.dhxevs.data[a]) { - this.dhxevs.data[a][b] = null; - delete this.dhxevs.data[a][b]; - } - this.dhxevs.data[a] = null; - delete this.dhxevs.data[a]; - } - } - - obj = null; - }; - - dhx4._eventable(dhx4); - -}; - -if (typeof(window.dhtmlx) == "undefined") { - window.dhtmlx={ - extend:function(a, b){ - for (var key in b) - if (!a[key]) - a[key]=b[key]; - return a; - }, - 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){ - 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) - dhtmlx.extend(window[name].prototype,ext); - }, - url:function(str){ - if (str.indexOf("?") != -1) - return "&"; - else - return "?"; - } - }; -}; - - _isFF = false; - _isIE = false; - _isOpera = false; - _isKHTML = false; - _isMacOS = false; - _isChrome = false; - _FFrv = false; - _KHTMLrv = false; - _OperaRv = 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)){ - _KHTMLrv = parseFloat(navigator.userAgent.substr(navigator.userAgent.indexOf('Safari')+7, 5)); - - if (_KHTMLrv > 525){ //mimic FF behavior for Safari 3.1+ - _isFF=true; - _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 || - navigator.appVersion.indexOf("MSIE 9.0")!= -1 || - navigator.appVersion.indexOf("MSIE 10.0")!= -1 || - document.documentMode > 7) && - document.compatMode != "BackCompat"){ - _isIE=8; - } -} else if (navigator.appName == 'Netscape' && navigator.userAgent.indexOf("Trident") != -1){ - //ie11 - _isIE=8; -} else { - _isFF=true; - _FFrv = parseFloat(navigator.userAgent.split("rv:")[1]) -} - -if (typeof(window.dhtmlxEvent) == "undefined") { - - function dhtmlxEvent(el, event, handler){ - if (el.addEventListener) - el.addEventListener(event, handler, false); - - else if (el.attachEvent) - el.attachEvent("on"+event, handler); - } -}; - -if (dhtmlxEvent.touchDelay == null) { - dhtmlxEvent.touchDelay = 2000; -}; - -if (typeof(dhtmlxEvent.initTouch) == "undefined") { - - dhtmlxEvent.initTouch = function(){ - var longtouch; - var target; - var tx, ty; - - dhtmlxEvent(document.body, "touchstart", function(ev){ - target = ev.touches[0].target; - tx = ev.touches[0].clientX; - ty = ev.touches[0].clientY; - longtouch = window.setTimeout(touch_event, dhtmlxEvent.touchDelay); - }); - function touch_event(){ - if (target){ - var ev = document.createEvent("HTMLEvents"); // for chrome and firefox - ev.initEvent("dblclick", true, true); - target.dispatchEvent(ev); - longtouch = target = null; - } - }; - dhtmlxEvent(document.body, "touchmove", function(ev){ - if (longtouch){ - if (Math.abs(ev.touches[0].clientX - tx) > 50 || Math.abs(ev.touches[0].clientY - ty) > 50 ){ - window.clearTimeout(longtouch); - longtouch = target = false; - } - } - }); - dhtmlxEvent(document.body, "touchend", function(ev){ - if (longtouch){ - window.clearTimeout(longtouch); - longtouch = target = false; - } - }); - - dhtmlxEvent.initTouch = function(){}; - }; -}; - -if(!window.dhtmlx) - window.dhtmlx = {}; - -(function(){ - var _dhx_msg_cfg = null; - function callback(config, result){ - var usercall = config.callback; - modality(false); - config.box.parentNode.removeChild(config.box); - _dhx_msg_cfg = config.box = null; - if (usercall) - usercall(result); - } - function modal_key(e){ - if (_dhx_msg_cfg){ - e = e||event; - var code = e.which||event.keyCode; - if (dhtmlx.message.keyboard){ - if (code == 13 || code == 32) - callback(_dhx_msg_cfg, true); - if (code == 27) - callback(_dhx_msg_cfg, false); - } - if (e.preventDefault) - e.preventDefault(); - return !(e.cancelBubble = true); - } - } - if (document.attachEvent) - document.attachEvent("onkeydown", modal_key); - else - document.addEventListener("keydown", modal_key, true); - - function modality(mode){ - if(!modality.cover){ - modality.cover = document.createElement("DIV"); - //necessary for IE only - modality.cover.onkeydown = modal_key; - modality.cover.className = "dhx_modal_cover"; - document.body.appendChild(modality.cover); - } - var height = document.body.scrollHeight; - modality.cover.style.display = mode?"inline-block":"none"; - } - - function button(text, result){ - var button_css = "dhtmlx_"+text.toLowerCase().replace(/ /g, "_")+"_button"; // dhtmlx_ok_button, dhtmlx_click_me_button - return "
"+text+"
"; - } - - function info(text){ - if (!t.area){ - t.area = document.createElement("DIV"); - t.area.className = "dhtmlx_message_area"; - t.area.style[t.position]="5px"; - document.body.appendChild(t.area); - } - - t.hide(text.id); - var message = document.createElement("DIV"); - message.innerHTML = "
"+text.text+"
"; - message.className = "dhtmlx-info dhtmlx-" + text.type; - message.onclick = function(){ - t.hide(text.id); - text = null; - }; - - if (t.position == "bottom" && t.area.firstChild) - t.area.insertBefore(message,t.area.firstChild); - else - t.area.appendChild(message); - - if (text.expire > 0) - t.timers[text.id]=window.setTimeout(function(){ - t.hide(text.id); - }, text.expire); - - t.pull[text.id] = message; - message = null; - - return text.id; - } - function _boxStructure(config, ok, cancel){ - var box = document.createElement("DIV"); - box.className = " dhtmlx_modal_box dhtmlx-"+config.type; - box.setAttribute("dhxbox", 1); - - var inner = ''; - - if (config.width) - box.style.width = config.width; - if (config.height) - box.style.height = config.height; - if (config.title) - inner+='
'+config.title+'
'; - inner+='
'+(config.content?'':config.text)+'
'; - if (ok) - inner += button(config.ok || "OK", true); - if (cancel) - inner += button(config.cancel || "Cancel", false); - if (config.buttons){ - for (var i=0; i this.config.sensitivity) { - // real drag starts here, - // when user moves mouse at first time after onmousedown - this.config.started = true; - this.config.ignore = false; - if (this.callEvent("onBeforeDragStart", [obj, this.config.original_target]) === false) { - this.config.ignore = true; - return true; - } - - // initialize dnd marker - var marker = this.config.marker = document.createElement("div"); - marker.className = "gantt_drag_marker"; - marker.innerHTML = "Dragging object"; - document.body.appendChild(marker); - - this.callEvent("onAfterDragStart", [obj, this.config.original_target]); - } else - this.config.ignore = true; - } - if (!this.config.ignore) { - e.pos = this.getPosition(e); - this.config.marker.style.left = e.pos.x + "px"; - this.config.marker.style.top = e.pos.y + "px"; - this.callEvent("onDragMove", [obj,e]); - } - }, - - dragEnd: function(obj) { - if (this.config.marker) { - this.config.marker.parentNode.removeChild(this.config.marker); - this.config.marker = null; - this.callEvent("onDragEnd", []); - } - document.body.className = document.body.className.replace(" gantt_noselect", ""); - }, - - getPosition: function(e) { - var x = 0, y = 0; - e = e || window.event; - if (e.pageX || e.pageY) { - x = e.pageX; - y = e.pageY; - } else if (e.clientX || e.clientY) { - x = e.clientX + document.body.scrollLeft + document.documentElement.scrollLeft; - y = e.clientY + document.body.scrollTop + document.documentElement.scrollTop; - } - return { x:x, y:y }; - } -}; -gantt._init_grid = function () { - this._click.gantt_close = dhtmlx.bind(function (e, id, trg) { - this.close(id); - return false; - }, this); - this._click.gantt_open = dhtmlx.bind(function (e, id, trg) { - this.open(id); - return false; - }, this); - - - this._click.gantt_row = dhtmlx.bind(function (e, id, trg) { - if (id !== null) { - var task = this.getTask(id); - if(this.config.scroll_on_click) - this.showDate(task.start_date); - this.callEvent("onTaskRowClick", [id, trg]); - } - }, this); - - this._click.gantt_grid_head_cell = dhtmlx.bind(function (e, id, trg) { - var column = trg.getAttribute("column_id"); - - if (!this.callEvent("onGridHeaderClick", [column, e])) - return; - - if (column == "add") { - this._click.gantt_add(e, this.config.root_id); - } else if (this.config.sort) { - var sort = (this._sort && this._sort.direction && this._sort.name == column) ? this._sort.direction : "desc"; - // invert sort direction - sort = (sort == "desc") ? "asc" : "desc"; - this._sort = { - name: column, - direction: sort - }; - this.sort(column, sort == "desc"); - } - }, this); - - if (!this.config.sort && this.config.order_branch) { - this._init_dnd(); - } - - this._click.gantt_add = dhtmlx.bind(function (e, id, trg) { - if (this.config.readonly) return; - - var item = { }; - this.createTask(item, id ? id : this.config.root_id); - - return false; - }, this); - - if(this._init_resize){ - this._init_resize(); - } - -}; - -gantt._render_grid = function () { - if (this._is_grid_visible()) { - this._calc_grid_width(); - this._render_grid_header(); - } -}; - -gantt._calc_grid_width = function () { - var columns = this.getGridColumns(); - var cols_width = 0; - var unknown = []; - var width = []; - - for (var i = 0; i < columns.length; i++) { - var v = parseInt(columns[i].width, 10); - if (window.isNaN(v)) { - v = 50; - unknown.push(i); - } - width[i] = v; - cols_width += v; - } - - if (this.config.autofit || unknown.length) { - var diff = this._get_grid_width() - cols_width; - // TODO: logic may be improved for proportional changing of width - var step = diff / (unknown.length > 0 ? unknown.length : (width.length > 0 ? width.length : 1)); - if (unknown.length > 0) { - // there are several columns with undefined width - var delta = diff / (unknown.length ? unknown.length : 1); - for (var i = 0; i < unknown.length; i++) { - var index = unknown[i]; - width[index] += delta; - } - } else { - // delta must be added for all columns - var delta = diff / (width.length ? width.length : 1); - for (var i = 0; i < width.length; i++) - width[i] += delta; - } - - for (var i = 0; i < width.length; i++) { - columns[i].width = width[i]; - } - }else{ - this.config.grid_width = cols_width; - } -}; - -gantt._render_grid_header = function () { - var columns = this.getGridColumns(); - var cells = []; - var width = 0, - labels = this.locale.labels; - - var lineHeigth = this.config.scale_height - 2; - - for (var i = 0; i < columns.length; i++) { - var last = i == columns.length - 1; - var col = columns[i]; - if (last && this._get_grid_width() > width + col.width) - col.width = this._get_grid_width() - width; - width += col.width; - var sort = (this._sort && col.name == this._sort.name) ? ("
") : ""; - var cssClass = ["gantt_grid_head_cell", - ("gantt_grid_head_" + col.name), - (last ? "gantt_last_cell" : ""), - this.templates.grid_header_class(col.name, col)].join(" "); - - var style = "width:" + (col.width - (last ? 1 : 0)) + "px;"; - var label = (col.label || labels["column_" + col.name]); - label = label || ""; - var cell = "
" + label + sort + "
"; - cells.push(cell); - } - this.$grid_scale.style.height = (this.config.scale_height - 1) + "px"; - this.$grid_scale.style.lineHeight = lineHeigth + "px"; - this.$grid_scale.style.width = (width - 1) + "px"; - this.$grid_scale.innerHTML = cells.join(""); -}; - - -gantt._render_grid_item = function (item) { - if (!gantt._is_grid_visible()) - return null; - - var columns = this.getGridColumns(); - var cells = []; - var width = 0; - for (var i = 0; i < columns.length; i++) { - var last = i == columns.length - 1; - var col = columns[i]; - var cell; - - var value; - if (col.name == "add") { - value = "
"; - } else { - if (col.template) - value = col.template(item); - else - value = item[col.name]; - - if (value instanceof Date) - value = this.templates.date_grid(value); - value = "
" + value + "
"; - } - var css = "gantt_cell" + (last ? " gantt_last_cell" : ""); - - var tree = ""; - if (col.tree) { - for (var j = 0; j < item.$level; j++) - tree += this.templates.grid_indent(item); - - var has_child = this._has_children(item.id); - if (has_child) { - tree += this.templates.grid_open(item); - tree += this.templates.grid_folder(item); - } else { - tree += this.templates.grid_blank(item); - tree += this.templates.grid_file(item); - } - } - var style = "width:" + (col.width - (last ? 1 : 0)) + "px;"; - if (dhtmlx.defined(col.align)) - style += "text-align:" + col.align + ";"; - cell = "
" + tree + value + "
"; - cells.push(cell); - } - var css = item.$index % 2 === 0 ? "" : " odd"; - css += (item.$transparent) ? " gantt_transparent" : ""; - if (this.templates.grid_row_class) { - var css_template = this.templates.grid_row_class.call(this, item.start_date, item.end_date, item); - if (css_template) - css += " " + css_template; - } - - if (this.getState().selected_task == item.id) { - css += " gantt_selected"; - } - var el = document.createElement("div"); - el.className = "gantt_row" + css; - el.style.height = this.config.row_height + "px"; - el.style.lineHeight = (gantt.config.row_height) + "px"; - el.setAttribute(this.config.task_attribute, item.id); - el.innerHTML = cells.join(""); - return el; -}; - - -gantt.open = function (id) { - gantt._set_item_state(id, true); - this.callEvent("onTaskOpened", [id]); -}; -gantt.close = function (id) { - gantt._set_item_state(id, false); - this.callEvent("onTaskClosed", [id]); -}; -gantt._set_item_state = function (id, state) { - if (id && this._pull[id]) { - this._pull[id].$open = state; - this.refreshData(); - } -}; - -gantt._is_grid_visible = function () { - return (this.config.grid_width && this.config.show_grid); -}; -gantt._get_grid_width = function () { - if (this._is_grid_visible()) { - if (this._is_chart_visible()) { - return this.config.grid_width; - } else { - return this._x; - } - } else { - return 0; - } -}; -gantt.getTaskIndex = function (id) { - var branch = this.getChildren(this.getParent(id)); - for (var i = 0; i < branch.length; i++) - if (branch[i] == id) - return i; - - return -1; -}; -gantt.getGlobalTaskIndex = function (id) { - var branch = this._order; - for (var i = 0; i < branch.length; i++) - if (branch[i] == id) - return i; - - return -1; -}; -gantt.moveTask = function (sid, tindex, parent) { - //target id as 4th parameter - var id = arguments[3]; - if (id) { - if (id === sid) return; - - parent = this.getParent(id); - tindex = this.getTaskIndex(id); - } - if(sid == parent){ - return; - } - parent = parent || this.config.root_id; - var source = this.getTask(sid); - var source_pid = this.getParent(source.id); - var sbranch = this.getChildren(this.getParent(source.id)); - - var tbranch = this.getChildren(parent); - if (tindex == -1) - tindex = tbranch.length + 1; - if (source_pid == parent) { - var sindex = this.getTaskIndex(sid); - if (sindex == tindex) return; - } - - - /* - prevent moving to another sub-branch: - - gantt.attachEvent("onBeforeTaskMove", function(id, parent, tindex){ - var task = gantt.getTask(id); - if(task.parent != parent) - return false; - return true; - }); - */ - if(this.callEvent("onBeforeTaskMove", [sid, parent, tindex]) === false) - return; - - this._replace_branch_child(source_pid, sid); - tbranch = this.getChildren(parent); - - var tid = tbranch[tindex]; - if (!tid) //adding as last element - tbranch.push(sid); - else - tbranch = tbranch.slice(0, tindex).concat([ sid ]).concat(tbranch.slice(tindex)); - - this.setParent(source, parent); - this._branches[parent] = tbranch; - - var childTree = this._getTaskTree(sid); - for(var i = 0; i < childTree.length; i++){ - var item = this._pull[childTree[i]]; - if(item) - item.$level = this.calculateTaskLevel(item); - } - - if(tindex*1 > 0){ - if(id){ - source.$drop_target = (this.getTaskIndex(sid) > this.getTaskIndex(id) ? "next:" : '') + id; - }else{ - source.$drop_target = "next:" + gantt.getPrevSibling(sid); - } - }else if(tbranch[tindex*1 + 1]){ - source.$drop_target = tbranch[tindex*1 + 1]; - }else{ - source.$drop_target = parent; - } - - if(!this.callEvent("onAfterTaskMove", [sid, parent, tindex])) - return; - - this.refreshData(); - -}; - -gantt._init_dnd = function () { - var dnd = new dhtmlxDnD(this.$grid_data, {updates_per_second: 60}); - if (dhtmlx.defined(this.config.dnd_sensitivity)) - dnd.config.sensitivity = this.config.dnd_sensitivity; - - dnd.attachEvent("onBeforeDragStart", dhtmlx.bind(function (obj, e) { - var el = this._locateHTML(e); - if (!el) return false; - if (this.hideQuickInfo) this._hideQuickInfo(); - - var id = this.locate(e); - - var task = gantt.getTask(id); - - if(gantt._is_readonly(task)) - return false; - - dnd.config.initial_open_state = task.$open; - if (!this.callEvent("onRowDragStart", [id, e.target || e.srcElement, e])) { - return false; - } - - }, this)); - - dnd.attachEvent("onAfterDragStart", dhtmlx.bind(function (obj, e) { - var el = this._locateHTML(e); - dnd.config.marker.innerHTML = el.outerHTML; - dnd.config.id = this.locate(e); - var task = this.getTask(dnd.config.id); - dnd.config.index = this.getTaskIndex(dnd.config.id); - dnd.config.parent = task.parent; - task.$open = false; - task.$transparent = true; - this.refreshData(); - }, this)); - - - dnd.lastTaskOfLevel = function (level) { - var ids = gantt._order, - pull = gantt._pull, - last_item = null; - for (var i = 0, len = ids.length; i < len; i++) { - if (pull[ids[i]].$level == level) { - last_item = pull[ids[i]]; - } - } - return last_item ? last_item.id : null; - }; - dnd._getGridPos = dhtmlx.bind( function(e){ - var pos = this._get_position(this.$grid_data); - - // row offset - var x = pos.x; - var y = e.pos.y - 10; - - // prevent moving row out of grid_data container - if (y < pos.y) y = pos.y; - if (y > pos.y + this.$grid_data.offsetHeight - this.config.row_height) y = pos.y + this.$grid_data.offsetHeight - this.config.row_height; - - pos.x = x; - pos.y = y; - return pos; - }, this); - dnd.attachEvent("onDragMove", dhtmlx.bind(function (obj, e) { - var dd = dnd.config; - var pos = dnd._getGridPos(e); - - - // setting position of row - dd.marker.style.left = pos.x + 10 + "px"; - dd.marker.style.top = pos.y + "px"; - - //previous action might cause page scroll appear thus change position of the gantt, need to recalculate - pos = dnd._getGridPos(e); - - var x = pos.x, - y = pos.y; - - // highlight row when mouseover - var target = document.elementFromPoint(pos.x - document.body.scrollLeft + 1, y - document.body.scrollTop); - var el = this.locate(target); - - var item = this.getTask(dnd.config.id); - if (!this.isTaskExists(el)) { - el = dnd.lastTaskOfLevel(item.$level); - if (el == dnd.config.id) { - el = null; - } - } - - if (this.isTaskExists(el)) { - var box = gantt._get_position(target); - var over = this.getTask(el); - - - if (box.y + target.offsetHeight / 2 < y) { - //hovering over bottom part of item, check can be drop to bottom - var index = this.getGlobalTaskIndex(over.id); - var next = this._pull[this._order[index + 1]]; //adds +1 when hovering over placeholder - if (next) { - if (next.id != item.id) - over = next; //there is a valid target - else - return; - } else { - //we at end of the list, check and drop at the end of list - next = this._pull[this._order[index]]; - if (next.$level == item.$level && next.id != item.id) { - this.moveTask(item.id, -1, this.getParent(next.id)); - - return; - } - } - } - //if item is on different level, check the one before it - var index = this.getGlobalTaskIndex(over.id), - prev = this._pull[this._order[index-1]]; - - var shift = 1; - while((!prev || prev.id == over.id) && index - shift >= 0){ - prev = this._pull[this._order[index-shift]]; - shift++; - } - - if (item.id == over.id) return; - //replacing item under cursor - if (over.$level == item.$level && item.id != over.id) { - this.moveTask(item.id, 0, 0, over.id); - - }else if(over.$level == item.$level - 1 && !gantt.getChildren(over.id).length){ - this.moveTask(item.id, 0, over.id); - - } else if(prev && (prev.$level == item.$level) && (item.id != prev.id)){ - this.moveTask(item.id, -1, this.getParent(prev.id)); - - } - } - return true; - }, this)); - - - dnd.attachEvent("onDragEnd", dhtmlx.bind(function () { - var task = this.getTask(dnd.config.id); - if(this.callEvent("onBeforeRowDragEnd",[dnd.config.id, dnd.config.index, dnd.config.parent]) === false) { - this.moveTask(dnd.config.id, dnd.config.index, dnd.config.parent); - task.$drop_target = null; - }else{ - this.callEvent("onRowDragEnd", [dnd.config.id, task.$drop_target]); - } - - task.$transparent = false; - task.$open = dnd.config.initial_open_state; - this.refreshData(); - - }, this)); -}; - -/* will be overwriten in order to provide hide/show column functionality in some editions */ -gantt.getGridColumns = function () { - return this.config.columns; -}; - - -gantt._has_children = function(id){ - return this.getChildren(id).length > 0; -}; -// --#include core/grid_resize.js -// --#include core/dynamic_loading.js -// --#include core/grid_column_api.js - -gantt._scale_helpers = { - getSum : function(sizes, from, to){ - if(to === undefined) - to = sizes.length - 1; - if(from === undefined) - from = 0; - - var summ = 0; - for(var i=from; i <= to; i++) - summ += sizes[i]; - - return summ; - }, - setSumWidth : function(sum_width, scale, from, to){ - var parts = scale.width; - - if(to === undefined) - to = parts.length - 1; - if(from === undefined) - from = 0; - var length = to - from + 1; - - if(from > parts.length - 1 || length <= 0 || to > parts.length - 1) - return; - - var oldWidth = this.getSum(parts, from, to); - - var diff = sum_width - oldWidth; - - this.adjustSize(diff, parts, from, to); - this.adjustSize(- diff, parts, to + 1); - - scale.full_width = this.getSum(parts); - }, - splitSize : function(width, count){ - var arr = []; - for(var i=0; i < count; i++) arr[i] = 0; - - this.adjustSize(width, arr); - return arr; - - }, - adjustSize : function(width, parts, from, to){ - if(!from) - from = 0; - if(to === undefined) - to = parts.length - 1; - - var length = to - from + 1; - - var full = this.getSum(parts, from, to); - - var shared = 0; - - for(var i = from; i <= to; i++){ - var share = Math.floor(width*(full ? (parts[i]/full) : (1/length))); - - full -= parts[i]; - width -= share; - length--; - - parts[i] += share; - shared += share; - } - parts[parts.length - 1] += width; - //parts[parts.length - 1] += width - shared; - }, - sortScales : function(scales){ - function cellSize(unit, step){ - var d = new Date(1970, 0, 1); - return gantt.date.add(d, step, unit) - d; - } - - scales.sort(function(a, b){ - if(cellSize(a.unit, a.step) < cellSize(b.unit, b.step)){ - return 1; - }else if(cellSize(a.unit, a.step) > cellSize(b.unit, b.step)){ - return -1; - }else{ - return 0; - } - }); - }, - primaryScale : function(){ - - gantt._init_template("date_scale"); - - return { - unit: gantt.config.scale_unit, - step: gantt.config.step, - template : gantt.templates.date_scale, - date : gantt.config.date_scale, - css: gantt.templates.scale_cell_class - }; - }, - - prepareConfigs : function(scales, min_coll_width, container_width, scale_height){ - var heights = this.splitSize(scale_height, scales.length); - var full_width = container_width; - - var configs = []; - for(var i=scales.length-1; i >= 0; i--){ - var main_scale = (i == scales.length - 1); - var cfg = this.initScaleConfig(scales[i]); - if(main_scale){ - this.processIgnores(cfg); - } - - this.initColSizes(cfg, min_coll_width, full_width, heights[i]); - this.limitVisibleRange(cfg); - - if(main_scale){ - full_width = cfg.full_width; - } - - configs.unshift(cfg); - } - - - for( var i =0; i < configs.length-1; i++){ - this.alineScaleColumns(configs[configs.length-1], configs[i]); - } - for(var i = 0; i < configs.length; i++){ - this.setPosSettings(configs[i]); - } - return configs; - - }, - setPosSettings: function(config){ - for(var i = 0, len = config.trace_x.length; i < len; i++){ - config.left.push((config.width[i - 1] || 0) + (config.left[i - 1] || 0)); - } - }, - - _ignore_time_config : function(date){ - if(this.config.skip_off_time){ - return !this.isWorkTime(date); - } - return false; - }, - //defined in an extension - processIgnores : function(config){ - config.ignore_x = {}; - config.display_count = config.count; - }, - initColSizes : function(config, min_col_width, full_width, line_height){ - var cont_width = full_width; - - config.height = line_height; - - var column_count = config.display_count === undefined ? config.count : config.display_count; - - if(!column_count) - column_count = 1; - - config.col_width = Math.floor(cont_width/column_count); - - if(min_col_width){ - if (config.col_width < min_col_width){ - config.col_width = min_col_width; - cont_width = config.col_width * column_count; - } - } - config.width = []; - var ignores = config.ignore_x || {}; - for(var i =0; i < config.trace_x.length; i++){ - if(ignores[config.trace_x[i].valueOf()] || (config.display_count == config.count)){ - config.width[i] = 0; - }else{ - config.width[i] = 1; - } - } - - this.adjustSize(cont_width - this.getSum(config.width)/* 1 width per column from the code above */, config.width); - config.full_width = this.getSum(config.width); - }, - initScaleConfig : function(config){ - var cfg = dhtmlx.mixin({ - count:0, - col_width:0, - full_width:0, - height:0, - width:[], - left:[], - trace_x:[] - }, config); - - this.eachColumn(config.unit, config.step, function(date){ - cfg.count++; - cfg.trace_x.push(new Date(date)); - }); - - return cfg; - }, - iterateScales : function(lower_scale, upper_scale, from, to, callback){ - var upper_dates = upper_scale.trace_x; - var lower_dates = lower_scale.trace_x; - - var prev = from || 0; - var end = to || (lower_dates.length - 1); - var prevUpper = 0; - for(var up=1; up < upper_dates.length; up++){ - for(var next=prev; next <= end; next++){ - if(+lower_dates[next] == +upper_dates[up]){ - if(callback){ - callback.apply(this, [prevUpper, up, prev, next]); - } - prev = next; - prevUpper = up; - continue; - } - } - } - }, - alineScaleColumns : function(lower_scale, upper_scale, from, to){ - this.iterateScales(lower_scale, upper_scale, from, to, function(upper_start, upper_end, lower_start, lower_end){ - var targetWidth = this.getSum(lower_scale.width, lower_start, lower_end - 1); - var actualWidth = this.getSum(upper_scale.width, upper_start, upper_end - 1); - if(actualWidth != targetWidth){ - this.setSumWidth(targetWidth, upper_scale, upper_start, upper_end - 1); - } - - }); - }, - - eachColumn : function(unit, step, callback){ - var start = new Date(gantt._min_date), - end = new Date(gantt._max_date); - if(gantt.date[unit + "_start"]){ - start = gantt.date[unit + "_start"](start); - } - - var curr = new Date(start); - if(+curr >= +end){ - end = gantt.date.add(curr, step, unit); - } - while(+curr < +end){ - callback.call(this, new Date(curr)); - curr = gantt.date.add(curr, step, unit); - curr = gantt.date[unit + "_start"](curr); - } - }, - limitVisibleRange : function(cfg){ - var dates = cfg.trace_x; - - var left = 0, right = cfg.width.length-1; - var diff = 0; - if(+dates[0] < +gantt._min_date && left != right){ - var width = Math.floor(cfg.width[0] * ((dates[1] - gantt._min_date)/ (dates[1] - dates[0]))); - diff += cfg.width[0] - width; - cfg.width[0] = width; - - dates[0] = new Date(gantt._min_date); - } - - var last = dates.length - 1; - var lastDate = dates[last]; - var outDate = gantt.date.add(lastDate, cfg.step, cfg.unit); - if(+outDate > +gantt._max_date && last > 0){ - var width = cfg.width[last] - Math.floor(cfg.width[last] * ((outDate - gantt._max_date)/(outDate - lastDate))); - diff += cfg.width[last] - width; - cfg.width[last] = width; - } - - if(diff){ - var full = this.getSum(cfg.width); - var shared = 0; - for(var i =0; i < cfg.width.length; i++){ - var share = Math.floor(diff*(cfg.width[i]/full)); - cfg.width[i] += share; - shared += share; - } - this.adjustSize(diff - shared, cfg.width); - } - - } -}; -// --#include core/scales_ignore.js -gantt._tasks_dnd = { - drag : null, - _events:{ - before_start:{}, - before_finish:{}, - after_finish:{} - }, - _handlers:{}, - init:function(){ - this.clear_drag_state(); - var drag = gantt.config.drag_mode; - this.set_actions(); - - var evs = { - "before_start":"onBeforeTaskDrag", - "before_finish":"onBeforeTaskChanged", - "after_finish":"onAfterTaskDrag" - }; - //for now, all drag operations will trigger the same events - for(var stage in this._events){ - for(var mode in drag){ - this._events[stage][mode] = evs[stage]; - } - } - - this._handlers[drag.move] = this._move; - this._handlers[drag.resize] = this._resize; - this._handlers[drag.progress] = this._resize_progress; - - }, - set_actions:function(){ - var data = gantt.$task_data; - dhtmlxEvent(data, "mousemove", dhtmlx.bind(function(e){ - this.on_mouse_move(e||event); - }, this)); - dhtmlxEvent(data, "mousedown", dhtmlx.bind(function(e){ - this.on_mouse_down(e||event); - }, this)); - dhtmlxEvent(data, "mouseup", dhtmlx.bind(function(e){ - this.on_mouse_up(e||event); - }, this)); - }, - - clear_drag_state : function(){ - this.drag = { - id:null, - mode:null, - pos:null, - start_x:null, - start_y:null, - obj:null, - left:null - }; - }, - _resize : function(ev, shift, drag){ - var cfg = gantt.config; - var coords_x = this._drag_task_coords(ev, drag); - if(drag.left){ - ev.start_date = gantt.dateFromPos(coords_x.start + shift); - if(!ev.start_date){ - ev.start_date = new Date(gantt.getState().min_date); - } - }else{ - ev.end_date =gantt.dateFromPos(coords_x.end + shift); - if(!ev.end_date){ - ev.end_date = new Date(gantt.getState().max_date); - } - } - - if (ev.end_date - ev.start_date < cfg.min_duration){ - if(drag.left) - ev.start_date = gantt.calculateEndDate(ev.end_date, -1); - else - ev.end_date = gantt.calculateEndDate(ev.start_date, 1); - } - gantt._init_task_timing(ev); - }, - _resize_progress:function(ev, shift, drag){ - var coords_x = this._drag_task_coords(ev, drag); - - var diff = Math.max(0, drag.pos.x - coords_x.start); - ev.progress = Math.min(1, diff / (coords_x.end-coords_x.start)); - }, - _move : function(ev, shift, drag){ - var coords_x = this._drag_task_coords(ev, drag); - var new_start = gantt.dateFromPos(coords_x.start + shift), - new_end = gantt.dateFromPos(coords_x.end + shift); - if(!new_start){ - ev.start_date = new Date(gantt.getState().min_date); - ev.end_date = gantt.dateFromPos(gantt.posFromDate(ev.start_date) + (coords_x.end - coords_x.start)); - }else if(!new_end){ - ev.end_date = new Date(gantt.getState().max_date); - ev.start_date = gantt.dateFromPos(gantt.posFromDate(ev.end_date) - (coords_x.end - coords_x.start)); - }else{ - ev.start_date = new_start; - ev.end_date = new_end; - } - }, - _drag_task_coords : function(t, drag){ - var start = drag.obj_s_x = drag.obj_s_x || gantt.posFromDate(t.start_date); - var end = drag.obj_e_x = drag.obj_e_x || gantt.posFromDate(t.end_date); - return { - start : start, - end : end - }; - }, - on_mouse_move : function(e){ - if(this.drag.start_drag) - this._start_dnd(e); - - var drag = this.drag; - - if (drag.mode){ - if(!gantt._checkTimeout(this, 40))//limit update frequency - return; - - this._update_on_move(e); - - } - }, - _update_on_move : function(e){ - var drag = this.drag; - - if (drag.mode){ - var pos = gantt._get_mouse_pos(e); - if(drag.pos && drag.pos.x == pos.x) - return; - - drag.pos=pos; - - var curr_date = gantt.dateFromPos(pos.x); - if(!curr_date || isNaN( curr_date.getTime() )) - return; - - - var shift = pos.x - drag.start_x; - var ev = gantt.getTask(drag.id); - - - if(this._handlers[drag.mode]){ - var original = dhtmlx.mixin({}, ev); - var copy = dhtmlx.mixin({}, ev); - this._handlers[drag.mode].apply(this, [copy, shift, drag]); - dhtmlx.mixin(ev, copy, true); - gantt._update_parents(drag.id, true); - gantt.callEvent("onTaskDrag", [ev.id, drag.mode, copy, original, e]); - - - dhtmlx.mixin(ev, copy, true); - gantt._update_parents(drag.id); - gantt.refreshTask(drag.id); - } - - } - }, - - on_mouse_down : function(e, src){ - // on Mac we do not get onmouseup event when clicking right mouse button leaving us in dnd state - // let's ignore right mouse button then - if (e.button == 2) - return; - - var id =gantt.locate(e); - var task = null; - if(gantt.isTaskExists(id)){ - task = gantt.getTask(id); - } - - if (gantt._is_readonly(task) || this.drag.mode) return; - - this.clear_drag_state(); - - src = src||(e.target||e.srcElement); - - var className = gantt._trim(src.className || ""); - if(!className || !this._get_drag_mode(className)){ - if(src.parentNode) - return this.on_mouse_down(e, src.parentNode); - else - return; - } - - var drag = this._get_drag_mode(className); - - if(!drag){ - if (gantt.checkEvent("onMouseDown") && gantt.callEvent("onMouseDown", [className.split(" ")[0]])) { - if (src.parentNode) - return this.on_mouse_down(e,src.parentNode); - - } - }else{ - if (drag.mode && drag.mode != gantt.config.drag_mode.ignore && gantt.config["drag_" + drag.mode]){ - id = gantt.locate(src); - task = dhtmlx.copy(gantt.getTask(id) || {}); - - if(gantt._is_readonly(task)){ - this.clear_drag_state(); - return false; - } - - if(gantt._is_flex_task(task) && drag.mode != gantt.config.drag_mode.progress){//only progress drag is allowed for tasks with flexible duration - this.clear_drag_state(); - return; - } - - drag.id = id; - var pos = gantt._get_mouse_pos(e); - - drag.start_x = pos.x; - drag.start_y = pos.y; - drag.obj = task; - this.drag.start_drag = drag; - - }else - this.clear_drag_state(); - } - }, - _fix_dnd_scale_time:function(task, drag){ - var unit = gantt._tasks.unit, - step = gantt._tasks.step; - if(!gantt.config.round_dnd_dates){ - unit = 'minute'; - step = gantt.config.time_step; - } - - function fixStart(task){ - if(!gantt.isWorkTime(task.start_date)) - task.start_date = gantt.calculateEndDate(task.start_date, -1, gantt.config.duration_unit); - } - function fixEnd(task){ - if(!gantt.isWorkTime(new Date(task.end_date - 1))) - task.end_date = gantt.calculateEndDate(task.end_date, 1, gantt.config.duration_unit); - } - if(drag.mode == gantt.config.drag_mode.resize){ - if(drag.left){ - task.start_date = gantt.roundDate({date:task.start_date, unit:unit, step:step}); - fixStart(task); - }else{ - task.end_date = gantt.roundDate({date:task.end_date, unit:unit, step:step}); - fixEnd(task); - } - }else if(drag.mode == gantt.config.drag_mode.move){ - task.start_date = gantt.roundDate({date:task.start_date, unit:unit, step:step}); - fixStart(task); - - task.end_date = gantt.calculateEndDate(task.start_date, task.duration, gantt.config.duration_unit); - } - }, - _fix_working_times:function(task, drag){ - var drag = drag || {mode : gantt.config.drag_mode.move}; - if(gantt.config.work_time && gantt.config.correct_work_time){ - if(drag.mode == gantt.config.drag_mode.resize){ - if(drag.left){ - task.start_date = gantt.getClosestWorkTime({date:task.start_date, dir:'future'}); - }else{ - task.end_date = gantt.getClosestWorkTime({date:task.end_date, dir:'past'}); - } - }else if(drag.mode == gantt.config.drag_mode.move){ - gantt.correctTaskWorkTime(task); - } - } - }, - on_mouse_up : function(e){ - var drag = this.drag; - if (drag.mode && drag.id){ - //drop - var ev=gantt.getTask(drag.id); - - if(gantt.config.work_time && gantt.config.correct_work_time){ - this._fix_working_times(ev, drag); - } - - this._fix_dnd_scale_time(ev, drag); - - gantt._init_task_timing(ev); - - if(!this._fireEvent("before_finish", drag.mode, [drag.id, drag.mode, dhtmlx.copy(drag.obj), e])){ - drag.obj._dhx_changed = false; - dhtmlx.mixin(ev, drag.obj, true); - - gantt.updateTask(ev.id); - } else { - var drag_id = drag.id; - - gantt._init_task_timing(ev); - this._fireEvent("after_finish", drag.mode, [drag_id, drag.mode, e]); - this.clear_drag_state(); - gantt.updateTask(ev.id); - } - - } - this.clear_drag_state(); - }, - _get_drag_mode : function(className){ - var modes = gantt.config.drag_mode; - var classes = (className || "").split(" "); - var classname = classes[0]; - var drag = {mode:null, left:null}; - switch (classname) { - case "gantt_task_line": - case "gantt_task_content": - drag.mode = modes.move; - break; - case "gantt_task_drag": - drag.mode = modes.resize; - if(classes[1] && classes[1].indexOf("left", classes[1].length - "left".length) !== -1){ - drag.left = true; - }else{ - drag.left = false; - } - break; - case "gantt_task_progress_drag": - drag.mode = modes.progress; - break; - case "gantt_link_control": - case "gantt_link_point": - drag.mode = modes.ignore; - break; - default: - drag = null; - break; - } - return drag; - - }, - - _start_dnd : function(e){ - var drag = this.drag = this.drag.start_drag; - delete drag.start_drag; - - var cfg = gantt.config; - var id = drag.id; - if (!cfg["drag_"+drag.mode] || !gantt.callEvent("onBeforeDrag",[id, drag.mode, e]) || !this._fireEvent("before_start", drag.mode, [id, drag.mode, e])){ - this.clear_drag_state(); - }else { - delete drag.start_drag; - } - - }, - _fireEvent:function(stage, mode, params){ - dhtmlx.assert(this._events[stage], "Invalid stage:{" + stage + "}"); - - var trigger = this._events[stage][mode]; - - dhtmlx.assert(trigger, "Unknown after drop mode:{" + mode + "}"); - dhtmlx.assert(params, "Invalid event arguments"); - - - if(!gantt.checkEvent(trigger)) - return true; - - return gantt.callEvent(trigger, params); - } -}; - -gantt.roundTaskDates = function(task){ - var drag_state = gantt._tasks_dnd.drag; - - if(!drag_state){ - drag_state = {mode:gantt.config.drag_mode.move}; - } - gantt._tasks_dnd._fix_dnd_scale_time(task, drag_state); -}; - - - - - - - -gantt._render_link = function(id){ - var link = this.getLink(id); - var renders = gantt._get_link_renderers(); - for(var i = 0; i < renders.length; i++) - renders[i].render_item(link); -}; - -gantt._get_link_type = function(from_start, to_start){ - var type = null; - if(from_start && to_start){ - type = gantt.config.links.start_to_start; - }else if(!from_start && to_start){ - type = gantt.config.links.finish_to_start; - }else if(!from_start && !to_start){ - type = gantt.config.links.finish_to_finish; - }else if(from_start && !to_start){ - type = gantt.config.links.start_to_finish; - } - return type; -}; - -gantt.isLinkAllowed = function(from, to, from_start, to_start){ - var link = null; - if(typeof(from) == "object"){ - link = from; - }else{ - link = {source:from, target:to, type: this._get_link_type(from_start, to_start)}; - } - - if(!link) return false; - if(!(link.source && link.target && link.type)) return false; - if(link.source == link.target) return false; - - var res = true; - //any custom rules - if(this.checkEvent("onLinkValidation")) - res = this.callEvent("onLinkValidation", [link]); - - return res; -}; - -gantt._render_link_element = function(link){ - var dots = this._path_builder.get_points(link); - var drawer = gantt._drawer; - var lines = drawer.get_lines(dots); - - var div = document.createElement("div"); - - - var css = "gantt_task_link"; - - if(link.color){ - css += " gantt_link_inline_color"; - } - var cssTemplate = this.templates.link_class ? this.templates.link_class(link) : ""; - if(cssTemplate){ - css += " " + cssTemplate; - } - - if(this.config.highlight_critical_path && this.isCriticalLink){ - if(this.isCriticalLink(link)) - css += " gantt_critical_link"; - } - - div.className = css; - div.setAttribute(gantt.config.link_attribute, link.id); - for(var i=0; i < lines.length; i++){ - if(i == lines.length - 1){ - lines[i].size -= gantt.config.link_arrow_size; - } - var el = drawer.render_line(lines[i], lines[i+1]); - if(link.color){ - el.firstChild.style.backgroundColor = link.color; - } - div.appendChild(el); - } - - var direction = lines[lines.length - 1].direction; - var endpoint = gantt._render_link_arrow(dots[dots.length - 1], direction); - if(link.color){ - endpoint.style.borderColor = link.color; - } - div.appendChild(endpoint); - - return div; -}; - -gantt._render_link_arrow = function(point, direction){ - var div = document.createElement("div"); - var drawer = gantt._drawer; - var top = point.y; - var left = point.x; - - var size = gantt.config.link_arrow_size; - var line_width = gantt.config.row_height; - var className = "gantt_link_arrow gantt_link_arrow_" + direction; - switch (direction){ - case drawer.dirs.right: - top -= (size - line_width)/2; - left -= size; - break; - case drawer.dirs.left: - top -= (size - line_width)/2; - break; - case drawer.dirs.up: - left -= (size - line_width)/2; - break; - case drawer.dirs.down: - top -= size; - left -= (size - line_width)/2; - break; - default: - break; - } - div.style.cssText = [ - "top:"+top + "px", - "left:"+left+'px'].join(';'); - div.className = className; - - return div; -}; - - -gantt._drawer = { - current_pos:null, - dirs:{"left":'left',"right":'right',"up":'up', "down":'down'}, - path:[], - clear:function(){ - this.current_pos = null; - this.path = []; - }, - point:function(pos){ - this.current_pos = dhtmlx.copy(pos); - }, - get_lines:function(dots){ - this.clear(); - this.point(dots[0]); - for(var i=1; i from.x){ - direction = this.dirs.right; - }else if (to.y > from.y){ - direction = this.dirs.down; - }else { - direction = this.dirs.up; - } - return direction; - } - -}; -gantt._y_from_ind = function(index){ - return (index)*gantt.config.row_height; -}; -gantt._path_builder = { - - path:[], - clear:function(){ - this.path = []; - }, - current:function(){ - return this.path[this.path.length - 1]; - }, - point:function(next){ - if(!next) - return this.current(); - - this.path.push(dhtmlx.copy(next)); - return next; - }, - point_to:function(direction, diff, point){ - if(!point) - point = dhtmlx.copy(this.point()); - else - point = {x:point.x, y:point.y}; - var dir = gantt._drawer.dirs; - switch (direction){ - case (dir.left): - point.x -= diff; - break; - case (dir.right): - point.x += diff; - break; - case (dir.up): - point.y -= diff; - break; - case (dir.down): - point.y += diff; - break; - default: - break; - } - return this.point(point); - }, - get_points:function(link){ - var pt = this.get_endpoint(link); - var xy = gantt.config; - - - var dy = pt.e_y - pt.y; - var dx = pt.e_x - pt.x; - - var dir = gantt._drawer.dirs; - - this.clear(); - this.point({x: pt.x, y : pt.y}); - - var shiftX = 2*xy.link_arrow_size;//just random size for first line - - - var forward = (pt.e_x > pt.x); - if(link.type == gantt.config.links.start_to_start){ - this.point_to(dir.left, shiftX); - if(forward){ - this.point_to(dir.down, dy); - this.point_to(dir.right, dx); - }else{ - this.point_to(dir.right, dx); - this.point_to(dir.down, dy); - } - this.point_to(dir.right, shiftX); - - }else if(link.type == gantt.config.links.finish_to_start){ - forward = (pt.e_x > (pt.x + 2*shiftX)); - this.point_to(dir.right, shiftX); - if(forward){ - dx -= shiftX; - this.point_to(dir.down, dy); - this.point_to(dir.right, dx); - }else{ - dx -= 2*shiftX; - var sign = dy > 0 ? 1 : -1; - - this.point_to(dir.down, sign * (xy.row_height/2)); - this.point_to(dir.right, dx); - this.point_to(dir.down, sign * ( Math.abs(dy) - (xy.row_height/2))); - this.point_to(dir.right, shiftX); - } - - }else if(link.type == gantt.config.links.finish_to_finish){ - this.point_to(dir.right, shiftX); - if(forward){ - this.point_to(dir.right, dx); - this.point_to(dir.down, dy); - }else{ - this.point_to(dir.down, dy); - this.point_to(dir.right, dx); - } - this.point_to(dir.left, shiftX); - }else if(link.type == gantt.config.links.start_to_finish){ - - forward = (pt.e_x > (pt.x - 2*shiftX)); - this.point_to(dir.left, shiftX); - - if(!forward){ - dx += shiftX; - this.point_to(dir.down, dy); - this.point_to(dir.right, dx); - }else{ - dx += 2*shiftX; - var sign = dy > 0 ? 1 : -1; - this.point_to(dir.down, sign * (xy.row_height/2)); - this.point_to(dir.right, dx); - this.point_to(dir.down, sign * ( Math.abs(dy) - (xy.row_height/2))); - this.point_to(dir.left, shiftX); - } - - } - - return this.path; - }, - get_endpoint : function(link){ - var types = gantt.config.links; - var from_start = false, to_start = false; - - if(link.type == types.start_to_start){ - from_start = to_start = true; - }else if(link.type == types.finish_to_finish){ - from_start = to_start = false; - }else if(link.type == types.finish_to_start){ - from_start = false; - to_start = true; - }else if(link.type == types.start_to_finish){ - from_start = true; - to_start = false; - }else{ - dhtmlx.assert(false, "Invalid link type"); - } - - var from = gantt._get_task_visible_pos(gantt._pull[link.source], from_start); - var to = gantt._get_task_visible_pos(gantt._pull[link.target], to_start); - - return { - x : from.x, - e_x : to.x, - y : from.y , - e_y : to.y - }; - } -}; - -gantt._init_links_dnd = function() { - var dnd = new dhtmlxDnD(this.$task_bars, { sensitivity : 0, updates_per_second : 60 }), - start_marker = "task_left", - end_marker = "task_right", - link_edge_marker = "gantt_link_point", - link_landing_hover_area = "gantt_link_control"; - - dnd.attachEvent("onBeforeDragStart", dhtmlx.bind(function(obj,e) { - var target = (e.target||e.srcElement); - resetDndState(); - if(gantt.getState().drag_id) - return false; - - - if(gantt._locate_css(target, link_edge_marker)){ - if(gantt._locate_css(target, start_marker)) - gantt._link_source_task_start = true; - - var sid = gantt._link_source_task = this.locate(e); - - - var t = gantt.getTask(sid); - if(gantt._is_readonly(t)){ - resetDndState(); - return false; - } - - var shift = 0; - if(gantt._get_safe_type(t.type) == gantt.config.types.milestone){ - shift = (gantt._get_visible_milestone_width() - gantt._get_milestone_width())/2; - } - - this._dir_start = getLinePos(t, !!gantt._link_source_task_start, shift); - return true; - }else{ - return false; - } - - }, this)); - - dnd.attachEvent("onAfterDragStart", dhtmlx.bind(function(obj,e) { - updateMarkedHtml(dnd.config.marker); - }, this)); - - function getLinePos(task, to_start, shift){ - var pos = gantt._get_task_pos(task, !!to_start); - pos.y += gantt._get_task_height()/2; - - shift = shift || 0; - pos.x += (to_start ? -1 : 1)*shift; - return pos; - } - - dnd.attachEvent("onDragMove", dhtmlx.bind(function(obj,e) { - var dd = dnd.config; - var pos = dnd.getPosition(e); - advanceMarker(dd.marker, pos); - var landing = gantt._is_link_drop_area(e); - - var prevTarget = gantt._link_target_task; - var prevLanding = gantt._link_landing; - var prevToStart = gantt._link_target_task_start; - - var targ = gantt.locate(e), - to_start = true; - if(landing){ - //refreshTask - to_start = !gantt._locate_css(e, end_marker); - landing = !!targ; - } - - gantt._link_target_task = targ; - gantt._link_landing = landing; - gantt._link_target_task_start = to_start; - - if(landing){ - var t = gantt.getTask(targ); - - var node = gantt._locate_css(e, link_landing_hover_area); - var shift = 0; - if(node){ - shift = Math.floor(node.offsetWidth / 2); - } - - this._dir_end = getLinePos(t, !!gantt._link_target_task_start,shift); - }else{ - this._dir_end = gantt._get_mouse_pos(e); - } - - var targetChanged = !(prevLanding == landing && prevTarget == targ && prevToStart == to_start); - if(targetChanged){ - if(prevTarget) - gantt.refreshTask(prevTarget, false); - if(targ) - gantt.refreshTask(targ, false); - } - - if(targetChanged){ - updateMarkedHtml(dd.marker); - } - - - - showDirectingLine(this._dir_start.x, this._dir_start.y, this._dir_end.x, this._dir_end.y); - - return true; - }, this)); - - - dnd.attachEvent("onDragEnd", dhtmlx.bind(function() { - var drag = getDndState(); - - if(drag.from && drag.to && drag.from != drag.to){ - var type = gantt._get_link_type(drag.from_start, drag.to_start); - - var link = {source : drag.from, target: drag.to, type:type}; - if(link.type && gantt.isLinkAllowed(link)) - gantt.addLink(link); - } - - resetDndState(); - - if(drag.from) - gantt.refreshTask(drag.from, false); - if(drag.to) - gantt.refreshTask(drag.to, false); - removeDirectionLine(); - }, this)); - - function updateMarkedHtml(marker){ - var link = getDndState(); - - var css = ["gantt_link_tooltip"]; - if(link.from && link.to){ - if(gantt.isLinkAllowed(link.from, link.to, link.from_start, link.to_start)){ - css.push("gantt_allowed_link"); - }else{ - css.push("gantt_invalid_link"); - } - } - - var className = gantt.templates.drag_link_class(link.from, link.from_start, link.to, link.to_start); - if(className) - css.push(className); - - var html = "
" + - gantt.templates.drag_link(link.from, link.from_start, link.to, link.to_start) + - "
"; - marker.innerHTML = html; - } - - function advanceMarker(marker, pos){ - marker.style.left = pos.x + 5 + "px"; - marker.style.top = pos.y + 5 + "px"; - } - function getDndState(){ - return { from : gantt._link_source_task, - to : gantt._link_target_task, - from_start : gantt._link_source_task_start, - to_start : gantt._link_target_task_start}; - } - function resetDndState(){ - gantt._link_source_task = - gantt._link_source_task_start = - gantt._link_target_task = null; - gantt._link_target_task_start = true; - } - function showDirectingLine(s_x, s_y, e_x, e_y){ - var div = getDirectionLine(); - - var link = getDndState(); - - var css = ["gantt_link_direction"]; - if(gantt.templates.link_direction_class){ - css.push(gantt.templates.link_direction_class(link.from, link.from_start, link.to, link.to_start)); - } - - var dist =Math.sqrt( (Math.pow(e_x - s_x, 2)) + (Math.pow(e_y - s_y, 2)) ); - dist = Math.max(0, dist - 3); - if(!dist) - return; - - div.className = css.join(" "); - var tan = (e_y - s_y)/(e_x - s_x), - angle = Math.atan(tan); - - if(coordinateCircleQuarter(s_x, e_x, s_y, e_y) == 2){ - angle += Math.PI; - }else if(coordinateCircleQuarter(s_x, e_x, s_y, e_y) == 3){ - angle -= Math.PI; - } - - - - var sin = Math.sin(angle), - cos = Math.cos(angle), - top = Math.round(s_y), - left = Math.round(s_x); - - - var style = [ - "-webkit-transform: rotate("+angle+"rad)", - "-moz-transform: rotate("+angle+"rad)", - "-ms-transform: rotate("+angle+"rad)", - "-o-transform: rotate("+angle+"rad)", - "transform: rotate("+angle+"rad)", - "width:" + Math.round(dist) + "px" - ]; - - if(window.navigator.userAgent.indexOf("MSIE 8.0") != -1){ - //ms-filter breaks styles in ie9, so add it only for 8th - style.push("-ms-filter: \"" + ieTransform(sin, cos) + "\""); - - var shiftLeft = Math.abs(Math.round(s_x - e_x)), - shiftTop = Math.abs(Math.round(e_y - s_y)); - //fix rotation axis - switch(coordinateCircleQuarter(s_x, e_x, s_y, e_y)){ - case 1: - top -= shiftTop; - break; - case 2: - left -= shiftLeft; - top -= shiftTop; - break; - case 3: - left -= shiftLeft; - break; - default: - break; - } - - } - - style.push("top:" + top + "px"); - style.push("left:" + left + "px"); - - div.style.cssText = style.join(";"); - } - - function ieTransform(sin, cos){ - return "progid:DXImageTransform.Microsoft.Matrix("+ - "M11 = "+cos+","+ - "M12 = -"+sin+","+ - "M21 = "+sin+","+ - "M22 = "+cos+","+ - "SizingMethod = 'auto expand'"+ - ")"; - } - function coordinateCircleQuarter(sX, eX, sY, eY){ - if(eX >= sX){ - if(eY <= sY){ - return 1; - }else{ - return 4; - } - }else{ - if(eY <= sY){ - return 2; - }else{ - return 3; - } - } - - } - function getDirectionLine(){ - if(!dnd._direction){ - dnd._direction = document.createElement("div"); - gantt.$task_links.appendChild(dnd._direction); - } - return dnd._direction; - } - function removeDirectionLine(){ - if(dnd._direction){ - if (dnd._direction.parentNode) //the event line can be detached because of data refresh - dnd._direction.parentNode.removeChild(dnd._direction); - - dnd._direction = null; - } - } - - gantt._is_link_drop_area = function(e){ - return !!gantt._locate_css(e, link_landing_hover_area); - }; -}; -gantt._get_link_state = function(){ - return { - link_landing_area : this._link_landing, - link_target_id : this._link_target_task, - link_target_start : this._link_target_task_start, - link_source_id : this._link_source_task, - link_source_start : this._link_source_task_start - }; -}; - - -gantt._init_tasks = function(){ - //store temporary configs - this._tasks = { - col_width:this.config.columnWidth, - width: [], // width of each column - full_width: 0, // width of all columns - trace_x:[], - rendered:{} - }; - - - this._click.gantt_task_link = dhtmlx.bind(function(e, trg){ - var id = this.locate(e, gantt.config.link_attribute); - if(id){ - this.callEvent("onLinkClick", [id, e]); - } - }, this); - - this._click.gantt_scale_cell = dhtmlx.bind(function(e, trg){ - var pos = gantt._get_mouse_pos(e); - var date = gantt.dateFromPos(pos.x); - var coll = Math.floor(gantt._day_index_by_date(date)); - - var coll_date = gantt._tasks.trace_x[coll]; - - gantt.callEvent("onScaleClick", [e, coll_date]); - }, this); - - this._dbl_click.gantt_task_link = dhtmlx.bind(function(e, id, trg){ - var id = this.locate(e, gantt.config.link_attribute); - this._delete_link_handler(id, e); - }, this); - - this._dbl_click.gantt_link_point = dhtmlx.bind(function(e, id, trg){ - var id = this.locate(e), - task = this.getTask(id); - - - var link = null; - if(trg.parentNode && trg.parentNode.className){ - if(trg.parentNode.className.indexOf("_left") > -1){ - link = task.$target[0]; - }else{ - link = task.$source[0]; - } - } - if(link) - this._delete_link_handler(link, e); - return false; - }, this); - - this._tasks_dnd.init(); - this._init_links_dnd(); - - this._link_layers.clear(); - - var links_layer = this.addLinkLayer({ - renderer: this._render_link_element, - container: this.$task_links, - filter: gantt._create_filter(['_filter_link', '_is_chart_visible']) - }); - this._linkRenderer = this._link_layers.getRenderer(links_layer); - - this._task_layers.clear(); - var bar_layer = this.addTaskLayer({ - renderer: this._render_task_element, - container: this.$task_bars, - filter: gantt._create_filter(['_filter_task', '_is_chart_visible']) - }); - this._taskRenderer = this._task_layers.getRenderer(bar_layer); - - this.addTaskLayer({ - renderer: this._render_grid_item, - container: this.$grid_data, - filter: gantt._create_filter(['_filter_task', '_is_grid_visible']) - }); - this.addTaskLayer({ - renderer: this._render_bg_line, - container: this.$task_bg, - filter: gantt._create_filter(['_filter_task', '_is_chart_visible', '_is_std_background']) - }); - - - - function refreshId(renders, oldId, newId, item){ - for(var i =0; i < renders.length; i++){ - renders[i].change_id(oldId, newId); - renders[i].render_item(item); - } - } - if(this._onTaskIdChange) - this.detachEvent(this._onTaskIdChange); - - this._onTaskIdChange = this.attachEvent("onTaskIdChange", function(oldId, newId){ - var render = this._get_task_renderers(); - refreshId(render, oldId, newId, this.getTask(newId)); - }); - - if(this._onLinkIdChange) - this.detachEvent(this._onLinkIdChange); - - this._onLinkIdChange = this.attachEvent("onLinkIdChange", function(oldId, newId){ - var render = this._get_link_renderers(); - refreshId(render, oldId, newId, this.getLink(newId)); - }); -}; - -gantt._create_filter = function(filter_methods){ - if(!(filter_methods instanceof Array)){ - filter_methods = Array.prototype.slice.call(arguments, 0); - } - - return function(obj){ - var res = true; - for(var i = 0, len = filter_methods.length; i < len; i++){ - var filter_method = filter_methods[i]; - if(gantt[filter_method]){ - res = res && (gantt[filter_method].apply(gantt, [obj.id, obj]) !== false); - } - } - - return res; - }; -}; - -gantt._is_chart_visible = function(){ - return !!this.config.show_chart; -}; - -gantt._filter_task = function(id, task){ - var min = null, max = null; - if(this.config.start_date && this.config.end_date){ - min = this.config.start_date.valueOf(); - max = this.config.end_date.valueOf(); - - if(+task.start_date > max || +task.end_date < +min) - return false; - } - return true; -}; -gantt._filter_link = function(id, link){ - if(!this.config.show_links){ - return false; - } - - if(!(gantt.isTaskVisible(link.source) && gantt.isTaskVisible(link.target))) - return false; - - return this.callEvent("onBeforeLinkDisplay", [id, link]); -}; -gantt._is_std_background = function(){ - return !this.config.static_background; -}; - -gantt._delete_link_handler = function(id, e){ - if(id && this.callEvent("onLinkDblClick", [id, e])){ - var link = gantt.getLink(id); - if(gantt._is_readonly(link)) return; - - var title = ""; - var question = gantt.locale.labels.link + " " +this.templates.link_description(this.getLink(id)) + " " + gantt.locale.labels.confirm_link_deleting; - - window.setTimeout(function(){ - gantt._dhtmlx_confirm(question, title, function(){ - gantt.deleteLink(id); - }); - },(gantt.config.touch ? 300 : 1)); - } -}; -gantt.getTaskNode = function(id){ - return this._taskRenderer.rendered[id]; -}; -gantt.getLinkNode = function(id){ - return this._linkRenderer.rendered[id]; -}; - - - - - -gantt._get_tasks_data = function(){ - var rows = []; - for(var i=0; i < this._order.length; i++){ - var item = this._pull[this._order[i]]; - item.$index = i; - //this._update_parents(item.id, true); - this.resetProjectDates(item); - rows.push(item); - } - return rows; -}; -gantt._get_links_data = function(){ - var links = []; - for(var i in this._lpull) - links.push(this._lpull[i]); - - return links; -}; -gantt._render_data = function(){ - this.callEvent("onBeforeDataRender", []); - if(!this._is_render_active()) - return; - - this._sync_order(); - this._update_layout_sizes(); - - if(this.config.static_background) - this._render_bg_canvas(); - - var data = this._get_tasks_data(); - - var renderers = this._get_task_renderers(); - for(var i=0; i < renderers.length; i++){ - renderers[i].render_items(data); - } - - var links = gantt._get_links_data(); - renderers = this._get_link_renderers(); - for(var i=0; i < renderers.length; i++) - renderers[i].render_items(links); - - this.callEvent("onDataRender", []); -}; - -gantt._update_layout_sizes = function(){ - var cfg = this._tasks; - - cfg.bar_height = this._get_task_height(); - - //task bars layer - this.$task_data.style.height = Math.max(this.$task.offsetHeight - this.config.scale_height, 0) + 'px'; - this.$task_bg.style.height = ""; - this.$task_bg.style.backgroundImage = ""; - - //timeline area layers - var data_els = this.$task_data.childNodes; - for(var i= 0, len = data_els.length; i < len; i++){ - var el = data_els[i]; - if(this._is_layer(el) && el.style) - el.style.width = cfg.full_width + "px"; - } - - //grid area - if(this._is_grid_visible()){ - var columns = this.getGridColumns(); - var width = 0; - for (var i = 0; i < columns.length; i++) - width += columns[i].width; - this.$grid_data.style.width = Math.max(width-1, 0) + "px"; - } -}; - -gantt._scale_range_unit = function(){ - var unit = this.config.scale_unit; - if(this.config.scale_offset_minimal){ - var scales = this._get_scales(); - unit = scales[scales.length - 1].unit; - } - return unit; -}; - -gantt._init_tasks_range = function(){ - var unit = this._scale_range_unit(); - if(this.config.start_date && this.config.end_date){ - this._min_date = this.date[unit + "_start"]( new Date(this.config.start_date)); - this._max_date = this.date[unit + "_start"]( new Date(this.config.end_date)); - return; - } - - //reset project timing - this._get_tasks_data(); - - var range = this.getSubtaskDates(); - this._min_date = range.start_date; - this._max_date = range.end_date; - - if(!(this._max_date && this._max_date)){ - this._min_date = new Date(); - this._max_date = new Date(this._min_date); - } - - this._min_date = this.date[unit + "_start"](this._min_date); - this._min_date = this.calculateEndDate(this.date[unit + "_start"](this._min_date), -1, unit);//one free column before first task - - this._max_date = this.date[unit + "_start"](this._max_date); - this._max_date = this.calculateEndDate(this._max_date, 2, unit);//one free column after last task -}; - - - -gantt._prepare_scale_html = function(config){ - var cells = []; - var date = null, content = null, css = null; - - if(config.template || config.date){ - content = config.template || this.date.date_to_str(config.date); - } - - - css = config.css || function(){}; - if(!config.css && this.config.inherit_scale_class){ - css = gantt.templates.scale_cell_class; - } - - for (var i = 0; i < config.count; i++) { - date = new Date(config.trace_x[i]); - var value = content.call(this, date), - width = config.width[i], - style = "", - template = "", - cssclass = ""; - - if(width){ - style = "width:"+(width)+"px;"; - cssclass = "gantt_scale_cell" + (i == config.count-1 ? " gantt_last_cell" : ""); - - template = css.call(this, date); - if(template) cssclass += " " + template; - var cell = "
" + value + "
"; - cells.push(cell); - }else{ - //do not render ignored cells - } - - } - return cells.join(""); -}; -gantt._get_scales = function(){ - var helpers = this._scale_helpers; - var scales = [helpers.primaryScale()].concat(this.config.subscales); - - helpers.sortScales(scales); - return scales; -}; - -gantt._render_tasks_scales = function() { - this._init_tasks_range(); - this._scroll_resize(); - this._set_sizes(); - - var scales_html = "", - outer_width = 0, - data_width = 0, - scale_height = 0; - - if(this._is_chart_visible()){ - var helpers = this._scale_helpers; - var scales = this._get_scales(); - scale_height = (this.config.scale_height-1); - var resize = this._get_resize_options(); - var avail_width = resize.x ? Math.max(this.config.autosize_min_width, 0) : this.$task.offsetWidth; - - var cfgs = helpers.prepareConfigs(scales,this.config.min_column_width, avail_width, scale_height); - var cfg = this._tasks = cfgs[cfgs.length - 1]; - - var html = []; - - var css = this.templates.scale_row_class; - for(var i=0; i < cfgs.length; i++){ - var cssClass = "gantt_scale_line"; - var tplClass = css(cfgs[i]); - if(tplClass){ - cssClass += " " + tplClass; - } - - html.push("
" + this._prepare_scale_html(cfgs[i]) + "
"); - } - - scales_html = html.join(""); - outer_width = cfg.full_width + this.$scroll_ver.offsetWidth + "px"; - data_width = cfg.full_width + "px"; - scale_height += "px"; - } - - if(this._is_chart_visible()){ - this.$task.style.display = ""; - }else{ - this.$task.style.display = "none"; - } - - this.$task_scale.style.height = scale_height; - - this.$task_data.style.width = - this.$task_scale.style.width = outer_width; - - this.$task_scale.innerHTML = scales_html; - -}; - -gantt._render_bg_line = function(item){ - var cfg = gantt._tasks; - var count = cfg.count; - var row = document.createElement("div"); - if(gantt.config.show_task_cells){ - for (var j = 0; j < count; j++) { - var width = cfg.width[j], - cssclass = ""; - - if(width > 0){//do not render skipped columns - var cell = document.createElement("div"); - cell.style.width = (width)+"px"; - - cssclass = "gantt_task_cell" + (j == count-1 ? " gantt_last_cell" : ""); - cssTemplate = this.templates.task_cell_class(item, cfg.trace_x[j]); - if(cssTemplate) - cssclass += " " + cssTemplate; - cell.className = cssclass; - - row.appendChild(cell); - } - - } - } - var odd = item.$index%2 !== 0; - var cssTemplate = gantt.templates.task_row_class(item.start_date, item.end_date, item); - var css = "gantt_task_row" + (odd ? " odd" : "") + (cssTemplate ? ' '+cssTemplate : ''); - - if(this.getState().selected_task == item.id){ - css += " gantt_selected"; - } - - //var row = "
" + cells.join("") + "
"; - - row.className = css; - row.style.height = (gantt.config.row_height)+"px"; - row.setAttribute(this.config.task_attribute, item.id); - return row; -}; - -//defined in an extension -gantt._render_bg_canvas = function(){}; - - -gantt._adjust_scales = function(){ - if(this.config.fit_tasks){ - var old_min = +this._min_date, - old_max = +this._max_date; - this._init_tasks_range(); - if(+this._min_date != old_min || +this._max_date != old_max){ - this.render(); - - this.callEvent("onScaleAdjusted", []); - return true; - } - } - return false; -}; - -//refresh task and related links -gantt.refreshTask = function(taskId, refresh_links){ - if(!this._is_render_active()) - return; - - var renders = this._get_task_renderers(); - - var task = this.getTask(taskId); - if(task && this.isTaskVisible(taskId)){ - for(var i =0; i < renders.length; i++) - renders[i].render_item(task); - - if(refresh_links !== undefined && !refresh_links) - return; - - for(var i=0; i < task.$source.length; i++){ - gantt.refreshLink(task.$source[i]); - } - for(var i=0; i < task.$target.length; i++){ - gantt.refreshLink(task.$target[i]); - } - }else{ - this._render_data(); - } -}; -gantt.refreshLink = function(linkId){ - if(!this._is_render_active()) - return; - - if(this.isLinkExists(linkId)){ - this._render_link(linkId); - }else{ - var renders = this._get_link_renderers(); - for(var i =0; i < renders.length; i++) - renders[i].remove_item(linkId); - } -}; - - - -gantt._combine_item_class = function(basic, template, itemId){ - var css = [basic]; - if(template) - css.push(template); - - var state = gantt.getState(); - - var task = this.getTask(itemId); - - if(this._get_safe_type(task.type) == this.config.types.milestone){ - css.push("gantt_milestone"); - } - - if(this._get_safe_type(task.type) == this.config.types.project){ - css.push("gantt_project"); - } - - if(this._is_flex_task(task)) - css.push("gantt_dependent_task"); - - if(this.config.select_task && itemId == state.selected_task) - css.push("gantt_selected"); - - if(itemId == state.drag_id){ - css.push("gantt_drag_" + state.drag_mode); - if(state.touch_drag){ - css.push("gantt_touch_" + state.drag_mode); - } - } - var links = gantt._get_link_state(); - if(links.link_source_id == itemId) - css.push("gantt_link_source"); - - if(links.link_target_id == itemId) - css.push("gantt_link_target"); - - - if(this.config.highlight_critical_path && this.isCriticalTask){ - if(this.isCriticalTask(task)) - css.push("gantt_critical_task"); - } - - if(links.link_landing_area && - (links.link_target_id && links.link_source_id) && - (links.link_target_id != links.link_source_id)){ - - var from_id = links.link_source_id; - var from_start = links.link_source_start; - var to_start = links.link_target_start; - - var allowDrag = gantt.isLinkAllowed(from_id, itemId, from_start, to_start); - - var dragClass = ""; - if(allowDrag){ - if(to_start) - dragClass = "link_start_allow"; - else - dragClass = "link_finish_allow"; - }else{ - if(to_start) - dragClass = "link_start_deny"; - else - dragClass = "link_finish_deny"; - } - css.push(dragClass); - } - return css.join(" "); -}; - -gantt._render_pair = function(parent, css, task, content){ - var state = gantt.getState(); - - if(+task.end_date <= +state.max_date) - parent.appendChild(content(css+" task_right")); - - if(+task.start_date >= +state.min_date) - parent.appendChild(content(css+" task_left")); -}; - -gantt._get_task_height = function(){ - // height of the bar item - var height = this.config.task_height; - if(height == "full") - height = this.config.row_height - 5; - //item height cannot be bigger than row height - height = Math.min(height, this.config.row_height); - return Math.max(height, 0); -}; - -gantt._get_milestone_width = function(){ - return this._get_task_height(); -}; -gantt._get_visible_milestone_width = function(){ - var origWidth = gantt._get_task_height();//m-s have square shape - return Math.sqrt(2*origWidth*origWidth); -}; - -// TODO: remove reduntant methods for task positioning -gantt.getTaskPosition = function(task, start_date, end_date){ - var x = this.posFromDate(start_date || task.start_date); - var x2 = this.posFromDate(end_date || task.end_date); - x2 = Math.max(x, x2); - var y = this.getTaskTop(task.id); - var height = this.config.task_height; - return { - left:x, - top:y, - height : height, - width: Math.max((x2 - x), 0) - }; -}; - -gantt._get_task_width = function(task, start, end ){ - return Math.round(this._get_task_pos(task, false).x - this._get_task_pos(task, true).x); -}; - -gantt._is_readonly = function(item){ - if(item && item[this.config.editable_property]){ - return false; - }else{ - return (item && item[this.config.readonly_property]) || this.config.readonly; - } -}; -gantt._task_default_render = function(task){ - var pos = this._get_task_pos(task); - - var cfg = this.config; - var height = this._get_task_height(); - - var padd = Math.floor((this.config.row_height - height)/2); - if(this._get_safe_type(task.type) == cfg.types.milestone && cfg.link_line_width > 1){ - //little adjust milestone position, so horisontal corners would match link arrow when thickness of link line is more than 1px - padd += 1; - } - - var div = document.createElement("div"); - var width = gantt._get_task_width(task); - - var type = this._get_safe_type(task.type); - - div.setAttribute(this.config.task_attribute, task.id); - - if(cfg.show_progress && type != this.config.types.milestone){ - this._render_task_progress(task,div, width); - } - - //use separate div to display content above progress bar - var content = gantt._render_task_content(task, width); - if(task.textColor){ - content.style.color = task.textColor; - } - div.appendChild(content); - - var css = this._combine_item_class("gantt_task_line", - this.templates.task_class(task.start_date, task.end_date, task), - task.id); - if(task.color || task.progressColor || task.textColor){ - css += " gantt_task_inline_color"; - } - div.className = css; - - var styles = [ - "left:" + pos.x + "px", - "top:" + (padd + pos.y) + 'px', - "height:" + height + 'px', - "line-height:" + height + 'px', - "width:" + width + 'px' - ]; - if(task.color){ - styles.push("background-color:" + task.color); - } - if(task.textColor){ - styles.push("color:" + task.textColor); - } - - div.style.cssText = styles.join(";"); - var side = this._render_leftside_content(task); - if(side) div.appendChild(side); - - side = this._render_rightside_content(task); - if(side) div.appendChild(side); - - if(!this._is_readonly(task)){ - if(cfg.drag_resize && !this._is_flex_task(task) && type != this.config.types.milestone){ - gantt._render_pair(div, "gantt_task_drag", task, function(css){ - var el = document.createElement("div"); - el.className = css; - return el; - }); - } - if(cfg.drag_links && this.config.show_links){ - gantt._render_pair(div, "gantt_link_control", task, function(css){ - var outer = document.createElement("div"); - outer.className = css; - outer.style.cssText = [ - "height:" + height + 'px', - "line-height:" + height + 'px' - ].join(";"); - var inner = document.createElement("div"); - inner.className = "gantt_link_point"; - outer.appendChild(inner); - return outer; - }); - } - } - return div; -}; - -gantt._render_task_element = function(task){ - var painters = this.config.type_renderers; - var renderer = painters[this._get_safe_type(task.type)], - defaultRenderer = this._task_default_render; - - if(!renderer){ - renderer = defaultRenderer; - } - return renderer.call(this, task, dhtmlx.bind(defaultRenderer, this)); -}; - -gantt._render_side_content = function(task, template, cssClass){ - if(!template) return null; - - var text = template(task.start_date, task.end_date, task); - if(!text) return null; - var content = document.createElement("div"); - content.className = "gantt_side_content " + cssClass; - content.innerHTML = text; - return content; -}; - - - -gantt._render_leftside_content = function(task){ - var css = "gantt_left " + gantt._get_link_crossing_css(true, task); - return gantt._render_side_content(task, this.templates.leftside_text, css); -}; -gantt._render_rightside_content = function(task){ - var css = "gantt_right " + gantt._get_link_crossing_css(false, task); - return gantt._render_side_content(task, this.templates.rightside_text, css); -}; - -gantt._get_conditions = function(leftside){ - if(leftside){ - return { - $source : [ - gantt.config.links.start_to_start - ], - $target : [ - gantt.config.links.start_to_start, - gantt.config.links.finish_to_start - ] - }; - }else{ - return { - $source : [ - gantt.config.links.finish_to_start, - gantt.config.links.finish_to_finish - ], - $target : [ - gantt.config.links.finish_to_finish - ] - }; - } -}; - -gantt._get_link_crossing_css = function(left, task){ - var cond = gantt._get_conditions(left); - - for(var i in cond){ - var links = task[i]; - for(var ln =0; ln < links.length; ln++){ - var link = gantt.getLink(links[ln]); - - for(var tp =0; tp < cond[i].length; tp++){ - if(link.type == cond[i][tp]){ - return "gantt_link_crossing"; - } - } - } - } - return ""; -}; - - - -gantt._render_task_content = function(task, width){ - var content = document.createElement("div"); - if(this._get_safe_type(task.type) != this.config.types.milestone) - content.innerHTML = this.templates.task_text(task.start_date, task.end_date, task); - content.className = "gantt_task_content"; - //content.style.width = width + 'px'; - return content; -}; -gantt._render_task_progress = function(task, element, maxWidth){ - var done = task.progress*1 || 0; - - maxWidth = Math.max(maxWidth - 2, 0);//2px for borders - var pr = document.createElement("div"); - var width = Math.round(maxWidth*done); - - width = Math.min(maxWidth, width); - if(task.progressColor){ - pr.style.backgroundColor = task.progressColor; - pr.style.opacity = 1; - } - pr.style.width = width + 'px'; - pr.className = "gantt_task_progress"; - pr.innerHTML = this.templates.progress_text(task.start_date, task.end_date, task); - element.appendChild(pr); - if(this.config.drag_progress && !gantt._is_readonly(task)){ - var drag = document.createElement("div"); - drag.style.left = width + 'px'; - drag.className = "gantt_task_progress_drag"; - pr.appendChild(drag); - element.appendChild(drag); - } -}; -gantt._get_line = function(step) { - var steps = { - "second": 1, - "minute": 60, - "hour": 60*60, - "day": 60*60*24, - "week": 60*60*24*7, - "month": 60*60*24*30, - "year": 60*60*24*365 - }; - return steps[step] || 0; -}; - - -gantt.dateFromPos = function(x){ - var scale = this._tasks; - if(x < 0 || x > scale.full_width || !scale.full_width){ - return null; - } - - var ind = this._findBinary(this._tasks.left, x); - var summ = this._tasks.left[ind]; - - var col_width = scale.width[ind] || scale.col_width; - var part = 0; - if(col_width) - part = (x - summ)/col_width; - - var unit = 0; - if(part){ - unit = gantt._get_coll_duration(scale, scale.trace_x[ind]); - } - - var date = new Date(scale.trace_x[ind].valueOf() + Math.round(part*unit)); - return date; -}; - -gantt.posFromDate = function(date){ - var ind = gantt._day_index_by_date(date); - dhtmlx.assert(ind >= 0, "Invalid day index"); - - var wholeCells = Math.floor(ind); - var partCell = ind % 1; - - var pos = gantt._tasks.left[Math.min(wholeCells, gantt._tasks.width.length - 1)]; - if(wholeCells == gantt._tasks.width.length) - pos += gantt._tasks.width[gantt._tasks.width.length - 1]; - //for(var i=1; i <= wholeCells; i++) - // pos += gantt._tasks.width[i-1]; - - if(partCell){ - if(wholeCells < gantt._tasks.width.length){ - pos += gantt._tasks.width[wholeCells]*(partCell % 1); - }else{ - pos += 1; - } - - } - return pos; -}; - -gantt._day_index_by_date = function(date){ - var pos = new Date(date).valueOf(); - var days = gantt._tasks.trace_x, - ignores = gantt._tasks.ignore_x; - - if(pos <= this._min_date) - return 0; - - if(pos >= this._max_date) - return days.length; - - /*var day = null; - for (var xind = 0, length = days.length-1; xind < length; xind++) { - // | 8:00, 8:30 | 8:15 should be checked against 8:30 - // clicking at the most left part of the cell, say 8:30 should create event in that cell, not previous one - day = +days[xind+1]; - if (pos < day && !ignores[day]) - break; - }*/ - - var day_ind = gantt._findBinary(days, pos); - var day = +gantt._tasks.trace_x[day_ind]; - while(ignores[day]){ - day = gantt._tasks.trace_x[++day_ind]; - } - - if(!day) return 0; - - return day_ind + ((date - days[day_ind]) / gantt._get_coll_duration(gantt._tasks, days[day_ind])); - - -}; -gantt._findBinary = function(array, target) { - // modified binary search, target value not exactly match array elements, looking for closest one - - var low = 0, high = array.length - 1, i, item, prev; - while (low <= high) { - - i = Math.floor((low + high) / 2); - item = +array[i]; - prev = +array[i - 1]; - if (item < target){ - low = i + 1; continue; - } - if (item > target){ - if(!(!isNaN(prev) && prev < target)) { - high = i - 1; continue; - }else{ - // if target is between 'i' and 'i-1' return 'i - 1' - return i - 1; - } - - } - - return i; - } - return array.length - 1; -}; -gantt._get_coll_duration = function(scale, date){ - return gantt.date.add(date, scale.step, scale.unit) - date; -}; - -gantt._get_x_pos = function(task, to_start){ - to_start = to_start !== false; - var x = gantt.posFromDate(to_start ? task.start_date : task.end_date); -}; - -gantt.getTaskTop = function(task_id){ - return this._y_from_ind(this._get_visible_order(task_id)); -}; - -gantt._get_task_coord = function(task, to_start, x_correction){ - to_start = to_start !== false; - x_correction = x_correction || 0; - var isMilestone = (this._get_safe_type(task.type) == this.config.types.milestone); - - var date = null; - - if(to_start || isMilestone){ - date = (task.start_date || this._default_task_date(task)); - }else{ - date = (task.end_date || this.calculateEndDate(this._default_task_date(task))); - } - var x = this.posFromDate(date), - y = this.getTaskTop(task.id); - - if(isMilestone){ - if(to_start){ - x -= x_correction; - }else{ - x += x_correction; - } - } - return {x:x, y:y}; -}; -gantt._get_task_pos = function(task, to_start){ - to_start = to_start !== false; - var mstoneCorrection = gantt._get_milestone_width()/2; - return this._get_task_coord(task, to_start, mstoneCorrection); -}; - -gantt._get_task_visible_pos = function(task, to_start){ - to_start = to_start !== false; - var mstoneCorrection = gantt._get_visible_milestone_width()/2; - return this._get_task_coord(task, to_start, mstoneCorrection); -}; - - -gantt._correct_shift=function(start, back){ - return start-=((new Date(gantt._min_date)).getTimezoneOffset()-(new Date(start)).getTimezoneOffset())*60000*(back?-1:1); -}; - - - -gantt._get_mouse_pos = function(ev){ - if (ev.pageX || ev.pageY) - var pos = {x:ev.pageX, y:ev.pageY}; - - var d = _isIE ? document.documentElement : document.body; - var pos = { - x:ev.clientX + d.scrollLeft - d.clientLeft, - y:ev.clientY + d.scrollTop - d.clientTop - }; - - var box = gantt._get_position(gantt.$task_data); - pos.x = pos.x - box.x + gantt.$task_data.scrollLeft; - pos.y = pos.y - box.y + gantt.$task_data.scrollTop; - return pos; -}; - -gantt._is_layer = function(dom_element){ - return (dom_element && dom_element.hasAttribute && dom_element.hasAttribute(this.config.layer_attribute)); -}; -//helper for rendering bars and links -gantt._task_renderer = function(id, render_one, node, filter){ - //hash of dom elements is needed to redraw single bar/link - if(!this._task_area_pulls) - this._task_area_pulls = {}; - - if(!this._task_area_renderers) - this._task_area_renderers = {}; - - if(this._task_area_renderers[id]) - return this._task_area_renderers[id]; - - if(!render_one) - dhtmlx.assert(false, "Invalid renderer call"); - - if(node) - node.setAttribute(this.config.layer_attribute, true); - - this._task_area_renderers[id] = { - render_item : function(item, container){ - var pull = gantt._task_area_pulls[id]; - container = container || node; - - - if(filter){ - if(!filter(item)){ - this.remove_item(item.id); - return; - } - } - - var dom = render_one.call(gantt, item); - if(!dom) return; - if(pull[item.id]){ - this.replace_item(item.id, dom); - }else{ - pull[item.id] = dom; - container.appendChild(dom); - } - }, - clear : function(container){ - this.rendered = gantt._task_area_pulls[id] = {}; - container = container || node; - if(container) - container.innerHTML = ""; - }, - render_items : function(items, container){ - container = container || node; - this.clear(container); - var buffer = document.createDocumentFragment(); - for(var i= 0, vis = items.length; i < vis; i++){ - this.render_item(items[i], buffer); - } - container.appendChild(buffer); - }, - replace_item: function(item_id, newNode){ - var item = this.rendered[item_id]; - if(item && item.parentNode){ - item.parentNode.replaceChild(newNode, item); - } - this.rendered[item_id] = newNode; - }, - remove_item:function(item_id){ - var item = this.rendered[item_id]; - if(item && item.parentNode){ - item.parentNode.removeChild(item); - } - delete this.rendered[item_id]; - }, - change_id: function(oldid, newid) { - this.rendered[newid] = this.rendered[oldid]; - delete this.rendered[oldid]; - }, - rendered : this._task_area_pulls[id], - node: node, - unload : function(){ - this.clear(); - delete gantt._task_area_renderers[id]; - delete gantt._task_area_pulls[id]; - } - }; - - return this._task_area_renderers[id]; -}; - -gantt._clear_renderers = function(){ - for(var i in this._task_area_renderers){ - this._task_renderer(i).unload(); - } -}; - - - -// --#include core/tasks_canvas_render.js -gantt.attachEvent("onGanttReady", function(){ - gantt._task_layers.add(); - gantt._link_layers.add(); -}); - -gantt._layers = { - prepareConfig: function(config){ - if(typeof config == "function"){ - config = {renderer: config}; - } - - var id = config.id = dhtmlx.uid(); - - if(!config.container) - config.container = document.createElement("div"); - - return config; - }, - create: function(get_container, rel_root){ - return { - tempCollection:[], - renderers:{}, - container: get_container, - getRenderers: function(){ - var res = []; - for (var i in this.renderers){ - res.push(this.renderers[i]); - } - return res; - }, - getRenderer: function(id){ - return this.renderers[id]; - }, - add: function(layer){ - if(layer) - this.tempCollection.push(layer); - - if(!this.container()) return; - - var container = this.container(); - - var pending = this.tempCollection; - for(var i =0; i < pending.length; i++){ - var layer = pending[i]; - var node = layer.container, - id = layer.id, - topmost = layer.topmost; - if(!node.parentNode){ - //insert on top or below the tasks - if(topmost){ - container.appendChild(node); - }else{ - var rel = rel_root ? rel_root() : container.firstChild; - if(rel) - container.insertBefore(node, rel); - else - container.appendChild(node); - } - } - this.renderers[id] = gantt._task_renderer(id, layer.renderer, node, layer.filter); - this.tempCollection.splice(i,1); - i--; - } - }, - remove: function(id){ - this.renderers[id].unload(); - delete this.renderers[id]; - }, - clear: function(){ - for(var i in this.renderers){ - this.renderers[i].unload(); - } - this.renderers = {}; - } - }; - } -}; - -gantt._create_filter = function(filter_methods){ - if(!(filter_methods instanceof Array)){ - filter_methods = Array.prototype.slice.call(arguments, 0); - } - - return function(obj){ - var res = true; - for(var i = 0, len = filter_methods.length; i < len; i++){ - var filter_method = filter_methods[i]; - if(gantt[filter_method]){ - res = res && (gantt[filter_method].call(gantt, obj.id, obj) !== false); - } - } - - return res; - }; -}; - -gantt._add_generic_layer = function(layersManager, filters){ - return function(config){ - if(config.filter === undefined){ - config.filter = gantt._create_filter(filters); - } - config = gantt._layers.prepareConfig(config); - layersManager.add(config); - return config.id; - }; -}; - -gantt._task_layers = gantt._layers.create(function(){return gantt.$task_data; }, function(){return gantt.$task_links;}); - -gantt._link_layers = gantt._layers.create(function(){return gantt.$task_data; }); - -gantt.addTaskLayer = gantt._add_generic_layer(gantt._task_layers, ['_filter_task', '_is_chart_visible']); - -gantt.removeTaskLayer = function(id){ - gantt._task_layers.remove(id); -}; - -gantt.addLinkLayer = gantt._add_generic_layer(gantt._link_layers, ['_filter_link', '_is_chart_visible']); -gantt.removeLinkLayer = function(id){ - gantt._link_layers.remove(id); -}; - -gantt._get_task_renderers = function(){ - return this._task_layers.getRenderers(); -}; -gantt._get_link_renderers = function(){ - return this._link_layers.getRenderers(); -}; - -gantt._pull = {}; -gantt._branches = {}; -gantt._order = []; -gantt._lpull = {}; - -gantt.load = function(url, type, callback){ - this._load_url = url; - dhtmlx.assert(arguments.length, "Invalid load arguments"); - this.callEvent("onLoadStart", []); - var tp = 'json', cl = null; - if(arguments.length >= 3){ - tp = type; - cl = callback; - }else{ - if(typeof arguments[1] == "string") - tp = arguments[1]; - else if(typeof arguments[1] == "function") - cl = arguments[1]; - } - - this._load_type = tp; - - dhx4.ajax.get(url, dhtmlx.bind(function(l) { - this.on_load(l, tp); - this.callEvent("onLoadEnd", []); - if(typeof cl == "function") - cl.call(this); - }, this)); -}; -gantt.parse = function(data, type) { - this.on_load({xmlDoc: {responseText: data}}, type); -}; - -gantt.serialize = function(type){ - type = type || "json"; - return this[type].serialize(); -}; - -/* -tasks and relations -{ -data:[ - { - "id":"string", - "text":"...", - "start_date":"Date or string", - "end_date":"Date or string", - "duration":"number", - "progress":"0..1", - "parent_id":"string", - "order":"number" - },...], -links:[ - { - id:"string", - source:"string", - target:"string", - type:"string" - },...], -collections:{ - collectionName:[ - {key:, label:, optional:...},... - ],... - } -} - - gantt._pull - id to object hash - gantt._branch - array of per branch arrays of objects|ids - gantt._order - array of visible elements - gantt._order_full - array of all elements - - gantt._links -* */ - -gantt.on_load = function(resp, type){ - this.callEvent("onBeforeParse", []); - if(!type) - type = "json"; - dhtmlx.assert(this[type], "Invalid data type:'" + type + "'"); - - var raw = resp.xmlDoc.responseText; - - var data = this[type].parse(raw, resp); - this._process_loading(data); -}; - - - -gantt._process_loading = function(data){ - if(data.collections) - this._load_collections(data.collections); - - var tasks = data.data; - var task; - for (var i = 0; i < tasks.length; i++) { - task = tasks[i]; - this._init_task(task); - if (!this.callEvent("onTaskLoading", [task])) continue; - this._pull[task.id] = task; - } - - for (var i in this._pull){ - task = this._pull[i]; - this.setParent(task, this.getParent(task) || this.config.root_id); - } - - // calculating $level for each item - for (var i in this._pull){ - task = this._pull[i]; - this._add_branch(task, true); - task.$level = this.calculateTaskLevel(task); - } - this._sync_order(); - this._init_links(data.links || (data.collections ? data.collections.links : [])); - this.callEvent("onParse", []); - this.render(); - if(this.config.initial_scroll){ - var id = (this._order[0] || this.config.root_id); - if(id) - this.showTask(id); - } -}; - - -gantt._init_links = function(links){ - if (links) - for(var i=0; i < links.length; i++){ - if(links[i]){ - var link = this._init_link(links[i]); - this._lpull[link.id] = link; - } - } - this._sync_links(); -}; - - -gantt._load_collections = function(collections){ - var collections_loaded = false; - for (var key in collections) { - if (collections.hasOwnProperty(key)) { - collections_loaded = true; - var collection = collections[key]; - var arr = this.serverList[key]; - if (!arr) continue; - arr.splice(0, arr.length); //clear old options - for (var j = 0; j < collection.length; j++) { - var option = collection[j]; - var obj = dhtmlx.copy(option); - obj.key = obj.value;// resulting option object - - for (var option_key in option) { - if (option.hasOwnProperty(option_key)) { - if (option_key == "value" || option_key == "label") - continue; - obj[option_key] = option[option_key]; // obj['value'] = option['value'] - } - } - arr.push(obj); - } - } - } - if (collections_loaded) - this.callEvent("onOptionsLoad", []); -}; - -gantt._sync_order = function(silent) { - this._order = []; - this._sync_order_item({parent:this.config.root_id, $open:true, $ignore:true, id:this.config.root_id}); - - if(!silent){ - this._scroll_resize(); - this._set_sizes(); - } -}; -gantt.attachEvent("onBeforeTaskDisplay", function(id, task){ - return !task.$ignore; -}); -gantt._sync_order_item = function(item) { - if(item.id && //do not trigger event for virtual root - this._filter_task(item.id, item) && - this.callEvent("onBeforeTaskDisplay", [item.id, item])){ - this._order.push(item.id); - } - - if (item.$open) { - var children = this.getChildren(item.id); - if (children) - for (var i = 0; i < children.length; i++) - this._sync_order_item(this._pull[children[i]]); - } -}; - -gantt._get_visible_order = function(id){ - dhtmlx.assert(id, "Invalid argument"); - var ord = this._order; - for(var i= 0, count = ord.length; i < count; i++) - if(ord[i] == id) return i; - - return -1; -}; - - - -gantt.eachTask = function(code, parent, master){ - parent = parent || this.config.root_id; - master = master || this; - - var branch = this.getChildren(parent); - if (branch) - for (var i=0; i - - My task 1 - 16.08.2013 - 22.08.2013 - - - - - - - -*/ - -gantt.xml = { - _xmlNodeToJSON:function(node, attrs_only){ - var t = {}; - for (var i = 0; i < node.attributes.length; i++) - t[node.attributes[i].name] = node.attributes[i].value; - - if (!attrs_only){ - for (var i = 0; i < node.childNodes.length; i++) { - var child = node.childNodes[i]; - if (child.nodeType == 1) - t[child.tagName] = child.firstChild ? child.firstChild.nodeValue : ""; - } - - if (!t.text) t.text = node.firstChild ? node.firstChild.nodeValue : ""; - } - - return t; - }, - _getCollections:function(loader){ - var collection = {}; - var opts = dhx4.ajax.xpath("//coll_options", loader); - for (var i = 0; i < opts.length; i++) { - var bind = opts[i].getAttribute("for"); - var arr = collection[bind] = []; - var itms = dhx4.ajax.xpath(".//item", opts[i]); - for (var j = 0; j < itms.length; j++) { - var itm = itms[j]; - var attrs = itm.attributes; - var obj = { key: itms[j].getAttribute("value"), label: itms[j].getAttribute("label")}; - for (var k = 0; k < attrs.length; k++) { - var attr = attrs[k]; - if (attr.nodeName == "value" || attr.nodeName == "label") - continue; - obj[attr.nodeName] = attr.nodeValue; - } - arr.push(obj); - } - } - return collection; - }, - _getXML:function(text, loader, toptag){ - toptag = toptag || "data"; - if (!loader.getXMLTopNode){ - loader = dhx4.ajax.parse(loader); - } - - var xml = dhx4.ajax.xmltop(toptag, loader.xmlDoc); - if (xml.tagName != toptag) throw "Invalid XML data"; - - var skey = xml.getAttribute("dhx_security"); - if (skey) - dhtmlx.security_key = skey; - - return xml; - }, - parse:function(text, loader){ - loader = this._getXML(text, loader); - var data = { }; - - var evs = data.data = []; - var xml = dhx4.ajax.xpath("//task", loader); - - for (var i = 0; i < xml.length; i++) - evs[i] = this._xmlNodeToJSON(xml[i]); - - data.collections = this._getCollections(loader); - return data; - }, - _copyLink:function(obj){ - return ""; - }, - _copyObject:function(obj){ - return ""; - }, - serialize:function(){ - var tasks = []; - var links = []; - - var json = gantt.json.serialize(); - for(var i= 0, len = json.data.length; i < len; i++){ - tasks.push(this._copyObject(json.data[i])); - } - for(var i= 0, len = json.links.length; i < len; i++){ - links.push(this._copyLink(json.links[i])); - } - return ""+tasks.join("")+""+links.join("")+""; - } -}; - - -gantt.oldxml = { - parse:function(text, loader){ - loader = gantt.xml._getXML(text, loader, "projects"); - var data = { collections:{ links:[] } }; - - var evs = data.data = []; - var xml = dhx4.ajax.xpath("//task", loader); - - for (var i = 0; i < xml.length; i++){ - evs[i] = gantt.xml._xmlNodeToJSON(xml[i]); - var parent = xml[i].parentNode; - - if (parent.tagName == "project") - evs[i].parent = "project-"+parent.getAttribute("id"); - else - evs[i].parent = parent.parentNode.getAttribute("id"); - } - - xml = dhx4.ajax.xpath("//project", loader); - for (var i = 0; i < xml.length; i++){ - var ev = gantt.xml._xmlNodeToJSON(xml[i], true); - ev.id ="project-"+ev.id; - evs.push(ev); - } - - for (var i=0; i 0; - } - return false; - }, - is_work_hour:function(date){ - var hours = this.get_working_hours(date); - var hour = date.getHours(); - for(var i=0; i < hours.length; i += 2){ - if(hours[i+1] === undefined){ - return hours[i] == hour; - }else{ - if(hour >= hours[i] && hour < hours[i+1]) - return true; - } - } - return false; - }, - - get_working_hours:function(date){ - var t = this._timestamp({date:date}); - var hours = true; - if(this.dates[t] !== undefined){ - hours = this.dates[t];//custom day - }else if(this.dates[date.getDay()] !== undefined){ - hours = this.dates[date.getDay()];//week day - } - if(hours === true){ - return this.hours; - }else if(hours){ - return hours; - } - return []; - - - }, - - get_work_units_between:function(from, to, unit, step){ - if(!unit){ - return false; - } - var start = new Date(from), - end = new Date(to), - step = step || 1; - var units = 0; - while(start.valueOf() < end.valueOf()){ - if(this.is_working_unit(start, unit)) - units++; - start = gantt.date.add(start, step, unit); - } - return units; - }, - is_work_units_between:function(from, to, unit, step){ - if(!unit){ - return false; - } - var start = new Date(from), - end = new Date(to), - step = step || 1; - - while(start.valueOf() < end.valueOf()){ - if(this.is_working_unit(start, unit)) - return true; - start = gantt.date.add(start, step, unit); - } - return false; - }, - add_worktime : function(from, duration, unit, step){ - if(!unit) - return false; - - var start = new Date(from), - added = 0, - step = step || 1, - duration = duration*1; - - if(!gantt.config.work_time){ - return gantt.date.add(start, step*duration, unit); - }else{ - - while(added < duration){ - var next = gantt.date.add(start, step, unit); - if(this.is_working_unit(step > 0 ? start : next, unit)) - added++; - start = next; - } - return start; - } - }, - - /* settings: - { - date:date, - unit:'day'/'hour'..., - dir:'future'/'past'/'any'/'' - } - */ - get_closest_worktime : function(settings){ - if(this.is_working_unit(settings.date, settings.unit)) - return settings.date; - - var unit = settings.unit; - - var curr = gantt.date[unit + '_start'](settings.date); - - var future_target = new Date(curr), - prev_target = new Date(curr), - tick = true, - maximum_loop = 3000,//be extra sure we won't fall into infinite loop, 3k seems big enough - count = 0, - both_directins = (settings.dir == 'any' || !settings.dir); - - var inc = 1; - if(settings.dir == 'past') - inc = -1; - - //will seek closest working hour in future or in past, one step in one direction per iteration - while(!this.is_working_unit(curr, unit)){ - - if(both_directins){ - curr = tick ? future_target : prev_target; - inc = inc*(-1); - } - - curr = gantt.date.add(curr, inc, unit); - curr = gantt.date[unit + '_start'](curr); - - if(both_directins){ - if(tick){ - future_target = curr; - }else{ - prev_target = curr; - } - } - tick = !tick; - count++; - if(count > maximum_loop){ - dhtmlx.assert(false, "Invalid working time check"); - return false; - } - } - - if(curr == prev_target || settings.dir == 'past'){ - curr = gantt.date.add(curr, 1, unit); - } - - return curr; - } - - -}; - -gantt.getTask = function(id) { - dhtmlx.assert(id, "Invalid argument for gantt.getTask"); - dhtmlx.assert(this._pull[id], "Task not found id=" + id); - return this._pull[id]; -}; -gantt.getTaskByTime = function(from, to){ - var p = this._pull, - res = [], - pos = 0, - taken = 0; - - if(!(from || to)){ - for (var t in p) res.push(p[t]); - }else{ - from = +from || -Infinity; - to = +to || Infinity; - for (var t in p){ - var task = p[t]; - if (+task.start_date < to && +task.end_date > from) - res.push(task); - } - } - - return res; -}; - -gantt.isTaskExists = function(id) { - return dhtmlx.defined(this._pull[id]); -}; - -gantt.isTaskVisible = function(id){ - if(!this._pull[id]) - return false; - - if(!(+this._pull[id].start_date < +this._max_date && +this._pull[id].end_date > +this._min_date)) - return false; - - for(var i= 0, count = this._order.length; i < count; i++) - if(this._order[i] == id) return true; - return false; -}; - - -gantt.updateTask = function(id, item) { - if (!dhtmlx.defined(item)) item = this.getTask(id); - if (this.callEvent("onBeforeTaskUpdate", [id, item])===false) return false; - - this._pull[item.id] = item; - if(!this._is_parent_sync(item)){ - this._resync_parent(item); - } - this._update_parents(item.id); - this.refreshTask(item.id); - - this.callEvent("onAfterTaskUpdate", [id, item]); - - this._sync_order(); - - this._adjust_scales(); -}; - -gantt._add_branch = function(task, silent){ - var pid = this.getParent(task); - if (!this.hasChild(pid)) - this._branches[pid] = []; - var branch = this.getChildren(pid); - var added_already = false; - for(var i = 0, length = branch.length; i < length; i++){ - if(branch[i] == task.id){ - added_already = true; - break; - } - } - if(!added_already) - branch.push(task.id); - - this._sync_parent(task); - this._sync_order(silent); -}; - -gantt._move_branch = function(task, old_parent, new_parent){ - this.setParent(task, new_parent); - this._sync_parent(task); - this._replace_branch_child(old_parent, task.id); - if(this.isTaskExists(new_parent) || new_parent == this.config.root_id){ - - this._add_branch(task); - }else{ - delete this._branches[task.id]; - } - task.$level = this.calculateTaskLevel(task); - this._sync_order(); -}; -gantt._resync_parent = function(task){ - this._move_branch(task, task.$rendered_parent, this.getParent(task)); -}; -gantt._sync_parent = function(task){ - task.$rendered_parent = this.getParent(task); -}; -gantt._is_parent_sync = function(task){ - return (task.$rendered_parent == this.getParent(task)); -}; - - -gantt._replace_branch_child = function(node, old_id, new_id){ - var branch = this.getChildren(node); - if (branch){ - var newbranch = []; - for (var i=0; i= 0 ? 1 : -1; - return helper.add_worktime(start, Math.abs(duration), unit || this.config.duration_unit, mult*this.config.duration_step); -}; - -gantt._init_task = function(task){ - if (!dhtmlx.defined(task.id)) - task.id = dhtmlx.uid(); - - if(task.start_date) - task.start_date = gantt.date.parseDate(task.start_date, "xml_date"); - if(task.end_date) - task.end_date = gantt.date.parseDate(task.end_date, "xml_date"); - - - - if(task.start_date){ - if(!task.end_date && task.duration){ - task.end_date = this.calculateEndDate(task.start_date, task.duration); - } - } - - gantt._init_task_timing(task); - if(task.start_date && task.end_date) - gantt.correctTaskWorkTime(task); - - task.$source = []; - task.$target = []; - if(task.parent === undefined){ - this.setParent(task, this.config.root_id); - } - task.$open = dhtmlx.defined(task.open) ? task.open : this.config.open_tree_initially; - task.$level = this.calculateTaskLevel(task); - return task; -}; - -gantt._init_task_timing = function(task){ - var task_type = this._get_safe_type(task.type); - - if(task.$rendered_type === undefined){ - task.$rendered_type = task_type; - }else if(task.$rendered_type != task_type){ - delete task.$no_end; - delete task.$no_start; - task.$rendered_type = task_type; - } - - if((task.$no_end === undefined || task.$no_start === undefined) && task_type != this.config.types.milestone){ - if(task_type == this.config.types.project){ - //project duration is always defined by children duration - task.$no_end = task.$no_start = true; - this._set_default_task_timing(task); - }else{ - //tasks can have fixed duration, children duration(as projects), or one date fixed, and other defined by nested items - task.$no_end = !(task.end_date || task.duration); - task.$no_start = !task.start_date; - } - } - - if(task_type == this.config.types.milestone){ - task.end_date = task.start_date; - } - if (task.start_date && task.end_date){ - task.duration = this.calculateDuration(task.start_date, task.end_date); - } - task.duration = task.duration || 0; -}; -gantt._is_flex_task = function(task){ - return !!(task.$no_end || task.$no_start); -}; - -// downward calculation of project duration -gantt.resetProjectDates = function(task){ - if(task.$no_end || task.$no_start){ - var dates = this.getSubtaskDates(task.id); - this._assign_project_dates(task, dates.start_date, dates.end_date); - } -}; - -gantt.getSubtaskDates = function(task_id){ - var min = null, - max = null, - root = task_id !== undefined ? task_id : gantt.config.root_id; - - this.eachTask(function(child){ - if(this._get_safe_type(child.type) == gantt.config.types.project) - return; - - if((child.start_date && !child.$no_start) && (!min || min > child.start_date.valueOf())) - min = child.start_date.valueOf(); - if((child.end_date && !child.$no_end) && (!max || max < child.end_date.valueOf())) - max = child.end_date.valueOf(); - }, root); - - return { - start_date: min ? new Date(min) : null, - end_date: max ? new Date(max): null - }; -}; - -gantt._assign_project_dates = function(task, from, to){ - if(task.$no_start){ - if(from && from != Infinity){ - task.start_date = new Date(from); - }else{ - task.start_date = this._default_task_date(task, this.getParent(task)); - } - } - - if(task.$no_end){ - if(to && to != -Infinity){ - task.end_date = new Date(to); - }else{ - task.end_date = this.calculateEndDate(task.start_date, this.config.duration_step); - } - } - if(task.$no_start || task.$no_end){ - this._init_task_timing(task); - } -}; - -// upward calculation of project duration -gantt._update_parents = function(taskId, silent){ - if(!taskId) return; - - var task = this.getTask(taskId); - var pid = this.getParent(task); - - while(!(task.$no_end || task.$no_start) && pid && this.isTaskExists(pid)){ - task = this.getTask(pid); - pid = this.getParent(task); - } - - if(task.$no_start || task.$no_end){ - gantt.resetProjectDates(task); - - if(!silent) - this.refreshTask(task.id, true); - } - - if(pid && this.isTaskExists(pid)){ - this._update_parents(pid, silent); - } -}; -gantt.isChildOf = function(child_id, parent_id){ - if(!this.isTaskExists(child_id)) - return false; - if(parent_id === this.config.root_id) - return this.isTaskExists(child_id); - - var task = this.getTask(child_id); - var pid = this.getParent(child_id); - - while(task && this.isTaskExists(pid)){ - task = this.getTask(pid); - - if(task && task.id == parent_id) - return true; - pid = this.getParent(task); - } - return false; -}; - -gantt.roundDate = function(config){ - if(config instanceof Date){ - config = { - date: config, - unit: gantt._tasks.unit, - step: gantt._tasks.step - }; - } - var date = config.date, - steps = config.step, - unit = config.unit; - - var upper = gantt.date[unit + "_start"](new Date(this._min_date)); - while(+upper < +date){ - upper = gantt.date[unit + "_start"](gantt.date.add(upper, steps, unit)); - } - - var lower = gantt.date.add(upper, -1*steps, unit); - if(config.dir && config.dir == 'future') - return upper; - if(config.dir && config.dir == 'past') - return lower; - - if(Math.abs(date - lower) < Math.abs(upper - date)){ - return lower; - }else{ - return upper; - } - -}; - - -gantt.attachEvent("onBeforeTaskUpdate", function(id, task){ - gantt._init_task_timing(task); - return true; -}); -gantt.attachEvent("onBeforeTaskAdd", function(id, task){ - gantt._init_task_timing(task); - return true; -}); - -gantt.calculateTaskLevel = function (item) { - var level = 0; - while (this.getParent(item)) { - if (!this.isTaskExists(this.getParent(item))) break; - item = this.getTask(this.getParent(item)); - level++; - } - return level; -}; - - -gantt.sort = function(field, desc, parent, silent) { - var render = !silent;//4th argument to cancel redraw after sorting - - if (!this.isTaskExists(parent)) { - parent = this.config.root_id; - } - - if (!field) field = "order"; - var criteria = (typeof(field) == "string") ? (function(a, b) { - if(a[field] == b[field]){ - return 0; - } - - var result = a[field] > b[field]; - if (desc) result = !result; - return result ? 1 : -1; - }) : field; - - - var els = this.getChildren(parent); - if (els){ - var temp = []; - for (var i = els.length - 1; i >= 0; i--) - temp[i] = this._pull[els[i]]; - - temp.sort(criteria); - - for (var i = 0; i < temp.length; i++) { - els[i] = temp[i].id; - this.sort(field, desc, els[i], true); - } - } - - if (render) { - this.render(); - } -}; - -gantt.getNext = function(id) { - for (var i = 0; i < this._order.length-1; i++) { - if (this._order[i] == id) - return this._order[i+1]; - } - return null; -}; -gantt.getPrev = function(id) { - for (var i = 1; i < this._order.length; i++) { - if (this._order[i] == id) - return this._order[i-1]; - } - return null; -}; - -gantt._get_parent_id = function(task){ - var parent = this.config.root_id; - if(task){ - parent = task.parent; - } - return parent; -}; - -gantt.getParent = function(id){ - var task = null; - if(id.id){ - task = id; - }else if(this.isTaskExists(id)){ - task = gantt.getTask(id); - } - - return this._get_parent_id(task); -}; - - - -gantt.setParent = function(task, new_pid){ - task.parent = new_pid; -}; - -gantt.getSiblings = function(id){ - if(!this.isTaskExists(id)){ - return []; - } - var parent = this.getParent(id); - return this.getChildren(parent); -}; -gantt.getNextSibling = function(id){ - var siblings = this.getSiblings(id); - for(var i= 0, len = siblings.length; i < len; i++){ - if(siblings[i] == id) - return siblings[i+1] || null; - } - return null; -}; -gantt.getPrevSibling = function(id){ - var siblings = this.getSiblings(id); - for(var i= 0, len = siblings.length; i < len; i++){ - if(siblings[i] == id) - return siblings[i-1] || null; - } - return null; -}; - -gantt._dp_init = function(dp) { - dp.setTransactionMode("POST", true); - dp.serverProcessor += (dp.serverProcessor.indexOf("?") != -1 ? "&" : "?") + "editing=true"; - dp._serverProcessor = dp.serverProcessor; - - dp.styles = { - updated:"gantt_updated", - inserted:"gantt_inserted", - deleted:"gantt_deleted", - invalid:"gantt_invalid", - error:"gantt_error", - clear:"" - }; - - dp._methods=["_row_style","setCellTextStyle","_change_id","_delete_task"]; - - dp.setGanttMode = function(mode){ - var modes = dp.modes || {}; - if(dp._ganttMode){ - modes[dp._ganttMode] = { - _in_progress : dp._in_progress, - _invalid : dp._invalid, - updatedRows : dp.updatedRows - }; - } - - var newState = modes[mode]; - if(!newState){ - newState = modes[mode] = { - _in_progress : {}, - _invalid : {}, - updatedRows : [] - }; - } - dp._in_progress = newState._in_progress; - dp._invalid = newState._invalid; - dp.updatedRows = newState.updatedRows; - dp.modes = modes; - dp._ganttMode = mode; - }; - - this._sendTaskOrder = function(id, item){ - if(item.$drop_target){ - dp.setGanttMode("tasks"); - this.getTask(id).target = item.$drop_target; - dp.setUpdated(id, true,"order"); - delete this.getTask(id).$drop_target; - } - }; - this.attachEvent("onAfterTaskAdd", function(id, item) { - dp.setGanttMode("tasks"); - dp.setUpdated(id,true,"inserted"); - }); - this.attachEvent("onAfterTaskUpdate", function(id, item) { - dp.setGanttMode("tasks"); - dp.setUpdated(id,true); - - gantt._sendTaskOrder(id, item); - }); - this.attachEvent("onAfterTaskDelete", function(id, item) { - dp.setGanttMode("tasks"); - dp.setUpdated(id,true,"deleted"); - - if(dp.updateMode != 'off' && !dp._tSend){ - dp.sendAllData(); - } - - }); - - this.attachEvent("onAfterLinkUpdate", function(id, item) { - dp.setGanttMode("links"); - dp.setUpdated(id, true); - }); - this.attachEvent("onAfterLinkAdd", function(id, item) { - dp.setGanttMode("links"); - dp.setUpdated(id, true,"inserted"); - }); - this.attachEvent("onAfterLinkDelete", function(id, item) { - dp.setGanttMode("links"); - dp.setUpdated(id, true,"deleted"); - }); - this.attachEvent("onRowDragEnd", function(id, target) { - gantt._sendTaskOrder(id, gantt.getTask(id)); - }); - - dp.attachEvent("onBeforeDataSending", function() { - if(this._tMode == "REST"){ - var urlPart = this._ganttMode.substr(0, this._ganttMode.length - 1);// links, tasks -> /link/id, /task/id - this.serverProcessor = this._serverProcessor + (this._serverProcessor.slice(-1) == "/" ? "" : "/") + urlPart; - }else{ - this.serverProcessor = this._serverProcessor + window.dhtmlx.url(this._serverProcessor) + "gantt_mode=" + this._ganttMode; - } - - return true; - }); - - - var afterUpdate = dp.afterUpdate; - dp.afterUpdate = function(){ - var xml; - if(arguments.length == 3){ - xml = arguments[1]; - }else{ - // old dataprocessor - xml = arguments[4]; - } - var mode = dp._ganttMode; - var reqUrl = xml.filePath || (xml.xmlDoc ? xml.xmlDoc.responseURL : ""); - - if(this._tMode != "REST"){ - if (reqUrl.indexOf("gantt_mode=links") != -1) { - mode = "links"; - }else{ - mode = "tasks"; - } - }else{ - if(reqUrl.indexOf("/link") > reqUrl.indexOf("/task")){ - mode = "links"; - }else{ - mode = "tasks"; - } - } - dp.setGanttMode(mode); - - var res = afterUpdate.apply(dp, arguments); - dp.setGanttMode(mode); - return res; - }; - - dp._getRowData=dhtmlx.bind(function(id, pref) { - var task; - if (dp._ganttMode == "tasks") - task = this.isTaskExists(id) ? this.getTask(id) : { id: id }; - else - task = this.isLinkExists(id) ? this.getLink(id) : { id: id }; - - task = dhtmlx.copy(task); - - var data = {}; - for (var key in task) { - if (key.substr(0, 1) == "$") continue; - var value = task[key]; - if (value instanceof Date) - data[key] = this.templates.xml_format(value); - else if(value === null) - data[key] = ""; - else - data[key] = value; - } - if(task.$no_start){ - task.start_date = ""; - task.duration = ""; - } - if(task.$no_end){ - task.end_date = ""; - task.duration = ""; - } - data[dp.action_param] = this.getUserData(id, dp.action_param); - return data; - }, this); - - this._change_id = dhtmlx.bind(function(oldid, newid) { - if (dp._ganttMode != "tasks") - this.changeLinkId(oldid, newid); - else - this.changeTaskId(oldid, newid); - }, this); - - this._row_style = function(row_id, classname){ - if (dp._ganttMode != "tasks") return; - var el = gantt.getTaskRowNode(row_id); - if (!el) return; - if (!classname) { - var regexp = / (gantt_updated|gantt_inserted|gantt_deleted|gantt_invalid|gantt_error)/g; - el.className = el.className.replace(regexp, ""); - } else - el.className += " " + classname; - }; - - // fake method for dataprocessor - this._delete_task = function(row_id, node){}; - - this._dp = dp; -}; - -gantt.getUserData = function(id, name) { - if (!this.userdata) this.userdata = {}; - if (this.userdata[id] && this.userdata[id][name]) return this.userdata[id][name]; - return ""; -}; -gantt.setUserData = function(id, name, value) { - if (!this.userdata) this.userdata = {}; - if (!this.userdata[id]) this.userdata[id] = {}; - this.userdata[id][name] = value; -}; - - -gantt._init_link = function(link) { - if (!dhtmlx.defined(link.id)) - link.id = dhtmlx.uid(); - return link; -}; - -gantt._sync_links = function() { - for (var id in this._pull) { - this._pull[id].$source = []; - this._pull[id].$target = []; - } - for (var id in this._lpull) { - var link = this._lpull[id]; - if(this._pull[link.source]) - this._pull[link.source].$source.push(id); - if(this._pull[link.target]) - this._pull[link.target].$target.push(id); - } -}; - -gantt.getLink = function(id) { - dhtmlx.assert(this._lpull[id], "Link doesn't exist"); - return this._lpull[id]; -}; - -gantt.getLinks = function(){ - var links = []; - for (var key in gantt._lpull) - links.push(gantt._lpull[key]); - return links; -}; - -gantt.isLinkExists = function(id) { - return dhtmlx.defined(this._lpull[id]); -}; - -gantt.addLink = function(link) { - link = this._init_link(link); - - if (this.callEvent("onBeforeLinkAdd", [link.id, link])===false) return false; - - this._lpull[link.id] = link; - this._sync_links(); - this._render_link(link.id); - this.callEvent("onAfterLinkAdd", [link.id, link]); - return link.id; -}; - -gantt.updateLink = function(id, data) { - if (!dhtmlx.defined(data)) - data = this.getLink(id); - - if (this.callEvent("onBeforeLinkUpdate", [id, data]) === false) return false; - - this._lpull[id] = data; - this._sync_links(); - this._render_link(id); - this.callEvent("onAfterLinkUpdate", [id, data]); - return true; -}; - -gantt.deleteLink = function(id) { - return this._deleteLink(id); -}; - -gantt._deleteLink = function(id, silent) { - var link = this.getLink(id); - if (!silent && this.callEvent("onBeforeLinkDelete", [id, link])===false) return false; - - delete this._lpull[id]; - this._sync_links(); - this.refreshLink(id); - if (!silent) this.callEvent("onAfterLinkDelete", [id, link]); - return true; -}; - -gantt.changeLinkId = function(oldid, newid) { - this._lpull[newid] = this._lpull[oldid]; - this._lpull[newid].id = newid; - delete this._lpull[oldid]; - - this._sync_links(); - this.callEvent("onLinkIdChange", [oldid, newid]); -}; - - -gantt.getChildren = function(id) { - return dhtmlx.defined(this._branches[id]) ? this._branches[id] : []; -}; -gantt.hasChild = function(id) { - return (dhtmlx.defined(this._branches[id]) && this._branches[id].length); -}; - - -gantt.refreshData = function(){ - this._render_data(); -}; - - -gantt._configure = function(col, data, force){ - for (var key in data) - if (typeof col[key] == "undefined" || force) - col[key] = data[key]; -}; -gantt._init_skin = function(){ - gantt._get_skin(false); - gantt._init_skin = function(){}; -}; -gantt._get_skin = function(force){ - if (!gantt.skin || force){ - var links = document.getElementsByTagName("link"); - for (var i = 0; i < links.length; i++) { - var res = links[i].href.match("dhtmlxgantt_([a-z]+).css"); - if (res){ - gantt.skin = res[1]; - break; - } - } - } - - if (!gantt.skin) gantt.skin = "terrace"; - var skinset = gantt.skins[gantt.skin]; - - //apply skin related settings - this._configure(gantt.config, skinset.config, force); - - var config = gantt.getGridColumns(); - if (config[1] && typeof config[1].width == "undefined") - config[1].width = skinset._second_column_width; - if (config[2] && typeof config[2].width == "undefined") - config[2].width = skinset._third_column_width; - - if (skinset._lightbox_template) - gantt._lightbox_template = skinset._lightbox_template; - - gantt.resetLightbox(); -}; -gantt.resetSkin = function(){ - this.skin = ""; - this._get_skin(true); -}; -gantt.skins = {}; - - -gantt._lightbox_methods = {}; -gantt._lightbox_template="
 
"; - -gantt.showLightbox=function(id){ - if (!id || gantt._is_readonly(this.getTask(id))) return; - if (!this.callEvent("onBeforeLightbox",[id])) return; - - var task = this.getTask(id); - - var box = this.getLightbox(this._get_safe_type(task.type)); - this._center_lightbox(box); - this.showCover(); - this._fill_lightbox(id,box); - this.callEvent("onLightbox",[id]); -}; -gantt._get_timepicker_step = function(){ - if(this.config.round_dnd_dates){ - var scale = gantt._tasks, - step = (this._get_line(scale.unit) * scale.step)/60;//timepicker step is measured in minutes - if(step >= 60*24 || !this._is_chart_visible()){ - step = this.config.time_step; - } - return step; - } - return this.config.time_step; -}; -gantt.getLabel = function(property, key) { - var sections = this._get_typed_lightbox_config(); - for (var i=0; i
"+this.locale.labels[button]+"
"; - - } - buttons = this.config.buttons_right; - for (var i = 0; i < buttons.length; i++){ - var button = this.config._migrate_buttons[buttons[i]] ? this.config._migrate_buttons[buttons[i]] : buttons[i]; - html+="
"+this.locale.labels[button]+"
"; - - } - html+=""; - d.innerHTML=html; - - if (gantt.config.drag_lightbox){ - d.firstChild.onmousedown = gantt._ready_to_dnd; - d.firstChild.onselectstart = function(){ return false; }; - d.firstChild.style.cursor = "pointer"; - gantt._init_dnd_events(); - - } - - document.body.insertBefore(d,document.body.firstChild); - this._lightbox=d; - - var sns = this._get_typed_lightbox_config(type); - html = this._render_sections(sns); - - var ds=d.getElementsByTagName("div"); - for (var i=0; i
"+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+="
"; - } - return html; -}; - - -gantt.resizeLightbox=function(){ - var d = this._lightbox; - if (!d) return; - - var con = d.childNodes[1]; - con.style.height="0px"; - con.style.height=con.scrollHeight+"px"; - d.style.height=con.scrollHeight+this.config.lightbox_additional_height+"px"; - con.style.height=con.scrollHeight+"px"; //it is incredible , how ugly IE can be - - -}; - -gantt._center_lightbox = function(box) { - if (box){ - box.style.display="block"; - - 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"; - } -}; -gantt.showCover = function(){ - if(this._cover) return; - - this._cover=document.createElement("DIV"); - this._cover.className="gantt_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); -}; - - -gantt._init_lightbox_events = function(){ - gantt.lightbox_events = {}; - - - gantt.lightbox_events["gantt_save_btn"] = function(e) { - gantt._save_lightbox(); - }; - - - gantt.lightbox_events["gantt_delete_btn"] = function(e) { - if(!gantt.callEvent("onLightboxDelete", [gantt._lightbox_id])) - return; - - if(gantt.isTaskExists(gantt._lightbox_id)){ - gantt.$click.buttons["delete"](gantt._lightbox_id); - }else{ - gantt.hideLightbox(); - } - - }; - - - gantt.lightbox_events["gantt_cancel_btn"] = function(e) { - gantt._cancel_lightbox(); - }; - - - gantt.lightbox_events["default"] = function(e, src) { - if (src.getAttribute("dhx_button")) { - gantt.callEvent("onLightboxButton", [src.className, src, e]); - } else { - var index, block, sec; - if (src.className.indexOf("gantt_custom_button") != -1) { - if (src.className.indexOf("gantt_custom_button_") != -1) { - index = src.parentNode.getAttribute("index"); - sec = src.parentNode.parentNode; - } else { - index = src.getAttribute("index"); - sec = src.parentNode; - src = src.firstChild; - } - } - - var sections = gantt._get_typed_lightbox_config(); - - if (index) { - block = gantt.form_blocks[sections[index].type]; - block.button_click(index, src, sec, sec.nextSibling); - } - } - }; - dhtmlxEvent(gantt.getLightbox(), "click", function(e) { - e = e || window.event; - var src = e.target ? e.target : e.srcElement; - - if (!src.className) - src = src.previousSibling; - if (src && src.className && src.className.indexOf("gantt_btn_set") === 0) - src = src.firstChild; - if (src && src.className) { - var func = dhtmlx.defined(gantt.lightbox_events[src.className]) ? gantt.lightbox_events[src.className] : gantt.lightbox_events["default"]; - return func(e, src); - } - return false; - }); - - gantt.getLightbox().onkeydown=function(e){ - switch((e||event).keyCode){ - case gantt.keys.edit_save: - if ((e||event).shiftKey) return; - gantt._save_lightbox(); - break; - case gantt.keys.edit_cancel: - gantt._cancel_lightbox(); - break; - default: - break; - } - }; -}; - -gantt._cancel_lightbox=function(){ - var task = this.getLightboxValues(); - this.callEvent("onLightboxCancel",[this._lightbox_id, task.$new]); - if(gantt.isTaskExists(task.id) && task.$new){ - this._deleteTask(task.id, true); - } - - this.refreshData(); - this.hideLightbox(); -}; - -gantt._save_lightbox=function(){ - var task = this.getLightboxValues(); - if(!this.callEvent("onLightboxSave", [this._lightbox_id, task, !!task.$new])) - return; - - if (task.$new){ - delete task.$new; - this.addTask(task); - }else if(this.isTaskExists(task.id)){ - dhtmlx.mixin(this.getTask(task.id), task, true); - this.updateTask(task.id); - } - this.refreshData(); - - // TODO: do we need any blockable events here to prevent closing lightbox? - this.hideLightbox(); -}; - -gantt._resolve_default_mapping = function(section) { - var mapping = section.map_to; - var time_controls = {"time":true, "duration":true}; - if(time_controls[section.type]){ - if(section.map_to == 'auto'){ - mapping = {start_date: "start_date", end_date: "end_date", duration: "duration"}; - }else if(typeof(section.map_to) === "string"){ - mapping = {start_date: section.map_to}; - } - } - - return mapping; -}; - -gantt.getLightboxValues=function(){ - var task = {}; - - if(gantt.isTaskExists(this._lightbox_id)) { - task = dhtmlx.mixin({}, this.getTask(this._lightbox_id)); - } - - var sns = this._get_typed_lightbox_config(); - for (var i=0; i < sns.length; i++) { - var node = document.getElementById(sns[i].id); - node=(node?node.nextSibling:node); - var block=this.form_blocks[sns[i].type]; - if(!block) continue; - var res=block.get_value.call(this,node,task, sns[i]); - var map_to = gantt._resolve_default_mapping(sns[i]); - if (typeof map_to == "string" && map_to != "auto") { - task[map_to] = res; - } else if(typeof map_to == "object") { - for(var property in map_to) { - if(map_to[property]) - task[map_to[property]] = res[property]; - } - } - } - return task; -}; - - -gantt.hideLightbox=function(){ - var box = this.getLightbox(); - if (box) box.style.display="none"; - this._lightbox_id=null; - - this.hideCover(); - this.callEvent("onAfterLightbox",[]); -}; -gantt.hideCover=function(){ - if (this._cover) - this._cover.parentNode.removeChild(this._cover); - this._cover=null; -}; - -gantt.resetLightbox = function(){ - if (gantt._lightbox && !gantt._custom_lightbox) - gantt._lightbox.parentNode.removeChild(gantt._lightbox); - gantt._lightbox = null; -}; -gantt._set_lightbox_values = function(data, box){ - var task = data; - var s = box.getElementsByTagName("span"); - if (gantt.templates.lightbox_header) { - s[1].innerHTML = ""; - s[2].innerHTML = gantt.templates.lightbox_header(task.start_date, task.end_date, task); - } else { - s[1].innerHTML = this.templates.task_time(task.start_date, task.end_date, task); - s[2].innerHTML = (this.templates.task_text(task.start_date, task.end_date, task) || "").substr(0, 70); //IE6 fix - } - - - var sns = this._get_typed_lightbox_config(this.getLightboxType()); - for (var i = 0; i < sns.length; i++) { - var section = sns[i]; - - if(!this.form_blocks[section.type]){ - continue;//skip incorrect sections, same check is done during rendering - } - - - var node = document.getElementById(section.id).nextSibling; - var block = this.form_blocks[section.type]; - var map_to = gantt._resolve_default_mapping(sns[i]); - var value = dhtmlx.defined(task[map_to]) ? task[map_to] : section.default_value; - block.set_value.call(gantt, node, value, task, section); - - if (section.focus) - block.focus.call(gantt, node); - } - if(data.id) - gantt._lightbox_id = data.id; -}; -gantt._fill_lightbox = function(id, box) { - var task = this.getTask(id); - this._set_lightbox_values(task, box); -}; - - -gantt.getLightboxSection = function(name){ - var config = this._get_typed_lightbox_config(); - var i =0; - for (i; i < config.length; i++) - if (config[i].name == name) - break; - var section = config[i]; - if(!section) - return null; - - if (!this._lightbox) - this.getLightbox(); - var header = document.getElementById(section.id); - var node = header.nextSibling; - - var result = { - section: section, - header: header, - node: node, - getValue:function(ev){ - return gantt.form_blocks[section.type].get_value.call(gantt, node, (ev||{}), section); - }, - setValue:function(value, ev){ - return gantt.form_blocks[section.type].set_value.call(gantt, node, value, (ev||{}), section); - } - }; - - var handler = this._lightbox_methods["get_"+section.type+"_control"]; - return handler?handler(result):result; -}; - -gantt._lightbox_methods.get_template_control = function(result) { - result.control = result.node; - return result; -}; -gantt._lightbox_methods.get_select_control = function(result) { - result.control = result.node.getElementsByTagName('select')[0]; - return result; -}; -gantt._lightbox_methods.get_textarea_control = function(result) { - result.control = result.node.getElementsByTagName('textarea')[0]; - return result; -}; -gantt._lightbox_methods.get_time_control = function(result) { - result.control = result.node.getElementsByTagName('select'); // array - return result; -}; - - - - - -gantt._init_dnd_events = function(){ - dhtmlxEvent(document.body, "mousemove", gantt._move_while_dnd); - dhtmlxEvent(document.body, "mouseup", gantt._finish_dnd); - gantt._init_dnd_events = function(){}; -}; -gantt._move_while_dnd = function(e){ - if (gantt._dnd_start_lb){ - if (!document.gantt_unselectable){ - document.body.className += " gantt_unselectable"; - document.gantt_unselectable = true; - } - var lb = gantt.getLightbox(); - var now = (e&&e.target)?[e.pageX, e.pageY]:[event.clientX, event.clientY]; - lb.style.top = gantt._lb_start[1]+now[1]-gantt._dnd_start_lb[1]+"px"; - lb.style.left = gantt._lb_start[0]+now[0]-gantt._dnd_start_lb[0]+"px"; - } -}; -gantt._ready_to_dnd = function(e){ - var lb = gantt.getLightbox(); - gantt._lb_start = [parseInt(lb.style.left,10), parseInt(lb.style.top,10)]; - gantt._dnd_start_lb = (e&&e.target)?[e.pageX, e.pageY]:[event.clientX, event.clientY]; -}; -gantt._finish_dnd = function(){ - if (gantt._lb_start){ - gantt._lb_start = gantt._dnd_start_lb = false; - document.body.className = document.body.className.replace(" gantt_unselectable",""); - document.gantt_unselectable = false; - } -}; - - - - -gantt._focus = function(node, select){ - if (node && node.focus){ - if (gantt.config.touch){ - //do not focus editor, to prevent auto-zoom - } else { - try { - if (select && node.select) node.select(); - node.focus(); - }catch(e){ } - } - } -}; - - -gantt.form_blocks={ - getTimePicker: function(sns, hidden) { - var time_format = sns.time_format; - if (!time_format) { - // default order - var time_format = ["%d", "%m", "%Y"]; - if(gantt._get_line(gantt._tasks.unit) < gantt._get_line("day")){ - time_format.push("%H:%i"); - } - } - // map: default order => real one - sns._time_format_order = { size:0 }; - - - var cfg = this.config; - var dt = this.date.date_part(new Date(gantt._min_date.valueOf())); - var last = 24*60, first = 0; - if(gantt.config.limit_time_select){ - last = 60*cfg.last_hour+1; - first = 60*cfg.first_hour; - dt.setHours(cfg.first_hour); - } - var html = ""; - - for (var p = 0; p < time_format.length; p++) { - var time_option = time_format[p]; - - // adding spaces between selects - if (p > 0) { - html += " "; - } - - var options = ''; - switch (time_option) { - case "%Y": - sns._time_format_order[2] = p; - sns._time_format_order.size++; - //year - - var range, offset, start_year, end_year; - - if(sns.year_range){ - if(!isNaN(sns.year_range)){ - range = sns.year_range; - }else if(sns.year_range.push){ - // if - start_year = sns.year_range[0]; - end_year = sns.year_range[1]; - } - } - - range = range || 10; - offset = offset || Math.floor(range/2); - start_year = start_year || dt.getFullYear() - offset; - end_year = end_year || start_year + range; - - - for (var i=start_year; i < end_year; i++) - options+=""; - break; - case "%m": - sns._time_format_order[1] = p; - sns._time_format_order.size++; - //month - for (var i=0; i < 12; i++) - options+=""; - break; - case "%d": - sns._time_format_order[0] = p; - sns._time_format_order.size++; - //days - for (var i=1; i < 32; i++) - options+=""; - break; - case "%H:%i": - // var last = 24*60, first = 0; - sns._time_format_order[3] = p; - sns._time_format_order.size++; - //hours - var i = first; - var tdate = dt.getDate(); - sns._time_values = []; - - while(i"+time+""; - sns._time_values.push(i); - dt.setTime(dt.valueOf()+this._get_timepicker_step()*60*1000); - var diff = (dt.getDate()!=tdate)?1:0; // moved or not to the next day - i=diff*24*60+dt.getHours()*60+dt.getMinutes(); - } - break; - default: - break; - } - - if(options){ - var readonly = sns.readonly ? "disabled='disabled'" : ""; - var display = hidden ? " style='display:none'" : ""; - html += ""; - } - } - return html; - }, - _fill_lightbox_select: function (s,i,d,map,cfg) { - s[i+map[0]].value=d.getDate(); - s[i+map[1]].value=d.getMonth(); - s[i+map[2]].value=d.getFullYear(); - if (dhtmlx.defined(map[3])) { - var v = d.getHours()*60+ d.getMinutes(); - v = Math.round(v/gantt._get_timepicker_step())*gantt._get_timepicker_step(); - var input = s[i+map[3]]; - input.value= v; - //in case option not shown - input.setAttribute('data-value', v); - } - }, - 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"; - return "
"; - }, - set_value:function(node,value,ev){ - node.firstChild.value=value||""; - }, - get_value:function(node,ev){ - return node.firstChild.value; - }, - focus:function(node){ - var a=node.firstChild; gantt._focus(a, true); - } - }, - select:{ - render:function(sns){ - var height=(sns.height||"23")+"px"; - var html="
"; - return html; - }, - set_value:function(node,value,ev,sns){ - var select = node.firstChild; - if (!select._dhx_onchange && sns.onchange) { - select.onchange = sns.onchange; - select._dhx_onchange = true; - } - if (typeof value == "undefined") - value = (select.options[0]||{}).value; - select.value=value||""; - }, - get_value:function(node,ev){ - return node.firstChild.value; - }, - focus:function(node){ - var a=node.firstChild; gantt._focus(a, true); - } - }, - time:{ - render:function(sns) { - var time = this.form_blocks.getTimePicker.call(this, sns); - var parts = ["
"]; - parts.push(time); - - if(sns.single_date){ - time = this.form_blocks.getTimePicker.call(this, sns, true); - parts.push(""); - }else{ - parts.push("  –  "); - } - - parts.push(time); - parts.push("
"); - return parts.join(''); - }, - set_value:function(node,value,ev,config){ - var cfg = config; - var s=node.getElementsByTagName("select"); - - var map = config._time_format_order; - var map_size = config._time_format_size; - - if(cfg.auto_end_date) { - var _update_lightbox_select = function() { - start_date = new Date(s[map[2]].value,s[map[1]].value,s[map[0]].value,0,0); - end_date = gantt.calculateEndDate(start_date, 1); - this.form_blocks._fill_lightbox_select(s,map.size, end_date,map,cfg); - }; - for(var i=0; i<4; i++) { - s[i].onchange = _update_lightbox_select; - } - } - - var mapping = gantt._resolve_default_mapping(config); - - if(typeof(mapping) === "string") mapping = {start_date: mapping}; - - var start_date = ev[mapping.start_date] || new Date(); - var end_date = ev[mapping.end_date] || gantt.calculateEndDate(start_date, 1); - - this.form_blocks._fill_lightbox_select(s,0,start_date,map,cfg); - this.form_blocks._fill_lightbox_select(s,map.size,end_date,map,cfg); - }, - - get_value:function(node, ev, config) { - var s=node.getElementsByTagName("select"); - var map = config._time_format_order; - - var hours = 0, minutes = 0; - if (dhtmlx.defined(map[3])) { - var time = parseInt(s[map[3]].value, 10); - hours = Math.floor(time/60); - minutes = time%60; - } - var start_date=new Date(s[map[2]].value,s[map[1]].value,s[map[0]].value,hours,minutes); - - hours = minutes = 0; - if (dhtmlx.defined(map[3])) { - var time = parseInt(s[map.size+map[3]].value, 10); - hours = Math.floor(time/60); - minutes = time%60; - } - var end_date=new Date(s[map[2]+map.size].value,s[map[1]+map.size].value,s[map[0]+map.size].value,hours,minutes); - - if (end_date <= start_date) - end_date = gantt.date.add(start_date, gantt._get_timepicker_step(),"minute"); - - var mapped_fields = gantt._resolve_default_mapping(config); - - var res = { - start_date: new Date(start_date), - end_date: new Date(end_date) - }; - if(typeof mapped_fields == "string"){ - return res.start_date; - }else{ - return res; - } - }, - focus:function(node){ - gantt._focus(node.getElementsByTagName("select")[0]); - } - }, - duration:{ - render:function(sns) { - var time = this.form_blocks.getTimePicker.call(this, sns); - time = "
"+time+"
"; - var label = this.locale.labels[this.config.duration_unit + "s"]; - - var singleDate = sns.single_date ? ' style="display:none"' : ""; - var readonly = sns.readonly ? " disabled='disabled'" : ""; - - var duration = "
" + - "" + - "" + - " " + label + " " + - "
"; - var html = "
"+time+" "+duration+"
"; - return html; - }, - set_value:function(node,value,ev,config){ - var cfg = config; - var s=node.getElementsByTagName("select"); - var inps = node.getElementsByTagName("input"); - - var duration = inps[1]; - var btns=[inps[0],inps[2]]; - var endspan = node.getElementsByTagName("span")[0]; - - var map = config._time_format_order; - - function _calc_date() { - var start_date = gantt.form_blocks.duration._get_start_date.call(gantt, node ,config); - var duration = gantt.form_blocks.duration._get_duration.call(gantt, node ,config); - var end_date = gantt.calculateEndDate(start_date, duration); - - endspan.innerHTML = gantt.templates.task_date(end_date); - } - - function _change_duration(step) { - var value = duration.value; - value = parseInt(value, 10); - if (window.isNaN(value)) - value = 0; - value+=step; - if (value < 1) value = 1; - duration.value = value; - _calc_date(); - } - - btns[0].onclick = dhtmlx.bind(function() { _change_duration(-1*this.config.duration_step); }, this); - btns[1].onclick = dhtmlx.bind(function() { _change_duration(1*this.config.duration_step); }, this); - s[0].onchange = _calc_date; - s[1].onchange = _calc_date; - s[2].onchange = _calc_date; - if (s[3]) s[3].onchange = _calc_date; - duration.onkeydown = dhtmlx.bind(function(e) { - e = e || window.event; - // up - var code = (e.charCode || e.keyCode || e.which); - - if (code == 40) { - _change_duration(-1*this.config.duration_step); - return false; - } - // down - if (code == 38) { - _change_duration(1*this.config.duration_step); - return false; - } - window.setTimeout(function(e) { - _calc_date(); - }, 1); - }, this); - - duration.onchange = dhtmlx.bind(function(e) { _calc_date(); }, this); - - var mapping = gantt._resolve_default_mapping(config); - if(typeof(mapping) === "string") mapping = {start_date: mapping}; - - var start_date = ev[mapping.start_date] || new Date(); - var end_date = ev[mapping.end_date] || gantt.calculateEndDate(start_date, 1); - var duration_val = Math.round(ev[mapping.duration]) || gantt.calculateDuration(start_date, end_date); - - gantt.form_blocks._fill_lightbox_select(s, 0, start_date, map, cfg); - duration.value = duration_val; - _calc_date(); - }, - - _get_start_date: function(node, config) { - var s=node.getElementsByTagName("select"); - var map = config._time_format_order; - var hours = 0; - var minutes = 0; - if (dhtmlx.defined(map[3])) { - var input = s[map[3]]; - var time = parseInt(input.value, 10); - if(isNaN(time) && input.hasAttribute("data-value")){ - time = parseInt(input.getAttribute("data-value"), 10); - } - - hours = Math.floor(time/60); - minutes = time%60; - } - return new Date(s[map[2]].value,s[map[1]].value,s[map[0]].value,hours,minutes); - }, - _get_duration: function(node, config) { - var duration = node.getElementsByTagName("input")[1]; - duration = parseInt(duration.value, 10); - if (!duration || window.isNaN(duration)) duration = 1; - if (duration < 0) duration *= -1; - return duration; - }, - - get_value:function(node, ev, config) { - var start_date = gantt.form_blocks.duration._get_start_date(node, config); - var duration = gantt.form_blocks.duration._get_duration(node, config); - - var end_date = gantt.calculateEndDate(start_date, duration); - var mapped_fields = gantt._resolve_default_mapping(config); - var res = { - start_date: new Date(start_date), - end_date: new Date(end_date), - duration: duration - }; - if(typeof mapped_fields == "string"){ - return res.start_date; - }else{ - return res; - } - }, - focus:function(node){ - gantt._focus(node.getElementsByTagName("select")[0]); - } - }, - parent: { - _filter : function(options, config, item_id){ - var filter = config.filter || function(){ return true;}; - - options = options.slice(0); - - for(var i=0; i < options.length; i++){ - var task = options[i]; - if(task.id == item_id || gantt.isChildOf(task.id, item_id) || filter(task.id, task) === false){ - options.splice(i, 1); - i--; - } - } - return options; - }, - - _display : function(config, item_id){ - var tasks = [], - options = []; - if(item_id){ - tasks = gantt.getTaskByTime(); - if(config.allow_root){ - tasks.unshift({id:gantt.config.root_id, text:config.root_label || ""}); - } - tasks = this._filter(tasks, config, item_id); - if(config.sort){ - tasks.sort(config.sort); - } - } - var text = config.template || gantt.templates.task_text; - for(var i = 0; i < tasks.length; i++){ - var label = text.apply(gantt, [tasks[i].start_date, tasks[i].end_date, tasks[i]]); - if(label === undefined){ - label = ""; - } - options.push({ - key: tasks[i].id, - label: label - }); - } - config.options = options; - config.map_to = config.map_to || "parent"; - return gantt.form_blocks.select.render.apply(this, arguments); - }, - render : function(sns){ - return gantt.form_blocks.parent._display(sns, false); - }, - set_value:function(node,value,ev,config){ - var tmpDom = document.createElement("div"); - tmpDom.innerHTML = gantt.form_blocks.parent._display(config, ev.id); - var newOptions = tmpDom.removeChild(tmpDom.firstChild); - node.onselect = null; - node.parentNode.replaceChild(newOptions, node); - - return gantt.form_blocks.select.set_value.apply(gantt, [newOptions,value,ev,config]); - }, - get_value:function(){ - return gantt.form_blocks.select.get_value.apply(gantt, arguments); - }, - focus:function(){ - return gantt.form_blocks.select.focus.apply(gantt, arguments); - } - } -}; - -gantt._is_lightbox_timepicker = function() { - var s = this._get_typed_lightbox_config(); - for (var i = 0; i < s.length; i++) - if (s[i].name == "time" && s[i].type == "time") - return true; - return false; -}; - -gantt._dhtmlx_confirm = function(message, title, callback, ok) { - if (!message) - return callback(); - var opts = { text: message }; - if (title) - opts.title = title; - if(ok){ - opts.ok = ok; - } - if (callback) { - opts.callback = function(result) { - if (result) - callback(); - }; - } - dhtmlx.confirm(opts); -}; - -gantt._get_typed_lightbox_config = function(type){ - if(type === undefined){ - type = this.getLightboxType(); - } - - var field = this._get_type_name(type); - - if(gantt.config.lightbox[field+"_sections"]){ - return gantt.config.lightbox[field+"_sections"]; - }else{ - return gantt.config.lightbox.sections; - } -}; - -gantt._silent_redraw_lightbox = function(type){ - var oldType = this.getLightboxType(); - - if(this.getState().lightbox){ - var taskId = this.getState().lightbox; - var formData = this.getLightboxValues(), - task = dhtmlx.copy(this.getTask(taskId)); - - this.resetLightbox(); - - var updTask = dhtmlx.mixin(task, formData, true); - var box = this.getLightbox(type ? type : undefined); - this._center_lightbox(this.getLightbox()); - this._set_lightbox_values(updTask, box); - }else{ - this.resetLightbox(); - this.getLightbox(type ? type : undefined); - } - this.callEvent("onLightboxChange", [oldType, this.getLightboxType()]); -}; -gantt._extend_to_optional = function(lightbox_block){ - - var duration = lightbox_block; - var optional_time = { - render : duration.render, - focus : duration.focus, - set_value: function (node, value, task, section){ - var mapping = gantt._resolve_default_mapping(section); - if(!task[mapping.start_date]){ - optional_time.disable(node, section); - var val = {}; - - for(var i in mapping){ - //take default values from the time control from task start/end dates - val[mapping[i]] = task[i]; - } - - return duration.set_value.call(gantt, node, value, val, section);//set default value - }else{ - optional_time.enable(node, section); - return duration.set_value.call(gantt, node, value, task, section); - } - }, - get_value: function (node, task, section){ - if(section.disabled){ - return {start_date: null}; - }else{ - return duration.get_value.call(gantt, node, task, section); - } - }, - update_block : function(node, section){ - gantt.callEvent("onSectionToggle", [gantt._lightbox_id, section]); - node.style.display = section.disabled ? "none" : "block"; - - if(section.button){ - var button = node.previousSibling.firstChild.firstChild, - labels = gantt.locale.labels; - - var button_text = section.disabled ? labels[section.name + "_enable_button"] : labels[section.name + "_disable_button"]; - - button.nextSibling.innerHTML = button_text; - } - gantt.resizeLightbox(); - }, - disable: function(node, section){ - section.disabled = true; - optional_time.update_block(node, section); - - }, - enable:function(node, section){ - section.disabled = false; - optional_time.update_block(node, section); - }, - button_click: function(index, el, section, container){ - if(gantt.callEvent("onSectionButton", [gantt._lightbox_id, section]) === false){ - return; - } - var config = gantt._get_typed_lightbox_config()[index]; - if(config.disabled){ - optional_time.enable(container, config); - }else{ - optional_time.disable(container, config); - } - } - }; - return optional_time; -}; - -gantt.form_blocks.duration_optional = gantt._extend_to_optional(gantt.form_blocks.duration); -gantt.form_blocks.time_optional = gantt._extend_to_optional(gantt.form_blocks.time); -/** - * @desc: constructor, data processor object - * @param: serverProcessorURL - url used for update - * @type: public - */ -function dataProcessor(serverProcessorURL){ - this.serverProcessor = serverProcessorURL; - this.action_param="!nativeeditor_status"; - - this.object = null; - this.updatedRows = []; //ids of updated rows - - this.autoUpdate = true; - this.updateMode = "cell"; - this._tMode="GET"; - this._headers = null; - this._payload = null; - 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); - dhx4._eventable(this); - - return this; - } - -dataProcessor.prototype={ - setTransactionMode:function(mode,total){ - if (typeof mode == "object"){ - this._tMode = mode.mode || this._tMode; - this._headers = this._headers || mode.headers; - this._payload = this._payload || mode.payload; - } else { - this._tMode=mode; - this._tSend=total; - } - - if (this._tMode == "REST"){ - this._tSend = false; - this._endnm = true; - } - }, - escape:function(data){ - if (this._utf) - return encodeURIComponent(data); - else - return escape(data); - }, - /** - * @desc: allows to set escaping mode - * @param: true - utf based escaping, simple - use current page encoding - * @type: public - */ - enableUTFencoding:function(mode){ - this._utf=dhx4.s2b(mode); - }, - /** - * @desc: allows to define, which column may trigger update - * @param: val - array or list of true/false values - * @type: public - */ - setDataColumns:function(val){ - this._columns=(typeof val == "string")?val.split(","):val; - }, - /** - * @desc: get state of updating - * @returns: true - all in sync with server, false - some items not updated yet. - * @type: public - */ - getSyncState:function(){ - return !this.updatedRows.length; - }, - /** - * @desc: enable/disable named field for data syncing, will use column ids for grid - * @param: mode - true/false - * @type: public - */ - enableDataNames:function(mode){ - this._endnm=dhx4.s2b(mode); - }, - /** - * @desc: enable/disable mode , when only changed fields and row id send to the server side, instead of all fields in default mode - * @param: mode - true/false - * @type: public - */ - enablePartialDataSend:function(mode){ - this._changed=dhx4.s2b(mode); - }, - /** - * @desc: set if rows should be send to server automaticaly - * @param: mode - "row" - based on row selection changed, "cell" - based on cell editing finished, "off" - manual data sending - * @type: public - */ - setUpdateMode:function(mode,dnd){ - this.autoUpdate = (mode=="cell"); - this.updateMode = mode; - this.dnd=dnd; - }, - ignore:function(code,master){ - this._silent_mode=true; - code.call(master||window); - this._silent_mode=false; - }, - /** - * @desc: mark row as updated/normal. check mandatory fields,initiate autoupdate (if turned on) - * @param: rowId - id of row to set update-status for - * @param: state - true for "updated", false for "not updated" - * @param: mode - update mode name - * @type: public - */ - setUpdated:function(rowId,state,mode){ - if (this._silent_mode) return; - var ind=this.findRow(rowId); - - mode=mode||"updated"; - var existing = this.obj.getUserData(rowId,this.action_param); - if (existing && mode == "updated") mode=existing; - if (state){ - this.set_invalid(rowId,false); //clear previous error flag - this.updatedRows[ind]=rowId; - this.obj.setUserData(rowId,this.action_param,mode); - if (this._in_progress[rowId]) - this._in_progress[rowId]="wait"; - } else{ - if (!this.is_invalid(rowId)){ - this.updatedRows.splice(ind,1); - this.obj.setUserData(rowId,this.action_param,""); - } - } - - //clear changed flag - if (!state) - this._clearUpdateFlag(rowId); - - this.markRow(rowId,state,mode); - if (state && this.autoUpdate) this.sendData(rowId); - }, - _clearUpdateFlag:function(id){}, - markRow:function(id,state,mode){ - var str=""; - var invalid=this.is_invalid(id); - if (invalid){ - str=this.styles[invalid]; - state=true; - } - if (this.callEvent("onRowMark",[id,state,mode,invalid])){ - //default logic - str=this.styles[state?mode:"clear"]+str; - - this.obj[this._methods[0]](id,str); - - if (invalid && invalid.details){ - str+=this.styles[invalid+"_cell"]; - for (var i=0; i < invalid.details.length; i++) - if (invalid.details[i]) - this.obj[this._methods[1]](id,i,str); - } - } - }, - getState:function(id){ - return this.obj.getUserData(id,this.action_param); - }, - is_invalid:function(id){ - return this._invalid[id]; - }, - set_invalid:function(id,mode,details){ - if (details) mode={value:mode, details:details, toString:function(){ return this.value.toString(); }}; - this._invalid[id]=mode; - }, - /** - * @desc: check mandatory fields and varify values of cells, initiate update (if specified) - * @param: rowId - id of row to set update-status for - * @type: public - */ - checkBeforeUpdate:function(rowId){ - return true; - }, - /** - * @desc: send row(s) values to server - * @param: rowId - id of row which data to send. If not specified, then all "updated" rows will be send - * @type: public - */ - sendData:function(rowId){ - if (this._waitMode && (this.obj.mytype=="tree" || this.obj._h2)) return; - if (this.obj.editStop) this.obj.editStop(); - - - if(typeof rowId == "undefined" || this._tSend) return this.sendAllData(); - if (this._in_progress[rowId]) return false; - - this.messages=[]; - if (!this.checkBeforeUpdate(rowId) && this.callEvent("onValidationError",[rowId,this.messages])) return false; - this._beforeSendData(this._getRowData(rowId),rowId); - }, - _beforeSendData:function(data,rowId){ - if (!this.callEvent("onBeforeUpdate",[rowId,this.getState(rowId),data])) return false; - this._sendData(data,rowId); - }, - serialize:function(data, id){ - if (typeof data == "string") - return data; - if (typeof id != "undefined") - return this.serialize_one(data,""); - else{ - var stack = []; - var keys = []; - for (var key in data) - if (data.hasOwnProperty(key)){ - stack.push(this.serialize_one(data[key],key+this.post_delim)); - keys.push(key); - } - stack.push("ids="+this.escape(keys.join(","))); - if (dhtmlx.security_key) - stack.push("dhx_security="+dhtmlx.security_key); - return stack.join("&"); - } - }, - serialize_one:function(data, pref){ - if (typeof data == "string") - return data; - var stack = []; - for (var key in data) - if (data.hasOwnProperty(key)){ - if ((key == "id" || key == this.action_param) && this._tMode == "REST") continue; - stack.push(this.escape((pref||"")+key)+"="+this.escape(data[key])); - } - return stack.join("&"); - }, - _sendData:function(a1,rowId){ - if (!a1) return; //nothing to send - if (!this.callEvent("onBeforeDataSending",rowId?[rowId,this.getState(rowId),a1]:[null, null, a1])) return false; - - if (rowId) - this._in_progress[rowId]=(new Date()).valueOf(); - - var that = this; - var back = function(xml){ - var ids = []; - if (rowId) - ids.push(rowId); - else if (a1) - for (var key in a1) - ids.push(key); - - return that.afterUpdate(that,xml,ids); - }; - - var a3 = this.serverProcessor+(this._user?(dhtmlx.url(this.serverProcessor)+["dhx_user="+this._user,"dhx_version="+this.obj.getUserData(0,"version")].join("&")):""); - - if (this._tMode=="GET") - dhx4.ajax.get(a3+((a3.indexOf("?")!=-1)?"&":"?")+this.serialize(a1,rowId), back); - else if (this._tMode == "POST") - dhx4.ajax.post(a3,this.serialize(a1,rowId), back); - else if (this._tMode == "REST"){ - var state = this.getState(rowId); - var url = a3.replace(/(\&|\?)editing\=true/,""); - var data = ""; - var method = "post"; - - if (state == "inserted"){ - data = this.serialize(a1, rowId); - } else if (state == "deleted"){ - method = "DELETE"; - url = url + (url.slice(-1) == "/" ? "" : "/") + rowId; - } else { - method = "PUT"; - data = this.serialize(a1, rowId); - url = url + (url.slice(-1) == "/" ? "" : "/") + rowId; - } - - - if (this._payload) - for (var key in this._payload) - url = url + dhtmlx.url(url) + this.escape(key) + "=" + this.escape(this._payload[key]); - - dhx4.ajax.query({ - url:url, - method:method, - headers:this._headers, - data:data, - callback:back - }); - } - - this._waitMode++; - }, - sendAllData:function(){ - if (!this.updatedRows.length) return; - - this.messages=[]; var valid=true; - for (var i=0; i Math.abs(wy)){ - if(res.x) return true;//no horisontal scroll, must not block scrolling - - var dir = wx/-40; - var left = gantt.$task.scrollLeft+dir*30; - gantt.scrollTo(left, null); - gantt.$scroll_hor.scrollTop = top; - } else { - if(res.y) return true;//no vertical scroll, must not block scrolling - - var dir = wy/-40; - if (typeof wy == "undefined") - dir = e.detail; - - var top = gantt.$scroll_ver.scrollTop+dir*30; - if(!gantt.config.prevent_default_scroll && gantt._cached_scroll_pos && gantt._cached_scroll_pos.y == top) return true; - - gantt.scrollTo(null, top); - gantt.$scroll_ver.scrollTop = top; - } - - if (e.preventDefault) - e.preventDefault(); - e.cancelBubble=true; - return false; - } - - if (ff) - dhtmlxEvent(gantt.$container, "wheel", onMouseWheel); - else - dhtmlxEvent(gantt.$container, "mousewheel", onMouseWheel); - -}; - - -gantt._scroll_resize = function() { - if (this._x < 20 || this._y < 20) return; - - var grid_width = this._get_grid_width(); - - var task_width = Math.max(this._x - grid_width, 0); - var task_height = Math.max(this._y - this.config.scale_height, 0); - - var scroll_size = this.config.scroll_size + 1;//1px for inner content - - var task_data_width = Math.max(this.$task_data.offsetWidth - scroll_size, 0); - var task_data_height = this.config.row_height*this._order.length; - - var resize = this._get_resize_options(); - var scroll_hor = this._scroll_hor = resize.x ? false : (task_data_width > task_width); - var scroll_ver = this._scroll_ver = resize.y ? false : (task_data_height > task_height); - - this.$scroll_hor.style.display = scroll_hor ? "block" : "none"; - this.$scroll_hor.style.height = (scroll_hor ? scroll_size : 0) + "px"; - this.$scroll_hor.style.width = Math.max((this._x - (scroll_ver ? scroll_size : 2)), 0) + "px"; - this.$scroll_hor.firstChild.style.width = (task_data_width + grid_width + scroll_size + 2) + "px"; - - this.$scroll_ver.style.display = scroll_ver ? "block" : "none"; - this.$scroll_ver.style.width = (scroll_ver ? scroll_size : 0) + "px"; - this.$scroll_ver.style.height = Math.max((this._y - (scroll_hor ? scroll_size : 0) - this.config.scale_height), 0) + "px"; - this.$scroll_ver.style.top = this.config.scale_height + "px"; - this.$scroll_ver.firstChild.style.height = (this.config.scale_height + task_data_height) + "px"; -}; - -gantt.locate = function(e) { - var trg = gantt._get_target_node(e); - - //ignore empty cells - if ((trg.className || "").indexOf("gantt_task_cell") >= 0) return null; - - var attribute = arguments[1] || this.config.task_attribute; - - while (trg){ - if (trg.getAttribute){ //text nodes has not getAttribute - var test = trg.getAttribute(attribute); - if (test) return test; - } - trg=trg.parentNode; - } - return null; -}; -gantt._get_target_node = function(e){ - var trg; - if (e.tagName) - trg = e; - else { - e=e||window.event; - trg=e.target||e.srcElement; - } - return trg; -}; -gantt._trim = function(str){ - var func = String.prototype.trim || function(){ return this.replace(/^\s+|\s+$/g, ""); }; - return func.apply(str); -}; - -gantt._locate_css = function(e, classname, strict){ - if(strict === undefined) - strict = true; - - var trg = gantt._get_target_node(e); - var css = ''; - var test = false; - while (trg){ - css = trg.className; - - if(css){ - var ind = css.indexOf(classname); - if (ind >= 0){ - if (!strict) - return trg; - - //check that we have exact match - var left = (ind === 0) || (!gantt._trim(css.charAt(ind - 1))); - var right = ((ind + classname.length >= css.length)) || (!gantt._trim(css.charAt(ind + classname.length))); - - if (left && right) - return trg; - } - } - - trg=trg.parentNode; - } - return null; -}; -gantt._locateHTML = function(e, attribute) { - var trg = gantt._get_target_node(e); - attribute = attribute || this.config.task_attribute; - - while (trg){ - if (trg.getAttribute){ //text nodes has not getAttribute - var test = trg.getAttribute(attribute); - if (test) return trg; - } - trg=trg.parentNode; - } - return null; -}; - -gantt.getTaskRowNode = function(id) { - var els = this.$grid_data.childNodes; - var attribute = this.config.task_attribute; - for (var i = 0; i < els.length; i++) { - if (els[i].getAttribute) { - var value = els[i].getAttribute(attribute); - if (value == id) return els[i]; - } - } - return null; -}; - -gantt.getState = function(){ - return { - drag_id : this._tasks_dnd.drag.id, - drag_mode : this._tasks_dnd.drag.mode, - drag_from_start : this._tasks_dnd.drag.left, - selected_task : this._selected_task, - min_date : new Date(this._min_date), - max_date : new Date(this._max_date), - lightbox : this._lightbox_id, - touch_drag : this._touch_drag - - }; - -}; - - -gantt._checkTimeout = function(host, updPerSecond){ - if(!updPerSecond) - return true; - var timeout = 1000/updPerSecond; - if(timeout < 1) return true; - - if(host._on_timeout) - return false; - - setTimeout(function(){ - delete host._on_timeout; - }, timeout); - - host._on_timeout = true; - return true; -}; - -gantt.selectTask = function(id){ - if(!this.config.select_task) - return false; - if (id){ - - if(this._selected_task == id) - return this._selected_task; - - if(!this.callEvent("onBeforeTaskSelected", [id])){ - return false; - } - - this.unselectTask(); - this._selected_task = id; - - this.refreshTask(id); - this.callEvent("onTaskSelected", [id]); - } - return this._selected_task; -}; -gantt.unselectTask = function(){ - var id = this._selected_task; - if(!id) - return; - this._selected_task = null; - this.refreshTask(id); - this.callEvent("onTaskUnselected", [id]); -}; -gantt.getSelectedId = function() { - return dhtmlx.defined(this._selected_task) ? this._selected_task : null; -}; - -gantt.changeLightboxType = function(type){ - if(this.getLightboxType() == type) - return true; - gantt._silent_redraw_lightbox(type); -}; - -gantt._is_render_active = function(){ - return !this._skip_render; -}; - -gantt.batchUpdate = function (callback) { - var call_dp = (this._dp && this._dp.updateMode != "off"); - var dp_mode; - if (call_dp){ - dp_mode = this._dp.updateMode; - this._dp.setUpdateMode("off"); - } - - this._skip_render = true; - - try{ - callback(); - }catch(e){ - - } - - this._skip_render = false; - this.render(); - if (call_dp) { - this._dp.setUpdateMode(dp_mode); - this._dp.sendData(); - } -}; - - -gantt.date={ - init:function(){ - var s = gantt.locale.date.month_short; - var t = gantt.locale.date.month_short_hash = {}; - for (var i = 0; i < s.length; i++) - t[s[i]]=i; - - var s = gantt.locale.date.month_full; - var t = gantt.locale.date.month_full_hash = {}; - for (var i = 0; i < s.length; i++) - t[s[i]]=i; - }, - date_part:function(date){ - var old = new Date(date); - date.setHours(0); - date.setMinutes(0); - date.setSeconds(0); - date.setMilliseconds(0); - if (date.getHours() && //shift to yesterday on dst - (date.getDate() < old.getDate() || date.getMonth() < old.getMonth() || date.getFullYear() < old.getFullYear()) ) - date.setTime(date.getTime() + 60 * 60 * 1000 * (24 - date.getHours())); - return date; - }, - time_part:function(date){ - return (date.valueOf()/1000 - date.getTimezoneOffset()*60)%86400; - }, - week_start:function(date){ - var shift=date.getDay(); - if (gantt.config.start_on_monday){ - if (shift===0) shift=6; - else shift--; - } - return this.date_part(this.add(date,-1*shift,"day")); - }, - month_start:function(date){ - date.setDate(1); - return this.date_part(date); - }, - year_start:function(date){ - date.setMonth(0); - return this.month_start(date); - }, - day_start:function(date){ - return this.date_part(date); - }, - hour_start:function(date){ - var hour = date.getHours(); - this.day_start(date); - date.setHours(hour); - return date; - }, - minute_start:function(date){ - var min = date.getMinutes(); - this.hour_start(date); - date.setMinutes(min); - return date; - }, - _add_days:function(date, inc){ - var ndate = new Date(date.valueOf()); - - ndate.setDate(ndate.getDate() + inc); - if (inc >= 0 && (!date.getHours() && ndate.getHours()) &&//shift to yesterday on dst - (ndate.getDate() < date.getDate() || ndate.getMonth() < date.getMonth() || ndate.getFullYear() < date.getFullYear()) ) - ndate.setTime(ndate.getTime() + 60 * 60 * 1000 * (24 - ndate.getHours())); - return ndate; - }, - - add:function(date,inc,mode){ - /*jsl:ignore*/ - var ndate=new Date(date.valueOf()); - switch(mode){ - case "day": - ndate = gantt.date._add_days(ndate, inc); - break; - case "week": - ndate = gantt.date._add_days(ndate, inc * 7); - break; - case "month": ndate.setMonth(ndate.getMonth()+inc); break; - case "year": ndate.setYear(ndate.getFullYear()+inc); break; - case "hour": - /* - adding hours/minutes via setHour(getHour() + inc) gives weird result when - adding one hour to the time before switch to a Daylight Saving time - - example: //Sun Mar 30 2014 01:00:00 GMT+0100 (W. Europe Standard Time) - new Date(2014, 02, 30, 1).setHours(2) - >>Sun Mar 30 2014 01:00:00 GMT+0100 (W. Europe Standard Time) - - setTime seems working as expected - */ - ndate.setTime(ndate.getTime()+inc * 60 * 60 * 1000); - break; - case "minute": - - ndate.setTime(ndate.getTime() + inc * 60 * 1000); - - break; - default: - return gantt.date["add_"+mode](date,inc,mode); - } - return ndate; - /*jsl:end*/ - }, - to_fixed:function(num){ - if (num<10) return "0"+num; - return num; - }, - copy:function(date){ - return new Date(date.valueOf()); - }, - date_to_str:function(format,utc){ - format=format.replace(/%[a-zA-Z]/g,function(a){ - switch(a){ - case "%d": return "\"+gantt.date.to_fixed(date.getDate())+\""; - case "%m": return "\"+gantt.date.to_fixed((date.getMonth()+1))+\""; - case "%j": return "\"+date.getDate()+\""; - case "%n": return "\"+(date.getMonth()+1)+\""; - case "%y": return "\"+gantt.date.to_fixed(date.getFullYear()%100)+\""; - case "%Y": return "\"+date.getFullYear()+\""; - case "%D": return "\"+gantt.locale.date.day_short[date.getDay()]+\""; - case "%l": return "\"+gantt.locale.date.day_full[date.getDay()]+\""; - case "%M": return "\"+gantt.locale.date.month_short[date.getMonth()]+\""; - case "%F": return "\"+gantt.locale.date.month_full[date.getMonth()]+\""; - case "%h": return "\"+gantt.date.to_fixed((date.getHours()+11)%12+1)+\""; - case "%g": return "\"+((date.getHours()+11)%12+1)+\""; - case "%G": return "\"+date.getHours()+\""; - case "%H": return "\"+gantt.date.to_fixed(date.getHours())+\""; - case "%i": return "\"+gantt.date.to_fixed(date.getMinutes())+\""; - case "%a": return "\"+(date.getHours()>11?\"pm\":\"am\")+\""; - case "%A": return "\"+(date.getHours()>11?\"PM\":\"AM\")+\""; - case "%s": return "\"+gantt.date.to_fixed(date.getSeconds())+\""; - case "%W": return "\"+gantt.date.to_fixed(gantt.date.getISOWeek(date))+\""; - default: return a; - } - }); - if (utc) format=format.replace(/date\.get/g,"date.getUTC"); - return new Function("date","return \""+format+"\";"); - }, - str_to_date:function(format,utc){ - var splt="var temp=date.match(/[a-zA-Z]+|[0-9]+/g);"; - var mask=format.match(/%[a-zA-Z]/g); - for (var i=0; i50?1900:2000);"; - break; - case "%g": - case "%G": - case "%h": - case "%H": - splt+="set[3]=temp["+i+"]||0;"; - break; - case "%i": - splt+="set[4]=temp["+i+"]||0;"; - break; - case "%Y": splt+="set[0]=temp["+i+"]||0;"; - break; - case "%a": - case "%A": splt+="set[3]=set[3]%12+((temp["+i+"]||'').toLowerCase()=='am'?0:12);"; - break; - case "%s": splt+="set[5]=temp["+i+"]||0;"; - break; - case "%M": splt+="set[1]=gantt.locale.date.month_short_hash[temp["+i+"]]||0;"; - break; - case "%F": splt+="set[1]=gantt.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]"; - if (utc) code =" Date.UTC("+code+")"; - return new Function("date","var set=[0,0,1,0,0,0]; "+splt+" return new Date("+code+");"); - }, - getISOWeek: function(ndate) { - if(!ndate) return false; - var nday = ndate.getDay(); - 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.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); - }, - convert_to_utc: function(date) { - return new Date(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(), date.getUTCHours(), date.getUTCMinutes(), date.getUTCSeconds()); - }, - parseDate: function(date, format) { - if (typeof(date) == "string") { - if (dhtmlx.defined(format)){ - if (typeof(format) == "string") - format = dhtmlx.defined(gantt.templates[format]) ? gantt.templates[format] : gantt.date.str_to_date(format); - else - format = gantt.templates.xml_date; - } - if(date) - date = format(date); - else - date = null; - } - return date; - } -}; -gantt.date.quarter_start = function(date){ - gantt.date.month_start(date); - var m = date.getMonth(), - res_month; - - if(m >= 9){ - res_month = 9; - }else if(m >= 6){ - res_month = 6; - }else if(m >= 3){ - res_month = 3; - }else{ - res_month = 0; - } - - date.setMonth(res_month); - return date; -}; -gantt.date.add_quarter = function(date, inc){ - return gantt.date.add(date, inc*3, "month"); -}; -/* - %d - the day as a number with a leading zero ( 01 to 31 ); - %j - the day as a number without a leading zero ( 1 to 31 ); - %D - the day as an abbreviation ( Sun to Sat ); - %l - the day as a full name ( Sunday to Saturday ); - %W - the ISO-8601 week number of the year. Weeks start on Monday; 1) - %m - the month as a number without a leading zero ( 1 to 12 ); - %n - the month as a number with a leading zero ( 01 to 12); - %M - the month as an abbreviation ( Jan to Dec ); - %F - the month as a full name ( January to December ); - %y - the year as a two-digit number ( 00 to 99 ); - %Y - the year as a four-digit number ( 1900–9999 ); - %h - the hour based on the 12-hour clock ( 00 to 11 ); - %H - the hour based on the 24-hour clock ( 00 to 23 ); - %i - the minute as a number with a leading zero ( 00 to 59 ); - %s - the second as a number without a leading zero ( 00 to 59 ); 2) - %a - displays am (for times from midnight until noon) and pm (for times from noon until midnight); - %A - displays AM (for times from midnight until noon) and PM (for times from noon until midnight). - - */ - -if(!gantt.config) gantt.config = {}; -if(!gantt.config) gantt.config = {}; -if(!gantt.templates) gantt.templates = {}; - -(function(){ - -dhtmlx.mixin(gantt.config, - {links : { - "finish_to_start":"0", - "start_to_start":"1", - "finish_to_finish":"2", - "start_to_finish":"3" - }, - types : { - 'task':'task', - 'project':'project', - 'milestone':'milestone' - }, - duration_unit : "day", - work_time:false, - correct_work_time:false, - skip_off_time:false, - - autosize:false, - autosize_min_width: 0, - - show_links : true, - show_task_cells : true, - // replace backgroung of the task area with a canvas img - static_background: false, - branch_loading: false, - show_loading: false, - show_chart : true, - show_grid : true, - min_duration : 60*60*1000, - xml_date : "%d-%m-%Y %H:%i", - api_date : "%d-%m-%Y %H:%i", - start_on_monday: true, - server_utc : false, - show_progress:true, - fit_tasks : false, - select_task:true, - scroll_on_click: true, - preserve_scroll: true, - readonly:false, - - /*grid */ - date_grid: "%Y-%m-%d", - - drag_links : true, - drag_progress:true, - drag_resize:true, - drag_move:true, - drag_mode:{ - "resize":"resize", - "progress":"progress", - "move":"move", - "ignore":"ignore" - }, - round_dnd_dates:true, - link_wrapper_width:20, - root_id:0, - - autofit: false, // grid column automatic fit grid_width config - columns: [ - {name:"text", tree:true, width:'*', resize:true }, - {name:"start_date", align: "center", resize:true }, - {name:"duration", align: "center" }, - {name:"add", width:'44' } - ], - - /*scale*/ - step: 1, - scale_unit: "day", - scale_offset_minimal:true, - subscales : [ - - ], - - inherit_scale_class:false, - - time_step: 60, - duration_step: 1, - date_scale: "%d %M", - task_date: "%d %F %Y", - time_picker: "%H:%i", - task_attribute: "task_id", - link_attribute: "link_id", - layer_attribute: "data-layer", - buttons_left: [ - "gantt_save_btn", - "gantt_cancel_btn" - ], - _migrate_buttons: { - "dhx_save_btn":"gantt_save_btn", - "dhx_cancel_btn":"gantt_cancel_btn", - "dhx_delete_btn":"gantt_delete_btn" - }, - buttons_right: [ - "gantt_delete_btn" - ], - lightbox: { - sections: [ - {name: "description", height: 70, map_to: "text", type: "textarea", focus: true}, - {name: "time", type: "duration", map_to: "auto"} - ], - project_sections: [ - {name: "description", height: 70, map_to: "text", type: "textarea", focus: true}, - {name: "type", type: "typeselect", map_to: "type"}, - {name: "time", type: "duration", readonly:true, map_to: "auto"} - ], - milestone_sections: [ - {name: "description", height: 70, map_to: "text", type: "textarea", focus: true}, - {name: "type", type: "typeselect", map_to: "type"}, - {name: "time", type: "duration", single_date:true, map_to: "auto"} - ] - }, - drag_lightbox: true, - sort: false, - details_on_create: true, - details_on_dblclick:true, - initial_scroll : true, - task_scroll_offset : 100, - - task_height: "full",//number px of 'full' for row height - min_column_width:70, - - // min width for grid column (when resizing) - min_grid_column_width:70, - // name of the attribute with column index for resize element - grid_resizer_column_attribute: "column_index", - // name of the attribute with column index for resize element - grid_resizer_attribute: "grid_resizer", - - // grid width can be increased after the column has been resized - keep_grid_width:false, - - // grid width can be adjusted - grid_resize:false, - - // - readonly_property: "readonly", - editable_property: "editable", - type_renderers:{}, - - open_tree_initially: false, - optimize_render: 'auto', - prevent_default_scroll: false - -}); -gantt.keys={ - edit_save:13, - edit_cancel:27 -}; - -gantt._init_template = function(name, initial){ - var registeredTemplates = this._reg_templates || {}; - - if(this.config[name] && registeredTemplates[name] != this.config[name]){ - if(!(initial && this.templates[name])){ - this.templates[name] = this.date.date_to_str(this.config[name]); - registeredTemplates[name] = this.config[name]; - } - } - this._reg_templates = registeredTemplates; -}; -gantt._init_templates = function(){ - var labels = gantt.locale.labels; - labels.gantt_save_btn = labels.icon_save; - labels.gantt_cancel_btn = labels.icon_cancel; - labels.gantt_delete_btn = labels.icon_delete; - - - - //build configuration based templates - var d = this.date.date_to_str; - var c = this.config; - gantt._init_template("date_scale", true); - gantt._init_template("date_grid", true); - gantt._init_template("task_date", true); - - - - dhtmlx.mixin(this.templates,{ - xml_date:this.date.str_to_date(c.xml_date,c.server_utc), - xml_format:d(c.xml_date,c.server_utc), - api_date:this.date.str_to_date(c.api_date), - progress_text:function(start, end, task){return "";}, - grid_header_class : function(column, config){ - return ""; - }, - - task_text:function(start, end, task){ - return task.text; - }, - task_class:function(start, end, task){return "";}, - grid_row_class:function(start, end, task){ - return ""; - }, - task_row_class:function(start, end, task){ - return ""; - }, - task_cell_class:function(item, date){return "";}, - scale_cell_class:function(date){return "";}, - scale_row_class:function(date){return "";}, - - grid_indent:function(item) { - return "
"; - }, - grid_folder:function(item) { - return "
"; - }, - grid_file:function(item) { - return "
"; - }, - grid_open:function(item) { - return "
"; - }, - grid_blank:function(item) { - return "
"; - }, - - - task_time:function(start,end,ev){ - return gantt.templates.task_date(start)+" - "+gantt.templates.task_date(end); - }, - time_picker:d(c.time_picker), - link_class : function(link){ - return ""; - }, - link_description : function(link){ - var from = gantt.getTask(link.source), - to = gantt.getTask(link.target); - - return "" + from.text + "" + to.text+""; - }, - - drag_link : function(from, from_start, to, to_start) { - from = gantt.getTask(from); - var labels = gantt.locale.labels; - - var text = "" + from.text + " " + (from_start ? labels.link_start : labels.link_end)+"
"; - if(to){ - to = gantt.getTask(to); - text += " " + to.text + " "+ (to_start ? labels.link_start : labels.link_end)+"
"; - } - return text; - }, - drag_link_class: function(from, from_start, to, to_start) { - var add = ""; - - if(from && to){ - var allowed = gantt.isLinkAllowed(from, to, from_start, to_start); - add = " " + (allowed ? "gantt_link_allow" : "gantt_link_deny"); - } - - return "gantt_link_tooltip" + add; - } - }); - - this.callEvent("onTemplatesReady",[]); -}; - -})(); -if (window.jQuery){ - -(function( $ ){ - - var methods = []; - $.fn.dhx_gantt = function(config){ - config = config || {}; - if (typeof(config) === 'string') { - if (methods[config] ) { - return methods[config].apply(this, []); - }else { - $.error('Method ' + config + ' does not exist on jQuery.dhx_gantt'); - } - } else { - var views = []; - this.each(function() { - if (this && this.getAttribute){ - if (!this.getAttribute("dhxgantt")){ - for (var key in config) - if (key!="data") - gantt.config[key] = config[key]; - - gantt.init(this); - if (config.data) - gantt.parse(config.data); - - views.push(gantt); - } - } - }); - - - if (views.length === 1) return views[0]; - return views; - } - }; - -})(jQuery); - -} - -if (window.dhtmlx){ - - if (!dhtmlx.attaches) - dhtmlx.attaches = {}; - - dhtmlx.attaches.attachGantt=function(start, end){ - var obj = document.createElement("DIV"); - obj.id = "gantt_"+dhtmlx.uid(); - obj.style.width = "100%"; - obj.style.height = "100%"; - obj.cmp = "grid"; - - document.body.appendChild(obj); - this.attachObject(obj.id); - - var that = this.vs[this.av]; - that.grid = gantt; - - gantt.init(obj.id, start, end); - obj.firstChild.style.border = "none"; - - that.gridId = obj.id; - that.gridObj = obj; - - var method_name="_viewRestore"; - return this.vs[this[method_name]()].grid; - }; - -} -gantt.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:{ - new_task:"New task", - icon_save:"Save", - icon_cancel:"Cancel", - icon_details:"Details", - icon_edit:"Edit", - icon_delete:"Delete", - confirm_closing:"",//Your changes will be lost, are your sure ? - confirm_deleting:"Task will be deleted permanently, are you sure?", - section_description:"Description", - section_time:"Time period", - section_type:"Type", - - /* grid columns */ - - column_text : "Task name", - column_start_date : "Start time", - column_duration : "Duration", - column_add : "", - - /* link confirmation */ - link: "Link", - confirm_link_deleting:"will be deleted", - link_start: " (start)", - link_end: " (end)", - - type_task: "Task", - type_project: "Project", - type_milestone: "Milestone", - - minutes: "Minutes", - hours: "Hours", - days: "Days", - weeks: "Week", - months: "Months", - years: "Years" - } -}; - - - - -gantt.skins.skyblue = { - config:{ - grid_width:350, - row_height: 27, - scale_height: 27, - link_line_width:1, - link_arrow_size:8, - lightbox_additional_height:75 - }, - _second_column_width:95, - _third_column_width:80 -}; -gantt.skins.meadow = { - config:{ - grid_width:350, - row_height: 27, - scale_height: 30, - link_line_width:2, - link_arrow_size:6, - lightbox_additional_height:72 - }, - _second_column_width:95, - _third_column_width:80 -}; - -gantt.skins.terrace = { - config:{ - grid_width:360, - row_height: 35, - scale_height: 35, - link_line_width:2, - link_arrow_size:6, - lightbox_additional_height:75 - }, - _second_column_width:90, - _third_column_width:70 -}; -gantt.skins.broadway = { - config:{ - grid_width:360, - row_height: 35, - scale_height: 35, - link_line_width:1, - link_arrow_size:7, - lightbox_additional_height:86 - }, - _second_column_width:90, - _third_column_width:80, - - _lightbox_template:"
 
", - _config_buttons_left: {}, - _config_buttons_right: { - "gantt_delete_btn": "icon_delete", - "gantt_save_btn": "icon_save" - } -}; - - -gantt.config.touch_drag = 500; //nearly immediate dnd -gantt.config.touch = true; -gantt.config.touch_feedback = true; - - -gantt._touch_feedback = function(){ - if(gantt.config.touch_feedback){ - if(navigator.vibrate) - navigator.vibrate(1); - } -}; - -gantt._init_touch_events = function(){ - if (this.config.touch != "force") - this.config.touch = this.config.touch && - ((navigator.userAgent.indexOf("Mobile")!=-1) || - (navigator.userAgent.indexOf("iPad")!=-1) || - (navigator.userAgent.indexOf("Android")!=-1) || - (navigator.userAgent.indexOf("Touch")!=-1)); - - if (this.config.touch){ - if (window.navigator.msPointerEnabled){ - this._touch_events(["MSPointerMove", "MSPointerDown", "MSPointerUp"], function(ev){ - if (ev.pointerType == ev.MSPOINTER_TYPE_MOUSE ) return null; - return ev; - }, function(ev){ - return (!ev || ev.pointerType == ev.MSPOINTER_TYPE_MOUSE); - }); - } else - this._touch_events(["touchmove", "touchstart", "touchend"], function(ev){ - if (ev.touches && ev.touches.length > 1) return null; - if (ev.touches[0]) - return { - target: ev.target, - pageX: ev.touches[0].pageX, - pageY: ev.touches[0].pageY, - clientX:ev.touches[0].clientX, - clientY:ev.touches[0].clientY - }; - else - return ev; - }, function(){ return false; }); - } -}; - - -//we can't use native scrolling, as we need to sync momentum between different parts -//so we will block native scroll and use the custom one -//in future we can add custom momentum -gantt._touch_events = function(names, accessor, ignore){ - //webkit on android need to be handled separately - var dblclicktime = 0; - var action_mode = false; - var scroll_mode = false; - var dblclick_timer = 0; - var action_start = null; - var scroll_state; - var long_tap_timer = null; - var current_target = null; - - //touch move - if (!this._gantt_touch_event_ready){ - this._gantt_touch_event_ready = 1; - dhtmlxEvent(gantt.$container, names[0], function(e){ - if (ignore(e)) return; - - //ignore common and scrolling moves - if (!action_mode) return; - - if (long_tap_timer) clearTimeout(long_tap_timer); - - var source = accessor(e); - if (gantt._tasks_dnd.drag.id || gantt._tasks_dnd.drag.start_drag) { - gantt._tasks_dnd.on_mouse_move(source); - if (e.preventDefault) - e.preventDefault(); - e.cancelBubble = true; - return false; - } - if (source && action_start){ - var dx = action_start.pageX - source.pageX; - var dy = action_start.pageY - source.pageY; - if (!scroll_mode && (Math.abs(dx) > 5 || Math.abs(dy) > 5)){ - gantt._touch_scroll_active = scroll_mode = true; - dblclicktime = 0; - scroll_state = gantt.getScrollState(); - } - - if (scroll_mode){ - gantt.scrollTo(scroll_state.x + dx, scroll_state.y + dy); - } - } - return block_action(e); - }); - } - - //block touch context menu in IE10 - dhtmlxEvent(this.$container, "contextmenu", function(e){ - if (action_mode) - return block_action(e); - }); - - //touch start - dhtmlxEvent(this.$container, names[1], function(e){ - if (ignore(e)) return; - if (e.touches && e.touches.length > 1){ - action_mode = false; - return; - } - - action_mode = true; - action_start = accessor(e); - - - - //dbl-tap handling - if (action_start && dblclicktime){ - var now = new Date(); - if ((now - dblclicktime) < 500 ){ - gantt._on_dblclick(action_start); - block_action(e); - } else - dblclicktime = now; - } else { - dblclicktime = new Date(); - } - - //long tap - long_tap_timer = setTimeout(function(){ - var taskId = gantt.locate(action_start); - if(taskId && action_start.target.className.indexOf("gantt_link_point") == -1) { - gantt._tasks_dnd.on_mouse_down(action_start); - gantt._tasks_dnd._start_dnd(action_start); - gantt._touch_drag = true; - cloneTaskRendered(taskId); - - gantt.refreshTask(taskId); - - gantt._touch_feedback(); - } - - long_tap_timer = null; - }, gantt.config.touch_drag); - }); - - //touch end - dhtmlxEvent(this.$container, names[2], function(e){ - if (ignore(e)) return; - if (long_tap_timer) clearTimeout(long_tap_timer); - gantt._touch_drag = false; - action_mode = false; - var source = accessor(e); - gantt._tasks_dnd.on_mouse_up(source); - - if(current_target) { - gantt.refreshTask(gantt.locate(current_target)); - current_target.parentNode.removeChild(current_target); - gantt._touch_feedback(); - } - - gantt._touch_scroll_active = action_mode = scroll_mode = false; - current_target = null; - }); - - - //common helper, prevents event - function block_action(e){ - if (e && e.preventDefault) - e.preventDefault(); - (e||event).cancelBubble = true; - return false; - } - - function cloneTaskRendered(taskId) { - var renders = gantt._task_area_pulls; - var task = gantt.getTask(taskId); - if(task && gantt.isTaskVisible(taskId)){ - for(var i in renders) { - task = renders[i][taskId]; - if(task && task.getAttribute("task_id") && task.getAttribute("task_id") == taskId) { - var copy = task.cloneNode(true); - current_target = task; - renders[i][taskId] = copy; - task.style.display="none"; - copy.className += " gantt_drag_move "; - task.parentNode.appendChild(copy); - return copy; - } - } - } - } -}; \ No newline at end of file diff --git a/libraries/dhtmlxgantt/sources/dhtmlxgantt.js.map b/libraries/dhtmlxgantt/sources/dhtmlxgantt.js.map deleted file mode 100644 index d1b725b..0000000 --- a/libraries/dhtmlxgantt/sources/dhtmlxgantt.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"dhtmlxgantt.js","sources":["dhtmlxgantt.js"],"names":["dhtmlxEvent","el","event","handler","addEventListener","attachEvent","dhtmlxDetachEvent","removeEventListener","detachEvent","dhtmlxDnD","obj","config","this","_settings","dhtmlxEventable","dhtmlx","bind","e","original_target","target","srcElement","dragStart","dataProcessor","serverProcessorURL","serverProcessor","action_param","object","updatedRows","autoUpdate","updateMode","_tMode","_headers","_payload","post_delim","_waitMode","_in_progress","_invalid","mandatoryFields","messages","styles","updated","inserted","deleted","invalid","invalid_cell","error","clear","enableUTFencoding","dhx4","_eventable","window","version","skin","skinDetect","comp",10,20,30,"readFromCss","className","property","t","document","createElement","body","firstChild","insertBefore","appendChild","w","parentNode","removeChild","lastId","newId","zim","data","step","first","last","a","Math","max","reserve","id","s2b","r","toLowerCase","s2j","s","temp","eval","absLeft","getElementById","getOffset","left","absTop","top","_aOfs","elem","parseInt","offsetTop","offsetLeft","offsetParent","_aOfsRect","box","getBoundingClientRect","docElem","documentElement","scrollTop","pageYOffset","scrollLeft","pageXOffset","clientTop","clientLeft","round","_isObj","k","_copyObj","length","screenDim","isIE","navigator","userAgent","indexOf","dim","right","innerWidth","clientWidth","getElementsByTagName","bottom","clientHeight","offsetHeight","innerHeight","selectTextRange","inp","start","end","len","value","min","setSelectionRange","createTextRange","range","moveStart","moveEnd","select","transData","transDetect","transProp","transEv","MozTransition","WebkitTransition","OTransition","msTransition","transition","style","_xmlNodeValue","node","q","childNodes","nodeValue","toString","replace","isIE6","XMLHttpRequest","isIE7","isIE8","isOpera","isChrome","isKHTML","isFF","isIPad","search","ajax","cache","method","parse","DOMParser","parseFromString","ActiveXObject","undefined","async","loadXML","xmltop","tagname","xhr","status","xml","responseXML","responseText","callEvent","arguments","xpath","xpathExp","docObj","nodeName","selectNodes","rows","col","ownerDocument","evaluate","XPathResult","ANY_TYPE","iterateNext","push","query","_call","url","callback","headers","get","onLoad","getSync","put","postData","del","post","String","postSync","getLong","postLong","longParams","isQt","match","onreadystatechange","readyState","setTimeout","apply","xmlDoc","Date","getTime","open","key","setRequestHeader","toUpperCase","send","mode","detachAllEvents","dhxevs","checkEvent","name","func","eventId","b","params","extend","extend_api","map","ext","tagName","that","_init","_patch","prototype","str","_isFF","_isIE","_isOpera","_isKHTML","_isMacOS","_isChrome","_FFrv","_KHTMLrv","_OperaRv","parseFloat","substr","appName","appVersion","documentMode","compatMode","split","touchDelay","initTouch","touch_event","ev","createEvent","initEvent","dispatchEvent","longtouch","tx","ty","touches","clientX","clientY","abs","clearTimeout","result","usercall","modality","_dhx_msg_cfg","modal_key","code","which","keyCode","message","keyboard","preventDefault","cancelBubble","cover","onkeydown","scrollHeight","display","button","text","button_css","info","area","position","hide","innerHTML","type","onclick","expire","timers","pull","_boxStructure","ok","cancel","setAttribute","inner","width","height","title","content","buttons","i","source","getAttribute","_createBox","hidden","x","floor","offsetWidth","y","focus","modalbox","alertPopup","confirmPopup","boxPopup","box_params","uid","alert","confirm","subtype","seed","valueOf","hideAll","gantt","_silent_mode","_silentStart","_silentEnd","catcher","callObj","_eventCatcher","addEvent","arg0","dhx_catch","z","res","zr","removeEvent","list","copy","Array","Number","Boolean","Object","hasOwnProperty","mixin","force","f","defined","_seed","functor","_get_position","_detectScrollSize","div","cssText","attaches","attachGantt","cmp","attachObject","vs","av","grid","init","border","gridId","gridObj","method_name","dhtmlXCellObject","dataObj","_click","_dbl_click","_context_menu","_on_click","trg","locate","default_action","_find_ev_handler","getTask","select_task","selectTask","_on_contextmenu","src","taskId","linkId","link_attribute","returnValue","hash","css","call","_on_dblclick","details_on_dblclick","showLightbox","_on_mousemove","_last_move_event","marker","started","pos","getPosition","sensitivity","mousemove","dragMove","limited_mousemove","dragScroll","updates_per_second","_checkTimeout","mouseup","dragEnd","diff_x","diff_y","distance","sqrt","pow","ignore","pageX","pageY","_init_grid","gantt_close","close","gantt_open","gantt_row","task","scroll_on_click","showDate","start_date","gantt_grid_head_cell","column","gantt_add","root_id","sort","_sort","direction","order_branch","_init_dnd","readonly","item","createTask","_init_resize","_render_grid","_is_grid_visible","_calc_grid_width","_render_grid_header","columns","getGridColumns","cols_width","unknown","v","isNaN","autofit","diff","_get_grid_width","delta","index","grid_width","cells","labels","locale","lineHeigth","scale_height","cssClass","templates","grid_header_class","join","label","cell","$grid_scale","lineHeight","_render_grid_item","template","date_grid","tree","j","$level","grid_indent","has_child","_has_children","grid_open","grid_folder","grid_blank","grid_file","align","$index","grid_row_class","css_template","end_date","getState","selected_task","row_height","task_attribute","_set_item_state","state","_pull","$open","refreshData","show_grid","_is_chart_visible","_x","getTaskIndex","branch","getChildren","getParent","getGlobalTaskIndex","_order","moveTask","sid","tindex","parent","source_pid","tbranch","sindex","_replace_branch_child","tid","slice","concat","setParent","_branches","childTree","_getTaskTree","calculateTaskLevel","$drop_target","getPrevSibling","dnd","$grid_data","dnd_sensitivity","_locateHTML","hideQuickInfo","_hideQuickInfo","_is_readonly","initial_open_state","outerHTML","$transparent","lastTaskOfLevel","level","ids","last_item","_getGridPos","dd","elementFromPoint","isTaskExists","over","next","prev","shift","_scale_helpers","getSum","sizes","from","to","summ","setSumWidth","sum_width","scale","parts","oldWidth","adjustSize","full_width","splitSize","count","arr","full","shared","share","sortScales","scales","cellSize","unit","d","date","add","primaryScale","_init_template","scale_unit","date_scale","scale_cell_class","prepareConfigs","min_coll_width","container_width","heights","configs","main_scale","cfg","initScaleConfig","processIgnores","initColSizes","limitVisibleRange","unshift","alineScaleColumns","setPosSettings","trace_x","_ignore_time_config","skip_off_time","isWorkTime","ignore_x","display_count","min_col_width","line_height","cont_width","column_count","col_width","ignores","eachColumn","iterateScales","lower_scale","upper_scale","upper_dates","lower_dates","prevUpper","up","upper_start","upper_end","lower_start","lower_end","targetWidth","actualWidth","_min_date","_max_date","curr","dates","lastDate","outDate","_tasks_dnd","drag","_events","before_start","before_finish","after_finish","_handlers","clear_drag_state","drag_mode","set_actions","evs","stage","move","_move","resize","_resize","progress","_resize_progress","$task_data","on_mouse_move","on_mouse_down","on_mouse_up","start_x","start_y","coords_x","_drag_task_coords","dateFromPos","min_date","max_date","min_duration","calculateEndDate","_init_task_timing","new_start","new_end","posFromDate","obj_s_x","obj_e_x","start_drag","_start_dnd","_update_on_move","_get_mouse_pos","curr_date","original","_update_parents","refreshTask","_trim","_get_drag_mode","_is_flex_task","_fix_dnd_scale_time","fixStart","duration_unit","fixEnd","_tasks","round_dnd_dates","time_step","roundDate","duration","_fix_working_times","work_time","correct_work_time","getClosestWorkTime","dir","correctTaskWorkTime","_fireEvent","drag_id","updateTask","_dhx_changed","modes","classes","classname","assert","trigger","roundTaskDates","drag_state","_render_link","link","getLink","renders","_get_link_renderers","render_item","_get_link_type","from_start","to_start","links","start_to_start","finish_to_start","start_to_finish","finish_to_finish","isLinkAllowed","_render_link_element","dots","_path_builder","get_points","drawer","_drawer","lines","get_lines","color","cssTemplate","link_class","highlight_critical_path","isCriticalLink","size","link_arrow_size","render_line","backgroundColor","endpoint","_render_link_arrow","borderColor","point","line_width","dirs","down","current_pos","path","line_to","get_path","line","_get_line","get_wrapper_sizes","wrapper_size","link_wrapper_width","link_line_width","get_line_sizes","line_size","marginTop","marginLeft","wrapper","innerPos","get_direction","vect","_y_from_ind","current","point_to","pt","get_endpoint","xy","dy","e_y","dx","e_x","shiftX","forward","sign","types","_get_task_visible_pos","_init_links_dnd","getLinePos","_get_task_pos","_get_task_height","updateMarkedHtml","getDndState","drag_link_class","html","drag_link","advanceMarker","_link_source_task","_link_target_task","_link_source_task_start","_link_target_task_start","resetDndState","showDirectingLine","s_x","s_y","getDirectionLine","link_direction_class","dist","tan","angle","atan","coordinateCircleQuarter","PI","sin","cos","ieTransform","shiftLeft","shiftTop","sX","eX","sY","eY","_direction","$task_links","removeDirectionLine","$task_bars","start_marker","end_marker","link_edge_marker","link_landing_hover_area","_locate_css","_get_safe_type","milestone","_get_visible_milestone_width","_get_milestone_width","_dir_start","landing","_is_link_drop_area","prevTarget","prevLanding","_link_landing","prevToStart","targ","_dir_end","targetChanged","addLink","_get_link_state","link_landing_area","link_target_id","link_target_start","link_source_id","link_source_start","_init_tasks","refreshId","oldId","change_id","columnWidth","rendered","gantt_task_link","gantt_scale_cell","coll","_day_index_by_date","coll_date","_delete_link_handler","gantt_link_point","$target","$source","_link_layers","links_layer","addLinkLayer","renderer","container","filter","_create_filter","_linkRenderer","getRenderer","_task_layers","bar_layer","addTaskLayer","_render_task_element","_taskRenderer","_render_bg_line","$task_bg","_onTaskIdChange","render","_get_task_renderers","_onLinkIdChange","filter_methods","filter_method","show_chart","_filter_task","_filter_link","show_links","isTaskVisible","_is_std_background","static_background","question","link_description","confirm_link_deleting","_dhtmlx_confirm","deleteLink","touch","getTaskNode","getLinkNode","_get_tasks_data","resetProjectDates","_get_links_data","_lpull","_render_data","_is_render_active","_sync_order","_update_layout_sizes","_render_bg_canvas","renderers","render_items","bar_height","$task","backgroundImage","data_els","_is_layer","_scale_range_unit","scale_offset_minimal","_get_scales","_init_tasks_range","getSubtaskDates","_prepare_scale_html","date_to_str","inherit_scale_class","cssclass","helpers","subscales","_render_tasks_scales","_scroll_resize","_set_sizes","scales_html","outer_width","data_width","_get_resize_options","avail_width","autosize_min_width","cfgs","min_column_width","scale_row_class","tplClass","$scroll_ver","$task_scale","row","show_task_cells","task_cell_class","odd","task_row_class","_adjust_scales","fit_tasks","old_min","old_max","refresh_links","refreshLink","isLinkExists","remove_item","_combine_item_class","basic","itemId","project","touch_drag","isCriticalTask","from_id","allowDrag","dragClass","_render_pair","task_height","origWidth","getTaskPosition","x2","getTaskTop","_get_task_width","editable_property","readonly_property","_task_default_render","padd","show_progress","_render_task_progress","_render_task_content","textColor","task_class","progressColor","side","_render_leftside_content","_render_rightside_content","drag_resize","drag_links","outer","painters","type_renderers","defaultRenderer","_render_side_content","_get_link_crossing_css","leftside_text","rightside_text","_get_conditions","leftside","cond","ln","tp","task_text","element","maxWidth","done","pr","opacity","progress_text","drag_progress","steps","second","minute","hour","day","week","month","year","ind","_findBinary","part","_get_coll_duration","wholeCells","partCell","days","day_ind","array","low","high","_get_x_pos","task_id","_get_visible_order","_get_task_coord","x_correction","isMilestone","_default_task_date","mstoneCorrection","_correct_shift","back","getTimezoneOffset","dom_element","hasAttribute","layer_attribute","_task_renderer","render_one","_task_area_pulls","_task_area_renderers","dom","replace_item","items","buffer","createDocumentFragment","vis","item_id","newNode","replaceChild","oldid","newid","unload","_clear_renderers","_layers","prepareConfig","create","get_container","rel_root","tempCollection","getRenderers","layer","pending","topmost","rel","splice","remove","_add_generic_layer","layersManager","filters","removeTaskLayer","removeLinkLayer","load","_load_url","cl","_load_type","l","on_load","serialize","resp","raw","_process_loading","collections","_load_collections","tasks","_init_task","_add_branch","_init_links","initial_scroll","showTask","_init_link","_sync_links","collections_loaded","collection","serverList","option","option_key","silent","_sync_order_item","$ignore","children","ord","eachTask","master","hasChild","json","JSON","_temp","dhx_security","security_key","_copyLink","_copyObject","charAt","xml_format","_xmlNodeToJSON","attrs_only","attributes","child","nodeType","_getCollections","loader","opts","itms","itm","attrs","attr","_getXML","toptag","getXMLTopNode","skey","oldxml","startdate","est","enddate","predecessortasks","_working_time_helper","units","hours",6,"_working_units_cache","_cache","time","_get_unit_order","_timestamp","settings","timestamp","date_part","set_time","unset_time","is_working_unit","order","is_work_unit","_check_is_working_unit","is_work_day","val","get_working_hours","is_work_hour","getHours","getDay","get_work_units_between","is_work_units_between","add_worktime","added","get_closest_worktime","future_target","prev_target","tick","maximum_loop","both_directins","inc","getTaskByTime","p","_is_parent_sync","_resync_parent","pid","added_already","_sync_parent","_move_branch","old_parent","new_parent","$rendered_parent","old_id","new_id","newbranch","addTask","parent_id","startDate","_set_default_task_timing","duration_step","new_task","details_on_create","$new","deleteTask","_deleteTask","_getChildLinks","branches","_deleteRelatedLinks","use_dp","_dp","prev_mode","send_changes","setUpdateMode","setGanttMode","setUpdated","_deleteLink","sendAllData","_deleteRelatedTasks","t_id","_unset_task","_update_flags","clearAll","_clear_data","_order_full","userdata","_lightbox_id","_selected_task","changeTaskId","_get_duration_unit","_get_type_name","type_value","getWorkHours","setWorkTime","helper","calculateDuration","_hasDuration","mult","parseDate","open_tree_initially","task_type","$rendered_type","$no_end","$no_start","_assign_project_dates","root","isChildOf","child_id","upper","lower","field","desc","criteria","els","getNext","getPrev","_get_parent_id","new_pid","getSiblings","getNextSibling","siblings","_dp_init","dp","setTransactionMode","_serverProcessor","_methods","_ganttMode","newState","_sendTaskOrder","_tSend","urlPart","afterUpdate","reqUrl","filePath","responseURL","_getRowData","getUserData","_change_id","changeLinkId","_row_style","row_id","getTaskRowNode","regexp","_delete_task","setUserData","getLinks","updateLink","_configure","_init_skin","_get_skin","href","skinset","skins","_second_column_width","_third_column_width","_lightbox_template","resetLightbox","resetSkin","_lightbox_methods","getLightbox","_center_lightbox","showCover","_fill_lightbox","_get_timepicker_step","getLabel","sections","_get_typed_lightbox_config","map_to","options","updateCollection","list_name","getLightboxType","_lightbox_type","_lightbox","_is_lightbox_timepicker","wide_form","visibility","buttons_left","_migrate_buttons","buttons_right","drag_lightbox","onmousedown","_ready_to_dnd","onselectstart","cursor","_init_dnd_events","sns","_render_sections","ds","t_ds","resizeLightbox","_init_lightbox_events","block","form_blocks","con","lightbox_additional_height","scroll_top","scroll_left","view_height","scrollWidth","_cover","_document_height","_scroll_height","lightbox_events","_save_lightbox","$click","hideLightbox","_cancel_lightbox","sec","button_click","nextSibling","previousSibling","keys","edit_save","shiftKey","edit_cancel","getLightboxValues","_resolve_default_mapping","section","mapping","time_controls","get_value","hideCover","_custom_lightbox","_set_lightbox_values","lightbox_header","task_time","default_value","set_value","getLightboxSection","header","getValue","setValue","get_template_control","control","get_select_control","get_textarea_control","get_time_control","_move_while_dnd","_finish_dnd","_dnd_start_lb","gantt_unselectable","lb","now","_lb_start","_focus","getTimePicker","time_format","_time_format_order","dt","limit_time_select","last_hour","first_hour","setHours","time_option","offset","start_year","end_year","year_range","getFullYear","month_full","tdate","getDate","_time_values","time_picker","setTime","getMinutes","_fill_lightbox_select","getMonth","input","textarea","_dhx_onchange","onchange","single_date","_time_format_size","auto_end_date","_update_lightbox_select","minutes","mapped_fields","singleDate","_calc_date","_get_start_date","_get_duration","endspan","task_date","_change_duration","inps","btns","charCode","duration_val","_filter","_display","allow_root","root_label","tmpDom","newOptions","onselect","lightbox","_silent_redraw_lightbox","oldType","formData","updTask","_extend_to_optional","lightbox_block","optional_time","enable","disable","disabled","update_block","button_text","duration_optional","time_optional","total","payload","_endnm","escape","_utf","encodeURIComponent","setDataColumns","_columns","getSyncState","enableDataNames","enablePartialDataSend","_changed","rowId","findRow","existing","set_invalid","is_invalid","_clearUpdateFlag","markRow","sendData","details","checkBeforeUpdate","mytype","_h2","editStop","_beforeSendData","_sendData","serialize_one","stack","pref","a1","a3","_user","valid","_getAllData","out","has_one","setVerificator","verifFunction","clearVerificator","pattern","defineAction","_uActions","afterUpdateCallback","action","btag","correct","soid","tag","finalizeUpdate","cleanUpdate","atag","anObj","setOnAfterUpdate","enableDebug","setOnBeforeUpdateHandler","setAutoUpdate","interval","user","_need_update","_loader","_update_busy","xml_node","afterAutoUpdate","fullSync","self","setInterval","loadUpdate","getUpdates","dtmlXMLLoaderObject","waitCall","_v","_a","vers","doXPath","upds","check","scroll_size","_on_resize","$container","_reinit","_init_html_area","_init_touch_events","_init_templates","_set_scroll_events","_obj","childs","$grid","$scroll_hor","edit","delete","confirm_deleting","confirm_deleting_title","_calculate_content_height","rows_height","hor_scroll_height","_scroll_hor","_calculate_content_width","chart_width","_scroll_ver","autosize","_clean_el_size","_get_box_styles","computed","getComputedStyle","properties","boxSizing","MozBoxSizing","horPaddings","paddingLeft","paddingRight","borderLeftWidth","borderRightWidth","vertPaddings","paddingTop","paddingBottom","borderTopWidth","borderBottomWidth","borderBox","outerWidth","outerHeight","_do_autosize","boxSizes","reqHeight","reqWidth","_y","dataHeight","gridWidth","getScrollState","_save_scroll_state","_cached_scroll_pos","_restore_scroll_state","scrollTo","date_x","scroll_to","task_scroll_offset","setSizes","visible_date","preserve_scroll","new_pos","new_date","onMouseWheel","_wheel_time","wx","ff","deltaX","wheelDeltaX","wy","deltaY","wheelDelta","detail","prevent_default_scroll","_touch_scroll_active","barLeft","barTop","task_width","task_data_width","task_data_height","scroll_hor","scroll_ver","_get_target_node","attribute","test","trim","strict","drag_from_start","_touch_drag","host","updPerSecond","timeout","_on_timeout","unselectTask","getSelectedId","changeLightboxType","_skip_render","batchUpdate","dp_mode","call_dp","month_short","month_short_hash","month_full_hash","old","setMinutes","setSeconds","setMilliseconds","time_part","week_start","start_on_monday","month_start","setDate","year_start","setMonth","day_start","hour_start","minute_start","_add_days","ndate","setYear","to_fixed","num","format","utc","Function","str_to_date","splt","mask","getISOWeek","nday","first_thursday","year_number","ordinal_date","week_number","getUTCISOWeek","convert_to_utc","getUTCFullYear","getUTCMonth","getUTCDate","getUTCHours","getUTCMinutes","getUTCSeconds","xml_date","quarter_start","res_month","m","add_quarter","branch_loading","show_loading","api_date","server_utc","drag_move","dhx_save_btn","dhx_cancel_btn","dhx_delete_btn","project_sections","milestone_sections","min_grid_column_width","grid_resizer_column_attribute","grid_resizer_attribute","keep_grid_width","grid_resize","optimize_render","initial","registeredTemplates","_reg_templates","gantt_save_btn","icon_save","gantt_cancel_btn","icon_cancel","gantt_delete_btn","icon_delete","c","link_start","link_end","allowed","jQuery","$","methods","fn","dhx_gantt","views","each","day_full","day_short","icon_details","icon_edit","confirm_closing","section_description","section_time","section_type","column_text","column_start_date","column_duration","column_add","type_task","type_project","type_milestone","weeks","months","years","skyblue","meadow","terrace","broadway","_config_buttons_left","_config_buttons_right","touch_feedback","_touch_feedback","vibrate","msPointerEnabled","_touch_events","pointerType","MSPOINTER_TYPE_MOUSE","names","accessor","block_action","cloneTaskRendered","cloneNode","current_target","scroll_state","dblclicktime","action_mode","scroll_mode","action_start","long_tap_timer","_gantt_touch_event_ready"],"mappings":"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"} \ No newline at end of file diff --git a/libraries/dhtmlxgantt/sources/ext/dhtmlxgantt_marker.js b/libraries/dhtmlxgantt/sources/ext/dhtmlxgantt_marker.js deleted file mode 100644 index a7794c7..0000000 --- a/libraries/dhtmlxgantt/sources/ext/dhtmlxgantt_marker.js +++ /dev/null @@ -1,119 +0,0 @@ -/* -@license - -dhtmlxGantt v.3.2.0 Stardard -This software is covered by GPL license. You also can obtain Commercial or Enterprise license to use it in non-GPL project - please contact sales@dhtmlx.com. Usage without proper license is prohibited. - -(c) Dinamenta, UAB. -*/ - -if(!gantt._markers) - gantt._markers = {}; - -gantt.config.show_markers = true; - -gantt.attachEvent("onClear", function(){ - gantt._markers = {}; -}); - -gantt.attachEvent("onGanttReady", function(){ - var markerArea = document.createElement("div"); - markerArea.className = "gantt_marker_area"; - gantt.$task_data.appendChild(markerArea); - gantt.$marker_area = markerArea; - - gantt._markerRenderer = gantt._task_renderer("markers", render_marker, gantt.$marker_area, null); - - function render_marker(marker){ - if(!gantt.config.show_markers) - return false; - - if(!marker.start_date) - return false; - - var state = gantt.getState(); - if(+marker.start_date > +state.max_date) - return; - if(+marker.end_date && +marker.end_date < +state.min_date || +marker.start_date < +state.min_date) - return; - - var div = document.createElement("div"); - - div.setAttribute("marker_id", marker.id); - - var css = "gantt_marker"; - if(gantt.templates.marker_class) - css += " " + gantt.templates.marker_class(marker); - - if(marker.css){ - css += " " + marker.css; - } - - if(marker.title){ - div.title = marker.title; - } - div.className = css; - - var start = gantt.posFromDate(marker.start_date); - div.style.left = start + "px"; - div.style.height = Math.max(gantt._y_from_ind(gantt._order.length), 0) + "px"; - if(marker.end_date){ - var end = gantt.posFromDate(marker.end_date); - div.style.width = Math.max((end - start), 0) + "px"; - - } - - if(marker.text){ - div.innerHTML = "
" + marker.text + "
"; - } - - return div; - } -}); - - -gantt.attachEvent("onDataRender", function(){ - gantt.renderMarkers(); -}); - -gantt.getMarker = function(id){ - if(!this._markers) return null; - - return this._markers[id]; -}; - -gantt.addMarker = function(marker){ - marker.id = marker.id || dhtmlx.uid(); - - this._markers[marker.id] = marker; - - return marker.id; -}; - -gantt.deleteMarker = function(id){ - if(!this._markers || !this._markers[id]) - return false; - - delete this._markers[id]; - return true; -}; -gantt.updateMarker = function(id){ - if(this._markerRenderer) - this._markerRenderer.render_item(id); -}; -gantt.renderMarkers = function(){ - if(!this._markers) - return false; - - if(!this._markerRenderer) - return false; - - var to_render = []; - - for(var id in this._markers) - to_render.push(this._markers[id]); - - this._markerRenderer.render_items(to_render); - - return true; -}; \ No newline at end of file diff --git a/libraries/dhtmlxgantt/sources/ext/dhtmlxgantt_marker.js.map b/libraries/dhtmlxgantt/sources/ext/dhtmlxgantt_marker.js.map deleted file mode 100644 index bf19c2d..0000000 --- a/libraries/dhtmlxgantt/sources/ext/dhtmlxgantt_marker.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"dhtmlxgantt_marker.js","sources":["dhtmlxgantt_marker.js"],"names":["gantt","_markers","config","show_markers","attachEvent","render_marker","marker","start_date","state","getState","max_date","end_date","min_date","div","document","createElement","setAttribute","id","css","templates","marker_class","title","className","start","posFromDate","style","left","height","Math","max","_y_from_ind","_order","length","end","width","text","innerHTML","markerArea","$task_data","appendChild","$marker_area","_markerRenderer","_task_renderer","renderMarkers","getMarker","this","addMarker","dhtmlx","uid","deleteMarker","updateMarker","render_item","to_render","push","render_items"],"mappings":";;;;;;;;AASIA,MAAMC,WACTD,MAAMC,aAEPD,MAAME,OAAOC,cAAe,EAE5BH,MAAMI,YAAY,UAAW,WAC5BJ,MAAMC,cAGPD,MAAMI,YAAY,eAAgB,WAQjC,QAASC,GAAcC,GACtB,IAAIN,MAAME,OAAOC,aAChB,OAAO,CAER,KAAIG,EAAOC,WACV,OAAO,CAER,IAAIC,GAAQR,MAAMS,UAClB,OAAIH,EAAOC,YAAcC,EAAME,WAE3BJ,EAAOK,WAAaL,EAAOK,UAAYH,EAAMI,WAAaN,EAAOC,YAAcC,EAAMI,UAAzF,CAGA,GAAIC,GAAMC,SAASC,cAAc,MAEjCF,GAAIG,aAAa,YAAaV,EAAOW,GAErC,IAAIC,GAAM,cACPlB,OAAMmB,UAAUC,eAClBF,GAAO,IAAMlB,MAAMmB,UAAUC,aAAad;AAExCA,EAAOY,MACTA,GAAO,IAAMZ,EAAOY,KAGlBZ,EAAOe,QACTR,EAAIQ,MAAQf,EAAOe,OAEpBR,EAAIS,UAAYJ,CAEhB,IAAIK,GAAQvB,MAAMwB,YAAYlB,EAAOC,WAGrC,IAFAM,EAAIY,MAAMC,KAAOH,EAAQ,KACzBV,EAAIY,MAAME,OAASC,KAAKC,IAAI7B,MAAM8B,YAAY9B,MAAM+B,OAAOC,QAAS,GAAK,KACtE1B,EAAOK,SAAS,CAClB,GAAIsB,GAAMjC,MAAMwB,YAAYlB,EAAOK,SACnCE,GAAIY,MAAMS,MAAQN,KAAKC,IAAKI,EAAMV,EAAQ,GAAK,KAQhD,MAJGjB,GAAO6B,OACTtB,EAAIuB,UAAY,sCAAwC9B,EAAO6B,KAAO,UAGhEtB,GAlDR,GAAIwB,GAAavB,SAASC,cAAc,MACxCsB,GAAWf,UAAY,oBACvBtB,MAAMsC,WAAWC,YAAYF,GAC7BrC,MAAMwC,aAAeH,EAErBrC,MAAMyC,gBAAkBzC,MAAM0C,eAAe,UAAWrC,EAAeL,MAAMwC,aAAc;;GAkD5FxC,MAAMI,YAAY,eAAgB,WACjCJ,MAAM2C,kBAGP3C,MAAM4C,UAAY,SAAS3B,GAC1B,MAAI4B,MAAK5C,SAEF4C,KAAK5C,SAASgB,GAFK,MAK3BjB,MAAM8C,UAAY,SAASxC,GAK1B,MAJAA,GAAOW,GAAKX,EAAOW,IAAM8B,OAAOC,MAEhCH,KAAK5C,SAASK,EAAOW,IAAMX,EAEpBA,EAAOW,IAGfjB,MAAMiD,aAAe,SAAShC,GAC7B,MAAI4B,MAAK5C,UAAa4C,KAAK5C,SAASgB,UAG7B4B,MAAK5C,SAASgB,IACd,IAHC,GAKTjB,MAAMkD,aAAe,SAASjC,GAC1B4B,KAAKJ,iBACPI,KAAKJ,gBAAgBU,YAAYlC,IAEnCjB,MAAM2C,cAAgB,WACrB,IAAIE,KAAK5C,SACR,OAAO,CAER,KAAI4C,KAAKJ,gBACR,OAAO;;AAER,GAAIW,KAEJ,KAAI,GAAInC,KAAM4B,MAAK5C,SAClBmD,EAAUC,KAAKR,KAAK5C,SAASgB,GAI9B,OAFA4B,MAAKJ,gBAAgBa,aAAaF,IAE3B"} \ No newline at end of file diff --git a/libraries/dhtmlxgantt/sources/ext/dhtmlxgantt_multiselect.js b/libraries/dhtmlxgantt/sources/ext/dhtmlxgantt_multiselect.js deleted file mode 100644 index 9914cf7..0000000 --- a/libraries/dhtmlxgantt/sources/ext/dhtmlxgantt_multiselect.js +++ /dev/null @@ -1,241 +0,0 @@ -/* -@license - -dhtmlxGantt v.3.2.0 Stardard -This software is covered by GPL license. You also can obtain Commercial or Enterprise license to use it in non-GPL project - please contact sales@dhtmlx.com. Usage without proper license is prohibited. - -(c) Dinamenta, UAB. -*/ -gantt.config.multiselect = true; -gantt.config.multiselect_one_level = false; - -gantt._multiselect = { - selected: {}, - one_level: true, - active: true, - isActive: function(){ - this.update_state(); - return this.active; - }, - update_state: function(){ - this.one_level = gantt.config.multiselect_one_level; - var active = this.active; - this.active = gantt.config.multiselect; - if(this.active != active){ - this.reset(); - } - }, - reset: function () { - this.selected = {}; - }, - set_last_selected: function (id) { - this.last_selected = id; - }, - getLastSelected: function () { - return this.last_selected ? this.last_selected : null; - }, - select: function (id, e) { - if(gantt.callEvent("onBeforeTaskMultiSelect", [id, true, e])){ - this.selected[id] = true; - this.set_last_selected(id); - gantt.callEvent("onTaskMultiSelect", [id, true, e]); - } - }, - toggle: function (id, e) { - if(this.selected[id]){ - this.unselect(id, e); - }else{ - this.select(id, e); - } - }, - unselect: function (id, e) { - if(gantt.callEvent("onBeforeTaskMultiSelect", [id, false, e])){ - this.selected[id] = false; - if(this.last_selected == id) - this.last_selected = null; - - gantt.callEvent("onTaskMultiSelect", [id, true, e]); - } - }, - isSelected: function (id) { - return !!this.selected[id]; - }, - getSelected: function () { - var res = []; - for (var i in this.selected) { - if (this.selected[i]) { - res.push(i); - } - } - - res.sort(function(a, b){ - return gantt.calculateTaskLevel(gantt.getTask(a)) > gantt.calculateTaskLevel(gantt.getTask(b)) ? 1 : -1; - }); - - return res; - }, - forSelected: function (callback) { - var selected = this.getSelected(); - for (var i = 0; i < selected.length; i++) { - callback(selected[i]); - } - }, - is_same_level: function(id){ - if(!this.one_level) - return true; - var last = this.getLastSelected(); - if(!last) - return true; - - if(!(gantt.isTaskExists(last) && gantt.isTaskExists(id))) - return true; - - return !!(gantt.calculateTaskLevel(gantt.getTask(last)) == gantt.calculateTaskLevel(gantt.getTask(id))); - }, - _after_select: function(target){ - gantt.refreshTask(target); - }, - _do_selection: function(e) { - /* add onclick handler to gantt container, hook up multiselection */ - if(!this.isActive()) - return true; - var target_ev = gantt.locate(e); - var selected = this.getSelected(); - if (!target_ev) - return true; - - if(!gantt.callEvent("onBeforeMultiSelect", [e])){ - return true; - } - - if (e.ctrlKey) { - if (target_ev) { - this.toggle(target_ev, e); - this._after_select(target_ev); - } - } else if (e.shiftKey && selected.length) { - var last = this.getLastSelected(); - if (!last) - last = selected[selected.length - 1]; - if (target_ev && last != target_ev) { - var last_si = gantt.getGlobalTaskIndex(last); - var cur_si = gantt.getGlobalTaskIndex(target_ev); - var tmp = target_ev; - while (gantt.getGlobalTaskIndex(tmp) != last_si) { - this.select(tmp); - this._after_select(tmp); - tmp = (last_si > cur_si) ? gantt.getNext(tmp) : gantt.getPrev(tmp); - } - this.forSelected(dhtmlx.bind(function (task_id) { - var index = gantt.getGlobalTaskIndex(task_id); - if ((index > last_si && index > cur_si) || (index < last_si && index < cur_si)) { - this.unselect(task_id); - gantt.refreshTask(task_id); - } - }, this)); - } - - } - else { - this.forSelected(dhtmlx.bind(function (task_id) { - if (task_id != target_ev) { - this.unselect(task_id); - gantt.refreshTask(task_id); - } - }, this)); - if (!this.isSelected(target_ev)) { - - this.select(target_ev); - this._after_select(target_ev); - } - } - - if(!this.isSelected(target_ev)){ - return false; - } - return true; - } -}; - - -(function(){ - var old_selectTask = gantt.selectTask; - gantt.selectTask = function(id){ - var res = old_selectTask.call(this, id); - if(this.config.multiselect) - this._multiselect.select(id); - - return res; - }; - var old_unselectTask = gantt.unselectTask; - gantt.unselectTask = function(id){ - var res = old_unselectTask.call(this, id); - if(this.config.multiselect) - this._multiselect.unselect(id); - - return res; - }; - - gantt.toggleTaskSelection = function(id){ - if(this.config.multiselect) - this._multiselect.toggle(id); - }; - gantt.getSelectedTasks = function(){ - return this._multiselect.getSelected(); - }; - gantt.eachSelectedTask = function(callback){ - return this._multiselect.forSelected(callback); - }; - gantt.isSelectedTask = function(id){ - return this._multiselect.isSelected(id); - }; - gantt.getLastSelectedTask = function(){ - return this._multiselect.getLastSelected(); - }; - -})(); - -gantt.attachEvent("onTaskIdChange", function (id, new_id) { - var multiselect = gantt._multiselect; - if(!multiselect.isActive()) - return true; - - if (gantt.isSelectedTask(id)) { - multiselect.unselect(id, null); - multiselect.select(new_id, null); - gantt.refreshTask(new_id); - } -}); - -gantt.attachEvent("onAfterTaskDelete", function (id, item) { - var multiselect = gantt._multiselect; - if(!multiselect.isActive()) - return true; - - if (multiselect.selected[id]) - multiselect.unselect(id, null); - - multiselect.forSelected(function (task_id) { - if (!gantt.isTaskExists(task_id)) - multiselect.unselect(task_id, null); - }); -}); - -gantt.attachEvent("onBeforeTaskMultiSelect", function(id, select, e){ - var multiselect = gantt._multiselect; - if(select && multiselect.isActive()){ - return multiselect.is_same_level(id); - } - return true; -}); - -gantt.attachEvent("onTaskClick", function(id, e){ - var res = gantt._multiselect._do_selection(e); - gantt.callEvent("onMultiSelect", [e]); - return res; -}); -gantt.attachEvent("onEmptyClick", function (e){ - gantt._multiselect._do_selection(e); - gantt.callEvent("onMultiSelect", [e]); - return true; -}); \ No newline at end of file diff --git a/libraries/dhtmlxgantt/sources/ext/dhtmlxgantt_multiselect.js.map b/libraries/dhtmlxgantt/sources/ext/dhtmlxgantt_multiselect.js.map deleted file mode 100644 index 93b5d08..0000000 --- a/libraries/dhtmlxgantt/sources/ext/dhtmlxgantt_multiselect.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"dhtmlxgantt_multiselect.js","sources":["dhtmlxgantt_multiselect.js"],"names":["gantt","config","multiselect","multiselect_one_level","_multiselect","selected","one_level","active","isActive","this","update_state","reset","set_last_selected","id","last_selected","getLastSelected","select","e","callEvent","toggle","unselect","isSelected","getSelected","res","i","push","sort","a","b","calculateTaskLevel","getTask","forSelected","callback","length","is_same_level","last","isTaskExists","_after_select","target","refreshTask","_do_selection","target_ev","locate","ctrlKey","shiftKey","last_si","getGlobalTaskIndex","cur_si","tmp","getNext","getPrev","dhtmlx","bind","task_id","index","old_selectTask","selectTask","call","old_unselectTask","unselectTask","toggleTaskSelection","getSelectedTasks","eachSelectedTask","isSelectedTask","getLastSelectedTask","attachEvent","new_id"],"mappings":";;;;;;;;AAQAA,MAAMC,OAAOC,aAAc,EAC3BF,MAAMC,OAAOE,uBAAwB,EAErCH,MAAMI,cACLC,YACAC,WAAW,EACXC,QAAQ,EACRC,SAAU,WAET,MADAC,MAAKC,eACED,KAAKF,QAEbG,aAAc,WACbD,KAAKH,UAAYN,MAAMC,OAAOE,qBAC9B,IAAII,GAASE,KAAKF,MAClBE,MAAKF,OAASP,MAAMC,OAAOC,YACxBO,KAAKF,QAAUA,GACjBE,KAAKE,SAGPA,MAAO,WACNF,KAAKJ,aAENO,kBAAmB,SAAUC,GAC5BJ,KAAKK,cAAgBD,GAEtBE,gBAAiB,WAChB,MAAON,MAAKK,cAAgBL,KAAKK,cAAgB;;EAElDE,OAAQ,SAAUH,EAAII,GAClBjB,MAAMkB,UAAU,2BAA4BL,GAAI,EAAMI,MACxDR,KAAKJ,SAASQ,IAAM,EACpBJ,KAAKG,kBAAkBC,GACvBb,MAAMkB,UAAU,qBAAsBL,GAAI,EAAMI,MAGlDE,OAAQ,SAAUN,EAAII,GAClBR,KAAKJ,SAASQ,GAChBJ,KAAKW,SAASP,EAAII,GAElBR,KAAKO,OAAOH,EAAII,IAGlBG,SAAU,SAAUP,EAAII,GACpBjB,MAAMkB,UAAU,2BAA4BL,GAAI,EAAOI,MACzDR,KAAKJ,SAASQ,IAAM,EACjBJ,KAAKK,eAAiBD,IACxBJ,KAAKK,cAAgB,MAEtBd,MAAMkB,UAAU,qBAAsBL,GAAI,EAAMI,MAGlDI,WAAY,SAAUR,GACrB,QAASJ,KAAKJ,SAASQ,IAExBS,YAAa;AACZ,GAAIC,KACJ,KAAK,GAAIC,KAAKf,MAAKJ,SACdI,KAAKJ,SAASmB,IACjBD,EAAIE,KAAKD,EAQX,OAJAD,GAAIG,KAAK,SAASC,EAAGC,GACpB,MAAO5B,OAAM6B,mBAAmB7B,MAAM8B,QAAQH,IAAM3B,MAAM6B,mBAAmB7B,MAAM8B,QAAQF,IAAM,EAAI,KAG/FL,GAERQ,YAAa,SAAUC,GAEtB,IAAK,GADD3B,GAAWI,KAAKa,cACXE,EAAI,EAAGA,EAAInB,EAAS4B,OAAQT,IACpCQ,EAAS3B,EAASmB,KAGpBU,cAAe,SAASrB,GACvB,IAAIJ,KAAKH,UACR,OAAO,CACR,IAAI6B,GAAO1B,KAAKM,iBAChB,OAAIoB,IAGCnC,MAAMoC,aAAaD,IAASnC,MAAMoC,aAAavB,KAG1Cb,MAAM6B,mBAAmB7B,MAAM8B,QAAQK,KAAUnC,MAAM6B,mBAAmB7B,MAAM8B,QAAQjB,MAL1F;;EAOTwB,cAAe,SAASC,GACvBtC,MAAMuC,YAAYD,IAEnBE,cAAe,SAASvB,GAEvB,IAAIR,KAAKD,WACR,OAAO,CACR,IAAIiC,GAAYzC,MAAM0C,OAAOzB,GACzBZ,EAAWI,KAAKa,aACpB,KAAKmB,EACJ,OAAO,CAER,KAAIzC,MAAMkB,UAAU,uBAAwBD,IAC3C,OAAO,CAGR,IAAIA,EAAE0B,QACDF,IACHhC,KAAKU,OAAOsB,EAAWxB,GACvBR,KAAK4B,cAAcI,QAEd,IAAIxB,EAAE2B,UAAYvC,EAAS4B,OAAQ,CACzC,GAAIE,GAAO1B,KAAKM,iBAGhB,IAFKoB,IACJA,EAAO9B,EAASA,EAAS4B,OAAS,IAC/BQ,GAAaN,GAAQM,EAAW,CAInC,IAHA,GAAII,GAAU7C,MAAM8C,mBAAmBX,GACnCY,EAAS/C,MAAM8C,mBAAmBL,GAClCO,EAAMP,EACHzC,MAAM8C,mBAAmBE,IAAQH,GACvCpC,KAAKO,OAAOgC,GACZvC,KAAK4B,cAAcW;AACnBA,EAAOH,EAAUE,EAAU/C,MAAMiD,QAAQD,GAAOhD,MAAMkD,QAAQF,EAE/DvC,MAAKsB,YAAYoB,OAAOC,KAAK,SAAUC,GACtC,GAAIC,GAAQtD,MAAM8C,mBAAmBO,IAChCC,EAAQT,GAAWS,EAAQP,GAAoBF,EAARS,GAA2BP,EAARO,KAC9D7C,KAAKW,SAASiC,GACdrD,MAAMuC,YAAYc,KAEjB5C,YAKJA,MAAKsB,YAAYoB,OAAOC,KAAK,SAAUC,GAClCA,GAAWZ,IACdhC,KAAKW,SAASiC,GACdrD,MAAMuC,YAAYc,KAEjB5C,OACEA,KAAKY,WAAWoB,KAEpBhC,KAAKO,OAAOyB,GACZhC,KAAK4B,cAAcI,GAIrB,OAAIhC,MAAKY,WAAWoB,IAGb,GAFC,IAOV,WACC,GAAIc,GAAiBvD,MAAMwD,UAC3BxD,OAAMwD,WAAa,SAAS3C,GAC3B,GAAIU,GAAMgC,EAAeE,KAAKhD,KAAMI,EAIpC,OAHGJ,MAAKR,OAAOC,aACdO,KAAKL,aAAaY,OAAOH;AAEnBU,EAER,IAAImC,GAAmB1D,MAAM2D,YAC7B3D,OAAM2D,aAAe,SAAS9C,GAC7B,GAAIU,GAAMmC,EAAiBD,KAAKhD,KAAMI,EAItC,OAHGJ,MAAKR,OAAOC,aACdO,KAAKL,aAAagB,SAASP,GAErBU,GAGRvB,MAAM4D,oBAAsB,SAAS/C,GACjCJ,KAAKR,OAAOC,aACdO,KAAKL,aAAae,OAAON,IAE3Bb,MAAM6D,iBAAmB,WACxB,MAAOpD,MAAKL,aAAakB,eAE1BtB,MAAM8D,iBAAmB,SAAS9B,GACjC,MAAOvB,MAAKL,aAAa2B,YAAYC,IAEtChC,MAAM+D,eAAiB,SAASlD,GAC/B,MAAOJ,MAAKL,aAAaiB,WAAWR,IAErCb,MAAMgE,oBAAsB,WAC3B,MAAOvD,MAAKL,aAAaW;;KAK3Bf,MAAMiE,YAAY,iBAAkB,SAAUpD,EAAIqD,GACjD,GAAIhE,GAAcF,MAAMI,YACxB,OAAIF,GAAYM,gBAGZR,MAAM+D,eAAelD,KACxBX,EAAYkB,SAASP,EAAI,MACzBX,EAAYc,OAAOkD,EAAQ,MAC3BlE,MAAMuC,YAAY2B,MALX,IASTlE,MAAMiE,YAAY,oBAAqB,SAAUpD,GAChD,GAAIX,GAAcF,MAAMI,YACxB,OAAIF,GAAYM,YAGZN,EAAYG,SAASQ,IACxBX,EAAYkB,SAASP,EAAI,UAE1BX,GAAY6B,YAAY,SAAUsB,GAC5BrD,MAAMoC,aAAaiB,IACvBnD,EAAYkB,SAASiC,EAAS,UAPxB,IAWTrD,MAAMiE,YAAY,0BAA2B,SAASpD,EAAIG,GACzD,GAAId,GAAcF,MAAMI,YACxB,OAAGY,IAAUd,EAAYM,WACjBN,EAAYgC,cAAcrB,IAE3B;;GAGRb,MAAMiE,YAAY,cAAe,SAASpD,EAAII,GAC7C,GAAIM,GAAMvB,MAAMI,aAAaoC,cAAcvB,EAE3C,OADAjB,OAAMkB,UAAU,iBAAkBD,IAC3BM,IAERvB,MAAMiE,YAAY,eAAgB,SAAUhD,GAG3C,MAFAjB,OAAMI,aAAaoC,cAAcvB,GACjCjB,MAAMkB,UAAU,iBAAkBD,KAC3B"} \ No newline at end of file diff --git a/libraries/dhtmlxgantt/sources/ext/dhtmlxgantt_quick_info.js b/libraries/dhtmlxgantt/sources/ext/dhtmlxgantt_quick_info.js deleted file mode 100644 index 7092c92..0000000 --- a/libraries/dhtmlxgantt/sources/ext/dhtmlxgantt_quick_info.js +++ /dev/null @@ -1,218 +0,0 @@ -/* -@license - -dhtmlxGantt v.3.2.0 Stardard -This software is covered by GPL license. You also can obtain Commercial or Enterprise license to use it in non-GPL project - please contact sales@dhtmlx.com. Usage without proper license is prohibited. - -(c) Dinamenta, UAB. -*/ -gantt.config.quickinfo_buttons = ["icon_delete","icon_edit"]; -gantt.config.quick_info_detached = true; -gantt.config.show_quick_info = true; - -gantt.attachEvent("onTaskClick", function(id){ - gantt.showQuickInfo(id); - return true; -}); - -(function(){ - var events = ["onEmptyClick", "onViewChange", "onLightbox", "onBeforeTaskDelete", "onBeforeDrag"]; - var hiding_function = function(){ - gantt._hideQuickInfo(); - return true; - }; - for (var i=0; i" + - "
" + - "" + - "
"; - - //buttons - html += "
"; - var buttons = gantt.config.quickinfo_buttons; - - var is_editor = {"icon_delete":true,"icon_edit":true}; - - for (var i = 0; i < buttons.length; i++){ - if(this._quick_info_readonly && is_editor[buttons[i]]) - continue; - - html += "
"+gantt.locale.labels[buttons[i]]+"
"; - } - html += "
"; - - qi.innerHTML = html; - dhtmlxEvent(qi, "click", function(ev){ - ev = ev || event; - gantt._qi_button_click(ev.target || ev.srcElement); - }); - if (gantt.config.quick_info_detached) - dhtmlxEvent(gantt.$task_data, "scroll", function(){ gantt.hideQuickInfo(); }); - } - - return this._quick_info_box; -}; - -gantt._qi_button_click = function(node){ - var box = gantt._quick_info_box; - if (!node || node == box) return; - - var mask = node.className; - if (mask.indexOf("_icon")!=-1){ - var id = gantt._quick_info_box_id; - gantt.$click.buttons[mask.split(" ")[1].replace("icon_","")](id); - } else - gantt._qi_button_click(node.parentNode); -}; -gantt._get_event_counter_part = function(id){ - var domEv = gantt.getTaskNode(id); - var left = 0; - var top = 0; - - var node = domEv; - while (node && node.className != "gantt_task"){ - left += node.offsetLeft; - top += node.offsetTop; - node = node.offsetParent; - } - var scroll = this.getScrollState(); - if(node){ - var dx = (left + domEv.offsetWidth/2) - scroll.x > (gantt._x/2) ? 1 : 0; - var dy = (top + domEv.offsetHeight/2) - scroll.y > (gantt._y/2) ? 1 : 0; - - return { left:left, top:top, dx:dx, dy:dy, - width:domEv.offsetWidth, height:domEv.offsetHeight }; - } - return 0; -}; - -gantt._fill_quick_data = function(id){ - var ev = gantt.getTask(id); - var qi = gantt._quick_info_box; - - gantt._quick_info_box_id = id; - -//title content - var titleContent = qi.firstChild.firstChild; - titleContent.innerHTML = gantt.templates.quick_info_title(ev.start_date, ev.end_date, ev); - var titleDate = titleContent.nextSibling; - titleDate.innerHTML = gantt.templates.quick_info_date(ev.start_date, ev.end_date, ev); - -//main content - var main = qi.firstChild.nextSibling; - main.innerHTML = gantt.templates.quick_info_content(ev.start_date, ev.end_date, ev); -}; diff --git a/libraries/dhtmlxgantt/sources/ext/dhtmlxgantt_quick_info.js.map b/libraries/dhtmlxgantt/sources/ext/dhtmlxgantt_quick_info.js.map deleted file mode 100644 index 3d3bc9c..0000000 --- a/libraries/dhtmlxgantt/sources/ext/dhtmlxgantt_quick_info.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"dhtmlxgantt_quick_info.js","sources":["dhtmlxgantt_quick_info.js"],"names":["gantt","config","quickinfo_buttons","quick_info_detached","show_quick_info","attachEvent","id","showQuickInfo","events","hiding_function","_hideQuickInfo","i","length","templates","quick_info_title","start","end","ev","text","substr","quick_info_content","details","quick_info_date","task_time","quick_info_class","this","_quick_info_box_id","hideQuickInfo","pos","_get_event_counter_part","_quick_info_box","_init_quick_info","className","_prepare_quick_info_classname","_fill_quick_data","_show_quick_info","forced","qi","parentNode","removeChild","style","right","left","dhtmlxEvent","window","e","keyCode","nodeName","toLowerCase","$task_data","appendChild","width","offsetWidth","height","offsetHeight","scrolls","getScrollState","screen_width","$task","x","Math","min","max","dx","top","dy","setTimeout","_obj","task","getTask","css","template","start_date","end_date","_quick_info_readonly","_is_readonly","document","createElement","html","buttons","is_editor","icon_delete","icon_edit","locale","labels","innerHTML","event","_qi_button_click","target","srcElement","node","box","mask","indexOf","$click","split","replace","domEv","getTaskNode","offsetLeft","offsetTop","offsetParent","scroll","_x","y","_y","titleContent","firstChild","titleDate","nextSibling","main"],"mappings":"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"} \ No newline at end of file diff --git a/libraries/dhtmlxgantt/sources/ext/dhtmlxgantt_tooltip.js b/libraries/dhtmlxgantt/sources/ext/dhtmlxgantt_tooltip.js deleted file mode 100644 index 33e772a..0000000 --- a/libraries/dhtmlxgantt/sources/ext/dhtmlxgantt_tooltip.js +++ /dev/null @@ -1,172 +0,0 @@ -/* -@license - -dhtmlxGantt v.3.2.0 Stardard -This software is covered by GPL license. You also can obtain Commercial or Enterprise license to use it in non-GPL project - please contact sales@dhtmlx.com. Usage without proper license is prohibited. - -(c) Dinamenta, UAB. -*/ -gantt._tooltip = {}; -gantt._tooltip_class = "gantt_tooltip"; -gantt.config.tooltip_timeout = 30;//, -gantt.config.tooltip_offset_y = 20; -gantt.config.tooltip_offset_x = 10;//, - // timeout_to_hide: 50, - // delta_x: 15, - // delta_y: -20 - -gantt._create_tooltip = function(){ - if (!this._tooltip_html){ - this._tooltip_html = document.createElement('div'); - this._tooltip_html.className = gantt._tooltip_class; - } - return this._tooltip_html; -}; - -gantt._is_cursor_under_tooltip = function(mouse_pos, tooltip) { - if(mouse_pos.x >= tooltip.pos.x && mouse_pos.x <= (tooltip.pos.x + tooltip.width)) return true; - if(mouse_pos.y >= tooltip.pos.y && mouse_pos.y <= (tooltip.pos.y + tooltip.height)) return true; - return false; -}; - -gantt._show_tooltip = function(text, pos) { - if (gantt.config.touch && !gantt.config.touch_tooltip) return; - - var tip = this._create_tooltip(); - - tip.innerHTML = text; - gantt.$task_data.appendChild(tip); - - var width = tip.offsetWidth + 20; - var height = tip.offsetHeight + 40; - var max_height = this.$task.offsetHeight; - var max_width = this.$task.offsetWidth; - var scroll = this.getScrollState(); - - //pos.x += scroll.x; - pos.y += scroll.y; - - var mouse_pos = { - x: pos.x, - y: pos.y - }; - - pos.x += (gantt.config.tooltip_offset_x*1 || 0); - pos.y += (gantt.config.tooltip_offset_y*1 || 0); - - pos.y = Math.min(Math.max(scroll.y, pos.y), scroll.y+max_height - height); - pos.x = Math.min(Math.max(scroll.x, pos.x), scroll.x+max_width - width); - - if (gantt._is_cursor_under_tooltip(mouse_pos, {pos: pos, width: width, height: height})) { - if((mouse_pos.x+width) > (max_width + scroll.x)) pos.x = mouse_pos.x - (width - 20) - (gantt.config.tooltip_offset_x*1 || 0); - if((mouse_pos.y+height) > (max_height + scroll.y)) pos.y = mouse_pos.y - (height - 40) - (gantt.config.tooltip_offset_y*1 || 0); - } - - tip.style.left = pos.x + "px"; - tip.style.top = pos.y + "px"; -}; - -gantt._hide_tooltip = function(){ - if (this._tooltip_html && this._tooltip_html.parentNode) - this._tooltip_html.parentNode.removeChild(this._tooltip_html); - this._tooltip_id = 0; -}; - -gantt._is_tooltip = function(ev) { - var node = ev.target || ev.srcElement; - return gantt._is_node_child(node, function(node){ - return (node.className == this._tooltip_class); - }); -}; - -gantt._is_task_line = function(ev){ - var node = ev.target || ev.srcElement; - return gantt._is_node_child(node, function(node){ - return (node == this.$task_data); - }); -}; - -gantt._is_node_child = function(node, condition){ - var res = false; - while (node && !res) { - res = condition.call(gantt, node); - node = node.parentNode; - } - return res; -}; - -gantt._tooltip_pos = function(ev) { - if (ev.pageX || ev.pageY) - var pos = {x:ev.pageX, y:ev.pageY}; - - var d = _isIE ? document.documentElement : document.body; - var pos = { - x:ev.clientX + d.scrollLeft - d.clientLeft, - y:ev.clientY + d.scrollTop - d.clientTop - }; - - var box = gantt._get_position(gantt.$task_data); - pos.x = pos.x - box.x; - pos.y = pos.y - box.y; - return pos; -}; - -gantt.attachEvent("onMouseMove", function(event_id, ev) { // (gantt event_id, browser event) - if(this.config.tooltip_timeout){ - //making events survive timeout in ie - if(document.createEventObject && !document.createEvent) - ev = document.createEventObject(ev); - - var delay = this.config.tooltip_timeout; - - if(this._tooltip_id && !event_id){ - if(!isNaN(this.config.tooltip_hide_timeout)){ - delay = this.config.tooltip_hide_timeout; - } - } - - clearTimeout(gantt._tooltip_ev_timer); - gantt._tooltip_ev_timer = setTimeout(function(){ - gantt._init_tooltip(event_id, ev); - }, delay); - - }else{ - gantt._init_tooltip(event_id, ev); - } -}); -gantt._init_tooltip = function(event_id, ev){ - if (this._is_tooltip(ev)) return; - if (event_id == this._tooltip_id && !this._is_task_line(ev)) return; - if (!event_id) - return this._hide_tooltip(); - - this._tooltip_id = event_id; - - var task = this.getTask(event_id); - var text = this.templates.tooltip_text(task.start_date, task.end_date, task); - if (!text){ - this._hide_tooltip(); - return; - } - this._show_tooltip(text, this._tooltip_pos(ev)); -}; -gantt.attachEvent("onMouseLeave", function(ev){ - if (gantt._is_tooltip(ev)) return; - this._hide_tooltip(); -}); - -// gantt.attachEvent("onBeforeDrag", function() { -// gantt._tooltip.hide(); -// return true; -// }); -// gantt.attachEvent("onEventDeleted", function() { -// gantt._tooltip.hide(); -// return true; -// }); - - -/* Could be redifined */ -gantt.templates.tooltip_date_format = gantt.date.date_to_str("%Y-%m-%d"); -gantt.templates.tooltip_text = function(start, end, event) { - return "Task: " + event.text + "
Start date: " + gantt.templates.tooltip_date_format(start) + "
End date: " + gantt.templates.tooltip_date_format(end); -}; diff --git a/libraries/dhtmlxgantt/sources/ext/dhtmlxgantt_tooltip.js.map b/libraries/dhtmlxgantt/sources/ext/dhtmlxgantt_tooltip.js.map deleted file mode 100644 index cedf395..0000000 --- a/libraries/dhtmlxgantt/sources/ext/dhtmlxgantt_tooltip.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"dhtmlxgantt_tooltip.js","sources":["dhtmlxgantt_tooltip.js"],"names":["gantt","_tooltip","_tooltip_class","config","tooltip_timeout","tooltip_offset_y","tooltip_offset_x","_create_tooltip","this","_tooltip_html","document","createElement","className","_is_cursor_under_tooltip","mouse_pos","tooltip","x","pos","width","y","height","_show_tooltip","text","touch","touch_tooltip","tip","innerHTML","$task_data","appendChild","offsetWidth","offsetHeight","max_height","$task","max_width","scroll","getScrollState","Math","min","max","style","left","top","_hide_tooltip","parentNode","removeChild","_tooltip_id","_is_tooltip","ev","node","target","srcElement","_is_node_child","_is_task_line","condition","res","call","_tooltip_pos","pageX","pageY","d","_isIE","documentElement","body","clientX","scrollLeft","clientLeft","clientY","scrollTop","clientTop","box","_get_position","attachEvent","event_id","createEventObject","createEvent","delay","isNaN","tooltip_hide_timeout","clearTimeout","_tooltip_ev_timer","setTimeout","_init_tooltip","task","getTask","templates","tooltip_text","start_date","end_date","tooltip_date_format","date","date_to_str","start","end","event"],"mappings":"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"} \ No newline at end of file diff --git a/libraries/dhtmlxgantt/sources/locale/locale.js b/libraries/dhtmlxgantt/sources/locale/locale.js deleted file mode 100644 index 26f1e80..0000000 --- a/libraries/dhtmlxgantt/sources/locale/locale.js +++ /dev/null @@ -1,54 +0,0 @@ -/* -@license - -dhtmlxGantt v.3.2.0 Stardard -This software is covered by GPL license. You also can obtain Commercial or Enterprise license to use it in non-GPL project - please contact sales@dhtmlx.com. Usage without proper license is prohibited. - -(c) Dinamenta, UAB. -*/ -gantt.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:{ - new_task:"New task", - icon_save:"Save", - icon_cancel:"Cancel", - icon_details:"Details", - icon_edit:"Edit", - icon_delete:"Delete", - confirm_closing:"",//Your changes will be lost, are your sure ? - confirm_deleting:"Task will be deleted permanently, are you sure?", - section_description:"Description", - section_time:"Time period", - section_type:"Type", - - /* grid columns */ - - column_text : "Task name", - column_start_date : "Start time", - column_duration : "Duration", - column_add : "", - - /* link confirmation */ - link: "Link", - confirm_link_deleting:"will be deleted", - link_start: " (start)", - link_end: " (end)", - - type_task: "Task", - type_project: "Project", - type_milestone: "Milestone", - - minutes: "Minutes", - hours: "Hours", - days: "Days", - weeks: "Week", - months: "Months", - years: "Years" - } -}; - diff --git a/libraries/dhtmlxgantt/sources/locale/locale.js.map b/libraries/dhtmlxgantt/sources/locale/locale.js.map deleted file mode 100644 index 0cf516b..0000000 --- a/libraries/dhtmlxgantt/sources/locale/locale.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"locale.js","sources":["locale.js"],"names":["gantt","locale","date","month_full","month_short","day_full","day_short","labels","new_task","icon_save","icon_cancel","icon_details","icon_edit","icon_delete","confirm_closing","confirm_deleting","section_description","section_time","section_type","column_text","column_start_date","column_duration","column_add","link","confirm_link_deleting","link_start","link_end","type_task","type_project","type_milestone","minutes","hours","days","weeks","months","years"],"mappings":";;;;;;;;AAQAA,MAAMC,QACLC,MACCC,YAAY,UAAW,WAAY,QAAS,QAAS,MAAO,OAAQ,OAAQ,SAAU,YAAa,UAAW,WAAY,YAC1HC,aAAa,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,OAC1FC,UAAU,SAAU,SAAU,UAAW,YAAa,WAAY,SAAU,YAC5EC,WAAW,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,QAEtDC,QACCC,SAAS,WACTC,UAAU,OACVC,YAAY,SACZC,aAAa,UACbC,UAAU,OACVC,YAAY,SACZC,gBAAgB;AAChBC,iBAAiB,kDACXC,oBAAoB,cACpBC,aAAa,cACnBC,aAAa,OAIPC,YAAc,YACdC,kBAAoB,aACpBC,gBAAkB,WAClBC,WAAa,GAGnBC,KAAM,OACNC,sBAAsB,kBACtBC,WAAY,WACZC,SAAU,SAEVC,UAAW,OACXC,aAAc,UACdC,eAAgB,YAEVC,QAAS,UACTC,MAAO,QACPC,KAAM,OACNC,MAAO,OACPC,OAAQ,SACRC,MAAO"} \ No newline at end of file diff --git a/libraries/dhtmlxgantt/sources/locale/locale_ar.js b/libraries/dhtmlxgantt/sources/locale/locale_ar.js deleted file mode 100644 index d3709ed..0000000 --- a/libraries/dhtmlxgantt/sources/locale/locale_ar.js +++ /dev/null @@ -1,57 +0,0 @@ -/* -@license - -dhtmlxGantt v.3.2.0 Stardard -This software is covered by GPL license. You also can obtain Commercial or Enterprise license to use it in non-GPL project - please contact sales@dhtmlx.com. Usage without proper license is prohibited. - -(c) Dinamenta, UAB. -*/ -gantt.locale = { - date: { - month_full: ["كانون الثاني", "شباط", "آذار", "نيسان", "أيار", "حزيران", "تموز", "آب", "أيلول", "تشرين الأول", "تشرين الثاني", "كانون الأول"], - month_short: ["يناير", "فبراير", "مارس", "أبريل", "مايو", "يونيو", "يوليو", "أغسطس", "سبتمبر", "أكتوبر", "نوفمبر", "ديسمبر"], - day_full: ["الأحد", "الأثنين", "ألثلاثاء", "الأربعاء", "ألحميس", "ألجمعة", "السبت"], - day_short: ["احد", "اثنين", "ثلاثاء", "اربعاء", "خميس", "جمعة", "سبت"] - }, - labels: { - dhx_cal_today_button: "اليوم", - day_tab: "يوم", - week_tab: "أسبوع", - month_tab: "شهر", - new_event: "حدث جديد", - icon_save: "اخزن", - icon_cancel: "الغاء", - icon_details: "تفاصيل", - icon_edit: "تحرير", - icon_delete: "حذف", - confirm_closing: "التغييرات سوف تضيع, هل انت متأكد؟", //Your changes will be lost, are your sure ? - confirm_deleting: "الحدث سيتم حذفها نهائيا ، هل أنت متأكد؟", - section_description: "الوصف", - section_time: "الفترة الزمنية", - section_type:"Type", - /* grid columns */ - - column_text : "Task name", - column_start_date : "Start time", - column_duration : "Duration", - column_add : "", - - /* link confirmation */ - link: "Link", - confirm_link_deleting:"will be deleted", - link_start: " (start)", - link_end: " (end)", - - type_task: "Task", - type_project: "Project", - type_milestone: "Milestone", - - minutes: "Minutes", - hours: "Hours", - days: "Days", - weeks: "Week", - months: "Months", - years: "Years" - } -}; - diff --git a/libraries/dhtmlxgantt/sources/locale/locale_ar.js.map b/libraries/dhtmlxgantt/sources/locale/locale_ar.js.map deleted file mode 100644 index fb5162d..0000000 --- a/libraries/dhtmlxgantt/sources/locale/locale_ar.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"locale_ar.js","sources":["locale_ar.js"],"names":["gantt","locale","date","month_full","month_short","day_full","day_short","labels","dhx_cal_today_button","day_tab","week_tab","month_tab","new_event","icon_save","icon_cancel","icon_details","icon_edit","icon_delete","confirm_closing","confirm_deleting","section_description","section_time","section_type","column_text","column_start_date","column_duration","column_add","link","confirm_link_deleting","link_start","link_end","type_task","type_project","type_milestone","minutes","hours","days","weeks","months","years"],"mappings":";;;;;;;;AAQAA,MAAMC,QACLC,MACCC,YAAa,eAAgB,OAAQ,OAAQ,QAAS,OAAQ,SAAU,OAAQ,KAAM,QAAS,cAAe,eAAgB,eAC9HC,aAAc,QAAS,SAAU,OAAQ,QAAS,OAAQ,QAAS,QAAS,QAAS,SAAU,SAAU,SAAU,UACnHC,UAAW,QAAS,UAAW,WAAY,WAAY,SAAU,SAAU,SAC3EC,WAAY,MAAO,QAAS,SAAU,SAAU,OAAQ,OAAQ,QAEjEC,QACCC,qBAAsB,QACtBC,QAAS,MACTC,SAAU,QACVC,UAAW,MACXC,UAAW;AACXC,UAAW,OACXC,YAAa,QACbC,aAAc,SACdC,UAAW,QACXC,YAAa,MACbC,gBAAiB,oCACjBC,iBAAkB,0CAClBC,oBAAqB,QACrBC,aAAc,iBACdC,aAAa,OAGPC,YAAc,YACdC,kBAAoB,aACpBC,gBAAkB,WAClBC,WAAa,GAGnBC,KAAM,OACNC,sBAAsB,kBACtBC,WAAY,WACZC,SAAU,SAEVC,UAAW,OACXC,aAAc;AACdC,eAAgB,YAEVC,QAAS,UACTC,MAAO,QACPC,KAAM,OACNC,MAAO,OACPC,OAAQ,SACRC,MAAO"} \ No newline at end of file diff --git a/libraries/dhtmlxgantt/sources/locale/locale_be.js b/libraries/dhtmlxgantt/sources/locale/locale_be.js deleted file mode 100644 index 6a091d8..0000000 --- a/libraries/dhtmlxgantt/sources/locale/locale_be.js +++ /dev/null @@ -1,58 +0,0 @@ -/* -@license - -dhtmlxGantt v.3.2.0 Stardard -This software is covered by GPL license. You also can obtain Commercial or Enterprise license to use it in non-GPL project - please contact sales@dhtmlx.com. Usage without proper license is prohibited. - -(c) Dinamenta, UAB. -*/ -gantt.locale = { - date: { - month_full: ["Студзень", "Люты", "Сакавік", "Красавік", "Maй", "Чэрвень", "Ліпень", "Жнівень", "Верасень", "Кастрычнік", "Лістапад", "Снежань"], - month_short: ["Студз", "Лют", "Сак", "Крас", "Maй", "Чэр", "Ліп", "Жнів", "Вер", "Каст", "Ліст", "Снеж"], - day_full: [ "Нядзеля", "Панядзелак", "Аўторак", "Серада", "Чацвер", "Пятніца", "Субота"], - day_short: ["Нд", "Пн", "Аўт", "Ср", "Чцв", "Пт", "Сб"] - }, - labels: { - dhx_cal_today_button: "Сёння", - day_tab: "Дзень", - week_tab: "Тыдзень", - month_tab: "Месяц", - new_event: "Новая падзея", - icon_save: "Захаваць", - icon_cancel: "Адмяніць", - icon_details: "Дэталі", - icon_edit: "Змяніць", - icon_delete: "Выдаліць", - confirm_closing: "", //Унесеныя змены будуць страчаны, працягнуць? - confirm_deleting: "Падзея будзе выдалена незваротна, працягнуць?", - section_description: "Апісанне", - section_time: "Перыяд часу", - section_type:"Тып", - /* grid columns */ - - column_text : "Задача", - column_start_date : "Пачатак", - column_duration : "Працяг", - column_add : "", - - /* link confirmation */ - link: "Сувязь", - confirm_link_deleting:"будзе выдалена", - link_start: "(пачатак)", - link_end: "(канец)", - - type_task: "Task", - type_project: "Project", - type_milestone: "Milestone", - - - minutes: "Хвiлiна", - hours: "Гадзiна", - days: "Дзень", - weeks: "Тыдзень", - months: "Месяц", - years: "Год" - } -}; - diff --git a/libraries/dhtmlxgantt/sources/locale/locale_be.js.map b/libraries/dhtmlxgantt/sources/locale/locale_be.js.map deleted file mode 100644 index 5210a7a..0000000 --- a/libraries/dhtmlxgantt/sources/locale/locale_be.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"locale_be.js","sources":["locale_be.js"],"names":["gantt","locale","date","month_full","month_short","day_full","day_short","labels","dhx_cal_today_button","day_tab","week_tab","month_tab","new_event","icon_save","icon_cancel","icon_details","icon_edit","icon_delete","confirm_closing","confirm_deleting","section_description","section_time","section_type","column_text","column_start_date","column_duration","column_add","link","confirm_link_deleting","link_start","link_end","type_task","type_project","type_milestone","minutes","hours","days","weeks","months","years"],"mappings":";;;;;;;;AAQAA,MAAMC,QACLC,MACCC,YAAa,WAAY,OAAQ,UAAW,WAAY,MAAO,UAAW,SAAU,UAAW,WAAY,aAAc,WAAY,WACrIC,aAAc,QAAS,MAAO,MAAO,OAAQ,MAAO,MAAO,MAAO,OAAQ,MAAO,OAAQ,OAAQ,QACjGC,UAAY,UAAW,aAAc,UAAW,SAAU,SAAU,UAAW,UAC/EC,WAAY,KAAM,KAAM,MAAO,KAAM,MAAO,KAAM,OAEnDC,QACCC,qBAAsB,QACtBC,QAAS,QACTC,SAAU,UACVC,UAAW,QACXC,UAAW,eACXC,UAAW;AACXC,YAAa,WACbC,aAAc,SACdC,UAAW,UACXC,YAAa,WACbC,gBAAiB,GACjBC,iBAAkB,gDAClBC,oBAAqB,WACrBC,aAAc,cACdC,aAAa,MAGPC,YAAc,SACdC,kBAAoB,UACpBC,gBAAkB,SAClBC,WAAa,GAGnBC,KAAM,SACNC,sBAAsB,iBACtBC,WAAY,YACZC,SAAU,UAEVC,UAAW,OACXC,aAAc,UACdC,eAAgB,YAGVC,QAAS;AACTC,MAAO,UACPC,KAAM,QACNC,MAAO,UACPC,OAAQ,QACRC,MAAO"} \ No newline at end of file diff --git a/libraries/dhtmlxgantt/sources/locale/locale_ca.js b/libraries/dhtmlxgantt/sources/locale/locale_ca.js deleted file mode 100644 index 9175634..0000000 --- a/libraries/dhtmlxgantt/sources/locale/locale_ca.js +++ /dev/null @@ -1,61 +0,0 @@ -/* -@license - -dhtmlxGantt v.3.2.0 Stardard -This software is covered by GPL license. You also can obtain Commercial or Enterprise license to use it in non-GPL project - please contact sales@dhtmlx.com. Usage without proper license is prohibited. - -(c) Dinamenta, UAB. -*/ -/* - @Traducido por Vicente Adria Bohigues - vicenteadria@hotmail.com - */ -gantt.locale = { - date: { - month_full: ["Gener", "Febrer", "Març", "Abril", "Maig", "Juny", "Juliol", "Agost", "Setembre", "Octubre", "Novembre", "Desembre"], - month_short: ["Gen", "Feb", "Mar", "Abr", "Mai", "Jun", "Jul", "Ago", "Set", "Oct", "Nov", "Des"], - day_full: ["Diumenge", "Dilluns", "Dimarts", "Dimecres", "Dijous", "Divendres", "Dissabte"], - day_short: ["Dg", "Dl", "Dm", "Dc", "Dj", "Dv", "Ds"] - }, - labels: { - dhx_cal_today_button: "Hui", - day_tab: "Dia", - week_tab: "Setmana", - month_tab: "Mes", - new_event: "Nou esdeveniment", - icon_save: "Guardar", - icon_cancel: "Cancel·lar", - icon_details: "Detalls", - icon_edit: "Editar", - icon_delete: "Esborrar", - confirm_closing: "", //"Els seus canvis es perdràn, continuar ?" - confirm_deleting: "L'esdeveniment s'esborrarà definitivament, continuar ?", - section_description: "Descripció", - section_time: "Periode de temps", - section_type:"Type", - /* grid columns */ - - column_text : "Task name", - column_start_date : "Start time", - column_duration : "Duration", - column_add : "", - - /* link confirmation */ - link: "Link", - confirm_link_deleting:"will be deleted", - link_start: " (start)", - link_end: " (end)", - - type_task: "Task", - type_project: "Project", - type_milestone: "Milestone", - - - minutes: "Minutes", - hours: "Hours", - days: "Days", - weeks: "Week", - months: "Months", - years: "Years" - } -}; - diff --git a/libraries/dhtmlxgantt/sources/locale/locale_ca.js.map b/libraries/dhtmlxgantt/sources/locale/locale_ca.js.map deleted file mode 100644 index 6a60785..0000000 --- a/libraries/dhtmlxgantt/sources/locale/locale_ca.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"locale_ca.js","sources":["locale_ca.js"],"names":["gantt","locale","date","month_full","month_short","day_full","day_short","labels","dhx_cal_today_button","day_tab","week_tab","month_tab","new_event","icon_save","icon_cancel","icon_details","icon_edit","icon_delete","confirm_closing","confirm_deleting","section_description","section_time","section_type","column_text","column_start_date","column_duration","column_add","link","confirm_link_deleting","link_start","link_end","type_task","type_project","type_milestone","minutes","hours","days","weeks","months","years"],"mappings":";;;;;;;;AAWAA,MAAMC,QACLC,MACCC,YAAa,QAAS,SAAU,OAAQ,QAAS,OAAQ,OAAQ,SAAU,QAAS,WAAY,UAAW,WAAY,YACvHC,aAAc,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,OAC3FC,UAAW,WAAY,UAAW,UAAW,WAAY,SAAU,YAAa,YAChFC,WAAY,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,OAEjDC,QACCC,qBAAsB,MACtBC,QAAS,MACTC,SAAU,UACVC,UAAW,MACXC,UAAW,mBACXC,UAAW,UACXC,YAAa;AACbC,aAAc,UACdC,UAAW,SACXC,YAAa,WACbC,gBAAiB,GACjBC,iBAAkB,yDAClBC,oBAAqB,aACrBC,aAAc,mBACdC,aAAa,OAGPC,YAAc,YACdC,kBAAoB,aACpBC,gBAAkB,WAClBC,WAAa,GAGnBC,KAAM,OACNC,sBAAsB,kBACtBC,WAAY,WACZC,SAAU,SAEVC,UAAW,OACXC,aAAc,UACdC,eAAgB,YAGVC,QAAS;AACTC,MAAO,QACPC,KAAM,OACNC,MAAO,OACPC,OAAQ,SACRC,MAAO"} \ No newline at end of file diff --git a/libraries/dhtmlxgantt/sources/locale/locale_cn.js b/libraries/dhtmlxgantt/sources/locale/locale_cn.js deleted file mode 100644 index cb9a970..0000000 --- a/libraries/dhtmlxgantt/sources/locale/locale_cn.js +++ /dev/null @@ -1,64 +0,0 @@ -/* -@license - -dhtmlxGantt v.3.2.0 Stardard -This software is covered by GPL license. You also can obtain Commercial or Enterprise license to use it in non-GPL project - please contact sales@dhtmlx.com. Usage without proper license is prohibited. - -(c) Dinamenta, UAB. -*/ -/* -Translation by FreezeSoul -*/ -gantt.config.day_date="%M %d日 %D"; -gantt.config.default_date="%Y年 %M %d日"; -gantt.config.month_date="%Y年 %M"; - -gantt.locale={ - date: { - month_full: ["一月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "十一月", "十二月"], - month_short: ["1月", "2月", "3月", "4月", "5月", "6月", "7月", "8月", "9月", "10月", "11月", "12月"], - day_full: ["星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"], - day_short: ["日", "一", "二", "三", "四", "五", "六"] - }, - labels: { - dhx_cal_today_button: "今天", - day_tab: "日", - week_tab: "周", - month_tab: "月", - new_event: "新建日程", - icon_save: "保存", - icon_cancel: "关闭", - icon_details: "详细", - icon_edit: "编辑", - icon_delete: "删除", - confirm_closing: "请确认是否撤销修改!", //Your changes will be lost, are your sure? - confirm_deleting: "是否删除日程?", - section_description: "描述", - section_time: "时间范围", - section_type:"Type", - /* grid columns */ - - column_text : "Task name", - column_start_date : "Start time", - column_duration : "Duration", - column_add : "", - - /* link confirmation */ - link: "Link", - confirm_link_deleting:"will be deleted", - link_start: " (start)", - link_end: " (end)", - - type_task: "Task", - type_project: "Project", - type_milestone: "Milestone", - - minutes: "Minutes", - hours: "Hours", - days: "Days", - weeks: "Week", - months: "Months", - years: "Years" - } -}; - diff --git a/libraries/dhtmlxgantt/sources/locale/locale_cn.js.map b/libraries/dhtmlxgantt/sources/locale/locale_cn.js.map deleted file mode 100644 index 5c50547..0000000 --- a/libraries/dhtmlxgantt/sources/locale/locale_cn.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"locale_cn.js","sources":["locale_cn.js"],"names":["gantt","config","day_date","default_date","month_date","locale","date","month_full","month_short","day_full","day_short","labels","dhx_cal_today_button","day_tab","week_tab","month_tab","new_event","icon_save","icon_cancel","icon_details","icon_edit","icon_delete","confirm_closing","confirm_deleting","section_description","section_time","section_type","column_text","column_start_date","column_duration","column_add","link","confirm_link_deleting","link_start","link_end","type_task","type_project","type_milestone","minutes","hours","days","weeks","months","years"],"mappings":";;;;;;;;AAWAA,MAAMC,OAAOC,SAAS,YACtBF,MAAMC,OAAOE,aAAa,aAC1BH,MAAMC,OAAOG,WAAW,SAExBJ,MAAMK,QACLC,MACCC,YAAa,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,MAAO,OAChFC,aAAc,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,MAAO,MAAO,OAClFC,UAAW,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,OACrDC,WAAY,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAE3CC,QACCC,qBAAsB,KACtBC,QAAS,IACTC,SAAU,IACVC,UAAW,IACXC,UAAW,OACXC,UAAW,KACXC,YAAa,KACbC,aAAc;AACdC,UAAW,KACXC,YAAa,KACbC,gBAAiB,aACjBC,iBAAkB,UAClBC,oBAAqB,KACrBC,aAAc,OACdC,aAAa,OAGPC,YAAc,YACdC,kBAAoB,aACpBC,gBAAkB,WAClBC,WAAa,GAGnBC,KAAM,OACNC,sBAAsB,kBACtBC,WAAY,WACZC,SAAU,SAEVC,UAAW,OACXC,aAAc,UACdC,eAAgB,YAEVC,QAAS,UACTC,MAAO,QACPC,KAAM,OACNC,MAAO,OACPC,OAAQ,SACRC,MAAO"} \ No newline at end of file diff --git a/libraries/dhtmlxgantt/sources/locale/locale_cs.js b/libraries/dhtmlxgantt/sources/locale/locale_cs.js deleted file mode 100644 index 43644b7..0000000 --- a/libraries/dhtmlxgantt/sources/locale/locale_cs.js +++ /dev/null @@ -1,58 +0,0 @@ -/* -@license - -dhtmlxGantt v.3.2.0 Stardard -This software is covered by GPL license. You also can obtain Commercial or Enterprise license to use it in non-GPL project - please contact sales@dhtmlx.com. Usage without proper license is prohibited. - -(c) Dinamenta, UAB. -*/ -gantt.locale = { - date: { - month_full: ["Leden", "Únor", "Březen", "Duben", "Květen", "Červen", "Červenec", "Srpen", "Září", "Říjen", "Listopad", "Prosinec"], - month_short: ["Led", "Ún", "Bře", "Dub", "Kvě", "Čer", "Čec", "Srp", "Září", "Říj", "List", "Pro"], - day_full: ["Neděle", "Pondělí", "Úterý", "Středa", "Čtvrtek", "Pátek", "Sobota"], - day_short: ["Ne", "Po", "Út", "St", "Čt", "Pá", "So"] - }, - labels: { - dhx_cal_today_button: "Dnes", - day_tab: "Den", - week_tab: "Týden", - month_tab: "Měsíc", - new_event: "Nová událost", - icon_save: "Uložit", - icon_cancel: "Zpět", - icon_details: "Detail", - icon_edit: "Edituj", - icon_delete: "Smazat", - confirm_closing: "", //Vaše změny budou ztraceny, opravdu ? - confirm_deleting: "Událost bude trvale smazána, opravdu?", - section_description: "Poznámky", - section_time: "Doba platnosti", - section_type:"Type", - /* grid columns */ - - column_text : "Task name", - column_start_date : "Start time", - column_duration : "Duration", - column_add : "", - - /* link confirmation */ - link: "Link", - confirm_link_deleting:"will be deleted", - link_start: " (start)", - link_end: " (end)", - - type_task: "Task", - type_project: "Project", - type_milestone: "Milestone", - - - minutes: "Minutes", - hours: "Hours", - days: "Days", - weeks: "Week", - months: "Months", - years: "Years" - } -}; - diff --git a/libraries/dhtmlxgantt/sources/locale/locale_cs.js.map b/libraries/dhtmlxgantt/sources/locale/locale_cs.js.map deleted file mode 100644 index ef3cdb9..0000000 --- a/libraries/dhtmlxgantt/sources/locale/locale_cs.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"locale_cs.js","sources":["locale_cs.js"],"names":["gantt","locale","date","month_full","month_short","day_full","day_short","labels","dhx_cal_today_button","day_tab","week_tab","month_tab","new_event","icon_save","icon_cancel","icon_details","icon_edit","icon_delete","confirm_closing","confirm_deleting","section_description","section_time","section_type","column_text","column_start_date","column_duration","column_add","link","confirm_link_deleting","link_start","link_end","type_task","type_project","type_milestone","minutes","hours","days","weeks","months","years"],"mappings":";;;;;;;;AAQAA,MAAMC,QACLC,MACCC,YAAa,QAAS,OAAQ,SAAU,QAAS,SAAU,SAAU,WAAY,QAAS,OAAQ,QAAS,WAAY,YACvHC,aAAc,MAAO,KAAM,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,OAAQ,MAAO,OAAQ,OAC5FC,UAAW,SAAU,UAAW,QAAS,SAAU,UAAW,QAAS,UACvEC,WAAY,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,OAEjDC,QACCC,qBAAsB,OACtBC,QAAS,MACTC,SAAU,QACVC,UAAW,QACXC,UAAW,eACXC,UAAW,SACXC,YAAa,OACbC,aAAc;AACdC,UAAW,SACXC,YAAa,SACbC,gBAAiB,GACjBC,iBAAkB,wCAClBC,oBAAqB,WACrBC,aAAc,iBACdC,aAAa,OAGPC,YAAc,YACdC,kBAAoB,aACpBC,gBAAkB,WAClBC,WAAa,GAGnBC,KAAM,OACNC,sBAAsB,kBACtBC,WAAY,WACZC,SAAU,SAEVC,UAAW,OACXC,aAAc,UACdC,eAAgB,YAGVC,QAAS,UACTC,MAAO,QACPC,KAAM,OACNC,MAAO;AACPC,OAAQ,SACRC,MAAO"} \ No newline at end of file diff --git a/libraries/dhtmlxgantt/sources/locale/locale_da.js b/libraries/dhtmlxgantt/sources/locale/locale_da.js deleted file mode 100644 index 5db95e3..0000000 --- a/libraries/dhtmlxgantt/sources/locale/locale_da.js +++ /dev/null @@ -1,58 +0,0 @@ -/* -@license - -dhtmlxGantt v.3.2.0 Stardard -This software is covered by GPL license. You also can obtain Commercial or Enterprise license to use it in non-GPL project - please contact sales@dhtmlx.com. Usage without proper license is prohibited. - -(c) Dinamenta, UAB. -*/ -gantt.locale = { - date: { - month_full: ["Januar", "Februar", "Marts", "April", "Maj", "Juni", "Juli", "August", "September", "Oktober", "November", "December"], - month_short: ["Jan", "Feb", "Mar", "Apr", "Maj", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Dec"], - day_full: ["Søndag", "Mandag", "Tirsdag", "Onsdag", "Torsdag", "Fredag", "Lørdag"], - day_short: ["Søn", "Man", "Tir", "Ons", "Tor", "Fre", "Lør"] - }, - labels: { - dhx_cal_today_button: "Idag", - day_tab: "Dag", - week_tab: "Uge", - month_tab: "Måned", - new_event: "Ny begivenhed", - icon_save: "Gem", - icon_cancel: "Fortryd", - icon_details: "Detaljer", - icon_edit: "Tilret", - icon_delete: "Slet", - confirm_closing: "Dine rettelser vil gå tabt.. Er dy sikker?", //Your changes will be lost, are your sure ? - confirm_deleting: "Bigivenheden vil blive slettet permanent. Er du sikker?", - section_description: "Beskrivelse", - section_time: "Tidsperiode", - section_type:"Type", - /* grid columns */ - - column_text : "Task name", - column_start_date : "Start time", - column_duration : "Duration", - column_add : "", - - /* link confirmation */ - link: "Link", - confirm_link_deleting:"will be deleted", - link_start: " (start)", - link_end: " (end)", - - type_task: "Task", - type_project: "Project", - type_milestone: "Milestone", - - - minutes: "Minutes", - hours: "Hours", - days: "Days", - weeks: "Week", - months: "Months", - years: "Years" - } -}; - diff --git a/libraries/dhtmlxgantt/sources/locale/locale_da.js.map b/libraries/dhtmlxgantt/sources/locale/locale_da.js.map deleted file mode 100644 index 72ca8ff..0000000 --- a/libraries/dhtmlxgantt/sources/locale/locale_da.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"locale_da.js","sources":["locale_da.js"],"names":["gantt","locale","date","month_full","month_short","day_full","day_short","labels","dhx_cal_today_button","day_tab","week_tab","month_tab","new_event","icon_save","icon_cancel","icon_details","icon_edit","icon_delete","confirm_closing","confirm_deleting","section_description","section_time","section_type","column_text","column_start_date","column_duration","column_add","link","confirm_link_deleting","link_start","link_end","type_task","type_project","type_milestone","minutes","hours","days","weeks","months","years"],"mappings":";;;;;;;;AAQAA,MAAMC,QACLC,MACCC,YAAa,SAAU,UAAW,QAAS,QAAS,MAAO,OAAQ,OAAQ,SAAU,YAAa,UAAW,WAAY,YACzHC,aAAc,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,OAC3FC,UAAW,SAAU,SAAU,UAAW,SAAU,UAAW,SAAU,UACzEC,WAAY,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,QAEvDC,QACCC,qBAAsB,OACtBC,QAAS,MACTC,SAAU,MACVC,UAAW,QACXC,UAAW,gBACXC,UAAW,MACXC,YAAa;AACbC,aAAc,WACdC,UAAW,SACXC,YAAa,OACbC,gBAAiB,6CACjBC,iBAAkB,0DAClBC,oBAAqB,cACrBC,aAAc,cACdC,aAAa,OAGPC,YAAc,YACdC,kBAAoB,aACpBC,gBAAkB,WAClBC,WAAa,GAGnBC,KAAM,OACNC,sBAAsB,kBACtBC,WAAY,WACZC,SAAU,SAEVC,UAAW,OACXC,aAAc;AACdC,eAAgB,YAGVC,QAAS,UACTC,MAAO,QACPC,KAAM,OACNC,MAAO,OACPC,OAAQ,SACRC,MAAO"} \ No newline at end of file diff --git a/libraries/dhtmlxgantt/sources/locale/locale_de.js b/libraries/dhtmlxgantt/sources/locale/locale_de.js deleted file mode 100644 index ebdc1f3..0000000 --- a/libraries/dhtmlxgantt/sources/locale/locale_de.js +++ /dev/null @@ -1,58 +0,0 @@ -/* -@license - -dhtmlxGantt v.3.2.0 Stardard -This software is covered by GPL license. You also can obtain Commercial or Enterprise license to use it in non-GPL project - please contact sales@dhtmlx.com. Usage without proper license is prohibited. - -(c) Dinamenta, UAB. -*/ -gantt.locale = { - date: { - month_full: [" Januar", " Februar", " März ", " April", " Mai", " Juni", " Juli", " August", " September ", " Oktober", " November ", " Dezember"], - month_short: ["Jan", "Feb", "Mär", "Apr", "Mai", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Dec"], - day_full: [ "Sonntag", "Montag", "Dienstag", " Mittwoch", " Donnerstag", "Freitag", "Samstag"], - day_short: ["So", "Mo", "Di", "Mi", "Do", "Fr", "Sa"] - }, - labels: { - dhx_cal_today_button: "Heute", - day_tab: "Tag", - week_tab: "Woche", - month_tab: "Monat", - new_event: "neuer Eintrag", - icon_save: "Speichern", - icon_cancel: "Abbrechen", - icon_details: "Details", - icon_edit: "Ändern", - icon_delete: "Löschen", - confirm_closing: "", //"Ihre Veränderungen werden verloren sein, wollen Sie ergänzen? " - confirm_deleting: "Der Eintrag wird gelöscht", - section_description: "Beschreibung", - section_time: "Zeitspanne", - section_type:"Type", - /* grid columns */ - - column_text : "Task-Namen", - column_start_date : "Startzeit", - column_duration : "Dauer", - column_add : "", - - /* link confirmation */ - link: "Link", - confirm_link_deleting:"werden gelöscht", - link_start: "(starten)", - link_end: "(ende)", - - type_task: "Task", - type_project: "Project", - type_milestone: "Milestone", - - - minutes: "Minuten", - hours: "Stunden", - days: "Tage", - weeks: "Wochen", - months: "Monate", - years: "Jahre" - } -}; - diff --git a/libraries/dhtmlxgantt/sources/locale/locale_de.js.map b/libraries/dhtmlxgantt/sources/locale/locale_de.js.map deleted file mode 100644 index 8d5fcac..0000000 --- a/libraries/dhtmlxgantt/sources/locale/locale_de.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"locale_de.js","sources":["locale_de.js"],"names":["gantt","locale","date","month_full","month_short","day_full","day_short","labels","dhx_cal_today_button","day_tab","week_tab","month_tab","new_event","icon_save","icon_cancel","icon_details","icon_edit","icon_delete","confirm_closing","confirm_deleting","section_description","section_time","section_type","column_text","column_start_date","column_duration","column_add","link","confirm_link_deleting","link_start","link_end","type_task","type_project","type_milestone","minutes","hours","days","weeks","months","years"],"mappings":";;;;;;;;AAQAA,MAAMC,QACLC,MACCC,YAAa,UAAW,WAAY,SAAU,SAAU,OAAQ,QAAS,QAAS,UAAW,cAAe,WAAY,aAAc,aACtIC,aAAc,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,OAC3FC,UAAY,UAAW,SAAU,WAAY,YAAa,cAAe,UAAW,WACpFC,WAAY,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,OAEjDC,QACCC,qBAAsB,QACtBC,QAAS,MACTC,SAAU,QACVC,UAAW,QACXC,UAAW,gBACXC,UAAW;AACXC,YAAa,YACbC,aAAc,UACdC,UAAW,SACXC,YAAa,UACbC,gBAAiB,GACjBC,iBAAkB,4BAClBC,oBAAqB,eACrBC,aAAc,aACdC,aAAa,OAGPC,YAAc,aACdC,kBAAoB,YACpBC,gBAAkB,QAClBC,WAAa,GAGnBC,KAAM,OACNC,sBAAsB,kBACtBC,WAAY,YACZC,SAAU,SAEVC,UAAW,OACXC,aAAc,UACdC,eAAgB,YAGVC,QAAS;AACTC,MAAO,UACPC,KAAM,OACNC,MAAO,SACPC,OAAQ,SACRC,MAAO"} \ No newline at end of file diff --git a/libraries/dhtmlxgantt/sources/locale/locale_el.js b/libraries/dhtmlxgantt/sources/locale/locale_el.js deleted file mode 100644 index 8384041..0000000 --- a/libraries/dhtmlxgantt/sources/locale/locale_el.js +++ /dev/null @@ -1,58 +0,0 @@ -/* -@license - -dhtmlxGantt v.3.2.0 Stardard -This software is covered by GPL license. You also can obtain Commercial or Enterprise license to use it in non-GPL project - please contact sales@dhtmlx.com. Usage without proper license is prohibited. - -(c) Dinamenta, UAB. -*/ -gantt.locale = { - date: { - month_full: ["Ιανουάριος", "Φεβρουάριος", "Μάρτιος", "Απρίλιος", "Μάϊος", "Ιούνιος", "Ιούλιος", "Αύγουστος", "Σεπτέμβριος", "Οκτώβριος", "Νοέμβριος", "Δεκέμβριος"], - month_short: ["ΙΑΝ", "ΦΕΒ", "ΜΑΡ", "ΑΠΡ", "ΜΑΙ", "ΙΟΥΝ", "ΙΟΥΛ", "ΑΥΓ", "ΣΕΠ", "ΟΚΤ", "ΝΟΕ", "ΔΕΚ"], - day_full: ["Κυριακή", "Δευτέρα", "Τρίτη", "Τετάρτη", "Πέμπτη", "Παρασκευή", "Κυριακή"], - day_short: ["ΚΥ", "ΔΕ", "ΤΡ", "ΤΕ", "ΠΕ", "ΠΑ", "ΣΑ"] - }, - labels: { - dhx_cal_today_button: "Σήμερα", - day_tab: "Ημέρα", - week_tab: "Εβδομάδα", - month_tab: "Μήνας", - new_event: "Νέο έργο", - icon_save: "Αποθήκευση", - icon_cancel: "Άκυρο", - icon_details: "Λεπτομέρειες", - icon_edit: "Επεξεργασία", - icon_delete: "Διαγραφή", - confirm_closing: "", //Your changes will be lost, are your sure ? - confirm_deleting: "Το έργο θα διαγραφεί οριστικά. Θέλετε να συνεχίσετε;", - section_description: "Περιγραφή", - section_time: "Χρονική περίοδος", - section_type:"Type", - /* grid columns */ - - column_text : "Task name", - column_start_date : "Start time", - column_duration : "Duration", - column_add : "", - - /* link confirmation */ - link: "Link", - confirm_link_deleting:"will be deleted", - link_start: " (start)", - link_end: " (end)", - - type_task: "Task", - type_project: "Project", - type_milestone: "Milestone", - - - minutes: "Minutes", - hours: "Hours", - days: "Days", - weeks: "Week", - months: "Months", - years: "Years" - } -}; - diff --git a/libraries/dhtmlxgantt/sources/locale/locale_el.js.map b/libraries/dhtmlxgantt/sources/locale/locale_el.js.map deleted file mode 100644 index 05cb995..0000000 --- a/libraries/dhtmlxgantt/sources/locale/locale_el.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"locale_el.js","sources":["locale_el.js"],"names":["gantt","locale","date","month_full","month_short","day_full","day_short","labels","dhx_cal_today_button","day_tab","week_tab","month_tab","new_event","icon_save","icon_cancel","icon_details","icon_edit","icon_delete","confirm_closing","confirm_deleting","section_description","section_time","section_type","column_text","column_start_date","column_duration","column_add","link","confirm_link_deleting","link_start","link_end","type_task","type_project","type_milestone","minutes","hours","days","weeks","months","years"],"mappings":";;;;;;;;AAQAA,MAAMC,QACLC,MACCC,YAAa,aAAc,cAAe,UAAW,WAAY,QAAS,UAAW,UAAW,YAAa,cAAe,YAAa,YAAa,cACtJC,aAAc,MAAO,MAAO,MAAO,MAAO,MAAO,OAAQ,OAAQ,MAAO,MAAO,MAAO,MAAO,OAC7FC,UAAW,UAAW,UAAW,QAAS,UAAW,SAAU,YAAa,WAC5EC,WAAY,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,OAEjDC,QACCC,qBAAsB,SACtBC,QAAS,QACTC,SAAU,WACVC,UAAW,QACXC,UAAW;AACXC,UAAW,aACXC,YAAa,QACbC,aAAc,eACdC,UAAW,cACXC,YAAa,WACbC,gBAAiB,GACjBC,iBAAkB,uDAClBC,oBAAqB,YACrBC,aAAc,mBACdC,aAAa,OAGPC,YAAc,YACdC,kBAAoB,aACpBC,gBAAkB,WAClBC,WAAa,GAGnBC,KAAM,OACNC,sBAAsB,kBACtBC,WAAY,WACZC,SAAU,SAEVC,UAAW,OACXC,aAAc;AACdC,eAAgB,YAGVC,QAAS,UACTC,MAAO,QACPC,KAAM,OACNC,MAAO,OACPC,OAAQ,SACRC,MAAO"} \ No newline at end of file diff --git a/libraries/dhtmlxgantt/sources/locale/locale_es.js b/libraries/dhtmlxgantt/sources/locale/locale_es.js deleted file mode 100644 index 7c8d9b4..0000000 --- a/libraries/dhtmlxgantt/sources/locale/locale_es.js +++ /dev/null @@ -1,61 +0,0 @@ -/* -@license - -dhtmlxGantt v.3.2.0 Stardard -This software is covered by GPL license. You also can obtain Commercial or Enterprise license to use it in non-GPL project - please contact sales@dhtmlx.com. Usage without proper license is prohibited. - -(c) Dinamenta, UAB. -*/ -/* - @Autor Manuel Fernandez Panzuela - www.mfernandez.es - */ -gantt.locale = { - date: { - month_full: ["Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre"], - month_short: ["Ene", "Feb", "Mar", "Abr", "May", "Jun", "Jul", "Ago", "Sep", "Oct", "Nov", "Dic"], - day_full: ["Domingo", "Lunes", "Martes", "Miércoles", "Jueves", "Viernes", "Sábado"], - day_short: ["Dom", "Lun", "Mar", "Mié", "Jue", "Vie", "Sáb"] - }, - labels: { - dhx_cal_today_button: "Hoy", - day_tab: "Día", - week_tab: "Semana", - month_tab: "Mes", - new_event: "Nuevo evento", - icon_save: "Guardar", - icon_cancel: "Cancelar", - icon_details: "Detalles", - icon_edit: "Editar", - icon_delete: "Eliminar", - confirm_closing: "", //"Sus cambios se perderán, continuar ?" - confirm_deleting: "El evento se borrará definitivamente, ¿continuar?", - section_description: "Descripción", - section_time: "Período", - section_type:"Type", - /* grid columns */ - - column_text : "Task name", - column_start_date : "Start time", - column_duration : "Duration", - column_add : "", - - /* link confirmation */ - link: "Link", - confirm_link_deleting:"will be deleted", - link_start: " (start)", - link_end: " (end)", - - type_task: "Task", - type_project: "Project", - type_milestone: "Milestone", - - - minutes: "Minutes", - hours: "Hours", - days: "Days", - weeks: "Week", - months: "Months", - years: "Years" - } -}; - diff --git a/libraries/dhtmlxgantt/sources/locale/locale_es.js.map b/libraries/dhtmlxgantt/sources/locale/locale_es.js.map deleted file mode 100644 index 150e5cd..0000000 --- a/libraries/dhtmlxgantt/sources/locale/locale_es.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"locale_es.js","sources":["locale_es.js"],"names":["gantt","locale","date","month_full","month_short","day_full","day_short","labels","dhx_cal_today_button","day_tab","week_tab","month_tab","new_event","icon_save","icon_cancel","icon_details","icon_edit","icon_delete","confirm_closing","confirm_deleting","section_description","section_time","section_type","column_text","column_start_date","column_duration","column_add","link","confirm_link_deleting","link_start","link_end","type_task","type_project","type_milestone","minutes","hours","days","weeks","months","years"],"mappings":";;;;;;;;AAWAA,MAAMC,QACLC,MACCC,YAAa,QAAS,UAAW,QAAS,QAAS,OAAQ,QAAS,QAAS,SAAU,aAAc,UAAW,YAAa,aAC7HC,aAAc,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,OAC3FC,UAAW,UAAW,QAAS,SAAU,YAAa,SAAU,UAAW,UAC3EC,WAAY,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,QAEvDC,QACCC,qBAAsB,MACtBC,QAAS,MACTC,SAAU,SACVC,UAAW,MACXC,UAAW,eACXC,UAAW,UACXC,YAAa;AACbC,aAAc,WACdC,UAAW,SACXC,YAAa,WACbC,gBAAiB,GACjBC,iBAAkB,oDAClBC,oBAAqB,cACrBC,aAAc,UACdC,aAAa,OAGPC,YAAc,YACdC,kBAAoB,aACpBC,gBAAkB,WAClBC,WAAa,GAGnBC,KAAM,OACNC,sBAAsB,kBACtBC,WAAY,WACZC,SAAU,SAEVC,UAAW,OACXC,aAAc,UACdC,eAAgB,YAGVC,QAAS;AACTC,MAAO,QACPC,KAAM,OACNC,MAAO,OACPC,OAAQ,SACRC,MAAO"} \ No newline at end of file diff --git a/libraries/dhtmlxgantt/sources/locale/locale_fi.js b/libraries/dhtmlxgantt/sources/locale/locale_fi.js deleted file mode 100644 index 106bf76..0000000 --- a/libraries/dhtmlxgantt/sources/locale/locale_fi.js +++ /dev/null @@ -1,58 +0,0 @@ -/* -@license - -dhtmlxGantt v.3.2.0 Stardard -This software is covered by GPL license. You also can obtain Commercial or Enterprise license to use it in non-GPL project - please contact sales@dhtmlx.com. Usage without proper license is prohibited. - -(c) Dinamenta, UAB. -*/ -gantt.locale = { - date: { - month_full: ["Tammikuu", "Helmikuu", "Maaliskuu", "Huhtikuu", "Toukokuu", "Kesäkuu", "Heinäkuu", "Elokuu", "Syyskuu", "Lokakuu", "Marraskuu", "Joulukuu"], - month_short: ["Tam", "Hel", "Maa", "Huh", "Tou", "Kes", "Hei", "Elo", "Syy", "Lok", "Mar", "Jou"], - day_full: ["Sunnuntai", "Maanantai", "Tiistai", "Keskiviikko", "Torstai", "Perjantai", "Lauantai"], - day_short: ["Su", "Ma", "Ti", "Ke", "To", "Pe", "La"] - }, - labels: { - dhx_cal_today_button: "Tänään", - day_tab: "Päivä", - week_tab: "Viikko", - month_tab: "Kuukausi", - new_event: "Uusi tapahtuma", - icon_save: "Tallenna", - icon_cancel: "Peru", - icon_details: "Tiedot", - icon_edit: "Muokkaa", - icon_delete: "Poista", - confirm_closing: "", //Your changes will be lost, are your sure ? - confirm_deleting: "Haluatko varmasti poistaa tapahtuman?", - section_description: "Kuvaus", - section_time: "Aikajakso", - section_type:"Type", - /* grid columns */ - - column_text : "Task name", - column_start_date : "Start time", - column_duration : "Duration", - column_add : "", - - /* link confirmation */ - link: "Link", - confirm_link_deleting:"will be deleted", - link_start: " (start)", - link_end: " (end)", - - type_task: "Task", - type_project: "Project", - type_milestone: "Milestone", - - - minutes: "Minutes", - hours: "Hours", - days: "Days", - weeks: "Week", - months: "Months", - years: "Years" - } -}; - diff --git a/libraries/dhtmlxgantt/sources/locale/locale_fi.js.map b/libraries/dhtmlxgantt/sources/locale/locale_fi.js.map deleted file mode 100644 index 08179ad..0000000 --- a/libraries/dhtmlxgantt/sources/locale/locale_fi.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"locale_fi.js","sources":["locale_fi.js"],"names":["gantt","locale","date","month_full","month_short","day_full","day_short","labels","dhx_cal_today_button","day_tab","week_tab","month_tab","new_event","icon_save","icon_cancel","icon_details","icon_edit","icon_delete","confirm_closing","confirm_deleting","section_description","section_time","section_type","column_text","column_start_date","column_duration","column_add","link","confirm_link_deleting","link_start","link_end","type_task","type_project","type_milestone","minutes","hours","days","weeks","months","years"],"mappings":";;;;;;;;AAQAA,MAAMC,QACLC,MACCC,YAAa,WAAY,WAAY,YAAa,WAAY,WAAY,eAAgB,gBAAiB,SAAU,UAAW,UAAW,YAAa,YACxJC,aAAc,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,OAC3FC,UAAW,YAAa,YAAa,UAAW,cAAe,UAAW,YAAa,YACvFC,WAAY,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,OAEjDC,QACCC,qBAAsB,SACtBC,QAAS,QACTC,SAAU,SACVC,UAAW,WACXC,UAAW;AACXC,UAAW,WACXC,YAAa,OACbC,aAAc,SACdC,UAAW,UACXC,YAAa,SACbC,gBAAiB,GACjBC,iBAAkB,wCAClBC,oBAAqB,SACrBC,aAAc,YACdC,aAAa,OAGPC,YAAc,YACdC,kBAAoB,aACpBC,gBAAkB,WAClBC,WAAa,GAGnBC,KAAM,OACNC,sBAAsB,kBACtBC,WAAY,WACZC,SAAU,SAEVC,UAAW,OACXC,aAAc,UACdC,eAAgB;AAGVC,QAAS,UACTC,MAAO,QACPC,KAAM,OACNC,MAAO,OACPC,OAAQ,SACRC,MAAO"} \ No newline at end of file diff --git a/libraries/dhtmlxgantt/sources/locale/locale_fr.js b/libraries/dhtmlxgantt/sources/locale/locale_fr.js deleted file mode 100644 index ac88819..0000000 --- a/libraries/dhtmlxgantt/sources/locale/locale_fr.js +++ /dev/null @@ -1,56 +0,0 @@ -/* -@license - -dhtmlxGantt v.3.2.0 Stardard -This software is covered by GPL license. You also can obtain Commercial or Enterprise license to use it in non-GPL project - please contact sales@dhtmlx.com. Usage without proper license is prohibited. - -(c) Dinamenta, UAB. -*/ -gantt.locale = { - date: { - month_full: ["Janvier", "Février", "Mars", "Avril", "Mai", "Juin", "Juillet", "Août", "Septembre", "Octobre", "Novembre", "Décembre"], - month_short: ["Jan", "Fév", "Mar", "Avr", "Mai", "Juin", "Juil", "Aoû", "Sep", "Oct", "Nov", "Déc"], - day_full: ["Dimanche", "Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi", "Samedi"], - day_short: ["Dim", "Lun", "Mar", "Mer", "Jeu", "Ven", "Sam"] - }, - labels:{ - new_task:"Nouvelle tâche", - icon_save:"Enregistrer", - icon_cancel:"Annuler", - icon_details:"Détails", - icon_edit:"Modifier", - icon_delete:"Effacer", - confirm_closing:"",//Vos modifications seront perdus, êtes-vous sûr ? - confirm_deleting:"L'événement sera effacé sans appel, êtes-vous sûr ?", - - section_description:"Description", - section_time:"Période", - section_type:"Type", - - /* grid columns */ - - column_text : "Nom de la tâche", - column_start_date : "Date initiale", - column_duration : "Durée", - column_add : "", - - - /* link confirmation */ - link: "Le lien", - confirm_link_deleting:"sera supprimé", - link_start: "(début)", - link_end: "(fin)", - - type_task: "Task", - type_project: "Project", - type_milestone: "Milestone", - - - minutes: "Minutes", - hours: "Heures", - days: "Jours", - weeks: "Semaines", - months: "Mois", - years: "Années" - } -}; diff --git a/libraries/dhtmlxgantt/sources/locale/locale_fr.js.map b/libraries/dhtmlxgantt/sources/locale/locale_fr.js.map deleted file mode 100644 index 8ffaa49..0000000 --- a/libraries/dhtmlxgantt/sources/locale/locale_fr.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"locale_fr.js","sources":["locale_fr.js"],"names":["gantt","locale","date","month_full","month_short","day_full","day_short","labels","new_task","icon_save","icon_cancel","icon_details","icon_edit","icon_delete","confirm_closing","confirm_deleting","section_description","section_time","section_type","column_text","column_start_date","column_duration","column_add","link","confirm_link_deleting","link_start","link_end","type_task","type_project","type_milestone","minutes","hours","days","weeks","months","years"],"mappings":";;;;;;;;AAQAA,MAAMC,QACLC,MACCC,YAAa,UAAW,UAAW,OAAQ,QAAS,MAAO,OAAQ,UAAW,OAAQ,YAAa,UAAW,WAAY,YAC1HC,aAAc,MAAO,MAAO,MAAO,MAAO,MAAO,OAAQ,OAAQ,MAAO,MAAO,MAAO,MAAO,OAC7FC,UAAW,WAAY,QAAS,QAAS,WAAY,QAAS,WAAY,UAC1EC,WAAY,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,QAEvDC,QACCC,SAAS,iBACTC,UAAU,cACVC,YAAY,UACZC,aAAa,UACbC,UAAU,WACVC,YAAY;AACZC,gBAAgB,GAChBC,iBAAiB,sDAEjBC,oBAAoB,cACpBC,aAAa,UACbC,aAAa,OAIPC,YAAc,kBACdC,kBAAoB,gBACpBC,gBAAkB,QAClBC,WAAa,GAInBC,KAAM,UACNC,sBAAsB,gBACtBC,WAAY,UACZC,SAAU,QAEVC,UAAW,OACXC,aAAc,UACdC,eAAgB,YAGbC,QAAS,UACTC,MAAO,SACPC,KAAM,QACNC,MAAO,WACPC,OAAQ;AACRC,MAAO"} \ No newline at end of file diff --git a/libraries/dhtmlxgantt/sources/locale/locale_he.js b/libraries/dhtmlxgantt/sources/locale/locale_he.js deleted file mode 100644 index 11319ef..0000000 --- a/libraries/dhtmlxgantt/sources/locale/locale_he.js +++ /dev/null @@ -1,58 +0,0 @@ -/* -@license - -dhtmlxGantt v.3.2.0 Stardard -This software is covered by GPL license. You also can obtain Commercial or Enterprise license to use it in non-GPL project - please contact sales@dhtmlx.com. Usage without proper license is prohibited. - -(c) Dinamenta, UAB. -*/ -gantt.locale = { - date: { - month_full: ["ינואר", "פברואר", "מרץ", "אפריל", "מאי", "יוני", "יולי", "אוגוסט", "ספטמבר", "אוקטובר", "נובמבר", "דצמבר"], - month_short: ["ינו", "פבר", "מרץ", "אפר", "מאי", "יונ", "יול", "אוג", "ספט", "אוק", "נוב", "דצמ"], - day_full: ["ראשון", "שני", "שלישי", "רביעי", "חמישי", "שישי", "שבת"], - day_short: ["א", "ב", "ג", "ד", "ה", "ו", "ש"] - }, - labels: { - dhx_cal_today_button: "היום", - day_tab: "יום", - week_tab: "שבוע", - month_tab: "חודש", - new_event: "ארוע חדש", - icon_save: "שמור", - icon_cancel: "בטל", - icon_details: "פרטים", - icon_edit: "ערוך", - icon_delete: "מחק", - confirm_closing: "", //Your changes will be lost, are your sure ? - confirm_deleting: "ארוע ימחק סופית.להמשיך?", - section_description: "הסבר", - section_time: "תקופה", - section_type:"Type", - /* grid columns */ - - column_text : "Task name", - column_start_date : "Start time", - column_duration : "Duration", - column_add : "", - - /* link confirmation */ - link: "Link", - confirm_link_deleting:"will be deleted", - link_start: " (start)", - link_end: " (end)", - - type_task: "Task", - type_project: "Project", - type_milestone: "Milestone", - - - minutes: "Minutes", - hours: "Hours", - days: "Days", - weeks: "Week", - months: "Months", - years: "Years" - } -}; - diff --git a/libraries/dhtmlxgantt/sources/locale/locale_he.js.map b/libraries/dhtmlxgantt/sources/locale/locale_he.js.map deleted file mode 100644 index 2f004fe..0000000 --- a/libraries/dhtmlxgantt/sources/locale/locale_he.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"locale_he.js","sources":["locale_he.js"],"names":["gantt","locale","date","month_full","month_short","day_full","day_short","labels","dhx_cal_today_button","day_tab","week_tab","month_tab","new_event","icon_save","icon_cancel","icon_details","icon_edit","icon_delete","confirm_closing","confirm_deleting","section_description","section_time","section_type","column_text","column_start_date","column_duration","column_add","link","confirm_link_deleting","link_start","link_end","type_task","type_project","type_milestone","minutes","hours","days","weeks","months","years"],"mappings":";;;;;;;;AAQAA,MAAMC,QACLC,MACCC,YAAa,QAAS,SAAU,MAAO,QAAS,MAAO,OAAQ,OAAQ,SAAU,SAAU,UAAW,SAAU,SAChHC,aAAc,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,OAC3FC,UAAW,QAAS,MAAO,QAAS,QAAS,QAAS,OAAQ,OAC9DC,WAAY,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAE3CC,QACCC,qBAAsB,OACtBC,QAAS,MACTC,SAAU,OACVC,UAAW,OACXC,UAAW,WACXC,UAAW,OACXC,YAAa,MACbC,aAAc,QACdC,UAAW,OACXC,YAAa;AACbC,gBAAiB,GACjBC,iBAAkB,0BAClBC,oBAAqB,OACrBC,aAAc,QACdC,aAAa,OAGPC,YAAc,YACdC,kBAAoB,aACpBC,gBAAkB,WAClBC,WAAa,GAGnBC,KAAM,OACNC,sBAAsB,kBACtBC,WAAY,WACZC,SAAU,SAEVC,UAAW,OACXC,aAAc,UACdC,eAAgB,YAGVC,QAAS,UACTC,MAAO,QACPC,KAAM,OACNC,MAAO,OACPC,OAAQ,SACRC,MAAO"} \ No newline at end of file diff --git a/libraries/dhtmlxgantt/sources/locale/locale_hu.js b/libraries/dhtmlxgantt/sources/locale/locale_hu.js deleted file mode 100644 index f489247..0000000 --- a/libraries/dhtmlxgantt/sources/locale/locale_hu.js +++ /dev/null @@ -1,58 +0,0 @@ -/* -@license - -dhtmlxGantt v.3.2.0 Stardard -This software is covered by GPL license. You also can obtain Commercial or Enterprise license to use it in non-GPL project - please contact sales@dhtmlx.com. Usage without proper license is prohibited. - -(c) Dinamenta, UAB. -*/ -gantt.locale = { - date: { - month_full: ["Január", "Február", "Március", "Április", "Május", "Június", "Július", "Augusztus", "Szeptember", "Október", "November", "December"], - month_short: ["Jan", "Feb", "Már", "Ápr", "Máj", "Jún", "Júl", "Aug", "Sep", "Okt", "Nov", "Dec"], - day_full: ["Vasárnap", "Hétfõ", "Kedd", "Szerda", "Csütörtök", "Péntek", "szombat"], - day_short: ["Va", "Hé", "Ke", "Sze", "Csü", "Pé", "Szo"] - }, - labels: { - dhx_cal_today_button: "Ma", - day_tab: "Nap", - week_tab: "Hét", - month_tab: "Hónap", - new_event: "Új esemény", - icon_save: "Mentés", - icon_cancel: "Mégse", - icon_details: "Részletek", - icon_edit: "Szerkesztés", - icon_delete: "Törlés", - confirm_closing: "", //A változások elvesznek, biztosan folytatja? " - confirm_deleting: "Az esemény törölve lesz, biztosan folytatja?", - section_description: "Leírás", - section_time: "Idõszak", - section_type:"Type", - /* grid columns */ - - column_text : "Task name", - column_start_date : "Start time", - column_duration : "Duration", - column_add : "", - - /* link confirmation */ - link: "Link", - confirm_link_deleting:"will be deleted", - link_start: " (start)", - link_end: " (end)", - - type_task: "Task", - type_project: "Project", - type_milestone: "Milestone", - - - minutes: "Minutes", - hours: "Hours", - days: "Days", - weeks: "Week", - months: "Months", - years: "Years" - } -}; - diff --git a/libraries/dhtmlxgantt/sources/locale/locale_hu.js.map b/libraries/dhtmlxgantt/sources/locale/locale_hu.js.map deleted file mode 100644 index dc9f4b5..0000000 --- a/libraries/dhtmlxgantt/sources/locale/locale_hu.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"locale_hu.js","sources":["locale_hu.js"],"names":["gantt","locale","date","month_full","month_short","day_full","day_short","labels","dhx_cal_today_button","day_tab","week_tab","month_tab","new_event","icon_save","icon_cancel","icon_details","icon_edit","icon_delete","confirm_closing","confirm_deleting","section_description","section_time","section_type","column_text","column_start_date","column_duration","column_add","link","confirm_link_deleting","link_start","link_end","type_task","type_project","type_milestone","minutes","hours","days","weeks","months","years"],"mappings":";;;;;;;;AAQAA,MAAMC,QACLC,MACCC,YAAa,SAAU,UAAW,UAAW,UAAW,QAAS,SAAU,SAAU,YAAa,aAAc,UAAW,WAAY,YACvIC,aAAc,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,OAC3FC,UAAW,WAAY,QAAS,OAAQ,SAAU,YAAa,SAAU,WACzEC,WAAY,KAAM,KAAM,KAAM,MAAO,MAAO,KAAM,QAEnDC,QACCC,qBAAsB,KACtBC,QAAS,MACTC,SAAU,MACVC,UAAW,QACXC,UAAW,aACXC,UAAW,SACXC,YAAa;AACbC,aAAc,YACdC,UAAW,cACXC,YAAa,SACbC,gBAAiB,GACjBC,iBAAkB,+CAClBC,oBAAqB,SACrBC,aAAc,UACdC,aAAa,OAGPC,YAAc,YACdC,kBAAoB,aACpBC,gBAAkB,WAClBC,WAAa,GAGnBC,KAAM,OACNC,sBAAsB,kBACtBC,WAAY,WACZC,SAAU,SAEVC,UAAW,OACXC,aAAc,UACdC,eAAgB,YAGVC,QAAS,UACTC,MAAO;AACPC,KAAM,OACNC,MAAO,OACPC,OAAQ,SACRC,MAAO"} \ No newline at end of file diff --git a/libraries/dhtmlxgantt/sources/locale/locale_id.js b/libraries/dhtmlxgantt/sources/locale/locale_id.js deleted file mode 100644 index 3a30a21..0000000 --- a/libraries/dhtmlxgantt/sources/locale/locale_id.js +++ /dev/null @@ -1,9 +0,0 @@ -/* -@license - -dhtmlxGantt v.3.2.0 Stardard -This software is covered by GPL license. You also can obtain Commercial or Enterprise license to use it in non-GPL project - please contact sales@dhtmlx.com. Usage without proper license is prohibited. - -(c) Dinamenta, UAB. -*/ -gantt.locale = { date: { month_full: ["Januari", "Februari", "Maret", "April", "Mei", "Juni", "Juli", "Agustus", "September", "Oktober", "November", "Desember"], month_short: ["Jan", "Feb", "Mar", "Apr", "Mei", "Jun", "Jul", "Ags", "Sep", "Okt", "Nov", "Des"], day_full: ["Minggu", "Senin", "Selasa", "Rabu", "Kamis", "Jumat", "Sabtu"], day_short: ["Ming", "Sen", "Sel", "Rab", "Kam", "Jum", "Sab"] }, labels: { dhx_cal_today_button: "Hari Ini", day_tab: "Hari", week_tab: "Minggu", month_tab: "Bulan", new_event: "Acara Baru", icon_save: "Simpan", icon_cancel: "Batal", icon_details: "Detail", icon_edit: "Edit", icon_delete: "Hapus", confirm_closing: "", /*Perubahan tidak akan disimpan ?*/ confirm_deleting: "Acara akan dihapus", section_description: "Keterangan", section_time: "Periode", section_type: "Type", /* grid columns */ column_text: "Task name", column_start_date: "Start time", column_duration: "Duration", column_add: "", /* link confirmation */ link: "Link", confirm_link_deleting: "will be deleted", link_start: " (start)", link_end: " (end)", type_task: "Task", type_project: "Project", type_milestone: "Milestone", minutes: "Minutes", hours: "Hours", days: "Days", weeks: "Week", months: "Months", years: "Years" } }; \ No newline at end of file diff --git a/libraries/dhtmlxgantt/sources/locale/locale_id.js.map b/libraries/dhtmlxgantt/sources/locale/locale_id.js.map deleted file mode 100644 index c9399d1..0000000 --- a/libraries/dhtmlxgantt/sources/locale/locale_id.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"locale_id.js","sources":["locale_id.js"],"names":["gantt","locale","date","month_full","month_short","day_full","day_short","labels","dhx_cal_today_button","day_tab","week_tab","month_tab","new_event","icon_save","icon_cancel","icon_details","icon_edit","icon_delete","confirm_closing","confirm_deleting","section_description","section_time","section_type","column_text","column_start_date","column_duration","column_add","link","confirm_link_deleting","link_start","link_end","type_task","type_project","type_milestone","minutes","hours","days","weeks","months","years"],"mappings":";;;;;;;;AAQAA,MAAMC,QACLC,MACCC,YAAa,UAAW,WAAY,QAAS,QAAS,MAAO,OAAQ,OAAQ,UAAW,YAAa,UAAW,WAAY,YAC5HC,aAAc,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,OAC3FC,UAAW,SAAU,QAAS,SAAU,OAAQ,QAAS,QAAS,SAClEC,WAAY,OAAQ,MAAO,MAAO,MAAO,MAAO,MAAO,QAExDC,QACCC,qBAAsB,WACtBC,QAAS,OACTC,SAAU,SACVC,UAAW,QACXC,UAAW,aACXC,UAAW,SACXC,YAAa;AACbC,aAAc,SACdC,UAAW,OACXC,YAAa,QACbC,gBAAiB,GACjBC,iBAAkB,qBAClBC,oBAAqB,aACrBC,aAAc,UACdC,aAAc,OAGdC,YAAa,YACbC,kBAAmB,aACnBC,gBAAiB,WACjBC,WAAY,GAGZC,KAAM,OACNC,sBAAuB,kBACvBC,WAAY,WACZC,SAAU,SAEVC,UAAW,OACXC,aAAc,UACdC,eAAgB,YAGhBC,QAAS,UACTC,MAAO,QACPC,KAAM,OACNC,MAAO;AACPC,OAAQ,SACRC,MAAO"} \ No newline at end of file diff --git a/libraries/dhtmlxgantt/sources/locale/locale_it.js b/libraries/dhtmlxgantt/sources/locale/locale_it.js deleted file mode 100644 index 74e91e6..0000000 --- a/libraries/dhtmlxgantt/sources/locale/locale_it.js +++ /dev/null @@ -1,58 +0,0 @@ -/* -@license - -dhtmlxGantt v.3.2.0 Stardard -This software is covered by GPL license. You also can obtain Commercial or Enterprise license to use it in non-GPL project - please contact sales@dhtmlx.com. Usage without proper license is prohibited. - -(c) Dinamenta, UAB. -*/ -gantt.locale = { - date: { - month_full: ["Gennaio", "Febbraio", "Marzo", "Aprile", "Maggio", "Giugno", "Luglio", "Agosto", "Settembre", "Ottobre", "Novembre", "Dicembre"], - month_short: ["Gen", "Feb", "Mar", "Apr", "Mag", "Giu", "Lug", "Ago", "Set", "Ott", "Nov", "Dic"], - day_full: ["Domenica", "Lunedì", "Martedì", "Mercoledì", "Giovedì", "Venerdì", "Sabato"], - day_short: ["Dom", "Lun", "Mar", "Mer", "Gio", "Ven", "Sab"] - }, - labels: { - dhx_cal_today_button: "Oggi", - day_tab: "Giorno", - week_tab: "Settimana", - month_tab: "Mese", - new_event: "Nuovo evento", - icon_save: "Salva", - icon_cancel: "Chiudi", - icon_details: "Dettagli", - icon_edit: "Modifica", - icon_delete: "Elimina", - confirm_closing: "", //Le modifiche apportate saranno perse, siete sicuri? - confirm_deleting: "L'evento sarà eliminato, siete sicuri?", - section_description: "Descrizione", - section_time: "Periodo di tempo", - section_type:"Type", - /* grid columns */ - - column_text : "Task name", - column_start_date : "Start time", - column_duration : "Duration", - column_add : "", - - /* link confirmation */ - link: "Link", - confirm_link_deleting:"will be deleted", - link_start: " (start)", - link_end: " (end)", - - type_task: "Task", - type_project: "Project", - type_milestone: "Milestone", - - - minutes: "Minutes", - hours: "Hours", - days: "Days", - weeks: "Week", - months: "Months", - years: "Years" - } -}; - diff --git a/libraries/dhtmlxgantt/sources/locale/locale_it.js.map b/libraries/dhtmlxgantt/sources/locale/locale_it.js.map deleted file mode 100644 index d77d32f..0000000 --- a/libraries/dhtmlxgantt/sources/locale/locale_it.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"locale_it.js","sources":["locale_it.js"],"names":["gantt","locale","date","month_full","month_short","day_full","day_short","labels","dhx_cal_today_button","day_tab","week_tab","month_tab","new_event","icon_save","icon_cancel","icon_details","icon_edit","icon_delete","confirm_closing","confirm_deleting","section_description","section_time","section_type","column_text","column_start_date","column_duration","column_add","link","confirm_link_deleting","link_start","link_end","type_task","type_project","type_milestone","minutes","hours","days","weeks","months","years"],"mappings":";;;;;;;;AAQAA,MAAMC,QACLC,MACCC,YAAa,UAAW,WAAY,QAAS,SAAU,SAAU,SAAU,SAAU,SAAU,YAAa,UAAW,WAAY,YACnIC,aAAc,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,OAC3FC,UAAW,WAAY,SAAU,UAAW,YAAa,UAAW,UAAW,UAC/EC,WAAY,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,QAEvDC,QACCC,qBAAsB,OACtBC,QAAS,SACTC,SAAU,YACVC,UAAW,OACXC,UAAW,eACXC,UAAW;AACXC,YAAa,SACbC,aAAc,WACdC,UAAW,WACXC,YAAa,UACbC,gBAAiB,GACjBC,iBAAkB,yCAClBC,oBAAqB,cACrBC,aAAc,mBACdC,aAAa,OAGPC,YAAc,YACdC,kBAAoB,aACpBC,gBAAkB,WAClBC,WAAa,GAGnBC,KAAM,OACNC,sBAAsB,kBACtBC,WAAY,WACZC,SAAU,SAEVC,UAAW,OACXC,aAAc,UACdC,eAAgB;AAGVC,QAAS,UACTC,MAAO,QACPC,KAAM,OACNC,MAAO,OACPC,OAAQ,SACRC,MAAO"} \ No newline at end of file diff --git a/libraries/dhtmlxgantt/sources/locale/locale_jp.js b/libraries/dhtmlxgantt/sources/locale/locale_jp.js deleted file mode 100644 index d99730d..0000000 --- a/libraries/dhtmlxgantt/sources/locale/locale_jp.js +++ /dev/null @@ -1,61 +0,0 @@ -/* -@license - -dhtmlxGantt v.3.2.0 Stardard -This software is covered by GPL license. You also can obtain Commercial or Enterprise license to use it in non-GPL project - please contact sales@dhtmlx.com. Usage without proper license is prohibited. - -(c) Dinamenta, UAB. -*/ -/* - Translation by Genexus Japan Inc. - */ -gantt.locale = { - date: { - month_full: ["1月", "2月", "3月", "4月", "5月", "6月", "7月", "8月", "9月", "10月", "11月", "12月"], - month_short: [ "1月", "2月", "3月", "4月", "5月", "6月", "7月", "8月", "9月", "10月", "11月", "12月"], - day_full: ["日曜日", "月曜日", "火曜日", "水曜日", "木曜日", "金曜日", "土曜日"], - day_short: ["日", "月", "火", "水", "木", "金", "土"] - }, - labels: { - dhx_cal_today_button: "今日", - day_tab: "日", - week_tab: "週", - month_tab: "月", - new_event: "新イベント", - icon_save: "保存", - icon_cancel: "キャンセル", - icon_details: "詳細", - icon_edit: "編集", - icon_delete: "削除", - confirm_closing: "", //変更が取り消されます、宜しいですか? - confirm_deleting: "イベント完全に削除されます、宜しいですか?", - section_description: "デスクリプション", - section_time: "期間", - section_type:"Type", - /* grid columns */ - - column_text : "Task name", - column_start_date : "Start time", - column_duration : "Duration", - column_add : "", - - /* link confirmation */ - link: "Link", - confirm_link_deleting:"will be deleted", - link_start: " (start)", - link_end: " (end)", - - type_task: "Task", - type_project: "Project", - type_milestone: "Milestone", - - - minutes: "Minutes", - hours: "Hours", - days: "Days", - weeks: "Week", - months: "Months", - years: "Years" - } -}; - diff --git a/libraries/dhtmlxgantt/sources/locale/locale_jp.js.map b/libraries/dhtmlxgantt/sources/locale/locale_jp.js.map deleted file mode 100644 index b19e459..0000000 --- a/libraries/dhtmlxgantt/sources/locale/locale_jp.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"locale_jp.js","sources":["locale_jp.js"],"names":["gantt","locale","date","month_full","month_short","day_full","day_short","labels","dhx_cal_today_button","day_tab","week_tab","month_tab","new_event","icon_save","icon_cancel","icon_details","icon_edit","icon_delete","confirm_closing","confirm_deleting","section_description","section_time","section_type","column_text","column_start_date","column_duration","column_add","link","confirm_link_deleting","link_start","link_end","type_task","type_project","type_milestone","minutes","hours","days","weeks","months","years"],"mappings":";;;;;;;;AAWAA,MAAMC,QACLC,MACCC,YAAa,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,MAAO,MAAO,OACjFC,aAAe,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,MAAO,MAAO,OACnFC,UAAW,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,OACrDC,WAAY,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAE3CC,QACCC,qBAAsB,KACtBC,QAAS,IACTC,SAAU,IACVC,UAAW,IACXC,UAAW,QACXC,UAAW,KACXC,YAAa,QACbC,aAAc,KACdC,UAAW,KACXC,YAAa,KACbC,gBAAiB,GACjBC,iBAAkB;AAClBC,oBAAqB,WACrBC,aAAc,KACdC,aAAa,OAGPC,YAAc,YACdC,kBAAoB,aACpBC,gBAAkB,WAClBC,WAAa,GAGnBC,KAAM,OACNC,sBAAsB,kBACtBC,WAAY,WACZC,SAAU,SAEVC,UAAW,OACXC,aAAc,UACdC,eAAgB,YAGVC,QAAS,UACTC,MAAO,QACPC,KAAM,OACNC,MAAO,OACPC,OAAQ,SACRC,MAAO"} \ No newline at end of file diff --git a/libraries/dhtmlxgantt/sources/locale/locale_kr.js b/libraries/dhtmlxgantt/sources/locale/locale_kr.js deleted file mode 100644 index bc4488e..0000000 --- a/libraries/dhtmlxgantt/sources/locale/locale_kr.js +++ /dev/null @@ -1,49 +0,0 @@ -/* -@license - -dhtmlxGantt v.3.2.0 Stardard -This software is covered by GPL license. You also can obtain Commercial or Enterprise license to use it in non-GPL project - please contact sales@dhtmlx.com. Usage without proper license is prohibited. - -(c) Dinamenta, UAB. -*/ -/* - Translated by cjkim@dbvalley.com -*/ -gantt.locale = { - date: { - month_full: ["1월", "2월", "3월", "4월", "5월", "6월", "7월", "8월", "9월", "10월", "11월", "12월"], - month_short: ["1월", "2월", "3월", "4월", "5월", "6월", "7월", "8월", "9월", "10월", "11월", "12월"], - day_full: ["일요일", "월요일", "화요일", "수요일", "목요일", "금요일", "토요일"], - day_short: ["일", "월", "화", "수", "목", "금", "토"] - }, - labels: { - new_task: "이름없는 작업", - icon_save: "저장", - icon_cancel: "취소", - icon_details: "세부 사항", - icon_edit: "수정", - icon_delete: "삭제", - confirm_closing: "", - confirm_deleting: "작업을 삭제하시겠습니까?", - section_description: "설명", - section_time: "기간", - section_type: "Type", - column_text: "작업명", - column_start_date: "시작일", - column_duration: "기간", - column_add: "", - link: "전제", - confirm_link_deleting: "삭제 하시겠습니까?", - link_start: " (start)", - link_end: " (end)", - type_task: "작업", - type_project: "프로젝트", - type_milestone: "마일스톤", - minutes: "분", - hours: "시간", - days: "일", - weeks: "주", - months: "달", - years: "년" - } -}; \ No newline at end of file diff --git a/libraries/dhtmlxgantt/sources/locale/locale_kr.js.map b/libraries/dhtmlxgantt/sources/locale/locale_kr.js.map deleted file mode 100644 index 2ea3a78..0000000 --- a/libraries/dhtmlxgantt/sources/locale/locale_kr.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"locale_kr.js","sources":["locale_kr.js"],"names":["gantt","locale","date","month_full","month_short","day_full","day_short","labels","new_task","icon_save","icon_cancel","icon_details","icon_edit","icon_delete","confirm_closing","confirm_deleting","section_description","section_time","section_type","column_text","column_start_date","column_duration","column_add","link","confirm_link_deleting","link_start","link_end","type_task","type_project","type_milestone","minutes","hours","days","weeks","months","years"],"mappings":";;;;;;;;AAWAA,MAAMC,QACLC,MACCC,YAAa,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,MAAO,MAAO,OACjFC,aAAc,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,MAAO,MAAO,OAClFC,UAAW,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,OACrDC,WAAY,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAE3CC,QACCC,SAAU,UACVC,UAAW,KACXC,YAAa,KACbC,aAAc,QACdC,UAAW,KACXC,YAAa,KACbC,gBAAiB,GACjBC,iBAAkB,gBAClBC,oBAAqB,KACrBC,aAAc,KACdC,aAAc,OACdC,YAAa;AACbC,kBAAmB,MACnBC,gBAAiB,KACjBC,WAAY,GACZC,KAAM,KACNC,sBAAuB,aACvBC,WAAY,WACZC,SAAU,SACVC,UAAW,KACXC,aAAc,OACdC,eAAgB,OAChBC,QAAS,IACTC,MAAO,KACPC,KAAM,IACNC,MAAO,IACPC,OAAQ,IACRC,MAAO"} \ No newline at end of file diff --git a/libraries/dhtmlxgantt/sources/locale/locale_nb.js b/libraries/dhtmlxgantt/sources/locale/locale_nb.js deleted file mode 100644 index 52a37cd..0000000 --- a/libraries/dhtmlxgantt/sources/locale/locale_nb.js +++ /dev/null @@ -1,58 +0,0 @@ -/* -@license - -dhtmlxGantt v.3.2.0 Stardard -This software is covered by GPL license. You also can obtain Commercial or Enterprise license to use it in non-GPL project - please contact sales@dhtmlx.com. Usage without proper license is prohibited. - -(c) Dinamenta, UAB. -*/ -gantt.locale = { - date: { - month_full: ["Januar", "Februar", "Mars", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Desember"], - month_short: ["Jan", "Feb", "Mar", "Apr", "Mai", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Des"], - day_full: ["Søndag", "Mandag", "Tirsdag", "Onsdag", "Torsdag", "Fredag", "Lørdag"], - day_short: ["Søn", "Mon", "Tir", "Ons", "Tor", "Fre", "Lør"] - }, - labels: { - dhx_cal_today_button: "I dag", - day_tab: "Dag", - week_tab: "Uke", - month_tab: "Måned", - new_event: "Ny hendelse", - icon_save: "Lagre", - icon_cancel: "Avbryt", - icon_details: "Detaljer", - icon_edit: "Rediger", - icon_delete: "Slett", - confirm_closing: "", //Your changes will be lost, are your sure ? - confirm_deleting: "Hendelsen vil bli slettet permanent. Er du sikker?", - section_description: "Beskrivelse", - section_time: "Tidsperiode", - section_type:"Type", - /* grid columns */ - - column_text : "Task name", - column_start_date : "Start time", - column_duration : "Duration", - column_add : "", - - /* link confirmation */ - link: "Link", - confirm_link_deleting:"will be deleted", - link_start: " (start)", - link_end: " (end)", - - type_task: "Task", - type_project: "Project", - type_milestone: "Milestone", - - - minutes: "Minutes", - hours: "Hours", - days: "Days", - weeks: "Week", - months: "Months", - years: "Years" - } -}; - diff --git a/libraries/dhtmlxgantt/sources/locale/locale_nb.js.map b/libraries/dhtmlxgantt/sources/locale/locale_nb.js.map deleted file mode 100644 index 20acc30..0000000 --- a/libraries/dhtmlxgantt/sources/locale/locale_nb.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"locale_nb.js","sources":["locale_nb.js"],"names":["gantt","locale","date","month_full","month_short","day_full","day_short","labels","dhx_cal_today_button","day_tab","week_tab","month_tab","new_event","icon_save","icon_cancel","icon_details","icon_edit","icon_delete","confirm_closing","confirm_deleting","section_description","section_time","section_type","column_text","column_start_date","column_duration","column_add","link","confirm_link_deleting","link_start","link_end","type_task","type_project","type_milestone","minutes","hours","days","weeks","months","years"],"mappings":";;;;;;;;AAQAA,MAAMC,QACLC,MACCC,YAAa,SAAU,UAAW,OAAQ,QAAS,MAAO,OAAQ,OAAQ,SAAU,YAAa,UAAW,WAAY,YACxHC,aAAc,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,OAC3FC,UAAW,SAAU,SAAU,UAAW,SAAU,UAAW,SAAU,UACzEC,WAAY,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,QAEvDC,QACCC,qBAAsB,QACtBC,QAAS,MACTC,SAAU,MACVC,UAAW,QACXC,UAAW,cACXC,UAAW,QACXC,YAAa;AACbC,aAAc,WACdC,UAAW,UACXC,YAAa,QACbC,gBAAiB,GACjBC,iBAAkB,qDAClBC,oBAAqB,cACrBC,aAAc,cACdC,aAAa,OAGPC,YAAc,YACdC,kBAAoB,aACpBC,gBAAkB,WAClBC,WAAa,GAGnBC,KAAM,OACNC,sBAAsB,kBACtBC,WAAY,WACZC,SAAU,SAEVC,UAAW,OACXC,aAAc,UACdC,eAAgB,YAGVC,QAAS;AACTC,MAAO,QACPC,KAAM,OACNC,MAAO,OACPC,OAAQ,SACRC,MAAO"} \ No newline at end of file diff --git a/libraries/dhtmlxgantt/sources/locale/locale_nl.js b/libraries/dhtmlxgantt/sources/locale/locale_nl.js deleted file mode 100644 index 4f0c3f2..0000000 --- a/libraries/dhtmlxgantt/sources/locale/locale_nl.js +++ /dev/null @@ -1,58 +0,0 @@ -/* -@license - -dhtmlxGantt v.3.2.0 Stardard -This software is covered by GPL license. You also can obtain Commercial or Enterprise license to use it in non-GPL project - please contact sales@dhtmlx.com. Usage without proper license is prohibited. - -(c) Dinamenta, UAB. -*/ -gantt.locale = { - date: { - month_full: ["Januari", "Februari", "Maart", "April", "Mei", "Juni", "Juli", "Augustus", "September", "Oktober", "November", "December"], - month_short: ["Jan", "Feb", "mrt", "Apr", "Mei", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Dec"], - day_full: ["Zondag", "Maandag", "Dinsdag", "Woensdag", "Donderdag", "Vrijdag", "Zaterdag"], - day_short: ["Zo", "Ma", "Di", "Wo", "Do", "Vr", "Za"] - }, - labels: { - dhx_cal_today_button: "Vandaag", - day_tab: "Dag", - week_tab: "Week", - month_tab: "Maand", - new_event: "Nieuw item", - icon_save: "Opslaan", - icon_cancel: "Annuleren", - icon_details: "Details", - icon_edit: "Bewerken", - icon_delete: "Verwijderen", - confirm_closing: "", //Your changes will be lost, are your sure ? - confirm_deleting: "Item zal permanent worden verwijderd, doorgaan?", - section_description: "Beschrijving", - section_time: "Tijd periode", - section_type:"Type", - /* grid columns */ - - column_text : "Taak omschrijving", - column_start_date : "Startdatum", - column_duration : "Duur", - column_add : "", - - /* link confirmation */ - link: "Koppeling", - confirm_link_deleting:"zal worden verwijderd", - link_start: " (start)", - link_end: " (eind)", - - type_task: "Task", - type_project: "Project", - type_milestone: "Milestone", - - - minutes: "minuten", - hours: "uren", - days: "dagen", - weeks: "weken", - months: "maanden", - years: "jaren" - } -}; - diff --git a/libraries/dhtmlxgantt/sources/locale/locale_nl.js.map b/libraries/dhtmlxgantt/sources/locale/locale_nl.js.map deleted file mode 100644 index 33a9b52..0000000 --- a/libraries/dhtmlxgantt/sources/locale/locale_nl.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"locale_nl.js","sources":["locale_nl.js"],"names":["gantt","locale","date","month_full","month_short","day_full","day_short","labels","dhx_cal_today_button","day_tab","week_tab","month_tab","new_event","icon_save","icon_cancel","icon_details","icon_edit","icon_delete","confirm_closing","confirm_deleting","section_description","section_time","section_type","column_text","column_start_date","column_duration","column_add","link","confirm_link_deleting","link_start","link_end","type_task","type_project","type_milestone","minutes","hours","days","weeks","months","years"],"mappings":";;;;;;;;AAQAA,MAAMC,QACLC,MACCC,YAAa,UAAW,WAAY,QAAS,QAAS,MAAO,OAAQ,OAAQ,WAAY,YAAa,UAAW,WAAY,YAC7HC,aAAc,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,OAC3FC,UAAW,SAAU,UAAW,UAAW,WAAY,YAAa,UAAW,YAC/EC,WAAY,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,OAEjDC,QACCC,qBAAsB,UACtBC,QAAS,MACTC,SAAU,OACVC,UAAW,QACXC,UAAW,aACXC,UAAW,UACXC,YAAa;AACbC,aAAc,UACdC,UAAW,WACXC,YAAa,cACbC,gBAAiB,GACjBC,iBAAkB,kDAClBC,oBAAqB,eACrBC,aAAc,eACdC,aAAa,OAGPC,YAAc,oBACdC,kBAAoB,aACpBC,gBAAkB,OAClBC,WAAa,GAGnBC,KAAM,YACNC,sBAAsB,wBACtBC,WAAY,WACZC,SAAU,UAEVC,UAAW,OACXC,aAAc,UACdC,eAAgB;AAGVC,QAAS,UACTC,MAAO,OACPC,KAAM,QACNC,MAAO,QACPC,OAAQ,UACRC,MAAO"} \ No newline at end of file diff --git a/libraries/dhtmlxgantt/sources/locale/locale_no.js b/libraries/dhtmlxgantt/sources/locale/locale_no.js deleted file mode 100644 index 612e773..0000000 --- a/libraries/dhtmlxgantt/sources/locale/locale_no.js +++ /dev/null @@ -1,58 +0,0 @@ -/* -@license - -dhtmlxGantt v.3.2.0 Stardard -This software is covered by GPL license. You also can obtain Commercial or Enterprise license to use it in non-GPL project - please contact sales@dhtmlx.com. Usage without proper license is prohibited. - -(c) Dinamenta, UAB. -*/ -gantt.locale = { - date: { - month_full: ["Januar", "Februar", "Mars", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Desember"], - month_short: ["Jan", "Feb", "Mar", "Apr", "Mai", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Des"], - day_full: ["Søndag", "Mandag", "Tirsdag", "Onsdag", "Torsdag", "Fredag", "Lørdag"], - day_short: ["Søn", "Man", "Tir", "Ons", "Tor", "Fre", "Lør"] - }, - labels: { - dhx_cal_today_button: "Idag", - day_tab: "Dag", - week_tab: "Uke", - month_tab: "Måned", - new_event: "Ny", - icon_save: "Lagre", - icon_cancel: "Avbryt", - icon_details: "Detaljer", - icon_edit: "Endre", - icon_delete: "Slett", - confirm_closing: "Endringer blir ikke lagret, er du sikker?", //Endringer blir ikke lagret, er du sikker? - confirm_deleting: "Oppføringen vil bli slettet, er du sikker?", - section_description: "Beskrivelse", - section_time: "Tidsperiode", - section_type:"Type", - /* grid columns */ - - column_text : "Task name", - column_start_date : "Start time", - column_duration : "Duration", - column_add : "", - - /* link confirmation */ - link: "Link", - confirm_link_deleting:"will be deleted", - link_start: " (start)", - link_end: " (end)", - - type_task: "Task", - type_project: "Project", - type_milestone: "Milestone", - - - minutes: "Minutes", - hours: "Hours", - days: "Days", - weeks: "Week", - months: "Months", - years: "Years" - } -}; - diff --git a/libraries/dhtmlxgantt/sources/locale/locale_no.js.map b/libraries/dhtmlxgantt/sources/locale/locale_no.js.map deleted file mode 100644 index 9b35f3e..0000000 --- a/libraries/dhtmlxgantt/sources/locale/locale_no.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"locale_no.js","sources":["locale_no.js"],"names":["gantt","locale","date","month_full","month_short","day_full","day_short","labels","dhx_cal_today_button","day_tab","week_tab","month_tab","new_event","icon_save","icon_cancel","icon_details","icon_edit","icon_delete","confirm_closing","confirm_deleting","section_description","section_time","section_type","column_text","column_start_date","column_duration","column_add","link","confirm_link_deleting","link_start","link_end","type_task","type_project","type_milestone","minutes","hours","days","weeks","months","years"],"mappings":";;;;;;;;AAQAA,MAAMC,QACLC,MACCC,YAAa,SAAU,UAAW,OAAQ,QAAS,MAAO,OAAQ,OAAQ,SAAU,YAAa,UAAW,WAAY,YACxHC,aAAc,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,OAC3FC,UAAW,SAAU,SAAU,UAAW,SAAU,UAAW,SAAU,UACzEC,WAAY,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,QAEvDC,QACCC,qBAAsB,OACtBC,QAAS,MACTC,SAAU,MACVC,UAAW,QACXC,UAAW,KACXC,UAAW,QACXC,YAAa,SACbC,aAAc;AACdC,UAAW,QACXC,YAAa,QACbC,gBAAiB,4CACjBC,iBAAkB,6CAClBC,oBAAqB,cACrBC,aAAc,cACdC,aAAa,OAGPC,YAAc,YACdC,kBAAoB,aACpBC,gBAAkB,WAClBC,WAAa,GAGnBC,KAAM,OACNC,sBAAsB,kBACtBC,WAAY,WACZC,SAAU,SAEVC,UAAW,OACXC,aAAc,UACdC,eAAgB,YAGVC,QAAS;AACTC,MAAO,QACPC,KAAM,OACNC,MAAO,OACPC,OAAQ,SACRC,MAAO"} \ No newline at end of file diff --git a/libraries/dhtmlxgantt/sources/locale/locale_pl.js b/libraries/dhtmlxgantt/sources/locale/locale_pl.js deleted file mode 100644 index 83a763f..0000000 --- a/libraries/dhtmlxgantt/sources/locale/locale_pl.js +++ /dev/null @@ -1,58 +0,0 @@ -/* -@license - -dhtmlxGantt v.3.2.0 Stardard -This software is covered by GPL license. You also can obtain Commercial or Enterprise license to use it in non-GPL project - please contact sales@dhtmlx.com. Usage without proper license is prohibited. - -(c) Dinamenta, UAB. -*/ -gantt.locale = { - date: { - month_full: ["Styczeń", "Luty", "Marzec", "Kwiecień", "Maj", "Czerwiec", "Lipiec", "Sierpień", "Wrzesień", "Październik", "Listopad", "Grudzień"], - month_short: ["Sty", "Lut", "Mar", "Kwi", "Maj", "Cze", "Lip", "Sie", "Wrz", "Paź", "Lis", "Gru"], - day_full: ["Niedziela", "Poniedziałek", "Wtorek", "Środa", "Czwartek", "Piątek", "Sobota"], - day_short: ["Nie", "Pon", "Wto", "Śro", "Czw", "Pią", "Sob"] - }, - labels: { - dhx_cal_today_button: "Dziś", - day_tab: "Dzień", - week_tab: "Tydzień", - month_tab: "Miesiąc", - new_event: "Nowe zdarzenie", - icon_save: "Zapisz", - icon_cancel: "Anuluj", - icon_details: "Szczegóły", - icon_edit: "Edytuj", - icon_delete: "Usuń", - confirm_closing: "", //Zmiany zostaną usunięte, jesteś pewien? - confirm_deleting: "Zdarzenie zostanie usunięte na zawsze, kontynuować?", - section_description: "Opis", - section_time: "Okres czasu", - section_type: "Typ", - /* grid columns */ - - column_text : "Nazwa zadania", - column_start_date : "Początek", - column_duration : "Czas trwania", - column_add : "", - - /* link confirmation */ - link: "Link", - confirm_link_deleting:"zostanie usunięty", - link_start: " (początek)", - link_end: " (koniec)", - - type_task: "Zadanie", - type_project: "Projekt", - type_milestone: "Milestone", - - - minutes: "Minuty", - hours: "Godziny", - days: "Dni", - weeks: "Tydzień", - months: "Miesiące", - years: "Lata" - } -}; - diff --git a/libraries/dhtmlxgantt/sources/locale/locale_pl.js.map b/libraries/dhtmlxgantt/sources/locale/locale_pl.js.map deleted file mode 100644 index dbe3a71..0000000 --- a/libraries/dhtmlxgantt/sources/locale/locale_pl.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"locale_pl.js","sources":["locale_pl.js"],"names":["gantt","locale","date","month_full","month_short","day_full","day_short","labels","dhx_cal_today_button","day_tab","week_tab","month_tab","new_event","icon_save","icon_cancel","icon_details","icon_edit","icon_delete","confirm_closing","confirm_deleting","section_description","section_time","section_type","column_text","column_start_date","column_duration","column_add","link","confirm_link_deleting","link_start","link_end","type_task","type_project","type_milestone","minutes","hours","days","weeks","months","years"],"mappings":";;;;;;;;AAQAA,MAAMC,QACLC,MACCC,YAAa,UAAW,OAAQ,SAAU,WAAY,MAAO,WAAY,SAAU,WAAY,WAAY,cAAe,WAAY,YACtIC,aAAc,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,OAC3FC,UAAW,YAAa,eAAgB,SAAU,QAAS,WAAY,SAAU,UACjFC,WAAY,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,QAEvDC,QACCC,qBAAsB,OACtBC,QAAS,QACTC,SAAU,UACVC,UAAW,UACXC,UAAW,iBACXC,UAAW;AACXC,YAAa,SACbC,aAAc,YACdC,UAAW,SACXC,YAAa,OACbC,gBAAiB,GACjBC,iBAAkB,sDAClBC,oBAAqB,OACrBC,aAAc,cACdC,aAAc,MAGdC,YAAc,gBACdC,kBAAoB,WACpBC,gBAAkB,eAClBC,WAAa,GAGbC,KAAM,OACNC,sBAAsB,oBACtBC,WAAY,cACZC,SAAU,YAEVC,UAAW,UACXC,aAAc,UACdC,eAAgB;AAGhBC,QAAS,SACTC,MAAO,UACPC,KAAM,MACNC,MAAO,UACPC,OAAQ,WACRC,MAAO"} \ No newline at end of file diff --git a/libraries/dhtmlxgantt/sources/locale/locale_pt.js b/libraries/dhtmlxgantt/sources/locale/locale_pt.js deleted file mode 100644 index 2ebfbce..0000000 --- a/libraries/dhtmlxgantt/sources/locale/locale_pt.js +++ /dev/null @@ -1,67 +0,0 @@ -/* -@license - -dhtmlxGantt v.3.2.0 Stardard -This software is covered by GPL license. You also can obtain Commercial or Enterprise license to use it in non-GPL project - please contact sales@dhtmlx.com. Usage without proper license is prohibited. - -(c) Dinamenta, UAB. -*/ -/* - - TRANSLATION BY MATTHEUS PIROVANI RORIZ GONЗALVES - - mattheusroriz@hotmail.com / mattheus.pirovani@gmail.com / - - www.atrixian.com.br - - */ - -gantt.locale = { - date: { - month_full: ["Janeiro", "Fevereiro", "Março", "Abril", "Maio", "Junho", "Julho", "Agosto", "Setembro", "Outubro", "Novembro", "Dezembro"], - month_short: ["Jan", "Fev", "Mar", "Abr", "Mai", "Jun", "Jul", "Ago", "Set", "Out", "Nov", "Dez"], - day_full: ["Domingo", "Segunda", "Terça", "Quarta", "Quinta", "Sexta", "Sábado"], - day_short: ["Dom", "Seg", "Ter", "Qua", "Qui", "Sex", "Sab"] - }, - labels: { - dhx_cal_today_button: "Hoje", - day_tab: "Dia", - week_tab: "Semana", - month_tab: "Mês", - new_event: "Novo evento", - icon_save: "Salvar", - icon_cancel: "Cancelar", - icon_details: "Detalhes", - icon_edit: "Editar", - icon_delete: "Deletar", - confirm_closing: "Suas alterações serão perdidas. Você tem certeza?", //Your changes will be lost, are your sure ? - confirm_deleting: "Tem certeza que deseja excluir?", - section_description: "Descrição", - section_time: "Período de tempo", - section_type:"Type", - /* grid columns */ - - column_text : "Nome tarefa", - column_start_date : "Data início", - column_duration : "Duração", - column_add : "", - - /* link confirmation */ - link: "Link", - confirm_link_deleting:"será apagado", - link_start: " (início)", - link_end: " (fim)", - - type_task: "Task", - type_project: "Project", - type_milestone: "Milestone", - - - minutes: "Minutos", - hours: "Horas", - days: "Dias", - weeks: "Semanas", - months: "Meses", - years: "Anos" - } -}; \ No newline at end of file diff --git a/libraries/dhtmlxgantt/sources/locale/locale_pt.js.map b/libraries/dhtmlxgantt/sources/locale/locale_pt.js.map deleted file mode 100644 index 30ac483..0000000 --- a/libraries/dhtmlxgantt/sources/locale/locale_pt.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"locale_pt.js","sources":["locale_pt.js"],"names":["gantt","locale","date","month_full","month_short","day_full","day_short","labels","dhx_cal_today_button","day_tab","week_tab","month_tab","new_event","icon_save","icon_cancel","icon_details","icon_edit","icon_delete","confirm_closing","confirm_deleting","section_description","section_time","section_type","column_text","column_start_date","column_duration","column_add","link","confirm_link_deleting","link_start","link_end","type_task","type_project","type_milestone","minutes","hours","days","weeks","months","years"],"mappings":";;;;;;;;AAkBAA,MAAMC,QACLC,MACCC,YAAa,UAAW,YAAa,QAAS,QAAS,OAAQ,QAAS,QAAS,SAAU,WAAY,UAAW,WAAY,YAC9HC,aAAc,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,OAC3FC,UAAW,UAAW,UAAW,QAAS,SAAU,SAAU,QAAS,UACvEC,WAAY,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,QAEvDC,QACCC,qBAAsB,OACtBC,QAAS,MACTC,SAAU,SACVC,UAAW,MACXC,UAAW,cACXC,UAAW,SACXC,YAAa;AACbC,aAAc,WACdC,UAAW,SACXC,YAAa,UACbC,gBAAiB,oDACjBC,iBAAkB,kCAClBC,oBAAqB,YACrBC,aAAc,mBACdC,aAAa,OAGbC,YAAc,cACdC,kBAAoB,cACpBC,gBAAkB,UAClBC,WAAa,GAGbC,KAAM,OACNC,sBAAsB,eACtBC,WAAY,YACZC,SAAU,SAEVC,UAAW,OACXC,aAAc,UACdC,eAAgB;AAGhBC,QAAS,UACTC,MAAO,QACPC,KAAM,OACNC,MAAO,UACPC,OAAQ,QACRC,MAAO"} \ No newline at end of file diff --git a/libraries/dhtmlxgantt/sources/locale/locale_ro.js b/libraries/dhtmlxgantt/sources/locale/locale_ro.js deleted file mode 100644 index 5a3c9a7..0000000 --- a/libraries/dhtmlxgantt/sources/locale/locale_ro.js +++ /dev/null @@ -1,62 +0,0 @@ -/* -@license - -dhtmlxGantt v.3.2.0 Stardard -This software is covered by GPL license. You also can obtain Commercial or Enterprise license to use it in non-GPL project - please contact sales@dhtmlx.com. Usage without proper license is prohibited. - -(c) Dinamenta, UAB. -*/ -/* - Traducere de Ovidiu Lixandru: http://www.madball.ro - */ - -gantt.locale = { - date:{ - month_full:["Ianuarie", "Februarie", "Martie", "Aprilie", "Mai", "Iunie", "Iulie", "August", "Septembrie", "Octombrie", "November", "December"], - month_short:["Ian", "Feb", "Mar", "Apr", "Mai", "Iun", "Iul", "Aug", "Sep", "Oct", "Nov", "Dec"], - day_full:["Duminica", "Luni", "Marti", "Miercuri", "Joi", "Vineri", "Sambata"], - day_short:["Du", "Lu", "Ma", "Mi", "Jo", "Vi", "Sa"] - }, - labels:{ - dhx_cal_today_button:"Astazi", - day_tab:"Zi", - week_tab:"Saptamana", - month_tab:"Luna", - new_event:"Eveniment nou", - icon_save:"Salveaza", - icon_cancel:"Anuleaza", - icon_details:"Detalii", - icon_edit:"Editeaza", - icon_delete:"Sterge", - confirm_closing:"Schimbarile nu vor fi salvate, esti sigur?",//Your changes will be lost, are your sure ? - confirm_deleting:"Evenimentul va fi sters permanent, esti sigur?", - section_description:"Descriere", - section_time:"Interval", - section_type:"Type", - /* grid columns */ - - column_text : "Task name", - column_start_date : "Start time", - column_duration : "Duration", - column_add : "", - - /* link confirmation */ - link: "Link", - confirm_link_deleting:"will be deleted", - link_start: " (start)", - link_end: " (end)", - - type_task: "Task", - type_project: "Project", - type_milestone: "Milestone", - - - minutes: "Minutes", - hours: "Hours", - days: "Days", - weeks: "Week", - months: "Months", - years: "Years" - } -}; - diff --git a/libraries/dhtmlxgantt/sources/locale/locale_ro.js.map b/libraries/dhtmlxgantt/sources/locale/locale_ro.js.map deleted file mode 100644 index 1817f20..0000000 --- a/libraries/dhtmlxgantt/sources/locale/locale_ro.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"locale_ro.js","sources":["locale_ro.js"],"names":["gantt","locale","date","month_full","month_short","day_full","day_short","labels","dhx_cal_today_button","day_tab","week_tab","month_tab","new_event","icon_save","icon_cancel","icon_details","icon_edit","icon_delete","confirm_closing","confirm_deleting","section_description","section_time","section_type","column_text","column_start_date","column_duration","column_add","link","confirm_link_deleting","link_start","link_end","type_task","type_project","type_milestone","minutes","hours","days","weeks","months","years"],"mappings":";;;;;;;;AAYAA,MAAMC,QACLC,MACCC,YAAY,WAAY,YAAa,SAAU,UAAW,MAAO,QAAS,QAAS,SAAU,aAAc,YAAa,WAAY,YACpIC,aAAa,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,OAC1FC,UAAU,WAAY,OAAQ,QAAS,WAAY,MAAO,SAAU,WACpEC,WAAW,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,OAEhDC,QACCC,qBAAqB,SACrBC,QAAQ,KACRC,SAAS,YACTC,UAAU,OACVC,UAAU,gBACVC,UAAU,WACVC,YAAY;AACZC,aAAa,UACbC,UAAU,WACVC,YAAY,SACZC,gBAAgB,6CAChBC,iBAAiB,iDACjBC,oBAAoB,YACpBC,aAAa,WACbC,aAAa,OAGPC,YAAc,YACdC,kBAAoB,aACpBC,gBAAkB,WAClBC,WAAa,GAGnBC,KAAM,OACNC,sBAAsB,kBACtBC,WAAY,WACZC,SAAU,SAEVC,UAAW,OACXC,aAAc,UACdC,eAAgB;AAGVC,QAAS,UACTC,MAAO,QACPC,KAAM,OACNC,MAAO,OACPC,OAAQ,SACRC,MAAO"} \ No newline at end of file diff --git a/libraries/dhtmlxgantt/sources/locale/locale_ru.js b/libraries/dhtmlxgantt/sources/locale/locale_ru.js deleted file mode 100644 index 8168b5f..0000000 --- a/libraries/dhtmlxgantt/sources/locale/locale_ru.js +++ /dev/null @@ -1,58 +0,0 @@ -/* -@license - -dhtmlxGantt v.3.2.0 Stardard -This software is covered by GPL license. You also can obtain Commercial or Enterprise license to use it in non-GPL project - please contact sales@dhtmlx.com. Usage without proper license is prohibited. - -(c) Dinamenta, UAB. -*/ -gantt.locale = { - date: { - month_full: ["Январь", "Февраль", "Март", "Апрель", "Maй", "Июнь", "Июль", "Август", "Сентябрь", "Oктябрь", "Ноябрь", "Декабрь"], - month_short: ["Янв", "Фев", "Maр", "Aпр", "Maй", "Июн", "Июл", "Aвг", "Сен", "Окт", "Ноя", "Дек"], - day_full: [ "Воскресенье", "Понедельник", "Вторник", "Среда", "Четверг", "Пятница", "Суббота"], - day_short: ["Вс", "Пн", "Вт", "Ср", "Чт", "Пт", "Сб"] - }, - labels: { - dhx_cal_today_button: "Сегодня", - day_tab: "День", - week_tab: "Неделя", - month_tab: "Месяц", - new_event: "Новое событие", - icon_save: "Сохранить", - icon_cancel: "Отменить", - icon_details: "Детали", - icon_edit: "Изменить", - icon_delete: "Удалить", - confirm_closing: "", //Ваши изменения будут потеряны, продолжить? - confirm_deleting: "Событие будет удалено безвозвратно, продолжить?", - section_description: "Описание", - section_time: "Период времени", - section_type:"Тип", - /* grid columns */ - - column_text : "Задача", - column_start_date : "Начало", - column_duration : "Длительность", - column_add : "", - - /* link confirmation */ - link: "Связь", - confirm_link_deleting:"будет удалена", - link_start: " (начало)", - link_end: " (конец)", - - type_task: "Task", - type_project: "Project", - type_milestone: "Milestone", - - - minutes: "Минута", - hours: "Час", - days: "День", - weeks: "Неделя", - months: "Месяц", - years: "Год" - } -}; - diff --git a/libraries/dhtmlxgantt/sources/locale/locale_ru.js.map b/libraries/dhtmlxgantt/sources/locale/locale_ru.js.map deleted file mode 100644 index c672a44..0000000 --- a/libraries/dhtmlxgantt/sources/locale/locale_ru.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"locale_ru.js","sources":["locale_ru.js"],"names":["gantt","locale","date","month_full","month_short","day_full","day_short","labels","dhx_cal_today_button","day_tab","week_tab","month_tab","new_event","icon_save","icon_cancel","icon_details","icon_edit","icon_delete","confirm_closing","confirm_deleting","section_description","section_time","section_type","column_text","column_start_date","column_duration","column_add","link","confirm_link_deleting","link_start","link_end","type_task","type_project","type_milestone","minutes","hours","days","weeks","months","years"],"mappings":";;;;;;;;AAQAA,MAAMC,QACLC,MACCC,YAAa,SAAU,UAAW,OAAQ,SAAU,MAAO,OAAQ,OAAQ,SAAU,WAAY,UAAW,SAAU,WACtHC,aAAc,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,OAC3FC,UAAY,cAAe,cAAe,UAAW,QAAS,UAAW,UAAW,WACpFC,WAAY,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,OAEjDC,QACCC,qBAAsB,UACtBC,QAAS,OACTC,SAAU,SACVC,UAAW,QACXC,UAAW,gBACXC,UAAW,YACXC,YAAa;AACbC,aAAc,SACdC,UAAW,WACXC,YAAa,UACbC,gBAAiB,GACjBC,iBAAkB,kDAClBC,oBAAqB,WACrBC,aAAc,iBACdC,aAAa,MAGPC,YAAc,SACdC,kBAAoB,SACpBC,gBAAkB,eAClBC,WAAa,GAGnBC,KAAM,QACNC,sBAAsB,gBACtBC,WAAY,YACZC,SAAU,WAEVC,UAAW,OACXC,aAAc,UACdC,eAAgB,YAGVC,QAAS;AACTC,MAAO,MACPC,KAAM,OACNC,MAAO,SACPC,OAAQ,QACRC,MAAO"} \ No newline at end of file diff --git a/libraries/dhtmlxgantt/sources/locale/locale_si.js b/libraries/dhtmlxgantt/sources/locale/locale_si.js deleted file mode 100644 index de68c5c..0000000 --- a/libraries/dhtmlxgantt/sources/locale/locale_si.js +++ /dev/null @@ -1,58 +0,0 @@ -/* -@license - -dhtmlxGantt v.3.2.0 Stardard -This software is covered by GPL license. You also can obtain Commercial or Enterprise license to use it in non-GPL project - please contact sales@dhtmlx.com. Usage without proper license is prohibited. - -(c) Dinamenta, UAB. -*/ -gantt.locale = { - date: { - month_full: ["Januar", "Februar", "Marec", "April", "Maj", "Junij", "Julij", "Avgust", "September", "Oktober", "November", "December"], - month_short: ["Jan", "Feb", "Mar", "Apr", "Maj", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Dec"], - day_full: ["Nedelja", "Ponedeljek", "Torek", "Sreda", "Četrtek", "Petek", "Sobota"], - day_short: ["Ned", "Pon", "Tor", "Sre", "Čet", "Pet", "Sob"] - }, - labels: { - dhx_cal_today_button: "Danes", - day_tab: "Dan", - week_tab: "Teden", - month_tab: "Mesec", - new_event: "Nov dogodek", - icon_save: "Shrani", - icon_cancel: "Prekliči", - icon_details: "Podrobnosti", - icon_edit: "Uredi", - icon_delete: "Izbriši", - confirm_closing: "", //Spremembe ne bodo shranjene. Želite nadaljevati ? - confirm_deleting: "Dogodek bo izbrisan. Želite nadaljevati?", - section_description: "Opis", - section_time: "Časovni okvir", - section_type:"Type", - /* grid columns */ - - column_text : "Task name", - column_start_date : "Start time", - column_duration : "Duration", - column_add : "", - - /* link confirmation */ - link: "Link", - confirm_link_deleting:"will be deleted", - link_start: " (start)", - link_end: " (end)", - - type_task: "Task", - type_project: "Project", - type_milestone: "Milestone", - - - minutes: "Minutes", - hours: "Hours", - days: "Days", - weeks: "Week", - months: "Months", - years: "Years" - } -}; - diff --git a/libraries/dhtmlxgantt/sources/locale/locale_si.js.map b/libraries/dhtmlxgantt/sources/locale/locale_si.js.map deleted file mode 100644 index 075866d..0000000 --- a/libraries/dhtmlxgantt/sources/locale/locale_si.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"locale_si.js","sources":["locale_si.js"],"names":["gantt","locale","date","month_full","month_short","day_full","day_short","labels","dhx_cal_today_button","day_tab","week_tab","month_tab","new_event","icon_save","icon_cancel","icon_details","icon_edit","icon_delete","confirm_closing","confirm_deleting","section_description","section_time","section_type","column_text","column_start_date","column_duration","column_add","link","confirm_link_deleting","link_start","link_end","type_task","type_project","type_milestone","minutes","hours","days","weeks","months","years"],"mappings":";;;;;;;;AAQAA,MAAMC,QACLC,MACCC,YAAa,SAAU,UAAW,QAAS,QAAS,MAAO,QAAS,QAAS,SAAU,YAAa,UAAW,WAAY,YAC3HC,aAAc,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,OAC3FC,UAAW,UAAW,aAAc,QAAS,QAAS,UAAW,QAAS,UAC1EC,WAAY,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,QAEvDC,QACCC,qBAAsB,QACtBC,QAAS,MACTC,SAAU,QACVC,UAAW,QACXC,UAAW,cACXC,UAAW,SACXC,YAAa;AACbC,aAAc,cACdC,UAAW,QACXC,YAAa,UACbC,gBAAiB,GACjBC,iBAAkB,2CAClBC,oBAAqB,OACrBC,aAAc,gBACdC,aAAa,OAGPC,YAAc,YACdC,kBAAoB,aACpBC,gBAAkB,WAClBC,WAAa,GAGnBC,KAAM,OACNC,sBAAsB,kBACtBC,WAAY,WACZC,SAAU,SAEVC,UAAW,OACXC,aAAc,UACdC,eAAgB,YAGVC,QAAS,UACTC,MAAO;AACPC,KAAM,OACNC,MAAO,OACPC,OAAQ,SACRC,MAAO"} \ No newline at end of file diff --git a/libraries/dhtmlxgantt/sources/locale/locale_sk.js b/libraries/dhtmlxgantt/sources/locale/locale_sk.js deleted file mode 100644 index ca52273..0000000 --- a/libraries/dhtmlxgantt/sources/locale/locale_sk.js +++ /dev/null @@ -1,58 +0,0 @@ -/* -@license - -dhtmlxGantt v.3.2.0 Stardard -This software is covered by GPL license. You also can obtain Commercial or Enterprise license to use it in non-GPL project - please contact sales@dhtmlx.com. Usage without proper license is prohibited. - -(c) Dinamenta, UAB. -*/ -gantt.locale = { - date: { - month_full: ["Január", "Február", "Marec", "Apríl", "Máj", "Jún", "Júl", "August", "September", "Október", "November", "December"], - month_short: ["Jan", "Feb", "Mar", "Apr", "Máj", "Jún", "Júl", "Aug", "Sept", "Okt", "Nov", "Dec"], - day_full: ["Nedeľa", "Pondelok", "Utorok", "Streda", "Štvrtok", "Piatok", "Sobota"], - day_short: ["Ne", "Po", "Ut", "St", "Št", "Pi", "So"] - }, - labels: { - dhx_cal_today_button: "Dnes", - day_tab: "Deň", - week_tab: "Týždeň", - month_tab: "Mesiac", - new_event: "Nová udalosť", - icon_save: "Uložiť", - icon_cancel: "Späť", - icon_details: "Detail", - icon_edit: "Edituj", - icon_delete: "Zmazať", - confirm_closing: "Vaše zmeny nebudú uložené. Skutočne?", //Vaše změny budou ztraceny, opravdu ? - confirm_deleting: "Udalosť bude natrvalo vymazaná. Skutočne?", - section_description: "Poznámky", - section_time: "Doba platnosti", - section_type:"Type", - /* grid columns */ - - column_text : "Task name", - column_start_date : "Start time", - column_duration : "Duration", - column_add : "", - - /* link confirmation */ - link: "Link", - confirm_link_deleting:"will be deleted", - link_start: " (start)", - link_end: " (end)", - - type_task: "Task", - type_project: "Project", - type_milestone: "Milestone", - - - minutes: "Minutes", - hours: "Hours", - days: "Days", - weeks: "Week", - months: "Months", - years: "Years" - } -}; - diff --git a/libraries/dhtmlxgantt/sources/locale/locale_sk.js.map b/libraries/dhtmlxgantt/sources/locale/locale_sk.js.map deleted file mode 100644 index ede642b..0000000 --- a/libraries/dhtmlxgantt/sources/locale/locale_sk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"locale_sk.js","sources":["locale_sk.js"],"names":["gantt","locale","date","month_full","month_short","day_full","day_short","labels","dhx_cal_today_button","day_tab","week_tab","month_tab","new_event","icon_save","icon_cancel","icon_details","icon_edit","icon_delete","confirm_closing","confirm_deleting","section_description","section_time","section_type","column_text","column_start_date","column_duration","column_add","link","confirm_link_deleting","link_start","link_end","type_task","type_project","type_milestone","minutes","hours","days","weeks","months","years"],"mappings":";;;;;;;;AAQAA,MAAMC,QACLC,MACCC,YAAa,SAAU,UAAW,QAAS,QAAS,MAAO,MAAO,MAAO,SAAU,YAAa,UAAW,WAAY,YACvHC,aAAc,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,OAAQ,MAAO,MAAO,OAC5FC,UAAW,SAAU,WAAY,SAAU,SAAU,UAAW,SAAU,UAC1EC,WAAY,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,OAEjDC,QACCC,qBAAsB,OACtBC,QAAS,MACTC,SAAU,SACVC,UAAW,SACXC,UAAW,eACXC,UAAW,SACXC,YAAa;AACbC,aAAc,SACdC,UAAW,SACXC,YAAa,SACbC,gBAAiB,uCACjBC,iBAAkB,4CAClBC,oBAAqB,WACrBC,aAAc,iBACdC,aAAa,OAGPC,YAAc,YACdC,kBAAoB,aACpBC,gBAAkB,WAClBC,WAAa,GAGnBC,KAAM,OACNC,sBAAsB,kBACtBC,WAAY,WACZC,SAAU,SAEVC,UAAW,OACXC,aAAc,UACdC,eAAgB;AAGVC,QAAS,UACTC,MAAO,QACPC,KAAM,OACNC,MAAO,OACPC,OAAQ,SACRC,MAAO"} \ No newline at end of file diff --git a/libraries/dhtmlxgantt/sources/locale/locale_sv.js b/libraries/dhtmlxgantt/sources/locale/locale_sv.js deleted file mode 100644 index 34e53a3..0000000 --- a/libraries/dhtmlxgantt/sources/locale/locale_sv.js +++ /dev/null @@ -1,60 +0,0 @@ -/* -@license - -dhtmlxGantt v.3.2.0 Stardard -This software is covered by GPL license. You also can obtain Commercial or Enterprise license to use it in non-GPL project - please contact sales@dhtmlx.com. Usage without proper license is prohibited. - -(c) Dinamenta, UAB. -*/ -/* - Translation by Peter Eriksson - */ -gantt.locale = { - date: { - month_full: ["Januari", "Februari", "Mars", "April", "Maj", "Juni", "Juli", "Augusti", "September", "Oktober", "November", "December"], - month_short: ["Jan", "Feb", "Mar", "Apr", "Maj", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Dec"], - day_full: ["Söndag", "Måndag", "Tisdag", "Onsdag", "Torsdag", "Fredag", "Lördag"], - day_short: ["Sön", "Mån", "Tis", "Ons", "Tor", "Fre", "Lör"] - }, - labels: { - dhx_cal_today_button: "Idag", - day_tab: "Dag", - week_tab: "Vecka", - month_tab: "Månad", - new_event: "Ny händelse", - icon_save: "Spara", - icon_cancel: "Avbryt", - icon_details: "Detajer", - icon_edit: "Ändra", - icon_delete: "Ta bort", - confirm_closing: "", - confirm_deleting: "Är du säker på att du vill ta bort händelsen permanent?", - section_description: "Beskrivning", - section_time: "Tid", - section_type: "Typ", - - /* grid columns */ - - column_text: "Uppgiftsnamn", - column_start_date: "Starttid", - column_duration: "Varaktighet", - column_add: "", - - /* link confirmation */ - - link: "Länk", - confirm_link_deleting: "kommer tas bort", - link_start: " (start)", - link_end: " (slut)", - type_task: "Uppgift", - type_project: "Projekt", - type_milestone: "Milstolpe", - - minutes: "Minuter", - hours: "Timmar", - days: "Dagar", - weeks: "Veckor", - months: "Månader", - years: "År" - } -}; \ No newline at end of file diff --git a/libraries/dhtmlxgantt/sources/locale/locale_sv.js.map b/libraries/dhtmlxgantt/sources/locale/locale_sv.js.map deleted file mode 100644 index f9a23f2..0000000 --- a/libraries/dhtmlxgantt/sources/locale/locale_sv.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"locale_sv.js","sources":["locale_sv.js"],"names":["gantt","locale","date","month_full","month_short","day_full","day_short","labels","dhx_cal_today_button","day_tab","week_tab","month_tab","new_event","icon_save","icon_cancel","icon_details","icon_edit","icon_delete","confirm_closing","confirm_deleting","section_description","section_time","section_type","column_text","column_start_date","column_duration","column_add","link","confirm_link_deleting","link_start","link_end","type_task","type_project","type_milestone","minutes","hours","days","weeks","months","years"],"mappings":";;;;;;;;AAWAA,MAAMC,QACLC,MACCC,YAAa,UAAW,WAAY,OAAQ,QAAS,MAAO,OAAQ,OAAQ,UAAW,YAAa,UAAW,WAAY,YAC3HC,aAAc,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,OAC3FC,UAAW,SAAU,SAAU,SAAU,SAAU,UAAW,SAAU,UACxEC,WAAY,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,QAEvDC,QACCC,qBAAsB,OACtBC,QAAS,MACTC,SAAU,QACVC,UAAW,QACXC,UAAW,cACXC,UAAW,QACXC,YAAa;AACbC,aAAc,UACdC,UAAW,QACXC,YAAa,UACbC,gBAAiB,GACjBC,iBAAkB,0DAClBC,oBAAqB,cACrBC,aAAc,MACdC,aAAc,MAIdC,YAAa,eACbC,kBAAmB,WACnBC,gBAAiB,cACjBC,WAAY,GAIZC,KAAM,OACNC,sBAAuB,kBACvBC,WAAY,WACZC,SAAU,UACVC,UAAW,UACXC,aAAc,UACdC,eAAgB,YAEhBC,QAAS;AACTC,MAAO,SACPC,KAAM,QACNC,MAAO,SACPC,OAAQ,UACRC,MAAO"} \ No newline at end of file diff --git a/libraries/dhtmlxgantt/sources/locale/locale_tr.js b/libraries/dhtmlxgantt/sources/locale/locale_tr.js deleted file mode 100644 index a6b1b6d..0000000 --- a/libraries/dhtmlxgantt/sources/locale/locale_tr.js +++ /dev/null @@ -1,58 +0,0 @@ -/* -@license - -dhtmlxGantt v.3.2.0 Stardard -This software is covered by GPL license. You also can obtain Commercial or Enterprise license to use it in non-GPL project - please contact sales@dhtmlx.com. Usage without proper license is prohibited. - -(c) Dinamenta, UAB. -*/ -gantt.locale = { - date: { - month_full: ["Ocak", "Þubat", "Mart", "Nisan", "Mayýs", "Haziran", "Temmuz", "Aðustos", "Eylül", "Ekim", "Kasým", "Aralýk"], - month_short: ["Oca", "Þub", "Mar", "Nis", "May", "Haz", "Tem", "Aðu", "Eyl", "Eki", "Kas", "Ara"], - day_full: ["Pazar", "Pazartes,", "Salý", "Çarþamba", "Perþembe", "Cuma", "Cumartesi"], - day_short: ["Paz", "Pts", "Sal", "Çar", "Per", "Cum", "Cts"] - }, - labels: { - dhx_cal_today_button: "Bugün", - day_tab: "Gün", - week_tab: "Hafta", - month_tab: "Ay", - new_event: "Uygun", - icon_save: "Kaydet", - icon_cancel: "Ýptal", - icon_details: "Detaylar", - icon_edit: "Düzenle", - icon_delete: "Sil", - confirm_closing: "", //Your changes will be lost, are your sure ? - confirm_deleting: "Etkinlik silinecek, devam?", - section_description: "Açýklama", - section_time: "Zaman aralýðý", - section_type:"Type", - /* grid columns */ - - column_text : "Task name", - column_start_date : "Start time", - column_duration : "Duration", - column_add : "", - - /* link confirmation */ - link: "Link", - confirm_link_deleting:"will be deleted", - link_start: " (start)", - link_end: " (end)", - - type_task: "Task", - type_project: "Project", - type_milestone: "Milestone", - - - minutes: "Minutes", - hours: "Hours", - days: "Days", - weeks: "Week", - months: "Months", - years: "Years" - } -}; - diff --git a/libraries/dhtmlxgantt/sources/locale/locale_tr.js.map b/libraries/dhtmlxgantt/sources/locale/locale_tr.js.map deleted file mode 100644 index 148090a..0000000 --- a/libraries/dhtmlxgantt/sources/locale/locale_tr.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"locale_tr.js","sources":["locale_tr.js"],"names":["gantt","locale","date","month_full","month_short","day_full","day_short","labels","dhx_cal_today_button","day_tab","week_tab","month_tab","new_event","icon_save","icon_cancel","icon_details","icon_edit","icon_delete","confirm_closing","confirm_deleting","section_description","section_time","section_type","column_text","column_start_date","column_duration","column_add","link","confirm_link_deleting","link_start","link_end","type_task","type_project","type_milestone","minutes","hours","days","weeks","months","years"],"mappings":";;;;;;;;AAQAA,MAAMC,QACLC,MACCC,YAAa,OAAQ,QAAS,OAAQ,QAAS,QAAS,UAAW,SAAU,UAAW,QAAS,OAAQ,QAAS,UAClHC,aAAc,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,OAC3FC,UAAW,QAAS,YAAa,OAAQ,WAAY,WAAY,OAAQ,aACzEC,WAAY,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,QAEvDC,QACCC,qBAAsB,QACtBC,QAAS,MACTC,SAAU,QACVC,UAAW,KACXC,UAAW,QACXC,UAAW,SACXC,YAAa,QACbC,aAAc;AACdC,UAAW,UACXC,YAAa,MACbC,gBAAiB,GACjBC,iBAAkB,6BAClBC,oBAAqB,WACrBC,aAAc,gBACdC,aAAa,OAGPC,YAAc,YACdC,kBAAoB,aACpBC,gBAAkB,WAClBC,WAAa,GAGnBC,KAAM,OACNC,sBAAsB,kBACtBC,WAAY,WACZC,SAAU,SAEVC,UAAW,OACXC,aAAc,UACdC,eAAgB,YAGVC,QAAS,UACTC,MAAO,QACPC,KAAM,OACNC,MAAO,OACPC,OAAQ;AACRC,MAAO"} \ No newline at end of file diff --git a/libraries/dhtmlxgantt/sources/locale/locale_ua.js b/libraries/dhtmlxgantt/sources/locale/locale_ua.js deleted file mode 100644 index be43e6d..0000000 --- a/libraries/dhtmlxgantt/sources/locale/locale_ua.js +++ /dev/null @@ -1,58 +0,0 @@ -/* -@license - -dhtmlxGantt v.3.2.0 Stardard -This software is covered by GPL license. You also can obtain Commercial or Enterprise license to use it in non-GPL project - please contact sales@dhtmlx.com. Usage without proper license is prohibited. - -(c) Dinamenta, UAB. -*/ -gantt.locale = { - date: { - month_full: ["Січень", "Лютий", "Березень", "Квітень", "Травень", "Червень", "Липень", "Серпень", "Вересень", "Жовтень", "Листопад", "Грудень"], - month_short: ["Січ", "Лют", "Бер", "Кві", "Тра", "Чер", "Лип", "Сер", "Вер", "Жов", "Лис", "Гру"], - day_full: ["Неділя", "Понеділок", "Вівторок", "Середа", "Четвер", "П'ятниця", "Субота"], - day_short: ["Нед", "Пон", "Вів", "Сер", "Чет", "Птн", "Суб"] - }, - labels: { - dhx_cal_today_button: "Сьогодні", - day_tab: "День", - week_tab: "Тиждень", - month_tab: "Місяць", - new_event: "Нова подія", - icon_save: "Зберегти", - icon_cancel: "Відміна", - icon_details: "Деталі", - icon_edit: "Редагувати", - icon_delete: "Вилучити", - confirm_closing: "", //Ваші зміни втратяться. Ви впевнені ? - confirm_deleting: "Подія вилучиться назавжди. Ви впевнені?", - section_description: "Опис", - section_time: "Часовий проміжок", - section_type:"Тип", - /* grid columns */ - - column_text : "Task name", - column_start_date : "Start time", - column_duration : "Duration", - column_add : "", - - /* link confirmation */ - link: "Link", - confirm_link_deleting:"will be deleted", - link_start: " (start)", - link_end: " (end)", - - type_task: "Task", - type_project: "Project", - type_milestone: "Milestone", - - - minutes: "Minutes", - hours: "Hours", - days: "Days", - weeks: "Week", - months: "Months", - years: "Years" - } -}; - diff --git a/libraries/dhtmlxgantt/sources/locale/locale_ua.js.map b/libraries/dhtmlxgantt/sources/locale/locale_ua.js.map deleted file mode 100644 index 3beb58b..0000000 --- a/libraries/dhtmlxgantt/sources/locale/locale_ua.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"locale_ua.js","sources":["locale_ua.js"],"names":["gantt","locale","date","month_full","month_short","day_full","day_short","labels","dhx_cal_today_button","day_tab","week_tab","month_tab","new_event","icon_save","icon_cancel","icon_details","icon_edit","icon_delete","confirm_closing","confirm_deleting","section_description","section_time","section_type","column_text","column_start_date","column_duration","column_add","link","confirm_link_deleting","link_start","link_end","type_task","type_project","type_milestone","minutes","hours","days","weeks","months","years"],"mappings":";;;;;;;;AAQAA,MAAMC,QACLC,MACCC,YAAa,SAAU,QAAS,WAAY,UAAW,UAAW,UAAW,SAAU,UAAW,WAAY,UAAW,WAAY,WACrIC,aAAc,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,OAC3FC,UAAW,SAAU,YAAa,WAAY,SAAU,SAAU,WAAY,UAC9EC,WAAY,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,QAEvDC,QACCC,qBAAsB,WACtBC,QAAS,OACTC,SAAU,UACVC,UAAW,SACXC,UAAW,aACXC,UAAW;AACXC,YAAa,UACbC,aAAc,SACdC,UAAW,aACXC,YAAa,WACbC,gBAAiB,GACjBC,iBAAkB,0CAClBC,oBAAqB,OACrBC,aAAc,mBACdC,aAAa,MAGPC,YAAc,YACdC,kBAAoB,aACpBC,gBAAkB,WAClBC,WAAa,GAGnBC,KAAM,OACNC,sBAAsB,kBACtBC,WAAY,WACZC,SAAU,SAEVC,UAAW,OACXC,aAAc,UACdC,eAAgB;AAGVC,QAAS,UACTC,MAAO,QACPC,KAAM,OACNC,MAAO,OACPC,OAAQ,SACRC,MAAO"} \ No newline at end of file diff --git a/libraries/dhtmlxgantt/sources/skins/dhtmlxgantt_broadway.css b/libraries/dhtmlxgantt/sources/skins/dhtmlxgantt_broadway.css deleted file mode 100644 index ebb0cc4..0000000 --- a/libraries/dhtmlxgantt/sources/skins/dhtmlxgantt_broadway.css +++ /dev/null @@ -1,1524 +0,0 @@ -/* -@license - -dhtmlxGantt v.3.2.0 Stardard -This software is covered by GPL license. You also can obtain Commercial or Enterprise license to use it in non-GPL project - please contact sales@dhtmlx.com. Usage without proper license is prohibited. - -(c) Dinamenta, UAB. -*/ -/*lighten(@alterColor,7%)*/ -/* colors for items with inline styles assigned (task.color, link.color)*/ -.gantt_grid { - background-color: #d6d6d6; - border-right: 1px solid #d6d6d6 !important; -} -.gantt_grid_scale { - background-color: #4f4f4f; - background-size: 5px 5px; - background-size: 4px 4px; - background-position: 0px 0px, 2px 2px; - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.05) 25%, transparent 25%, transparent 75%, rgba(255, 255, 255, 0.05) 75%, rgba(255, 255, 255, 0.05)), linear-gradient(45deg, rgba(255, 255, 255, 0.05) 25%, transparent 25%, transparent 75%, rgba(255, 255, 255, 0.05) 75%, rgba(255, 255, 255, 0.05)); - background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.05) 25%, transparent 25%, transparent 75%, rgba(255, 255, 255, 0.05) 75%, rgba(255, 255, 255, 0.05)), linear-gradient(45deg, rgba(255, 255, 255, 0.05) 25%, transparent 25%, transparent 75%, rgba(255, 255, 255, 0.05) 75%, rgba(255, 255, 255, 0.05)); - background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.05) 25%, transparent 25%, transparent 75%, rgba(255, 255, 255, 0.05) 75%, rgba(255, 255, 255, 0.05)), linear-gradient(45deg, rgba(255, 255, 255, 0.05) 25%, transparent 25%, transparent 75%, rgba(255, 255, 255, 0.05) 75%, rgba(255, 255, 255, 0.05)); - color: #e1e1e1; - font-size: 14px; -} -.gantt_grid_scale .gantt_grid_head_cell { - border-top: none !important; - border-right: 1px solid #4f4f4f !important; - border-left: 1px solid #5b5b5b !important; -} -.gantt_grid_data .gantt_row, -.gantt_grid_data .gantt_row.odd { - background-color: #dbdbdb; - border-top: 1px solid #f6f6f6; - border-bottom: 1px solid #bababa; -} -.gantt_grid_data .gantt_row .gantt_cell, -.gantt_grid_data .gantt_row.odd .gantt_cell { - border-right: none; -} -.gridHoverStyle { - border-top: 1px solid #ededed; - background-color: #ededed; -} -.gridSelection { - background-color: #fff3a1; - border-top-color: #fff087; -} -.timelineSelection { - background-color: #fff3a1; -} -/*Tree icons*/ -.gantt_cell .gantt_tree_icon.gantt_folder_open { - background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAPCAYAAAACsSQRAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6ODhBMDIwQzhDRUI3MTFFMjg4RUJDNUMzQkZEREM2RDIiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6ODhBMDIwQzlDRUI3MTFFMjg4RUJDNUMzQkZEREM2RDIiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo4OEEwMjBDNkNFQjcxMUUyODhFQkM1QzNCRkREQzZEMiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo4OEEwMjBDN0NFQjcxMUUyODhFQkM1QzNCRkREQzZEMiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PntuzoIAAACySURBVHjaYmTAAjo6Ov4z4AAVFRWM6GJM6ALt7e0OUCYjFowsDwfIEjDbDRgZGSf8//8fUzEj4wGgeAGQeQFJ+CIj0IALQEl9BjIB0NADTJQYAHWdAxMDFQBVDGEB+ukgxYYAcQNSzCCnh4NY0o89VkOAAbMfV5gBNR0AytuDXAs01AEUxbhcwoAj1c4HaUTi9wMNwWnb/0ERO0xA/z6k0IyP4NgBGpRApgEfgHgBQIABAAcyQOF3e6FiAAAAAElFTkSuQmCC); -} -.gantt_cell .gantt_tree_icon.gantt_folder_closed { - background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAPCAYAAAACsSQRAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6ODhBMDIwQzhDRUI3MTFFMjg4RUJDNUMzQkZEREM2RDIiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6ODhBMDIwQzlDRUI3MTFFMjg4RUJDNUMzQkZEREM2RDIiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo4OEEwMjBDNkNFQjcxMUUyODhFQkM1QzNCRkREQzZEMiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo4OEEwMjBDN0NFQjcxMUUyODhFQkM1QzNCRkREQzZEMiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PntuzoIAAACySURBVHjaYmTAAjo6Ov4z4AAVFRWM6GJM6ALt7e0OUCYjFowsDwfIEjDbDRgZGSf8//8fUzEj4wGgeAGQeQFJ+CIj0IALQEl9BjIB0NADTJQYAHWdAxMDFQBVDGEB+ukgxYYAcQNSzCCnh4NY0o89VkOAAbMfV5gBNR0AytuDXAs01AEUxbhcwoAj1c4HaUTi9wMNwWnb/0ERO0xA/z6k0IyP4NgBGpRApgEfgHgBQIABAAcyQOF3e6FiAAAAAElFTkSuQmCC); -} -.gantt_cell .gantt_tree_icon.gantt_file { - background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6RkQ2NjJFM0ZDRUI3MTFFMkFGNzc4M0YxNUM2NzkwMTIiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6RkQ2NjJFNDBDRUI3MTFFMkFGNzc4M0YxNUM2NzkwMTIiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpGRDY2MkUzRENFQjcxMUUyQUY3NzgzRjE1QzY3OTAxMiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpGRDY2MkUzRUNFQjcxMUUyQUY3NzgzRjE1QzY3OTAxMiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PhnnqLUAAAExSURBVHjanFPtUcMwDI28AB0BJkg6AWEEJqAbxPxLJkh+phuUDdiAbtAwAYxAJ0jf60k51ecWDt3pZFtPn5akSKjv+3uIBlyLSMW3eZ4niD1423Xdt8dLYjzCqCluEJyNcPJq9+CMJzMGaAtet20rZJ7Bb+eIIhHYw0UGLvIRwBoRplx04CrgWModgwAXhTXj8Usjr73xMAwzJbNInBwU/8ASoqV9LbInYqwc2tJBrZdd8XcaVT4GpFOa52topL1Ks9CGVuGXL/vU40fqZPlGA7E5GX1NvQ7U4sSw1AWdMNIm07CfxIn1K6rcB2sI5yCXhXPyjPO7fuOLNfNikAAi+OnWILEUYFfLICWjXGptO12cyRk20G+sduiq/y7TOXJ2G906R13n0n0nmz2m63wSYAB0aMIyVTQbywAAAABJRU5ErkJggg==); -} -/* - Gantt part -*/ -.chartHeaderBg { - background-color: #dbdbdb; -} -.gantt_task .gantt_task_scale .gantt_scale_cell { - border-left: 1px solid #f6f6f6; - border-right: 1px solid #bababa; - color: #494949; - font-size: 14px; -} -/* - Tasks -*/ -.taskProgressStyle { - border-right: 1px solid #1cb3fb; - box-shadow: -1px 0px 0 1px #04a1eb inset; -} -.gantt_task_line { - background-size: 4px 4px; - background-image: -webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.2) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.2) 50%, rgba(255, 255, 255, 0.2) 75%, transparent 75%, transparent); - background-image: linear-gradient(135deg, rgba(255, 255, 255, 0.2) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.2) 50%, rgba(255, 255, 255, 0.2) 75%, transparent 75%, transparent); - background-image: -moz-linear-gradient(0deg, transparent, transparent); -} -.gantt_task_line .gantt_task_content { - text-align: left; - font-weight: bold; - padding: 0 8px; - box-sizing: border-box; -} -.gantt_task_link .gantt_link_arrow_right { - border-width: 5px 5px 5px 5px; - margin-top: -2px; -} -.gantt_task_link .gantt_link_arrow_left { - border-width: 5px 5px 5px 5px; - margin-left: -7px; - margin-top: -2px; -} -.gantt_task_link .gantt_link_arrow_top { - border-width: 5px 5px 5px 5px; -} -.gantt_task_link .gantt_link_arrow_down { - border-width: 5px 5px 5px 5px; -} -.gantt_task_line .gantt_task_progress_drag { - bottom: -4px; - height: 16px; - margin-left: -8px; - width: 16px; -} -/* - project highlight -*/ -.gantt_row.gantt_project, -.gantt_row.odd.gantt_project { - background-color: #edffef; -} -.gantt_task_row.gantt_project, -.gantt_task_row.odd.gantt_project { - background-color: #f5fff6; -} -.gantt_task_line.gantt_project { - background-color: #65c16f; - border: 1px solid #3c9445; -} -.gantt_task_line.gantt_project .gantt_task_progress { - background-color: #46ad51; - border-right: 1px solid #5abc65; - box-shadow: -1px 0px 0 1px #45a94f inset; -} -/* - milestone -*/ -/* - lightbox -*/ -.gantt_cal_light { - background-color: #ffffff; - border: none !important; -} -.gantt_cal_light .gantt_cal_lsection { - color: #959595; -} -.gantt_cal_light .gantt_cal_larea { - border-bottom: none; -} -.gantt_cal_light .gantt_cal_ltitle { - background-color: #4f4f4f; - background-size: 5px 5px; - background-size: 4px 4px; - background-position: 0px 0px, 2px 2px; - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.05) 25%, transparent 25%, transparent 75%, rgba(255, 255, 255, 0.05) 75%, rgba(255, 255, 255, 0.05)), linear-gradient(45deg, rgba(255, 255, 255, 0.05) 25%, transparent 25%, transparent 75%, rgba(255, 255, 255, 0.05) 75%, rgba(255, 255, 255, 0.05)); - background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.05) 25%, transparent 25%, transparent 75%, rgba(255, 255, 255, 0.05) 75%, rgba(255, 255, 255, 0.05)), linear-gradient(45deg, rgba(255, 255, 255, 0.05) 25%, transparent 25%, transparent 75%, rgba(255, 255, 255, 0.05) 75%, rgba(255, 255, 255, 0.05)); - background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.05) 25%, transparent 25%, transparent 75%, rgba(255, 255, 255, 0.05) 75%, rgba(255, 255, 255, 0.05)), linear-gradient(45deg, rgba(255, 255, 255, 0.05) 25%, transparent 25%, transparent 75%, rgba(255, 255, 255, 0.05) 75%, rgba(255, 255, 255, 0.05)); - font-size: 14px; - color: #e1e1e1; - position: relative; - padding-top: 12px; - padding-bottom: 12px; - font-weight: normal; -} -.gantt_cal_light .gantt_cal_ltitle .gantt_title { - font-size: 13px; -} -.gantt_cal_light .gantt_btn_set { - margin: 5px 10px; -} -.buttonBg { - background: #fff; -} -.gantt_btn_set.gantt_save_btn_set { - background: #46ad51; - text-shadow: 0 -1px 0 #307738; - color: #fff; -} -.gantt_btn_set.gantt_delete_btn_set { - margin-left: 0; - text-shadow: 0 -1px 0 #6f6f6f; - background: #ec8e00; - text-shadow: 0 -1px 0 #aa6600; - color: #fff; -} -.gantt_delete_btn { - margin-top: 2px; - width: 20px; -} -.gantt_cal_light_wide { - padding-left: 0 !important; - padding-right: 0 !important; -} -.gantt_cal_light_wide .gantt_cal_larea { - border-left: none !important; - border-right: none !important; -} -.gantt_cal_ltitle .gantt_cancel_btn { - background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAMCAYAAABbayygAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3QYLEgAjh/DRnAAAAMdJREFUGNN1kcsNwjAQRF9iCkgJdJCUkBJQpDkDFUALdBAqAM6WQglQAlxzSglQgAUH1tIKgS9ezzztz0Vd18QYW0lXfpzsFeM49sAGOEpaf0FHYAnsS6evYoy9g3qDAB6Flb4BtYk568Huu6RmBhBCaFNKV4MPrso9hNAClABd1z2ABfB00BNYmEf5NeTrT/wBh2GogDNQOa8CzuZ9QOuvccPkgZqU0gXA7xFgL2nr1pP1ne/xlCEAi0/5nfc4lzT9+cK5pOkNX8hRT8hMyVwAAAAASUVORK5CYII=); - width: 30px; - top: 0px; - right: 0; - background-position: 6px 12px; - background-repeat: no-repeat; - position: absolute; - height: 100%; -} -/* - Message -*/ -.dhtmlx_popup_button.dhtmlx_ok_button { - background: #46ad51; - text-shadow: 0 -1px 0 #307738; - color: #fff; - font-weight: bold; -} -.dhtmlx_popup_button.dhtmlx_cancel_button { - font-weight: bold; -} -/* - Quick info -*/ -.gantt_qi_big_icon.icon_edit { - color: #454544; -} -.gantt_qi_big_icon.icon_delete { - text-shadow: 0 -1px 0 #6f6f6f; - background: #ec8e00; - text-shadow: 0 -1px 0 #aa6600; - color: #fff; - font-weight: bold; -} -/* - links dnd -*/ -.gantt_container { - font-family: "Arial"; - font-size: 13px; - border: 1px solid #bababa; - position: relative; - white-space: nowrap; -} -.gantt_grid { - border-right: 1px solid #bababa; -} -.gantt_task_scroll { - overflow-x: scroll; -} -.gantt_task { - position: relative; -} -.gantt_task, -.gantt_grid { - overflow-x: hidden; - overflow-y: hidden; - display: inline-block; - vertical-align: top; -} -.gantt_grid_scale, -.gantt_task_scale { - color: #494949; - font-size: 12px; - border-bottom: 1px solid #bababa; -} -.gantt_grid_scale { - background-color: #4f4f4f; - background-size: 5px 5px; - background-size: 4px 4px; - background-position: 0px 0px, 2px 2px; - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.05) 25%, transparent 25%, transparent 75%, rgba(255, 255, 255, 0.05) 75%, rgba(255, 255, 255, 0.05)), linear-gradient(45deg, rgba(255, 255, 255, 0.05) 25%, transparent 25%, transparent 75%, rgba(255, 255, 255, 0.05) 75%, rgba(255, 255, 255, 0.05)); - background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.05) 25%, transparent 25%, transparent 75%, rgba(255, 255, 255, 0.05) 75%, rgba(255, 255, 255, 0.05)), linear-gradient(45deg, rgba(255, 255, 255, 0.05) 25%, transparent 25%, transparent 75%, rgba(255, 255, 255, 0.05) 75%, rgba(255, 255, 255, 0.05)); - background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.05) 25%, transparent 25%, transparent 75%, rgba(255, 255, 255, 0.05) 75%, rgba(255, 255, 255, 0.05)), linear-gradient(45deg, rgba(255, 255, 255, 0.05) 25%, transparent 25%, transparent 75%, rgba(255, 255, 255, 0.05) 75%, rgba(255, 255, 255, 0.05)); - color: #e1e1e1; - font-size: 14px; -} -.gantt_task_scale { - background-color: #dbdbdb; -} -.gantt_scale_line { - box-sizing: border-box; - -moz-box-sizing: border-box; - border-top: 1px solid #bababa; -} -.gantt_scale_line:first-child { - border-top: none; -} -.gantt_grid_head_cell { - display: inline-block; - vertical-align: top; - border-right: 1px solid #bababa; - text-align: center; - position: relative; - cursor: default; - height: 100%; - box-sizing: border-box; - -moz-box-sizing: border-box; - line-height: 33px; - -moz-user-select: -moz-none; - -webkit-user-select: none; - -user-select: none; - overflow: hidden; -} -.gantt_scale_line { - clear: both; -} -.gantt_grid_data { - width: 100%; - overflow: hidden; -} -.gantt_row { - position: relative; - -webkit-user-select: none; - -moz-user-select: none; - -moz-user-select: -moz-none; -} -.gantt_add, -.gantt_grid_head_add { - width: 100%; - height: 100%; - background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3QYHCygkHejN0gAAAD1JREFUOMtjtN15mYESwIJLwvHo6v/I/P3WoYzY1DExUAiGgQGMtjsvYwQYsWC/dSjjcAmD0YREo0AkFgAASgkTQxnJ6ggAAAAASUVORK5CYII=); - background-position: center center; - background-repeat: no-repeat; - cursor: pointer; - position: relative; - -moz-opacity: 0.3; - opacity: 0.3; -} -.gantt_grid_head_cell.gantt_grid_head_add { - -moz-opacity: 0.6; - opacity: 0.6; - top: 0; -} -.gantt_grid_head_cell.gantt_grid_head_add:hover { - -moz-opacity: 1; - opacity: 1; -} -.gantt_grid_data .gantt_row:hover, -.gantt_grid_data .gantt_row.odd:hover { - border-top: 1px solid #ededed; - background-color: #ededed; -} -.gantt_grid_data .gantt_row:hover .gantt_add, -.gantt_grid_data .gantt_row.odd:hover .gantt_add { - -moz-opacity: 1; - opacity: 1; -} -.gantt_task_row, -.gantt_row { - border-bottom: 1px solid #ebebeb; -} -.gantt_row, -.gantt_task_row { - background-color: #ffffff; -} -.gantt_row.odd, -.gantt_task_row.odd { - background-color: #ffffff; -} -.gantt_row, -.gantt_cell, -.gantt_task_row, -.gantt_task_cell, -.gantt_grid_head_cell, -.gantt_scale_cell { - box-sizing: border-box; - -moz-box-sizing: border-box; -} -.gantt_grid_head_cell, -.gantt_scale_cell { - line-height: inherit; -} -.gantt_grid_scale .gantt_grid_column_resize_wrap { - cursor: col-resize; - position: absolute; - width: 13px; -} -.gantt_grid_column_resize_wrap .gantt_grid_column_resize { - background-color: #bababa; - height: 100%; - width: 1px; - margin: 0 auto; -} -.gantt_grid .gantt_grid_resize_wrap { - cursor: col-resize; - position: absolute; - width: 13px; - z-index: 1; -} -.gantt_grid_resize_wrap .gantt_grid_resize { - background-color: #bababa; - width: 1px; - margin: 0 auto; -} -.gantt_drag_marker.gantt_grid_resize_area { - background-color: rgba(231, 231, 231, 0.5); - border-left: 1px solid #bababa; - border-right: 1px solid #bababa; - height: 100%; - width: 100%; - -moz-box-sizing: border-box; - -webkit-box-sizing: border-box; - box-sizing: border-box; -} -.gantt_cell { - display: inline-block; - vertical-align: top; - border-right: 1px solid #ebebeb; - padding-left: 6px; - padding-right: 6px; - height: 100%; - overflow: hidden; - white-space: nowrap; - font-size: 13px; -} -.gantt_grid_scale .gantt_last_cell, -.gantt_grid_data .gantt_last_cell, -.gantt_task_scale .gantt_last_cell, -.gantt_task_bg .gantt_last_cell { - border-right-width: 0px; -} -.gantt_task_bg { - overflow: hidden; -} -.gantt_scale_cell { - display: inline-block; - white-space: nowrap; - overflow: hidden; - border-right: 1px solid #bababa; - text-align: center; - height: 100%; -} -.gantt_task_cell { - display: inline-block; - height: 100%; - border-right: 1px solid #ebebeb; -} -.gantt_ver_scroll { - width: 0px; - background-color: transparent; - height: 1px; - overflow-x: hidden; - overflow-y: scroll; - display: none; - position: absolute; - right: 0px; -} -.gantt_ver_scroll > div { - width: 1px; - height: 1px; -} -.gantt_hor_scroll { - height: 0px; - background-color: transparent; - width: 100%; - clear: both; - overflow-x: scroll; - overflow-y: hidden; - display: none; -} -.gantt_hor_scroll > div { - width: 5000px; - height: 1px; -} -.gantt_tree_indent { - width: 15px; - height: 100%; - display: inline-block; -} -.gantt_tree_content, -.gantt_tree_icon { - vertical-align: top; -} -.gantt_tree_icon { - width: 28px; - height: 100%; - display: inline-block; - background-repeat: no-repeat; - background-position: center center; -} -.gantt_tree_content { - height: 100%; - display: inline-block; -} -.gantt_tree_icon.gantt_open { - background-image: url(data:image/gif;base64,R0lGODlhEgASAOMHAMrKyt3d3ejp6d7f3+/v75aWlvf39////wAAAP///////////////////////////yH5BAEKAA8ALAAAAAASABIAAAQt8MlJq704672L/x9WZKNVXieVIipKsVMaS0hdSzL+tuY+9yJXEAUCcY7IJCUCADs=); - width: 18px; - cursor: pointer; -} -.gantt_tree_icon.gantt_close { - background-image: url(data:image/gif;base64,R0lGODlhEgASAOMIAMrKyt3d3ejp6d7f3+/v75aWlvf39wAAAP///////////////////////////////yH5BAEKAAYALAAAAAASABIAAAQp0MhJq704672L/x9WZKNVXieVVqvUTm95zLOLkreY7yqOgiCOcEikRAAAOw==); - width: 18px; - cursor: pointer; -} -.gantt_tree_icon.gantt_blank { - width: 18px; -} -.gantt_tree_icon.gantt_folder_open { - background-image: url(data:image/gif;base64,R0lGODlhEgASAJECAJeXl7Gvrf///wAAACH/C1hNUCBEYXRhWE1QPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS4wLWMwNjAgNjEuMTM0Nzc3LCAyMDEwLzAyLzEyLTE3OjMyOjAwICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdFJlZj0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlUmVmIyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M1IFdpbmRvd3MiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NTdDRDM3QzVDMDZEMTFFMUJGMzhFMDhCN0RGRjBGQ0YiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NTdDRDM3QzZDMDZEMTFFMUJGMzhFMDhCN0RGRjBGQ0YiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo1N0NEMzdDM0MwNkQxMUUxQkYzOEUwOEI3REZGMEZDRiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo1N0NEMzdDNEMwNkQxMUUxQkYzOEUwOEI3REZGMEZDRiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PgH//v38+/r5+Pf29fTz8vHw7+7t7Ovq6ejn5uXk4+Lh4N/e3dzb2tnY19bV1NPS0dDPzs3My8rJyMfGxcTDwsHAv769vLu6ubi3trW0s7KxsK+urayrqqmop6alpKOioaCfnp2cm5qZmJeWlZSTkpGQj46NjIuKiYiHhoWEg4KBgH9+fXx7enl4d3Z1dHNycXBvbm1sa2ppaGdmZWRjYmFgX15dXFtaWVhXVlVUU1JRUE9OTUxLSklIR0ZFRENCQUA/Pj08Ozo5ODc2NTQzMjEwLy4tLCsqKSgnJiUkIyIhIB8eHRwbGhkYFxYVFBMSERAPDg0MCwoJCAcGBQQDAgEAACH5BAEAAAIALAAAAAASABIAAAIzlI+pywcPm3mhWgkCsjBOvVkimElG9ZlCBlXd+2XjjLKg5GqoeZXqvsOQXK/ijUZTKVUFADs=); -} -.gantt_tree_icon.gantt_folder_closed { - background-image: url(data:image/gif;base64,R0lGODlhEgASAJECAJeXl7Gvrf///wAAACH/C1hNUCBEYXRhWE1QPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS4wLWMwNjAgNjEuMTM0Nzc3LCAyMDEwLzAyLzEyLTE3OjMyOjAwICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdFJlZj0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlUmVmIyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M1IFdpbmRvd3MiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NTAyMTU1RTNDMDZEMTFFMUJGNzZCRThBRkFCRjg4MTIiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NTAyMTU1RTRDMDZEMTFFMUJGNzZCRThBRkFCRjg4MTIiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo1MDIxNTVFMUMwNkQxMUUxQkY3NkJFOEFGQUJGODgxMiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo1MDIxNTVFMkMwNkQxMUUxQkY3NkJFOEFGQUJGODgxMiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PgH//v38+/r5+Pf29fTz8vHw7+7t7Ovq6ejn5uXk4+Lh4N/e3dzb2tnY19bV1NPS0dDPzs3My8rJyMfGxcTDwsHAv769vLu6ubi3trW0s7KxsK+urayrqqmop6alpKOioaCfnp2cm5qZmJeWlZSTkpGQj46NjIuKiYiHhoWEg4KBgH9+fXx7enl4d3Z1dHNycXBvbm1sa2ppaGdmZWRjYmFgX15dXFtaWVhXVlVUU1JRUE9OTUxLSklIR0ZFRENCQUA/Pj08Ozo5ODc2NTQzMjEwLy4tLCsqKSgnJiUkIyIhIB8eHRwbGhkYFxYVFBMSERAPDg0MCwoJCAcGBQQDAgEAACH5BAEAAAIALAAAAAASABIAAAIwlI+pywcPm3mhWgkCsjBOvVkimElG9ZlCuYIY6TYs+6bmHDO4igfdD3GNhheV0VQAADs=); -} -.gantt_tree_icon.gantt_file { - background-image: url(data:image/gif;base64,R0lGODlhEgASAJECAJeXl7Gvrf///wAAACH/C1hNUCBEYXRhWE1QPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS4wLWMwNjAgNjEuMTM0Nzc3LCAyMDEwLzAyLzEyLTE3OjMyOjAwICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdFJlZj0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlUmVmIyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M1IFdpbmRvd3MiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NzkxQzI4RjZDMDZEMTFFMTgwRjhBQURDQzI3NDU3QUEiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NzkxQzI4RjdDMDZEMTFFMTgwRjhBQURDQzI3NDU3QUEiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo3OTFDMjhGNEMwNkQxMUUxODBGOEFBRENDMjc0NTdBQSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo3OTFDMjhGNUMwNkQxMUUxODBGOEFBRENDMjc0NTdBQSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PgH//v38+/r5+Pf29fTz8vHw7+7t7Ovq6ejn5uXk4+Lh4N/e3dzb2tnY19bV1NPS0dDPzs3My8rJyMfGxcTDwsHAv769vLu6ubi3trW0s7KxsK+urayrqqmop6alpKOioaCfnp2cm5qZmJeWlZSTkpGQj46NjIuKiYiHhoWEg4KBgH9+fXx7enl4d3Z1dHNycXBvbm1sa2ppaGdmZWRjYmFgX15dXFtaWVhXVlVUU1JRUE9OTUxLSklIR0ZFRENCQUA/Pj08Ozo5ODc2NTQzMjEwLy4tLCsqKSgnJiUkIyIhIB8eHRwbGhkYFxYVFBMSERAPDg0MCwoJCAcGBQQDAgEAACH5BAEAAAIALAAAAAASABIAAAIylI+pwN16QJiUQiFThRlJm3RRFYSlR5qXMKmXaMDuuMoyOi8n/e6xn8NMHETgh5RaKQsAOw==); -} -.gantt_grid_head_cell .gantt_sort { - position: absolute; - right: 5px; - top: 8px; - width: 7px; - height: 13px; - background-repeat: no-repeat; - background-position: center center; -} -.gantt_grid_head_cell .gantt_sort.gantt_asc { - background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAANCAYAAABlyXS1AAAARUlEQVR42mNgQAL1/VP/M2ADIIntF2/9x1AAlrh0C47hCmA60DFYwX88gIFGwNDY5D8uDFbg7hvwHx2jmIBTAlkB0e4BAEjlaNtBWJPnAAAAAElFTkSuQmCC); -} -.gantt_grid_head_cell .gantt_sort.gantt_desc { - background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAANCAYAAABlyXS1AAAARUlEQVR4nGNgQAKGxib/GbABkIS7b8B/DAUwCRiGK0CXwFBAb1DfP/U/LszwHwi2X7qFgUEArBtdAVwCBmAKMCSQFSDzAWXXaOHsXeqkAAAAAElFTkSuQmCC); -} -.gantt_inserted, -.gantt_updated { - font-weight: bold; -} -.gantt_deleted { - text-decoration: line-through; -} -.gantt_invalid { - background-color: FFE0E0; -} -.gantt_error { - color: red; -} -.gantt_status { - right: 1px; - padding: 5px 10px; - background: rgba(155, 155, 155, 0.1); - position: absolute; - top: 1px; - -webkit-transition: opacity 0.2s; - transition: opacity 0.2s; - opacity: 0; -} -.gantt_status.gantt_status_visible { - opacity: 1; -} -#gantt_ajax_dots span { - -webkit-transition: opacity 0.2s; - transition: opacity 0.2s; - background-repeat: no-repeat; - opacity: 0; -} -#gantt_ajax_dots span.gantt_dot_visible { - opacity: 1; -} -.dhtmlx_message_area { - position: fixed; - right: 5px; - width: 250px; - z-index: 1000; -} -.dhtmlx-info { - min-width: 120px; - padding: 4px 4px 4px 20px; - font-family: "Arial"; - z-index: 10000; - margin: 5px; - margin-bottom: 10px; - -webkit-transition: all .5s ease; - -moz-transition: all .5s ease; - -o-transition: all .5s ease; - transition: all .5s ease; -} -.dhtmlx-info.hidden { - height: 0px; - padding: 0px; - border-width: 0px; - margin: 0px; - overflow: hidden; -} -.dhtmlx_modal_box { - overflow: hidden; - display: inline-block; - min-width: 250px; - width: 250px; - text-align: center; - position: fixed; - z-index: 20000; - box-shadow: 3px 3px 3px rgba(0, 0, 0, 0.07); - font-family: "Arial"; - border-radius: 6px; - border: 1px solid #bababa; - background: #ffffff; -} -.dhtmlx_popup_title { - border-top-left-radius: 6px; - border-top-right-radius: 6px; - border-width: 0px; -} -.dhtmlx_button, -.dhtmlx_popup_button { - border: 1px solid #bababa; - height: 30px; - line-height: 30px; - display: inline-block; - margin: 0 5px; - border-radius: 4px; - background: #fff; -} -.dhtmlx-info, -.dhtmlx_popup_button, -.dhtmlx_button { - user-select: none; - -webkit-user-select: none; - -moz-user-select: -moz-none; - cursor: pointer; -} -.dhtmlx_popup_text { - overflow: hidden; -} -.dhtmlx_popup_controls { - border-radius: 6px; - padding: 10px; -} -.dhtmlx_popup_button { - min-width: 100px; -} -div.dhx_modal_cover { - background-color: #000; - cursor: default; - filter: progid:DXImageTransform.Microsoft.Alpha(opacity=20); - opacity: 0.2; - position: fixed; - z-index: 19999; - left: 0px; - top: 0px; - width: 100%; - height: 100%; - border: none; - zoom: 1; -} -.dhtmlx-info img, -.dhtmlx_modal_box img { - float: left; - margin-right: 20px; -} -.dhtmlx-alert-error, -.dhtmlx-confirm-error { - border: 1px solid #ff0000; -} -/*Skin section*/ -.dhtmlx_button input, -.dhtmlx_popup_button div { - border-radius: 4px; - font-size: 14px; - -moz-box-sizing: content-box; - box-sizing: content-box; - padding: 0px; - margin: 0px; - vertical-align: top; -} -.dhtmlx_popup_title { - color: #fff; - text-shadow: 1px 1px #000; - height: 40px; - line-height: 40px; - font-size: 20px; -} -.dhtmlx_popup_text { - margin: 15px 15px 5px 15px; - font-size: 14px; - color: #000; - min-height: 30px; - border-radius: 6px; -} -.dhtmlx-info, -.dhtmlx-error { - font-size: 14px; - color: #000; - box-shadow: 3px 3px 3px rgba(0, 0, 0, 0.07); - padding: 0px; - background-color: #FFF; - border-radius: 3px; - border: 1px solid #ffffff; -} -.dhtmlx-info div { - padding: 5px 10px 5px 10px; - background-color: #fff; - border-radius: 3px; - border: 1px solid #bababa; -} -.dhtmlx-error { - background-color: #d81b1b; - border: 1px solid #ff3c3c; - box-shadow: 3px 3px 3px rgba(0, 0, 0, 0.07); -} -.dhtmlx-error div { - background-color: #d81b1b; - border: 1px solid #940000; - color: #FFF; -} -.gantt_grid div, -.gantt_data_area div { - -ms-touch-action: none; - -webkit-tap-highlight-color: rgba(0, 0, 0, 0); -} -.gantt_data_area { - position: relative; - overflow-x: hidden; - overflow-y: hidden; - -moz-user-select: -moz-none; - -webkit-user-select: none; - -user-select: none; -} -.gantt_links_area { - position: absolute; - left: 0px; - top: 0px; -} -.gantt_task_content, -.gantt_task_progress, -.gantt_side_content { - line-height: inherit; - overflow: hidden; - height: 100%; -} -.gantt_task_content { - font-size: 13px; - color: #ffffff; - width: 100%; - top: 0; - position: absolute; - white-space: nowrap; - text-align: center; -} -.gantt_task_progress { - text-align: center; - z-index: 0; - background: #04a4f0; - border-right: 1px solid #1cb3fb; - box-shadow: -1px 0px 0 1px #04a1eb inset; -} -.gantt_task_line { - -webkit-border-radius: 2px; - -moz-border-radius: 2px; - border-radius: 2px; - position: absolute; - -moz-box-sizing: border-box; - box-sizing: border-box; - background-color: #17b2fb; - border: 1px solid #049ae1; - -webkit-user-select: none; - -moz-user-select: none; - -moz-user-select: -moz-none; -} -.gantt_task_line.gantt_drag_move div { - cursor: move; -} -.gantt_touch_move, -.gantt_touch_progress .gantt_touch_resize { - -moz-transform: scale(1.02, 1.1); - -o-transform: scale(1.02, 1.1); - -webkit-transform: scale(1.02, 1.1); - transform: scale(1.02, 1.1); - -moz-transform-origin: 50%; - -o-transform-origin: 50%; - -webkit-transform-origin: 50%; - transform-origin: 50%; -} -.gantt_touch_progress .gantt_task_progress_drag, -.gantt_touch_resize .gantt_task_drag { - -moz-transform: scaleY(1.3); - -o-transform: scaleY(1.3); - -webkit-transform: scaleY(1.3); - transform: scaleY(1.3); - -moz-transform-origin: 50%; - -o-transform-origin: 50%; - -webkit-transform-origin: 50%; - transform-origin: 50%; -} -.gantt_side_content { - position: absolute; - white-space: nowrap; - color: #6e6e6e; - bottom: 7px; - font-size: 11px; - font-size: 12px; -} -.gantt_side_content.gantt_left { - right: 100%; - padding-right: 15px; -} -.gantt_side_content.gantt_right { - left: 100%; - padding-left: 15px; -} -.gantt_side_content.gantt_link_crossing { - bottom: 8.75px; -} -.gantt_task_link .gantt_line_wrapper, -.gantt_link_arrow { - position: absolute; - cursor: pointer; -} -.gantt_line_wrapper div { - background-color: #ffa011; -} -.gantt_task_link:hover .gantt_line_wrapper div { - box-shadow: 0 0 5px 0px #ffa011; -} -.gantt_task_link div.gantt_link_arrow { - background-color: transparent; - border-style: solid; - width: 0px; - height: 0px; -} -.gantt_link_control { - position: absolute; - width: 13px; - top: 0px; -} -.gantt_link_control div { - display: none; - cursor: pointer; - box-sizing: border-box; - position: relative; - top: 50%; - margin-top: -7.5px; - vertical-align: middle; - border: 1px solid #929292; - -webkit-border-radius: 6.5px; - -moz-border-radius: 6.5px; - border-radius: 6.5px; - height: 13px; - width: 13px; - background-color: #f0f0f0; -} -.gantt_link_control div:hover { - background-color: #ffffff; -} -.gantt_link_control.task_left { - left: -13px; -} -.gantt_link_control.task_right { - right: -13px; -} -.gantt_task_line.gantt_selected .gantt_link_control div, -.gantt_task_line:hover .gantt_link_control div { - display: block; -} -.gantt_link_target .gantt_link_control div { - display: block; -} -.gantt_link_source, -.gantt_link_target { - box-shadow: 0px 0px 3px #04a4f0; -} -.gantt_link_target.link_start_allow, -.gantt_link_target.link_finish_allow { - box-shadow: 0px 0px 3px #ffbf5e; -} -.gantt_link_target.link_start_deny, -.gantt_link_target.link_finish_deny { - box-shadow: 0px 0px 3px #e87e7b; -} -.link_start_allow .gantt_link_control.task_left div, -.link_finish_allow .gantt_link_control.task_right div { - background-color: #ffbf5e; - border-color: #ffa011; -} -.link_start_deny .gantt_link_control.task_left div, -.link_finish_deny .gantt_link_control.task_right div { - background-color: #e87e7b; - border-color: #dd3e3a; -} -.gantt_link_arrow_right { - border-width: 2.5px 0 2.5px 5px; - border-top-color: transparent !important; - border-right-color: transparent !important; - border-bottom-color: transparent !important; - border-left-color: #ffa011; - margin-top: -1px; -} -.gantt_link_arrow_left { - border-width: 2.5px 5px 2.5px 0; - margin-top: -1px; - border-top-color: transparent !important; - border-right-color: #ffa011; - border-bottom-color: transparent !important; - border-left-color: transparent !important; -} -.gantt_link_arrow_top { - border-width: 0 2.5px 5px 2.5px; - border-color: transparent transparent #ffa011 transparent; - border-top-color: transparent !important; - border-right-color: transparent !important; - border-bottom-color: #ffa011; - border-left-color: transparent !important; -} -.gantt_link_arrow_down { - border-width: 2.5px 5px 0 2.5px; - border-top-color: #ffa011; - border-right-color: transparent !important; - border-bottom-color: transparent !important; - border-left-color: transparent !important; -} -.gantt_task_drag, -.gantt_task_progress_drag { - cursor: w-resize; - height: 100%; - display: none; - position: absolute; -} -.gantt_task_line.gantt_selected .gantt_task_progress_drag, -.gantt_task_line:hover .gantt_task_progress_drag, -.gantt_task_line.gantt_selected .gantt_task_drag, -.gantt_task_line:hover .gantt_task_drag { - display: block; -} -.gantt_task_drag { - width: 6px; - background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAACCAYAAAB7Xa1eAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3QYDDjkw3UJvAwAAABRJREFUCNdj/P//PwM2wASl/6PTAKrrBf4+lD8LAAAAAElFTkSuQmCC); - z-index: 1; - top: 0px; -} -.gantt_task_drag.task_left { - left: 0px; -} -.gantt_task_drag.task_right { - right: 0px; -} -.gantt_task_progress_drag { - height: 8px; - width: 8px; - bottom: -4px; - margin-left: -4px; - background-position: bottom; - background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAALCAYAAAB24g05AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MkY3Rjk0RUVDMkYzMTFFMkI1OThEQTA3ODU0OTkzMEEiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MkY3Rjk0RUZDMkYzMTFFMkI1OThEQTA3ODU0OTkzMEEiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDoyRjdGOTRFQ0MyRjMxMUUyQjU5OERBMDc4NTQ5OTMwQSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDoyRjdGOTRFREMyRjMxMUUyQjU5OERBMDc4NTQ5OTMwQSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PobPBzIAAADkSURBVHjaYpk2bRoDDsAExL1QdjEQ/8OmiAWHZk4gXqymqhQM4ty6fU8OSMUA8XdiDBAB4k0a6iqWRga6EKcwMQXduHlnL5DpB8Rv0J2JDFSA+JiOtgZcMwiA2CAxkBxUDVYDLEAKgIpV9XQ0MZwFEgPJAZnHoWpRDAgC4n2W5saiQKfjClQGkBxQDciL+6B6wAbkA/EqJwdrTkUFOQZCAKQGpBbIXA3SCzJggo+XK7OEuBgDsQCkFqgHrBfsBT5eHgZSAUwP2IBfv36TbABMDygdtK1Zv6UESLORaAbIhG6AAAMAKN8wE24DXWcAAAAASUVORK5CYII=); - background-repeat: no-repeat; - z-index: 2; -} -.gantt_link_tooltip { - box-shadow: 3px 3px 3px #888888; - background-color: #ffffff; - border-left: 1px dotted #cecece; - border-top: 1px dotted #cecece; - font-family: Tahoma; - font-size: 8pt; - color: #444444; - padding: 6px; - line-height: 20px; -} -.gantt_link_direction { - height: 0px; - border: 0px none #ffa011; - border-bottom-style: dashed; - border-bottom-width: 2px; - transform-origin: 0% 0%; - -ms-transform-origin: 0% 0%; - -webkit-transform-origin: 0% 0%; - z-index: 2; - margin-left: 1px; - position: absolute; -} -.gantt_grid_data .gantt_row.gantt_selected, -.gantt_grid_data .gantt_row.odd.gantt_selected { - background-color: #fff3a1; - border-top-color: #fff087; -} -.gantt_task_row.gantt_selected { - background-color: #fff3a1; -} -.gantt_task_row.gantt_selected .gantt_task_cell { - border-right-color: #ffec6e; -} -.gantt_task_line.gantt_selected { - box-shadow: 0 0 5px #04a4f0; -} -.gantt_task_line.gantt_project.gantt_selected { - box-shadow: 0 0 5px #46ad51; -} -.gantt_task_line.gantt_milestone { - visibility: hidden; - background-color: #db7dc5; - border: 0px solid #cd49ae; - box-sizing: content-box; - -moz-box-sizing: content-box; -} -.gantt_task_line.gantt_milestone div { - visibility: visible; -} -.gantt_task_line.gantt_milestone .gantt_task_content { - background: inherit; - border: inherit; - border-width: 1px; - border-radius: inherit; - box-sizing: border-box; - -moz-box-sizing: border-box; - -webkit-transform: rotate(45deg); - -moz-transform: rotate(45deg); - -ms-transform: rotate(45deg); - -o-transform: rotate(45deg); - transform: rotate(45deg); -} -.gantt_task_line.gantt_task_inline_color { - border-color: #999999; -} -.gantt_task_line.gantt_task_inline_color .gantt_task_progress { - background-color: #363636; - opacity: 0.2; -} -.gantt_task_line.gantt_task_inline_color.gantt_selected { - box-shadow: 0 0 5px #999999; -} -.gantt_task_line.gantt_task_inline_color.gantt_project.gantt_selected { - box-shadow: 0 0 5px #999999; -} -.gantt_task_link.gantt_link_inline_color:hover .gantt_line_wrapper div { - box-shadow: 0 0 5px 0px #999999; -} -.gantt_critical_task { - background-color: #e63030; - border-color: #9d3a3a; -} -.gantt_critical_task .gantt_task_progress { - background-color: rgba(0, 0, 0, 0.4); -} -.gantt_critical_link .gantt_line_wrapper > div { - background-color: #e63030; -} -.gantt_critical_link .gantt_link_arrow { - border-color: #e63030; -} -.gantt_unselectable, -.gantt_unselectable div { - -webkit-user-select: none; - -moz-user-select: none; - -moz-user-select: -moz-none; -} -.gantt_cal_light { - -webkit-tap-highlight-color: transparent; - border-radius: 6px; - font-family: "Arial"; - font-size: 13px; - border: 1px solid #bababa; - color: #494949; - font-size: 12px; - position: absolute; - z-index: 10001; - width: 550px; - height: 250px; - box-shadow: 3px 3px 3px rgba(0, 0, 0, 0.07); -} -.gantt_cal_light_wide { - width: 650px; -} -.gantt_cal_light select { - font-family: "Arial"; - border: 1px solid #bababa; - font-size: 13px; - padding: 2px; - margin: 0px; -} -.gantt_cal_ltitle { - padding: 7px 10px; - overflow: hidden; - white-space: nowrap; - -webkit-border-top-left-radius: 6px; - -webkit-border-bottom-left-radius: 0; - -webkit-border-top-right-radius: 6px; - -webkit-border-bottom-right-radius: 0; - -moz-border-radius-topleft: 6px; - -moz-border-radius-bottomleft: 0; - -moz-border-radius-topright: 6px; - -moz-border-radius-bottomright: 0; - border-top-left-radius: 6px; - border-bottom-left-radius: 0; - border-top-right-radius: 6px; - border-bottom-right-radius: 0; -} -.gantt_cal_ltitle span { - white-space: nowrap; -} -.gantt_cal_lsection { - color: #727272; - font-weight: bold; - padding: 12px 0px 5px 10px; -} -.gantt_cal_lsection .gantt_fullday { - float: right; - margin-right: 5px; - font-size: 12px; - font-weight: normal; - line-height: 20px; - vertical-align: top; - cursor: pointer; -} -.gantt_cal_lsection { - font-size: 13px; -} -.gantt_cal_ltext { - padding: 2px 10px; - overflow: hidden; -} -.gantt_cal_ltext textarea { - overflow: auto; - font-family: "Arial"; - font-size: 13px; - -moz-box-sizing: border-box; - -webkit-box-sizing: border-box; - box-sizing: border-box; - border: 1px solid #bababa; - height: 100%; - width: 100%; - outline: none !important; - resize: none; -} -.gantt_time { - font-weight: bold; -} -.gantt_cal_light .gantt_title { - padding-left: 10px; -} -.gantt_cal_larea { - border: 1px solid #bababa; - border-left: none; - border-right: none; - background-color: #fff; - overflow: hidden; - height: 1px; -} -.gantt_btn_set { - margin: 10px 7px 5px 10px; - padding: 5px 15px 5px 10px; - float: left; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - border-width: 0; - border-color: #bababa; - border-style: solid; - height: 32px; - font-weight: bold; - background: #fff; - -moz-box-sizing: border-box; - -webkit-box-sizing: border-box; - box-sizing: border-box; - cursor: pointer; -} -.gantt_btn_set div { - float: left; - font-size: 13px; - height: 22px; - line-height: 22px; - background-repeat: no-repeat; - vertical-align: middle; -} -.gantt_save_btn { - background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAPCAYAAAACsSQRAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6QTBBQUI0RDhDRUJEMTFFMjhFM0ZENTlERUM1OEQzRTYiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6QTBBQUI0RDlDRUJEMTFFMjhFM0ZENTlERUM1OEQzRTYiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpBMEFBQjRENkNFQkQxMUUyOEUzRkQ1OURFQzU4RDNFNiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpBMEFBQjREN0NFQkQxMUUyOEUzRkQ1OURFQzU4RDNFNiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PjdPZV0AAACtSURBVHjanJPbDYUgEESvtwJKoQRLoRNL0RK0ArUCS9AOpAMclDVkw0s2mQ9XcpwJY2OM+VWMgDQ9/CsAEtoh9W6skw+S0Akd5hl1J6kADJBwADs9j9MmIszQ5GJo793qf2nwLUYc0E7xONbaBmloZKAsgCCLW0p2qCsBEEQ6F33gcBbg304I1JYA+BWHQFlAqCcclAXEykaguQSQaiyBVEmbm8RfLFgzo3MJMACZSGxiH8QaMAAAAABJRU5ErkJggg==); - margin-top: 2px; - width: 21px; -} -.gantt_cancel_btn { - margin-top: 2px; - background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MDkzMDA3MzlDMzA0MTFFMjg2QTVFMzFEQzgwRkJERDYiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MDkzMDA3M0FDMzA0MTFFMjg2QTVFMzFEQzgwRkJERDYiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDowOTMwMDczN0MzMDQxMUUyODZBNUUzMURDODBGQkRENiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDowOTMwMDczOEMzMDQxMUUyODZBNUUzMURDODBGQkRENiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PmYuYOUAAAEdSURBVHjaYvz//z8DJYAFXWDlypU8QKoIiD2A2AwqfAqIdwBxX3h4+Bdk9YzILgBqtgdS84FYEYeF94E4EWjIQZgAE5LmQCB1AKoZZKMPEAtAMYh9GSp3AKjWD8UFQAEhIPshEIOc3wHENUBb/qJ57SyQMoJyPwKxElDNO1gYFEE17wMKVmIJlzNQzeegrjaA6qmBecEbSvfh0GwMxGeBhoPoemQ9MAO0kEIbl2YTqPAFKK2IbMB3AjabYIkRZmQD7kNpMyI0G0PpO8gGbIUFJj7NQDk2INWIrIcJKfBAKcwJqvkcDs0TgFgXGo19KCkRmpDWQdWDEk0NUoCBoq0FqhkE/IEWbKJKUmZEz43QzFSKIzN1481M5ACAAAMAlfl/lCwRpagAAAAASUVORK5CYII=); - width: 20px; -} -.gantt_delete_btn { - background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAQCAYAAAAmlE46AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6QzQzRjMxM0NDRUJEMTFFMjlCNDZDQzhFQUM0ODRCMEIiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6QzQzRjMxM0RDRUJEMTFFMjlCNDZDQzhFQUM0ODRCMEIiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpDNDNGMzEzQUNFQkQxMUUyOUI0NkNDOEVBQzQ4NEIwQiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpDNDNGMzEzQkNFQkQxMUUyOUI0NkNDOEVBQzQ4NEIwQiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PoU+5FoAAACMSURBVHja7JPdDYAgDIQLE+gmjuAIbOIKjMRIbAAb1BZLUozgz7OXfIbWKxeCAiKCwmNfXnsNP5S4mIkMrSYiEaY2LOFloO6QVF1JamPGc2IvpaeSbqXY4LkOLwU6OTyvgzBasxwnBnivYOGj/sEXg27gbd/JpWZiOf0pV7Anlq9UGqs07hTFC7sAAwCbSNs8SyqFMAAAAABJRU5ErkJggg==); - margin-top: 2px; - width: 20px; -} -.gantt_cal_cover { - width: 100%; - height: 100%; - position: absolute; - z-index: 10000; - top: 0px; - left: 0px; - background-color: black; - opacity: 0.1; - filter: progid:DXImageTransform.Microsoft.Alpha(opacity=10); -} -.gantt_custom_button { - padding: 0px 3px 0px 3px; - font-family: "Arial"; - font-size: 13px; - font-weight: normal; - margin-right: 10px; - margin-top: -5px; - cursor: pointer; - float: right; - height: 21px; - width: 90px; - border: 1px solid #CECECE; - text-align: center; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - -ms-border-radius: 4px; - -o-border-radius: 4px; - border-radius: 4px; -} -.gantt_custom_button div { - cursor: pointer; - float: none; - height: 21px; - line-height: 21px; - vertical-align: middle; -} -.gantt_custom_button div:first-child { - display: none; -} -.gantt_cal_light_wide { - width: 580px; - padding: 2px 4px; -} -.gantt_cal_light_wide .gantt_cal_larea { - -moz-box-sizing: border-box; - -webkit-box-sizing: border-box; - box-sizing: border-box; - border: 1px solid #bababa; -} -.gantt_cal_light_wide .gantt_cal_lsection { - border: 0px; - float: left; - text-align: right; - width: 80px; - height: 20px; - padding: 5px 10px 0px 0px; -} -.gantt_cal_light_wide .gantt_wrap_section { - position: relative; - padding: 10px 0; - overflow: hidden; - border-bottom: 1px solid #ebebeb; -} -.gantt_cal_light_wide .gantt_section_time { - overflow: hidden; - padding-top: 2px !important; - padding-right: 0px; - height: 20px !important; -} -.gantt_cal_light_wide .gantt_cal_ltext { - padding-right: 0px; -} -.gantt_cal_light_wide .gantt_cal_larea { - padding: 0 10px; - width: 100%; -} -.gantt_cal_light_wide .gantt_section_time { - background: transparent; -} -.gantt_cal_light_wide .gantt_cal_checkbox label { - padding-left: 0px; -} -.gantt_cal_light_wide .gantt_cal_lsection .gantt_fullday { - float: none; - margin-right: 0px; - font-weight: bold; - cursor: pointer; -} -.gantt_cal_light_wide .gantt_custom_button { - position: absolute; - top: 0; - right: 0; - margin-top: 2px; -} -.gantt_cal_light_wide .gantt_repeat_right { - margin-right: 55px; -} -.gantt_cal_light_wide.gantt_cal_light_full { - width: 738px; -} -.gantt_cal_wide_checkbox input { - margin-top: 8px; - margin-left: 14px; -} -.gantt_cal_light input { - font-size: 13px; -} -.gantt_section_time { - background-color: white; - white-space: nowrap; - padding: 2px 10px 5px; - padding-top: 2px !important; -} -.gantt_section_time .gantt_time_selects { - float: left; - height: 25px; -} -.gantt_section_time .gantt_time_selects select { - height: 23px; - padding: 2px; - border: 1px solid #bababa; -} -.gantt_duration { - width: 100px; - height: 23px; - float: left; - white-space: nowrap; - margin-left: 20px; - line-height: 23px; -} -.gantt_duration .gantt_duration_value, -.gantt_duration .gantt_duration_dec, -.gantt_duration .gantt_duration_inc { - -moz-box-sizing: border-box; - -webkit-box-sizing: border-box; - box-sizing: border-box; - text-align: center; - vertical-align: top; - height: 100%; - border: 1px solid #bababa; -} -.gantt_duration .gantt_duration_value { - width: 40px; - padding: 3px 4px; - border-left-width: 0; - border-right-width: 0; -} -.gantt_duration .gantt_duration_dec, -.gantt_duration .gantt_duration_inc { - width: 20px; - padding: 1px; - padding-bottom: 3px; - background: #fff; -} -.gantt_duration .gantt_duration_dec { - -moz-border-top-left-radius: 4px; - -moz-border-bottom-left-radius: 4px; - -webkit-border-top-left-radius: 4px; - -webkit-border-bottom-left-radius: 4px; - border-top-left-radius: 4px; - border-bottom-left-radius: 4px; -} -.gantt_duration .gantt_duration_inc { - margin-right: 4px; - -moz-border-top-right-radius: 4px; - -moz-border-bottom-right-radius: 4px; - -webkit-border-top-right-radius: 4px; - -webkit-border-bottom-right-radius: 4px; - border-top-right-radius: 4px; - border-bottom-right-radius: 4px; -} -/* Quick info */ -.gantt_cal_quick_info { - border: 1px solid #bababa; - border-radius: 6px; - position: absolute; - z-index: 300; - box-shadow: 3px 3px 3px rgba(0, 0, 0, 0.07); - background-color: #ffffff; - width: 300px; - transition: left 0.5s ease, right 0.5s; - -moz-transition: left 0.5s ease, right 0.5s; - -webkit-transition: left 0.5s ease, right 0.5s; - -o-transition: left 0.5s ease, right 0.5s; -} -.gantt_no_animate { - transition: none; - -moz-transition: none; - -webkit-transition: none; - -o-transition: none; -} -.gantt_cal_quick_info.gantt_qi_left .gantt_qi_big_icon { - float: right; -} -.gantt_cal_qi_title { - -webkit-border-top-left-radius: 6px; - -webkit-border-bottom-left-radius: 0; - -webkit-border-top-right-radius: 6px; - -webkit-border-bottom-right-radius: 0; - -moz-border-radius-topleft: 6px; - -moz-border-radius-bottomleft: 0; - -moz-border-radius-topright: 6px; - -moz-border-radius-bottomright: 0; - border-top-left-radius: 6px; - border-bottom-left-radius: 0; - border-top-right-radius: 6px; - border-bottom-right-radius: 0; - padding: 5px 0px 8px 12px; - color: #494949; - background-color: #dbdbdb; - border-bottom: 1px solid #bababa; -} -.gantt_cal_qi_tdate { - font-size: 14px; - font-weight: bold; -} -.gantt_cal_qi_tcontent { - font-size: 13px; -} -.gantt_cal_qi_content { - padding: 16px 8px; - font-size: 13px; - color: #494949; - overflow: hidden; -} -.gantt_cal_qi_controls { - -webkit-border-top-left-radius: 0; - -webkit-border-bottom-left-radius: 6px; - -webkit-border-top-right-radius: 0; - -webkit-border-bottom-right-radius: 6px; - -moz-border-radius-topleft: 0; - -moz-border-radius-bottomleft: 6px; - -moz-border-radius-topright: 0; - -moz-border-radius-bottomright: 6px; - border-top-left-radius: 0; - border-bottom-left-radius: 6px; - border-top-right-radius: 0; - border-bottom-right-radius: 6px; - padding-left: 7px; -} -.gantt_cal_qi_controls .gantt_menu_icon { - margin-top: 6px; - background-repeat: no-repeat; -} -.gantt_cal_qi_controls .gantt_menu_icon.icon_edit { - width: 20px; - background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH3QYFCjI5ZQj5bAAAAFNJREFUOMvt0zEOACAIA0DkwTymH8bJTRTKZGJXyaWEKPKTCQAH4Ls37cItcDUzsxHNDLZNhCq7Gt1wh9ErV7EjyGAhyGLphlnsClWuS32rn0czAV+vNGrM/LBtAAAAAElFTkSuQmCC); -} -.gantt_cal_qi_controls .gantt_menu_icon.icon_delete { - width: 20px; - background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAQCAYAAAAmlE46AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6QzQzRjMxM0NDRUJEMTFFMjlCNDZDQzhFQUM0ODRCMEIiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6QzQzRjMxM0RDRUJEMTFFMjlCNDZDQzhFQUM0ODRCMEIiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpDNDNGMzEzQUNFQkQxMUUyOUI0NkNDOEVBQzQ4NEIwQiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpDNDNGMzEzQkNFQkQxMUUyOUI0NkNDOEVBQzQ4NEIwQiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PoU+5FoAAACMSURBVHja7JPdDYAgDIQLE+gmjuAIbOIKjMRIbAAb1BZLUozgz7OXfIbWKxeCAiKCwmNfXnsNP5S4mIkMrSYiEaY2LOFloO6QVF1JamPGc2IvpaeSbqXY4LkOLwU6OTyvgzBasxwnBnivYOGj/sEXg27gbd/JpWZiOf0pV7Anlq9UGqs07hTFC7sAAwCbSNs8SyqFMAAAAABJRU5ErkJggg==); -} -.gantt_qi_big_icon { - font-size: 13px; - border-radius: 4px; - font-weight: bold; - background: #fff; - margin: 5px 9px 8px 0px; - min-width: 60px; - line-height: 32px; - vertical-align: middle; - padding: 0px 10px 0px 5px; - cursor: pointer; - border: 1px solid #bababa; -} -.gantt_cal_qi_controls div { - float: left; - height: 32px; - text-align: center; - line-height: 32px; -} -.gantt_tooltip { - box-shadow: 3px 3px 3px rgba(0, 0, 0, 0.07); - background-color: white; - border-left: 1px solid rgba(0, 0, 0, 0.07); - border-top: 1px solid rgba(0, 0, 0, 0.07); - font-family: "Arial"; - font-size: 8pt; - color: #494949; - padding: 10px; - position: absolute; - z-index: 50; -} -.gantt_marker { - height: 100%; - width: 2px; - top: 0; - position: absolute; - text-align: center; - background-color: rgba(255, 0, 0, 0.4); - -moz-box-sizing: border-box; - -webkit-box-sizing: border-box; - box-sizing: border-box; -} -.gantt_marker .gantt_marker_content { - padding: 5px; - background: inherit; - color: white; - position: absolute; - font-size: 12px; - line-height: 12px; - opacity: 0.8; -} -.gantt_marker_area { - position: absolute; - top: 0; - left: 0; -} -.gantt_noselect { - -moz-user-select: -moz-none; - -webkit-user-select: none; - -user-select: none; -} -.gantt_drag_marker { - position: absolute; - font-family: "Arial"; - font-size: 13px; -} -.gantt_drag_marker .gantt_tree_indent, -.gantt_drag_marker .gantt_tree_icon.gantt_blank, -.gantt_drag_marker .gantt_tree_icon.gantt_open, -.gantt_drag_marker .gantt_tree_icon.gantt_close { - display: none; -} -.gantt_drag_marker, -.gantt_drag_marker .gantt_row.odd { - background-color: #ffffff; -} -.gantt_drag_marker .gantt_row { - border-left: 1px solid #d2d2d2; - border-top: 1px solid #d2d2d2; -} -.gantt_drag_marker .gantt_cell { - border-color: #d2d2d2; -} -.gantt_row.gantt_over, -.gantt_task_row.gantt_over { - background-color: #0070fe; -} -.gantt_row.gantt_transparent .gantt_cell { - opacity: 0.7; -} -.gantt_task_row.gantt_transparent { - background-color: #dbf3fe; -} -.dhtmlx_popup_button.dhtmlx_delete_button { - background: #46ad51; - text-shadow: 0 -1px 0 #307738; - color: #fff; - font-weight: bold; -} diff --git a/libraries/dhtmlxgantt/sources/skins/dhtmlxgantt_meadow.css b/libraries/dhtmlxgantt/sources/skins/dhtmlxgantt_meadow.css deleted file mode 100644 index 49fc61a..0000000 --- a/libraries/dhtmlxgantt/sources/skins/dhtmlxgantt_meadow.css +++ /dev/null @@ -1,1420 +0,0 @@ -/* -@license - -dhtmlxGantt v.3.2.0 Stardard -This software is covered by GPL license. You also can obtain Commercial or Enterprise license to use it in non-GPL project - please contact sales@dhtmlx.com. Usage without proper license is prohibited. - -(c) Dinamenta, UAB. -*/ -/* colors for items with inline styles assigned (task.color, link.color)*/ -/* - Header -*/ -.chartHeaderBg { - background-color: #f4f2ea; -} -/* - Grid -*/ -.gridHoverStyle { - background-color: #ffebbc !important; -} -.gantt_grid_scale .gantt_grid_head_cell { - border-top: none !important; - border-right: none !important; -} -.gantt_grid_data .gantt_cell { - border-right: none; -} -.gridSelection { - background-color: #ffebbc !important; -} -.timelineSelection { - background-color: #ffebbc !important; -} -/* - Plot -*/ -/* - milestone -*/ -.gantt_task_line .gantt_task_progress_drag { - bottom: -4px; - height: 16px; - margin-left: -8px; - width: 16px; -} -.gantt_task .gantt_task_scale .gantt_scale_cell { - border-right: 1px solid #cac8bd; -} -/* - project highlight -*/ -.gantt_row.gantt_project .gantt_cell, -.gantt_row.odd.gantt_project .gantt_cell { - background-color: #edf4ff; -} -.gantt_task_row.gantt_project .gantt_task_cell, -.gantt_task_row.odd.gantt_project .gantt_task_cell { - background-color: #f5f8ff; -} -.gantt_task_line.gantt_project { - background-color: #c7d8f7; - border: 1px solid #7ba3ed; -} -.gantt_task_line.gantt_project .gantt_task_progress { - background-color: #9ab9f1; -} -/* - lightbox -*/ -.gantt_cal_light .gantt_cal_ltitle { - padding: 7px 10px; -} -.gantt_cal_light .gantt_cal_ltext textarea { - border: 1px solid #d8d6ce; -} -.gantt_cal_light .gantt_cal_larea { - border-color: #d8d6ce !important; - background-color: #fcfaf3; -} -.gantt_cal_light .gantt_cal_larea .gantt_section_time { - background-color: #fcfaf3; -} -.buttonBg { - background: #e0ded7; -} -.gantt_cal_light .gantt_btn_set { - height: 27px; - margin: 5px 10px; - padding: 0px 15px 0px 10px; -} -.gantt_cal_light .gantt_btn_set div { - height: 25px; - margin-top: 0; - background-position: center center; - line-height: 25px; -} -.gantt_btn_set.gantt_save_btn_set { - border: 1px solid #98d27e; - background: #a7d991; -} -.gantt_btn_set.gantt_cancel_btn_set { - background: #e0ded7; - border: 1px solid #cac8bd; -} -.gantt_btn_set.gantt_delete_btn_set { - border: 1px solid #ffad54; - background: #ffb96d; -} -.gantt_cal_light_wide { - padding: 0 !important; -} -.gantt_cal_light_wide .gantt_cal_larea { - border-left: none !important; - border-right: none !important; -} -.gantt_cal_light_wide .gantt_cal_larea .gantt_cal_lsection { - width: 90px; -} -.gantt_cal_light_wide .gantt_btn_set { - margin: 7px 10px; -} -/* - Message -*/ -.dhtmlx_popup_button.dhtmlx_ok_button { - border: 1px solid #98d27e; - background: #a7d991; -} -/* - QuickInfo -*/ -.gantt_data_area .gantt_cal_quick_info { - background-color: #f4f2ea; -} -.gantt_data_area .gantt_cal_qi_content { - background: #fcfaf3; - border-bottom: 1px solid #cac8bd; -} -.gantt_qi_big_icon.icon_delete { - border-color: #ffad54; - background: #ffb96d; -} -/* links dnd */ -.gantt_container { - font-family: "Verdana"; - font-size: 11px; - border: 1px solid #cac8bd; - position: relative; - white-space: nowrap; -} -.gantt_grid { - border-right: 1px solid #cac8bd; -} -.gantt_task_scroll { - overflow-x: scroll; -} -.gantt_task { - position: relative; -} -.gantt_task, -.gantt_grid { - overflow-x: hidden; - overflow-y: hidden; - display: inline-block; - vertical-align: top; -} -.gantt_grid_scale, -.gantt_task_scale { - color: #3f3f3f; - font-size: 8pt; - border-bottom: 1px solid #cac8bd; -} -.gantt_grid_scale { - background-color: #f4f2ea; -} -.gantt_task_scale { - background-color: #f4f2ea; -} -.gantt_scale_line { - box-sizing: border-box; - -moz-box-sizing: border-box; - border-top: 1px solid #cac8bd; -} -.gantt_scale_line:first-child { - border-top: none; -} -.gantt_grid_head_cell { - display: inline-block; - vertical-align: top; - border-right: 1px solid #cac8bd; - text-align: center; - position: relative; - cursor: default; - height: 100%; - box-sizing: border-box; - -moz-box-sizing: border-box; - line-height: 28px; - -moz-user-select: -moz-none; - -webkit-user-select: none; - -user-select: none; - overflow: hidden; -} -.gantt_scale_line { - clear: both; -} -.gantt_grid_data { - width: 100%; - overflow: hidden; -} -.gantt_row { - position: relative; - -webkit-user-select: none; - -moz-user-select: none; - -moz-user-select: -moz-none; -} -.gantt_add, -.gantt_grid_head_add { - width: 100%; - height: 100%; - background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MDAzOTZDREFDN0FGMTFFMkE1MDhCNkFCRDk3RkY4NTkiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MDAzOTZDREJDN0FGMTFFMkE1MDhCNkFCRDk3RkY4NTkiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDowMDM5NkNEOEM3QUYxMUUyQTUwOEI2QUJEOTdGRjg1OSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDowMDM5NkNEOUM3QUYxMUUyQTUwOEI2QUJEOTdGRjg1OSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PnzqpNoAAAEFSURBVHjapJPPDsFAEMbHZqXSi1ZC3Dg7O9bbeA7v4czZE4hLSRwkbiI4cCAN4Uyqs/pPs1vbrTDJHL7Mb77sbr8WeuMu/FOEMQaStplYdgYHFBnKjK1atZqI8+ViZZ2AMmS5x1QxFNHLNVAx1EPMNVAxBBFtvxnfuq4LUKDTTLwXXsFqNprKE1RMM2y+9oe9FV3Bw5++/3svfMRWpS0MV7fFx0Ka2e62kQEhBEbzoTA0DAPqtXqinbMD643IFGkR3KcL1Cib0yA4/DBY4A2u15ug45oFHD05x44sO+kc+FwhI0j4RZBQlUT5kH+0JS4VBpKfqaSVYDDpJ1rz9eNxlxq8BBgAcMHBu6BPeX8AAAAASUVORK5CYII=); - background-position: center center; - background-repeat: no-repeat; - cursor: pointer; - position: relative; - -moz-opacity: 0.3; - opacity: 0.3; -} -.gantt_grid_head_cell.gantt_grid_head_add { - -moz-opacity: 0.6; - opacity: 0.6; - top: 0; -} -.gantt_grid_head_cell.gantt_grid_head_add:hover { - -moz-opacity: 1; - opacity: 1; -} -.gantt_grid_data .gantt_row:hover, -.gantt_grid_data .gantt_row.odd:hover { - background-color: #ffebbc !important; -} -.gantt_grid_data .gantt_row:hover .gantt_add, -.gantt_grid_data .gantt_row.odd:hover .gantt_add { - -moz-opacity: 1; - opacity: 1; -} -.gantt_task_row, -.gantt_row { - border-bottom: 1px solid #eae9e5; -} -.gantt_row, -.gantt_task_row { - background-color: #ffffff; -} -.gantt_row.odd, -.gantt_task_row.odd { - background-color: #ffffff; -} -.gantt_row, -.gantt_cell, -.gantt_task_row, -.gantt_task_cell, -.gantt_grid_head_cell, -.gantt_scale_cell { - box-sizing: border-box; - -moz-box-sizing: border-box; -} -.gantt_grid_head_cell, -.gantt_scale_cell { - line-height: inherit; -} -.gantt_grid_scale .gantt_grid_column_resize_wrap { - cursor: col-resize; - position: absolute; - width: 13px; -} -.gantt_grid_column_resize_wrap .gantt_grid_column_resize { - background-color: #cac8bd; - height: 100%; - width: 1px; - margin: 0 auto; -} -.gantt_grid .gantt_grid_resize_wrap { - cursor: col-resize; - position: absolute; - width: 13px; - z-index: 1; -} -.gantt_grid_resize_wrap .gantt_grid_resize { - background-color: #cac8bd; - width: 1px; - margin: 0 auto; -} -.gantt_drag_marker.gantt_grid_resize_area { - background-color: rgba(231, 231, 231, 0.5); - border-left: 1px solid #cac8bd; - border-right: 1px solid #cac8bd; - height: 100%; - width: 100%; - -moz-box-sizing: border-box; - -webkit-box-sizing: border-box; - box-sizing: border-box; -} -.gantt_cell { - display: inline-block; - vertical-align: top; - border-right: 1px solid #eae9e5; - padding-left: 6px; - padding-right: 6px; - height: 100%; - overflow: hidden; - white-space: nowrap; - font-size: 8pt; -} -.gantt_grid_scale .gantt_last_cell, -.gantt_grid_data .gantt_last_cell, -.gantt_task_scale .gantt_last_cell, -.gantt_task_bg .gantt_last_cell { - border-right-width: 0px; -} -.gantt_task_bg { - overflow: hidden; -} -.gantt_scale_cell { - display: inline-block; - white-space: nowrap; - overflow: hidden; - border-right: 1px solid #cac8bd; - text-align: center; - height: 100%; -} -.gantt_task_cell { - display: inline-block; - height: 100%; - border-right: 1px solid #eae9e5; -} -.gantt_ver_scroll { - width: 0px; - background-color: transparent; - height: 1px; - overflow-x: hidden; - overflow-y: scroll; - display: none; - position: absolute; - right: 0px; -} -.gantt_ver_scroll > div { - width: 1px; - height: 1px; -} -.gantt_hor_scroll { - height: 0px; - background-color: transparent; - width: 100%; - clear: both; - overflow-x: scroll; - overflow-y: hidden; - display: none; -} -.gantt_hor_scroll > div { - width: 5000px; - height: 1px; -} -.gantt_tree_indent { - width: 15px; - height: 100%; - display: inline-block; -} -.gantt_tree_content, -.gantt_tree_icon { - vertical-align: top; -} -.gantt_tree_icon { - width: 28px; - height: 100%; - display: inline-block; - background-repeat: no-repeat; - background-position: center center; -} -.gantt_tree_content { - height: 100%; - display: inline-block; -} -.gantt_tree_icon.gantt_open { - background-image: url(data:image/gif;base64,R0lGODlhEgASAJEAAP///4SEhAAAAP///yH5BAUUAAMALAAAAAASABIAAAIqnI+py+0Powq01haA3iDgLWwek2mhNi6ZwLLdZ4owcL4kJ5OWJfX+DykAADs=); - width: 18px; - cursor: pointer; -} -.gantt_tree_icon.gantt_close { - background-image: url(data:image/gif;base64,R0lGODlhEgASAJEAAP///4SEhAAAAP///yH5BAUUAAMALAAAAAASABIAAAImnI+py+0Powq01haA3iBgvnlMBnafgKLmWK4LCYpvK0+WJeX6DhUAOw==); - width: 18px; - cursor: pointer; -} -.gantt_tree_icon.gantt_blank { - width: 18px; -} -.gantt_tree_icon.gantt_folder_open { - background-image: url(data:image/gif;base64,R0lGODlhEgASAMQfAPXMWPK9N/fipOzLbPrVaP/89frqwv3tuvvprfLES+7PdP7xyP7z0vPAQfvtyMuaIv/32/735OSqFv3de+7ReP7lmf7gh/nv0v/67unFXfb29vK/PenFSaGEPfLnyv///yH5BAEAAB8ALAAAAAASABIAAAWS4Cc+ZGk+YvqZRVtgGiag6sNBThlFWnTQqQcE4sqRFj/VashsYR6HZI0JWSAjDwQCOGIgERULg/EQzJRQsGVCYHTK51qYTQDkFPj4iA4AJHIUgQoGQA8EdX4NhHgKAxeFfQkJGwGLeI6Fkg2UlQ8Dn5hBCZuchKChIxKkGw05Ga8DHlwkqg2tJ1xBtDlKvTUkviEAOw==); -} -.gantt_tree_icon.gantt_folder_closed { - background-image: url(data:image/gif;base64,R0lGODlhEgASAMQfAPvjpP/24fPHVvnUdvzotdSiKv/23vvrw/LCS/C+RfnelvPMaf/88/nbi/rsyerYq/TLYv7y1v7wzeCsLO+8P86dJfvv0MuaIsydKPPOc+SqGKGEPe/AS+zVneWwLf///yH5BAEAAB8ALAAAAAASABIAAAWZ4CdeZGleYvpdA+O+zNUBqHoZOB4EceHUqVtuF+n9VCtdQCI5BC6FA3BkCEQkBALAACVMV9eDVhGJQGnIixigaAwiG6jie2G7BxDLpVJozG13EAICPxUeGRleQQMLgggJUhiHC3pBggKPFJETGZRAF5gJCRSaFxgTC55BCByioz+nEKojGgmtHBwPJAUCELo2J8FfSMTFxsUhADs=); -} -.gantt_tree_icon.gantt_file { - background-image: url(data:image/gif;base64,R0lGODlhEgASAMQVAPv7+2RkZPf39/r6+vj4+Pn5+fT09Pb29vX19fHx8fDw8Onp6fLy8u7u7uzs7PPz8+vr6+rq6uXl5ejo6O/v7////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAABUALAAAAAASABIAAAV4YCWOZGkGaKqaVSAMQCwLQnAOj6ErzUTXpQDgQDgcGJTFDzgSEp4HRCKytDUBMKzAoIAsJACrSCjTGhINR5hELg8ECEZifS3HCgQEgj62xwZPAnwtbgMDBQU0g21Yh4iIi3aGkzBihH52lgEEmDIEli0qoigspSYhADs=); -} -.gantt_grid_head_cell .gantt_sort { - position: absolute; - right: 5px; - top: 8px; - width: 7px; - height: 13px; - background-repeat: no-repeat; - background-position: center center; -} -.gantt_grid_head_cell .gantt_sort.gantt_asc { - background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAANCAYAAABlyXS1AAAARUlEQVR42mNgQAL1/VP/M2ADIIntF2/9x1AAlrh0C47hCmA60DFYwX88gIFGwNDY5D8uDFbg7hvwHx2jmIBTAlkB0e4BAEjlaNtBWJPnAAAAAElFTkSuQmCC); -} -.gantt_grid_head_cell .gantt_sort.gantt_desc { - background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAANCAYAAABlyXS1AAAARUlEQVR4nGNgQAKGxib/GbABkIS7b8B/DAUwCRiGK0CXwFBAb1DfP/U/LszwHwi2X7qFgUEArBtdAVwCBmAKMCSQFSDzAWXXaOHsXeqkAAAAAElFTkSuQmCC); -} -.gantt_inserted, -.gantt_updated { - font-weight: bold; -} -.gantt_deleted { - text-decoration: line-through; -} -.gantt_invalid { - background-color: FFE0E0; -} -.gantt_error { - color: red; -} -.gantt_status { - right: 1px; - padding: 5px 10px; - background: rgba(155, 155, 155, 0.1); - position: absolute; - top: 1px; - -webkit-transition: opacity 0.2s; - transition: opacity 0.2s; - opacity: 0; -} -.gantt_status.gantt_status_visible { - opacity: 1; -} -#gantt_ajax_dots span { - -webkit-transition: opacity 0.2s; - transition: opacity 0.2s; - background-repeat: no-repeat; - opacity: 0; -} -#gantt_ajax_dots span.gantt_dot_visible { - opacity: 1; -} -.dhtmlx_message_area { - position: fixed; - right: 5px; - width: 250px; - z-index: 1000; -} -.dhtmlx-info { - min-width: 120px; - padding: 4px 4px 4px 20px; - font-family: "Verdana"; - z-index: 10000; - margin: 5px; - margin-bottom: 10px; - -webkit-transition: all .5s ease; - -moz-transition: all .5s ease; - -o-transition: all .5s ease; - transition: all .5s ease; -} -.dhtmlx-info.hidden { - height: 0px; - padding: 0px; - border-width: 0px; - margin: 0px; - overflow: hidden; -} -.dhtmlx_modal_box { - overflow: hidden; - display: inline-block; - min-width: 250px; - width: 250px; - text-align: center; - position: fixed; - z-index: 20000; - box-shadow: 3px 3px 3px rgba(0, 0, 0, 0.07); - font-family: "Verdana"; - border-radius: 6px; - border: 1px solid #cac8bd; - background: #fcfaf3; -} -.dhtmlx_popup_title { - border-top-left-radius: 6px; - border-top-right-radius: 6px; - border-width: 0px; -} -.dhtmlx_button, -.dhtmlx_popup_button { - border: 1px solid #cac8bd; - height: 25px; - line-height: 25px; - display: inline-block; - margin: 0 5px; - border-radius: 4px; - background: #e0ded7; -} -.dhtmlx-info, -.dhtmlx_popup_button, -.dhtmlx_button { - user-select: none; - -webkit-user-select: none; - -moz-user-select: -moz-none; - cursor: pointer; -} -.dhtmlx_popup_text { - overflow: hidden; -} -.dhtmlx_popup_controls { - border-radius: 6px; - padding: 10px; -} -.dhtmlx_popup_button { - min-width: 100px; -} -div.dhx_modal_cover { - background-color: #000; - cursor: default; - filter: progid:DXImageTransform.Microsoft.Alpha(opacity=20); - opacity: 0.2; - position: fixed; - z-index: 19999; - left: 0px; - top: 0px; - width: 100%; - height: 100%; - border: none; - zoom: 1; -} -.dhtmlx-info img, -.dhtmlx_modal_box img { - float: left; - margin-right: 20px; -} -.dhtmlx-alert-error, -.dhtmlx-confirm-error { - border: 1px solid #ff0000; -} -/*Skin section*/ -.dhtmlx_button input, -.dhtmlx_popup_button div { - border-radius: 4px; - font-size: 14px; - -moz-box-sizing: content-box; - box-sizing: content-box; - padding: 0px; - margin: 0px; - vertical-align: top; -} -.dhtmlx_popup_title { - color: #fff; - text-shadow: 1px 1px #000; - height: 40px; - line-height: 40px; - font-size: 20px; -} -.dhtmlx_popup_text { - margin: 15px 15px 5px 15px; - font-size: 14px; - color: #000; - min-height: 30px; - border-radius: 6px; -} -.dhtmlx-info, -.dhtmlx-error { - font-size: 14px; - color: #000; - box-shadow: 3px 3px 3px rgba(0, 0, 0, 0.07); - padding: 0px; - background-color: #FFF; - border-radius: 3px; - border: 1px solid #ffffff; -} -.dhtmlx-info div { - padding: 5px 10px 5px 10px; - background-color: #fff; - border-radius: 3px; - border: 1px solid #cac8bd; -} -.dhtmlx-error { - background-color: #d81b1b; - border: 1px solid #ff3c3c; - box-shadow: 3px 3px 3px rgba(0, 0, 0, 0.07); -} -.dhtmlx-error div { - background-color: #d81b1b; - border: 1px solid #940000; - color: #FFF; -} -.gantt_grid div, -.gantt_data_area div { - -ms-touch-action: none; - -webkit-tap-highlight-color: rgba(0, 0, 0, 0); -} -.gantt_data_area { - position: relative; - overflow-x: hidden; - overflow-y: hidden; - -moz-user-select: -moz-none; - -webkit-user-select: none; - -user-select: none; -} -.gantt_links_area { - position: absolute; - left: 0px; - top: 0px; -} -.gantt_task_content, -.gantt_task_progress, -.gantt_side_content { - line-height: inherit; - overflow: hidden; - height: 100%; -} -.gantt_task_content { - font-size: 11px; - color: #3f3f3f; - width: 100%; - top: 0; - position: absolute; - white-space: nowrap; - text-align: center; -} -.gantt_task_progress { - text-align: center; - z-index: 0; - background: #a7d991; -} -.gantt_task_line { - -webkit-border-radius: 2px; - -moz-border-radius: 2px; - border-radius: 2px; - position: absolute; - -moz-box-sizing: border-box; - box-sizing: border-box; - background-color: #e1ffd4; - border: 1px solid #7fbc64; - -webkit-user-select: none; - -moz-user-select: none; - -moz-user-select: -moz-none; -} -.gantt_task_line.gantt_drag_move div { - cursor: move; -} -.gantt_touch_move, -.gantt_touch_progress .gantt_touch_resize { - -moz-transform: scale(1.02, 1.1); - -o-transform: scale(1.02, 1.1); - -webkit-transform: scale(1.02, 1.1); - transform: scale(1.02, 1.1); - -moz-transform-origin: 50%; - -o-transform-origin: 50%; - -webkit-transform-origin: 50%; - transform-origin: 50%; -} -.gantt_touch_progress .gantt_task_progress_drag, -.gantt_touch_resize .gantt_task_drag { - -moz-transform: scaleY(1.3); - -o-transform: scaleY(1.3); - -webkit-transform: scaleY(1.3); - transform: scaleY(1.3); - -moz-transform-origin: 50%; - -o-transform-origin: 50%; - -webkit-transform-origin: 50%; - transform-origin: 50%; -} -.gantt_side_content { - position: absolute; - white-space: nowrap; - color: #6e6e6e; - bottom: 7px; - font-size: 11px; - font-size: 10px; -} -.gantt_side_content.gantt_left { - right: 100%; - padding-right: 15px; -} -.gantt_side_content.gantt_right { - left: 100%; - padding-left: 15px; -} -.gantt_side_content.gantt_link_crossing { - bottom: 6.75px; -} -.gantt_task_link .gantt_line_wrapper, -.gantt_link_arrow { - position: absolute; - cursor: pointer; -} -.gantt_line_wrapper div { - background-color: #ffb96d; -} -.gantt_task_link:hover .gantt_line_wrapper div { - box-shadow: 0 0 5px 0px #ffb96d; -} -.gantt_task_link div.gantt_link_arrow { - background-color: transparent; - border-style: solid; - width: 0px; - height: 0px; -} -.gantt_link_control { - position: absolute; - width: 13px; - top: 0px; -} -.gantt_link_control div { - display: none; - cursor: pointer; - box-sizing: border-box; - position: relative; - top: 50%; - margin-top: -7.5px; - vertical-align: middle; - border: 1px solid #929292; - -webkit-border-radius: 6.5px; - -moz-border-radius: 6.5px; - border-radius: 6.5px; - height: 13px; - width: 13px; - background-color: #f0f0f0; -} -.gantt_link_control div:hover { - background-color: #ffffff; -} -.gantt_link_control.task_left { - left: -13px; -} -.gantt_link_control.task_right { - right: -13px; -} -.gantt_task_line.gantt_selected .gantt_link_control div, -.gantt_task_line:hover .gantt_link_control div { - display: block; -} -.gantt_link_target .gantt_link_control div { - display: block; -} -.gantt_link_source, -.gantt_link_target { - box-shadow: 0px 0px 3px #a7d991; -} -.gantt_link_target.link_start_allow, -.gantt_link_target.link_finish_allow { - box-shadow: 0px 0px 3px #ffdeba; -} -.gantt_link_target.link_start_deny, -.gantt_link_target.link_finish_deny { - box-shadow: 0px 0px 3px #e87e7b; -} -.link_start_allow .gantt_link_control.task_left div, -.link_finish_allow .gantt_link_control.task_right div { - background-color: #ffdeba; - border-color: #ffb96d; -} -.link_start_deny .gantt_link_control.task_left div, -.link_finish_deny .gantt_link_control.task_right div { - background-color: #e87e7b; - border-color: #dd3e3a; -} -.gantt_link_arrow_right { - border-width: 4px 0 4px 6px; - border-top-color: transparent !important; - border-right-color: transparent !important; - border-bottom-color: transparent !important; - border-left-color: #ffb96d; - margin-top: -1px; -} -.gantt_link_arrow_left { - border-width: 4px 6px 4px 0; - margin-top: -1px; - border-top-color: transparent !important; - border-right-color: #ffb96d; - border-bottom-color: transparent !important; - border-left-color: transparent !important; -} -.gantt_link_arrow_top { - border-width: 0 4px 6px 4px; - border-color: transparent transparent #ffb96d transparent; - border-top-color: transparent !important; - border-right-color: transparent !important; - border-bottom-color: #ffb96d; - border-left-color: transparent !important; -} -.gantt_link_arrow_down { - border-width: 4px 6px 0 4px; - border-top-color: #ffb96d; - border-right-color: transparent !important; - border-bottom-color: transparent !important; - border-left-color: transparent !important; -} -.gantt_task_drag, -.gantt_task_progress_drag { - cursor: w-resize; - height: 100%; - display: none; - position: absolute; -} -.gantt_task_line.gantt_selected .gantt_task_progress_drag, -.gantt_task_line:hover .gantt_task_progress_drag, -.gantt_task_line.gantt_selected .gantt_task_drag, -.gantt_task_line:hover .gantt_task_drag { - display: block; -} -.gantt_task_drag { - width: 6px; - background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAACCAYAAACUn8ZgAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6OTgyOEUzQzJDODQ3MTFFMjg3NDRCMUFBMTM1M0U1OTYiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6OTgyOEUzQzNDODQ3MTFFMjg3NDRCMUFBMTM1M0U1OTYiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo5ODI4RTNDMEM4NDcxMUUyODc0NEIxQUExMzUzRTU5NiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo5ODI4RTNDMUM4NDcxMUUyODc0NEIxQUExMzUzRTU5NiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pj3qIQcAAAAaSURBVHjaYvz//z8DLsAEIhoaGv5jowECDAASbgp+4xzYLgAAAABJRU5ErkJggg==); - z-index: 1; - top: 0px; -} -.gantt_task_drag.task_left { - left: 0px; -} -.gantt_task_drag.task_right { - right: 0px; -} -.gantt_task_progress_drag { - height: 8px; - width: 8px; - bottom: -4px; - margin-left: -4px; - background-position: bottom; - background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAJCAYAAAAGuM1UAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6Q0JCMkQyRDhDOTFDMTFFMjg3RTFCNUEzNUQwRDMxNjEiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6Q0JCMkQyRDlDOTFDMTFFMjg3RTFCNUEzNUQwRDMxNjEiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpDQkIyRDJENkM5MUMxMUUyODdFMUI1QTM1RDBEMzE2MSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpDQkIyRDJEN0M5MUMxMUUyODdFMUI1QTM1RDBEMzE2MSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Ppy3ICwAAADsSURBVHjafFBbaoNQEB1vghtIPlJX4Z/iX/cSsoZQGl80JZvIAvxVf1yNX6EFH+ADK8Y6nblQaGzagXNnmHPODHMVRIR5+L7/Sqm2bfv0i2TDT3ied4zjGBlU7+f8XPzCwrZtsSzLb9PTXQMRfhRFWFUVdl0nURQFco+45xsDNdwwDOVUNuR5LlHXNWZZhsyR5sDahRDC1XXdsSwLFCHgo+/hc5okhusVVFUFTdNgHMfHIAhQ0N2OaZowkbtpGhiG4Qa0RX6OYRicvCU9b2maPqzWa/grKtpE93D5zoZtkiRnyhv4Py6E3ZcAAwDb89Sl5rtPtAAAAABJRU5ErkJggg==); - background-repeat: no-repeat; - z-index: 2; -} -.gantt_link_tooltip { - box-shadow: 3px 3px 3px #888888; - background-color: #ffffff; - border-left: 1px dotted #cecece; - border-top: 1px dotted #cecece; - font-family: Tahoma; - font-size: 8pt; - color: #444444; - padding: 6px; - line-height: 20px; -} -.gantt_link_direction { - height: 0px; - border: 0px none #ffb96d; - border-bottom-style: dashed; - border-bottom-width: 2px; - transform-origin: 0% 0%; - -ms-transform-origin: 0% 0%; - -webkit-transform-origin: 0% 0%; - z-index: 2; - margin-left: 1px; - position: absolute; -} -.gantt_grid_data .gantt_row.gantt_selected, -.gantt_grid_data .gantt_row.odd.gantt_selected { - background-color: #ffebbc !important; -} -.gantt_task_row.gantt_selected { - background-color: #ffebbc !important; -} -.gantt_task_row.gantt_selected .gantt_task_cell { - border-right-color: #ffdc89; -} -.gantt_task_line.gantt_selected { - box-shadow: 0 0 5px #a7d991; -} -.gantt_task_line.gantt_project.gantt_selected { - box-shadow: 0 0 5px #9ab9f1; -} -.gantt_task_line.gantt_milestone { - visibility: hidden; - background-color: #db7dc5; - border: 0px solid #cd49ae; - box-sizing: content-box; - -moz-box-sizing: content-box; -} -.gantt_task_line.gantt_milestone div { - visibility: visible; -} -.gantt_task_line.gantt_milestone .gantt_task_content { - background: inherit; - border: inherit; - border-width: 1px; - border-radius: inherit; - box-sizing: border-box; - -moz-box-sizing: border-box; - -webkit-transform: rotate(45deg); - -moz-transform: rotate(45deg); - -ms-transform: rotate(45deg); - -o-transform: rotate(45deg); - transform: rotate(45deg); -} -.gantt_task_line.gantt_task_inline_color { - border-color: #999999; -} -.gantt_task_line.gantt_task_inline_color .gantt_task_progress { - background-color: #363636; - opacity: 0.2; -} -.gantt_task_line.gantt_task_inline_color.gantt_selected { - box-shadow: 0 0 5px #999999; -} -.gantt_task_line.gantt_task_inline_color.gantt_project.gantt_selected { - box-shadow: 0 0 5px #999999; -} -.gantt_task_link.gantt_link_inline_color:hover .gantt_line_wrapper div { - box-shadow: 0 0 5px 0px #999999; -} -.gantt_critical_task { - background-color: #e63030; - border-color: #9d3a3a; -} -.gantt_critical_task .gantt_task_progress { - background-color: rgba(0, 0, 0, 0.4); -} -.gantt_critical_link .gantt_line_wrapper > div { - background-color: #e63030; -} -.gantt_critical_link .gantt_link_arrow { - border-color: #e63030; -} -.gantt_unselectable, -.gantt_unselectable div { - -webkit-user-select: none; - -moz-user-select: none; - -moz-user-select: -moz-none; -} -.gantt_cal_light { - -webkit-tap-highlight-color: transparent; - background: #f4f2ea; - border-radius: 6px; - font-family: "Verdana"; - font-size: 11px; - border: 1px solid #cac8bd; - color: #3f3f3f; - font-size: 8pt; - position: absolute; - z-index: 10001; - width: 550px; - height: 250px; - box-shadow: 3px 3px 3px rgba(0, 0, 0, 0.07); -} -.gantt_cal_light_wide { - width: 650px; -} -.gantt_cal_light select { - font-family: "Verdana"; - border: 1px solid #cac8bd; - font-size: 11px; - padding: 2px; - margin: 0px; -} -.gantt_cal_ltitle { - padding: 7px 10px; - overflow: hidden; - white-space: nowrap; - -webkit-border-top-left-radius: 6px; - -webkit-border-bottom-left-radius: 0; - -webkit-border-top-right-radius: 6px; - -webkit-border-bottom-right-radius: 0; - -moz-border-radius-topleft: 6px; - -moz-border-radius-bottomleft: 0; - -moz-border-radius-topright: 6px; - -moz-border-radius-bottomright: 0; - border-top-left-radius: 6px; - border-bottom-left-radius: 0; - border-top-right-radius: 6px; - border-bottom-right-radius: 0; -} -.gantt_cal_ltitle span { - white-space: nowrap; -} -.gantt_cal_lsection { - color: #727272; - font-weight: bold; - padding: 12px 0px 5px 10px; -} -.gantt_cal_lsection .gantt_fullday { - float: right; - margin-right: 5px; - font-size: 12px; - font-weight: normal; - line-height: 20px; - vertical-align: top; - cursor: pointer; -} -.gantt_cal_lsection { - font-size: 13px; -} -.gantt_cal_ltext { - padding: 2px 10px; - overflow: hidden; -} -.gantt_cal_ltext textarea { - overflow: auto; - font-family: "Verdana"; - font-size: 11px; - -moz-box-sizing: border-box; - -webkit-box-sizing: border-box; - box-sizing: border-box; - border: 1px solid #cac8bd; - height: 100%; - width: 100%; - outline: none !important; - resize: none; -} -.gantt_time { - font-weight: bold; -} -.gantt_cal_light .gantt_title { - padding-left: 10px; -} -.gantt_cal_larea { - border: 1px solid #cac8bd; - border-left: none; - border-right: none; - background-color: #fff; - overflow: hidden; - height: 1px; -} -.gantt_btn_set { - margin: 10px 7px 5px 10px; - padding: 5px 15px 5px 10px; - float: left; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - border-width: 0; - border-color: #cac8bd; - border-style: solid; - height: 27px; - color: #4f4f4f; - background: #e0ded7; - -moz-box-sizing: border-box; - -webkit-box-sizing: border-box; - box-sizing: border-box; - cursor: pointer; -} -.gantt_btn_set div { - float: left; - font-size: 13px; - height: 17px; - line-height: 17px; - background-repeat: no-repeat; - vertical-align: middle; -} -.gantt_save_btn { - background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6QUUzMDA3NzlDOTFEMTFFMkJBQTNFMTU1NTdFNUNFMTMiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6QUUzMDA3N0FDOTFEMTFFMkJBQTNFMTU1NTdFNUNFMTMiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpBRTMwMDc3N0M5MUQxMUUyQkFBM0UxNTU1N0U1Q0UxMyIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpBRTMwMDc3OEM5MUQxMUUyQkFBM0UxNTU1N0U1Q0UxMyIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PtHrmoUAAAF4SURBVHjaYvr//z8DNTATA5UA1QxiIUdTQEAAG5CaA8S6QGyyYcOGvyzkGMLIyLgSGC4BHBwcr1RUVBhJdhHQEGagIctAhjAzM/9OSkrqd3Nz+ws3CKjAA0hNA+JcoDO34jIESC0FGhIM4tvb2y8FGjIbyPwPD2wNDQ1RIKUItG09UIM3LkOAOBzEB3rnaF5eXieQ+RYl1jo6Og4oKCicAtrGCjXMA82Q+TBD+Pj4HtfU1NQDmTewRf/jjIyMNmDgfYAatgnJMFDsxIIYrKysX7Ozs9sFBAT240xHQO/t8PT0BGliQHLZdiA3AabGz89vlrm5+RIg8x++BPkzPj5+Msj/UMM4gBTciwYGBttiY2MnAJmfiUnZj4CB2MzFxfUGWVBcXPx6WVlZE0ie6CwiJye3D+il6UCvgZ0PCreCggKQ4adIzWu/w8LCpoO8wsLC8j0yMnKipqbmelh6wQUYQUUADmACxDpADArwl4RSPT6DBqYYAQgwANyusz7jloxAAAAAAElFTkSuQmCC); - margin-top: 2px; - width: 21px; -} -.gantt_cancel_btn { - margin-top: 2px; - background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6QjQxN0VEOUZDOTFEMTFFMkFFMjE4MDI4MUJDNDQ1NDkiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6QjQxN0VEQTBDOTFEMTFFMkFFMjE4MDI4MUJDNDQ1NDkiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpCNDE3RUQ5REM5MUQxMUUyQUUyMTgwMjgxQkM0NDU0OSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpCNDE3RUQ5RUM5MUQxMUUyQUUyMTgwMjgxQkM0NDU0OSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pq9E2PUAAAH/SURBVHjaYvz//z8DNQAjTQ0KCAjgAVJFQOwBxGZQ4VNAvAOI+zZs2PCFoEFAQ+wZGRkXAMUVsNrMyPgAKJcANOwgToOAhgQCqXUgtqCg4ANXV9ctzs7Od0D8vXv3quzYsSPw06dP0lDl/kDDNmEYBDRECGjbYyCfS09Pb0dNTc1sNja2M0CpF1C1EjExMfu/fPmiBHXZZ5CrgYa9A/FZYCaysLCU/vnzh0tUVPRGU1NTPVDoNBD/R3ItyKVKAgICj/79+8cIdJksSA9QrBIkz4RkUBCINjU1XQUNWGRDQC4zBhrycMGCBYW2trbLkPWgGPTz50+wk6WlpTegBT6yIaCYXMfJybkRJPf7928ZDIOYmZl/g+jjx4+/xmcISPz27dsfYNowDOLi4gIb8PDhQ1N8hkDVGIBobm7ulxgGAb0EClyGX79+leAzBCjH9vXr13pkPSgGhYeHTwd6DxhUP62ghjzCZggw2icCw0YdGNDfQXrgkQVjGBgYHPHx8Zm9cePGHGhA/gdq/ANkysGUAHELMO3ogji+vr6zQXpwZREFkEErV66M//btmwi2LAIMyzdAlyz09/efDAoufJlW8tWrVx7Tp08PevDggc779+8VYFlGQUHhSmZm5joxMTFQ5n1OTDHCCsT6QAxKJ2JQsVdA/ASIL4J8TrPyCCDAAK8E80CvM3cMAAAAAElFTkSuQmCC); - width: 20px; -} -.gantt_delete_btn { - background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6QjkzQUQ0MjVDOTFEMTFFMkEwRERFNzQ5NzZCRjlBODgiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6QjkzQUQ0MjZDOTFEMTFFMkEwRERFNzQ5NzZCRjlBODgiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpCOTNBRDQyM0M5MUQxMUUyQTBEREU3NDk3NkJGOUE4OCIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpCOTNBRDQyNEM5MUQxMUUyQTBEREU3NDk3NkJGOUE4OCIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pmbo+yIAAAB9SURBVHjaYvz//z8DNQALPsmAgAC4LRs2bGDEaxLIRdiwv78/kPqfBsNQPk71jDCvIdtOLEB2JRMDlQAjUmCnkaF/FtYwgoUDsTQypprXRg0a0QYhp2yGpqamzefOnfMhpMnIyGhLXV2dL06DgMAYigmBs1CM0yCyAUCAAQAlK4lJjSOjGQAAAABJRU5ErkJggg==); - margin-top: 2px; - width: 20px; -} -.gantt_cal_cover { - width: 100%; - height: 100%; - position: absolute; - z-index: 10000; - top: 0px; - left: 0px; - background-color: black; - opacity: 0.1; - filter: progid:DXImageTransform.Microsoft.Alpha(opacity=10); -} -.gantt_custom_button { - padding: 0px 3px 0px 3px; - font-family: "Verdana"; - font-size: 11px; - font-weight: normal; - margin-right: 10px; - margin-top: -5px; - cursor: pointer; - float: right; - height: 21px; - width: 90px; - border: 1px solid #CECECE; - text-align: center; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - -ms-border-radius: 4px; - -o-border-radius: 4px; - border-radius: 4px; -} -.gantt_custom_button div { - cursor: pointer; - float: none; - height: 21px; - line-height: 21px; - vertical-align: middle; -} -.gantt_custom_button div:first-child { - display: none; -} -.gantt_cal_light_wide { - width: 580px; - padding: 2px 4px; -} -.gantt_cal_light_wide .gantt_cal_larea { - -moz-box-sizing: border-box; - -webkit-box-sizing: border-box; - box-sizing: border-box; - border: 1px solid #cac8bd; -} -.gantt_cal_light_wide .gantt_cal_lsection { - border: 0px; - float: left; - text-align: right; - width: 80px; - height: 20px; - padding: 5px 10px 0px 0px; -} -.gantt_cal_light_wide .gantt_wrap_section { - position: relative; - padding: 10px 0; - overflow: hidden; - border-bottom: 1px solid #eae9e5; -} -.gantt_cal_light_wide .gantt_section_time { - overflow: hidden; - padding-top: 2px !important; - padding-right: 0px; - height: 20px !important; -} -.gantt_cal_light_wide .gantt_cal_ltext { - padding-right: 0px; -} -.gantt_cal_light_wide .gantt_cal_larea { - padding: 0 10px; - width: 100%; -} -.gantt_cal_light_wide .gantt_section_time { - background: transparent; -} -.gantt_cal_light_wide .gantt_cal_checkbox label { - padding-left: 0px; -} -.gantt_cal_light_wide .gantt_cal_lsection .gantt_fullday { - float: none; - margin-right: 0px; - font-weight: bold; - cursor: pointer; -} -.gantt_cal_light_wide .gantt_custom_button { - position: absolute; - top: 0; - right: 0; - margin-top: 2px; -} -.gantt_cal_light_wide .gantt_repeat_right { - margin-right: 55px; -} -.gantt_cal_light_wide.gantt_cal_light_full { - width: 738px; -} -.gantt_cal_wide_checkbox input { - margin-top: 8px; - margin-left: 14px; -} -.gantt_cal_light input { - font-size: 11px; -} -.gantt_section_time { - background-color: white; - white-space: nowrap; - padding: 2px 10px 5px; - padding-top: 2px !important; -} -.gantt_section_time .gantt_time_selects { - float: left; - height: 25px; -} -.gantt_section_time .gantt_time_selects select { - height: 23px; - padding: 2px; - border: 1px solid #cac8bd; -} -.gantt_duration { - width: 100px; - height: 23px; - float: left; - white-space: nowrap; - margin-left: 20px; - line-height: 23px; -} -.gantt_duration .gantt_duration_value, -.gantt_duration .gantt_duration_dec, -.gantt_duration .gantt_duration_inc { - -moz-box-sizing: border-box; - -webkit-box-sizing: border-box; - box-sizing: border-box; - text-align: center; - vertical-align: top; - height: 100%; - border: 1px solid #cac8bd; -} -.gantt_duration .gantt_duration_value { - width: 40px; - padding: 3px 4px; - border-left-width: 0; - border-right-width: 0; -} -.gantt_duration .gantt_duration_dec, -.gantt_duration .gantt_duration_inc { - width: 20px; - padding: 1px; - padding-bottom: 3px; - background: #e0ded7; -} -.gantt_duration .gantt_duration_dec { - -moz-border-top-left-radius: 4px; - -moz-border-bottom-left-radius: 4px; - -webkit-border-top-left-radius: 4px; - -webkit-border-bottom-left-radius: 4px; - border-top-left-radius: 4px; - border-bottom-left-radius: 4px; -} -.gantt_duration .gantt_duration_inc { - margin-right: 4px; - -moz-border-top-right-radius: 4px; - -moz-border-bottom-right-radius: 4px; - -webkit-border-top-right-radius: 4px; - -webkit-border-bottom-right-radius: 4px; - border-top-right-radius: 4px; - border-bottom-right-radius: 4px; -} -/* Quick info */ -.gantt_cal_quick_info { - border: 1px solid #cac8bd; - border-radius: 6px; - position: absolute; - z-index: 300; - box-shadow: 3px 3px 3px rgba(0, 0, 0, 0.07); - background-color: #fcfaf3; - width: 300px; - transition: left 0.5s ease, right 0.5s; - -moz-transition: left 0.5s ease, right 0.5s; - -webkit-transition: left 0.5s ease, right 0.5s; - -o-transition: left 0.5s ease, right 0.5s; -} -.gantt_no_animate { - transition: none; - -moz-transition: none; - -webkit-transition: none; - -o-transition: none; -} -.gantt_cal_quick_info.gantt_qi_left .gantt_qi_big_icon { - float: right; -} -.gantt_cal_qi_title { - -webkit-border-top-left-radius: 6px; - -webkit-border-bottom-left-radius: 0; - -webkit-border-top-right-radius: 6px; - -webkit-border-bottom-right-radius: 0; - -moz-border-radius-topleft: 6px; - -moz-border-radius-bottomleft: 0; - -moz-border-radius-topright: 6px; - -moz-border-radius-bottomright: 0; - border-top-left-radius: 6px; - border-bottom-left-radius: 0; - border-top-right-radius: 6px; - border-bottom-right-radius: 0; - padding: 5px 0px 8px 12px; - color: #3f3f3f; - background-color: #f4f2ea; - border-bottom: 1px solid #cac8bd; -} -.gantt_cal_qi_tdate { - font-size: 14px; - font-weight: bold; -} -.gantt_cal_qi_tcontent { - font-size: 11px; -} -.gantt_cal_qi_content { - padding: 16px 8px; - font-size: 13px; - color: #3f3f3f; - overflow: hidden; -} -.gantt_cal_qi_controls { - -webkit-border-top-left-radius: 0; - -webkit-border-bottom-left-radius: 6px; - -webkit-border-top-right-radius: 0; - -webkit-border-bottom-right-radius: 6px; - -moz-border-radius-topleft: 0; - -moz-border-radius-bottomleft: 6px; - -moz-border-radius-topright: 0; - -moz-border-radius-bottomright: 6px; - border-top-left-radius: 0; - border-bottom-left-radius: 6px; - border-top-right-radius: 0; - border-bottom-right-radius: 6px; - padding-left: 7px; -} -.gantt_cal_qi_controls .gantt_menu_icon { - margin-top: 3.5px; - background-repeat: no-repeat; -} -.gantt_cal_qi_controls .gantt_menu_icon.icon_edit { - width: 20px; - background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH3QYFDgcMloNXJQAAAFNJREFUOMvt0zEOACAIA0Dkg30rL8TJTRTKZGJXyaWEKPKTCQAH4Ls37cItcDUzsxHNDLZNhCq7Gt1wh9ErV7EjyGAhyGLphlnsClWuS32rn0czAT/KLVk9yshBAAAAAElFTkSuQmCC); -} -.gantt_cal_qi_controls .gantt_menu_icon.icon_delete { - width: 20px; - background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6QjkzQUQ0MjVDOTFEMTFFMkEwRERFNzQ5NzZCRjlBODgiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6QjkzQUQ0MjZDOTFEMTFFMkEwRERFNzQ5NzZCRjlBODgiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpCOTNBRDQyM0M5MUQxMUUyQTBEREU3NDk3NkJGOUE4OCIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpCOTNBRDQyNEM5MUQxMUUyQTBEREU3NDk3NkJGOUE4OCIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pmbo+yIAAAB9SURBVHjaYvz//z8DNQALPsmAgAC4LRs2bGDEaxLIRdiwv78/kPqfBsNQPk71jDCvIdtOLEB2JRMDlQAjUmCnkaF/FtYwgoUDsTQypprXRg0a0QYhp2yGpqamzefOnfMhpMnIyGhLXV2dL06DgMAYigmBs1CM0yCyAUCAAQAlK4lJjSOjGQAAAABJRU5ErkJggg==); -} -.gantt_qi_big_icon { - font-size: 13px; - border-radius: 4px; - color: #4f4f4f; - background: #e0ded7; - margin: 5px 9px 8px 0px; - min-width: 60px; - line-height: 27px; - vertical-align: middle; - padding: 0px 10px 0px 5px; - cursor: pointer; - border: 1px solid #cac8bd; -} -.gantt_cal_qi_controls div { - float: left; - height: 27px; - text-align: center; - line-height: 27px; -} -.gantt_tooltip { - box-shadow: 3px 3px 3px rgba(0, 0, 0, 0.07); - background-color: white; - border-left: 1px solid rgba(0, 0, 0, 0.07); - border-top: 1px solid rgba(0, 0, 0, 0.07); - font-family: "Verdana"; - font-size: 8pt; - color: #3f3f3f; - padding: 10px; - position: absolute; - z-index: 50; -} -.gantt_marker { - height: 100%; - width: 2px; - top: 0; - position: absolute; - text-align: center; - background-color: rgba(255, 0, 0, 0.4); - -moz-box-sizing: border-box; - -webkit-box-sizing: border-box; - box-sizing: border-box; -} -.gantt_marker .gantt_marker_content { - padding: 5px; - background: inherit; - color: white; - position: absolute; - font-size: 12px; - line-height: 12px; - opacity: 0.8; -} -.gantt_marker_area { - position: absolute; - top: 0; - left: 0; -} -.gantt_noselect { - -moz-user-select: -moz-none; - -webkit-user-select: none; - -user-select: none; -} -.gantt_drag_marker { - position: absolute; - font-family: "Verdana"; - font-size: 11px; -} -.gantt_drag_marker .gantt_tree_indent, -.gantt_drag_marker .gantt_tree_icon.gantt_blank, -.gantt_drag_marker .gantt_tree_icon.gantt_open, -.gantt_drag_marker .gantt_tree_icon.gantt_close { - display: none; -} -.gantt_drag_marker, -.gantt_drag_marker .gantt_row.odd { - background-color: #ffffff; -} -.gantt_drag_marker .gantt_row { - border-left: 1px solid #d3d1c8; - border-top: 1px solid #d3d1c8; -} -.gantt_drag_marker .gantt_cell { - border-color: #d3d1c8; -} -.gantt_row.gantt_over, -.gantt_task_row.gantt_over { - background-color: #0070fe; -} -.gantt_row.gantt_transparent .gantt_cell { - opacity: 0.7; -} -.gantt_task_row.gantt_transparent { - background-color: #ffffff; -} -.dhtmlx_popup_button.dhtmlx_delete_button { - border: 1px solid #98d27e; - background: #a7d991; -} diff --git a/libraries/dhtmlxgantt/sources/skins/dhtmlxgantt_skyblue.css b/libraries/dhtmlxgantt/sources/skins/dhtmlxgantt_skyblue.css deleted file mode 100644 index 1a797b8..0000000 --- a/libraries/dhtmlxgantt/sources/skins/dhtmlxgantt_skyblue.css +++ /dev/null @@ -1,1389 +0,0 @@ -/* -@license - -dhtmlxGantt v.3.2.0 Stardard -This software is covered by GPL license. You also can obtain Commercial or Enterprise license to use it in non-GPL project - please contact sales@dhtmlx.com. Usage without proper license is prohibited. - -(c) Dinamenta, UAB. -*/ -/* colors for items with inline styles assigned (task.color, link.color)*/ -.gridHoverStyle { - background-color: #ffe6b1 !important; - background-color: #ffebc1; - background-image: -webkit-linear-gradient(top, #ffe09d 0%, #ffeabb 100%); - background-image: -moz-linear-gradient(top, #ffe09d 0%, #ffeabb 100%); - background-image: -ms-linear-gradient(top, #ffe09d 0%, #ffeabb 100%); - background-image: linear-gradient(to top, #ffe09d 0%, #ffeabb 100%); - border-top-color: #ffc341; - border-bottom-color: #ffc341; -} -.gridSelection { - background-color: #ffe6b1 !important; - border-bottom-color: #ffc341; -} -.timelineSelection { - background-color: #ffe6b1 !important; - background-color: #ffebc1; - background-image: -webkit-linear-gradient(top, #ffe09d 0%, #ffeabb 100%); - background-image: -moz-linear-gradient(top, #ffe09d 0%, #ffeabb 100%); - background-image: -ms-linear-gradient(top, #ffe09d 0%, #ffeabb 100%); - background-image: linear-gradient(to top, #ffe09d 0%, #ffeabb 100%); - border-top-color: #ffc341; - border-bottom-color: #ffc341; -} -.timelineSelection .gantt_task_cell { - border-right-color: #ffce65; -} -/* - milestone -*/ -/* - links dnd -*/ -/* - task resizers -*/ -/*lightbox*/ -/* - Message -*/ -.gantt_cal_quick_info .gantt_cal_qi_title { - background: #ffffff; -} -.gantt_cal_qi_controls .gantt_qi_big_icon .gantt_menu_icon.icon_delete { - margin-top: 5px; -} -.gantt_container { - font-family: "Tahoma"; - font-size: 11px; - border: 1px solid #a4bed4; - position: relative; - white-space: nowrap; -} -.gantt_grid { - border-right: 1px solid #a4bed4; -} -.gantt_task_scroll { - overflow-x: scroll; -} -.gantt_task { - position: relative; -} -.gantt_task, -.gantt_grid { - overflow-x: hidden; - overflow-y: hidden; - display: inline-block; - vertical-align: top; -} -.gantt_grid_scale, -.gantt_task_scale { - color: #42464b; - border-bottom: 1px solid #a4bed4; -} -.gantt_grid_scale { - box-shadow: 0px 1px 1px #fff inset; - background-color: #dfedff; - background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #e4f0ff), color-stop(50%, #dfedff), color-stop(100%, #d5e8ff)); - /* old webkit */ - background-image: -webkit-linear-gradient(top, #e4f0ff 0%, #dfedff 50%, #d5e8ff 100%); - background-image: -moz-linear-gradient(top, #e4f0ff 0%, #dfedff 60%, #d5e8ff 100%); - background-image: -ms-linear-gradient(top, #e4f0ff 0%, #dfedff 60%, #d5e8ff 100%); - background-image: -o-linear-gradient(top, #e4f0ff 0%, #dfedff 60%, #d5e8ff 100%); - background-position: 0px 1px; - background-repeat: repeat-x; -} -.gantt_task_scale { - box-shadow: 0px 1px 1px #fff inset; - background-color: #dfedff; - background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #e4f0ff), color-stop(50%, #dfedff), color-stop(100%, #d5e8ff)); - /* old webkit */ - background-image: -webkit-linear-gradient(top, #e4f0ff 0%, #dfedff 50%, #d5e8ff 100%); - background-image: -moz-linear-gradient(top, #e4f0ff 0%, #dfedff 60%, #d5e8ff 100%); - background-image: -ms-linear-gradient(top, #e4f0ff 0%, #dfedff 60%, #d5e8ff 100%); - background-image: -o-linear-gradient(top, #e4f0ff 0%, #dfedff 60%, #d5e8ff 100%); - background-position: 0px 1px; - background-repeat: repeat-x; -} -.gantt_scale_line { - box-sizing: border-box; - -moz-box-sizing: border-box; - border-top: 1px solid #a4bed4; -} -.gantt_scale_line:first-child { - border-top: none; -} -.gantt_grid_head_cell { - display: inline-block; - vertical-align: top; - border-right: 1px solid #a4bed4; - text-align: center; - position: relative; - cursor: default; - height: 100%; - box-sizing: border-box; - -moz-box-sizing: border-box; - line-height: 25px; - -moz-user-select: -moz-none; - -webkit-user-select: none; - -user-select: none; - overflow: hidden; -} -.gantt_scale_line { - clear: both; -} -.gantt_grid_data { - width: 100%; - overflow: hidden; -} -.gantt_row { - position: relative; - -webkit-user-select: none; - -moz-user-select: none; - -moz-user-select: -moz-none; -} -.gantt_add, -.gantt_grid_head_add { - width: 100%; - height: 100%; - background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NzZCMThBRUFCRTQ0MTFFMkFFMEFGMEFBMzJEN0RBRTIiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NzZCMThBRUJCRTQ0MTFFMkFFMEFGMEFBMzJEN0RBRTIiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo3NkIxOEFFOEJFNDQxMUUyQUUwQUYwQUEzMkQ3REFFMiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo3NkIxOEFFOUJFNDQxMUUyQUUwQUYwQUEzMkQ3REFFMiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PkVHygEAAAEpSURBVHjaYgzeGcyABfxnwA4Y0QVY/v79i1VlsUMxCr/3QC9WdTgN+P//P8Ohr4fAbDtuOwZc6lj+/PmDVeLfv39wTSA2LnU4DQC5AGYAiI1LHRNQ4j861pfSZ3j36x1YEwiD2CAxbGoZbRbZ/K/3qUcx9cPvDwzXv11n+PL3C5jPw8zDoMmlySDAKoCirnFLI8QLID/ufLOTARf48OcDw/Gfx1HE3EXcwa5j+f37N95AwgVAekB64QaATISB97/fM1z5dIXh85/PYD4vCy+DDp8OgyCrIIYBjFoTtDBSnYWyBYO9rj3DsbfHwHwrYSuGg5cPMpy4ewIzFoCmMKLjwzcOMwiwCMBjAcQGiWFTizchweRompDwuiBANoCgCxjFasQoys4AAQYARt4I/K036xQAAAAASUVORK5CYII=); - background-position: center center; - background-repeat: no-repeat; - cursor: pointer; - position: relative; - -moz-opacity: 0.3; - opacity: 0.3; -} -.gantt_grid_head_cell.gantt_grid_head_add { - -moz-opacity: 0.6; - opacity: 0.6; - top: 0; -} -.gantt_grid_head_cell.gantt_grid_head_add:hover { - -moz-opacity: 1; - opacity: 1; -} -.gantt_grid_data .gantt_row:hover, -.gantt_grid_data .gantt_row.odd:hover { - background-color: #ffe6b1 !important; - background-color: #ffebc1; - background-image: -webkit-linear-gradient(top, #ffe09d 0%, #ffeabb 100%); - background-image: -moz-linear-gradient(top, #ffe09d 0%, #ffeabb 100%); - background-image: -ms-linear-gradient(top, #ffe09d 0%, #ffeabb 100%); - background-image: linear-gradient(to top, #ffe09d 0%, #ffeabb 100%); - border-top-color: #ffc341; - border-bottom-color: #ffc341; -} -.gantt_grid_data .gantt_row:hover .gantt_add, -.gantt_grid_data .gantt_row.odd:hover .gantt_add { - -moz-opacity: 1; - opacity: 1; -} -.gantt_task_row, -.gantt_row { - border-bottom: 1px solid #ebebeb; -} -.gantt_row, -.gantt_task_row { - background-color: #ffffff; -} -.gantt_row.odd, -.gantt_task_row.odd { - background-color: #ffffff; -} -.gantt_row, -.gantt_cell, -.gantt_task_row, -.gantt_task_cell, -.gantt_grid_head_cell, -.gantt_scale_cell { - box-sizing: border-box; - -moz-box-sizing: border-box; -} -.gantt_grid_head_cell, -.gantt_scale_cell { - line-height: inherit; -} -.gantt_grid_scale .gantt_grid_column_resize_wrap { - cursor: col-resize; - position: absolute; - width: 13px; -} -.gantt_grid_column_resize_wrap .gantt_grid_column_resize { - background-color: #a4bed4; - height: 100%; - width: 1px; - margin: 0 auto; -} -.gantt_grid .gantt_grid_resize_wrap { - cursor: col-resize; - position: absolute; - width: 13px; - z-index: 1; -} -.gantt_grid_resize_wrap .gantt_grid_resize { - background-color: #a4bed4; - width: 1px; - margin: 0 auto; -} -.gantt_drag_marker.gantt_grid_resize_area { - background-color: rgba(231, 231, 231, 0.5); - border-left: 1px solid #a4bed4; - border-right: 1px solid #a4bed4; - height: 100%; - width: 100%; - -moz-box-sizing: border-box; - -webkit-box-sizing: border-box; - box-sizing: border-box; -} -.gantt_cell { - display: inline-block; - vertical-align: top; - border-right: 1px solid #ebebeb; - padding-left: 6px; - padding-right: 6px; - height: 100%; - overflow: hidden; - white-space: nowrap; -} -.gantt_grid_scale .gantt_last_cell, -.gantt_grid_data .gantt_last_cell, -.gantt_task_scale .gantt_last_cell, -.gantt_task_bg .gantt_last_cell { - border-right-width: 0px; -} -.gantt_task_bg { - overflow: hidden; -} -.gantt_scale_cell { - display: inline-block; - white-space: nowrap; - overflow: hidden; - border-right: 1px solid #a4bed4; - text-align: center; - height: 100%; -} -.gantt_task_cell { - display: inline-block; - height: 100%; - border-right: 1px solid #ebebeb; -} -.gantt_ver_scroll { - width: 0px; - background-color: transparent; - height: 1px; - overflow-x: hidden; - overflow-y: scroll; - display: none; - position: absolute; - right: 0px; -} -.gantt_ver_scroll > div { - width: 1px; - height: 1px; -} -.gantt_hor_scroll { - height: 0px; - background-color: transparent; - width: 100%; - clear: both; - overflow-x: scroll; - overflow-y: hidden; - display: none; -} -.gantt_hor_scroll > div { - width: 5000px; - height: 1px; -} -.gantt_tree_indent { - width: 15px; - height: 100%; - display: inline-block; -} -.gantt_tree_content, -.gantt_tree_icon { - vertical-align: top; -} -.gantt_tree_icon { - width: 28px; - height: 100%; - display: inline-block; - background-repeat: no-repeat; - background-position: center center; -} -.gantt_tree_content { - height: 100%; - display: inline-block; -} -.gantt_tree_icon.gantt_open { - background-image: url(data:image/gif;base64,R0lGODlhEgASAJEAAP///4SEhAAAAP///yH5BAUUAAMALAAAAAASABIAAAIqnI+py+0Powq01haA3iDgLWwek2mhNi6ZwLLdZ4owcL4kJ5OWJfX+DykAADs=); - width: 18px; - cursor: pointer; -} -.gantt_tree_icon.gantt_close { - background-image: url(data:image/gif;base64,R0lGODlhEgASAJEAAP///4SEhAAAAP///yH5BAUUAAMALAAAAAASABIAAAImnI+py+0Powq01haA3iBgvnlMBnafgKLmWK4LCYpvK0+WJeX6DhUAOw==); - width: 18px; - cursor: pointer; -} -.gantt_tree_icon.gantt_blank { - width: 18px; -} -.gantt_tree_icon.gantt_folder_open { - background-image: url(data:image/gif;base64,R0lGODlhEgASAMQfAPXMWPK9N/fipOzLbPrVaP/89frqwv3tuvvprfLES+7PdP7xyP7z0vPAQfvtyMuaIv/32/735OSqFv3de+7ReP7lmf7gh/nv0v/67unFXfb29vK/PenFSaGEPfLnyv///yH5BAEAAB8ALAAAAAASABIAAAWS4Cc+ZGk+YvqZRVtgGiag6sNBThlFWnTQqQcE4sqRFj/VashsYR6HZI0JWSAjDwQCOGIgERULg/EQzJRQsGVCYHTK51qYTQDkFPj4iA4AJHIUgQoGQA8EdX4NhHgKAxeFfQkJGwGLeI6Fkg2UlQ8Dn5hBCZuchKChIxKkGw05Ga8DHlwkqg2tJ1xBtDlKvTUkviEAOw==); -} -.gantt_tree_icon.gantt_folder_closed { - background-image: url(data:image/gif;base64,R0lGODlhEgASAMQfAPvjpP/24fPHVvnUdvzotdSiKv/23vvrw/LCS/C+RfnelvPMaf/88/nbi/rsyerYq/TLYv7y1v7wzeCsLO+8P86dJfvv0MuaIsydKPPOc+SqGKGEPe/AS+zVneWwLf///yH5BAEAAB8ALAAAAAASABIAAAWZ4CdeZGleYvpdA+O+zNUBqHoZOB4EceHUqVtuF+n9VCtdQCI5BC6FA3BkCEQkBALAACVMV9eDVhGJQGnIixigaAwiG6jie2G7BxDLpVJozG13EAICPxUeGRleQQMLgggJUhiHC3pBggKPFJETGZRAF5gJCRSaFxgTC55BCByioz+nEKojGgmtHBwPJAUCELo2J8FfSMTFxsUhADs=); -} -.gantt_tree_icon.gantt_file { - background-image: url(data:image/gif;base64,R0lGODlhEgASAMQVAPv7+2RkZPf39/r6+vj4+Pn5+fT09Pb29vX19fHx8fDw8Onp6fLy8u7u7uzs7PPz8+vr6+rq6uXl5ejo6O/v7////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAABUALAAAAAASABIAAAV4YCWOZGkGaKqaVSAMQCwLQnAOj6ErzUTXpQDgQDgcGJTFDzgSEp4HRCKytDUBMKzAoIAsJACrSCjTGhINR5hELg8ECEZifS3HCgQEgj62xwZPAnwtbgMDBQU0g21Yh4iIi3aGkzBihH52lgEEmDIEli0qoigspSYhADs=); -} -.gantt_grid_head_cell .gantt_sort { - position: absolute; - right: 5px; - top: 8px; - width: 7px; - height: 13px; - background-repeat: no-repeat; - background-position: center center; -} -.gantt_grid_head_cell .gantt_sort.gantt_asc { - background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAANCAYAAABlyXS1AAAARUlEQVR4nGNgQAKGxib/GbABkIS7b8B/DAUwCRiGK0CXwFBAb1DfP/U/LszwHwi2X7qFgUEArBtdAVwCBmAKMCSQFSDzAWXXaOHsXeqkAAAAAElFTkSuQmCC); -} -.gantt_grid_head_cell .gantt_sort.gantt_desc { - background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAANCAYAAABlyXS1AAAARUlEQVR42mNgQAL1/VP/M2ADIIntF2/9x1AAlrh0C47hCmA60DFYwX88gIFGwNDY5D8uDFbg7hvwHx2jmIBTAlkB0e4BAEjlaNtBWJPnAAAAAElFTkSuQmCC); -} -.gantt_inserted, -.gantt_updated { - font-weight: bold; -} -.gantt_deleted { - text-decoration: line-through; -} -.gantt_invalid { - background-color: FFE0E0; -} -.gantt_error { - color: red; -} -.gantt_status { - right: 1px; - padding: 5px 10px; - background: rgba(155, 155, 155, 0.1); - position: absolute; - top: 1px; - -webkit-transition: opacity 0.2s; - transition: opacity 0.2s; - opacity: 0; -} -.gantt_status.gantt_status_visible { - opacity: 1; -} -#gantt_ajax_dots span { - -webkit-transition: opacity 0.2s; - transition: opacity 0.2s; - background-repeat: no-repeat; - opacity: 0; -} -#gantt_ajax_dots span.gantt_dot_visible { - opacity: 1; -} -.dhtmlx_message_area { - position: fixed; - right: 5px; - width: 250px; - z-index: 1000; -} -.dhtmlx-info { - min-width: 120px; - padding: 4px 4px 4px 20px; - font-family: "Tahoma"; - z-index: 10000; - margin: 5px; - margin-bottom: 10px; - -webkit-transition: all .5s ease; - -moz-transition: all .5s ease; - -o-transition: all .5s ease; - transition: all .5s ease; -} -.dhtmlx-info.hidden { - height: 0px; - padding: 0px; - border-width: 0px; - margin: 0px; - overflow: hidden; -} -.dhtmlx_modal_box { - overflow: hidden; - display: inline-block; - min-width: 250px; - width: 250px; - text-align: center; - position: fixed; - z-index: 20000; - box-shadow: 3px 3px 3px rgba(0, 0, 0, 0.07); - font-family: "Tahoma"; - border-radius: 0; - border: 1px solid #a4bed4; - background: #ffffff; -} -.dhtmlx_popup_title { - border-top-left-radius: 0; - border-top-right-radius: 0; - border-width: 0px; -} -.dhtmlx_button, -.dhtmlx_popup_button { - border: 1px solid #a4bed4; - height: 24px; - line-height: 24px; - display: inline-block; - margin: 0 5px; - border-radius: 4px; - background-color: #f8f8f8; - background-image: -webkit-linear-gradient(top, #e6e6e6 0%, #ffffff 100%); - background-image: -moz-linear-gradient(top, #e6e6e6 0%, #ffffff 100%); - background-image: -ms-linear-gradient(top, #e6e6e6 0%, #ffffff 100%); - background-image: linear-gradient(to top, #e6e6e6 0%, #ffffff 100%); -} -.dhtmlx-info, -.dhtmlx_popup_button, -.dhtmlx_button { - user-select: none; - -webkit-user-select: none; - -moz-user-select: -moz-none; - cursor: pointer; -} -.dhtmlx_popup_text { - overflow: hidden; -} -.dhtmlx_popup_controls { - border-radius: 6px; - padding: 10px; -} -.dhtmlx_popup_button { - min-width: 100px; -} -div.dhx_modal_cover { - background-color: #000; - cursor: default; - filter: progid:DXImageTransform.Microsoft.Alpha(opacity=20); - opacity: 0.2; - position: fixed; - z-index: 19999; - left: 0px; - top: 0px; - width: 100%; - height: 100%; - border: none; - zoom: 1; -} -.dhtmlx-info img, -.dhtmlx_modal_box img { - float: left; - margin-right: 20px; -} -.dhtmlx-alert-error, -.dhtmlx-confirm-error { - border: 1px solid #ff0000; -} -/*Skin section*/ -.dhtmlx_button input, -.dhtmlx_popup_button div { - border-radius: 4px; - font-size: 15px; - -moz-box-sizing: content-box; - box-sizing: content-box; - padding: 0px; - margin: 0px; - vertical-align: top; -} -.dhtmlx_popup_title { - color: #fff; - text-shadow: 1px 1px #000; - height: 40px; - line-height: 40px; - font-size: 20px; -} -.dhtmlx_popup_text { - margin: 15px 15px 5px 15px; - font-size: 14px; - color: #000; - min-height: 30px; - border-radius: 0; -} -.dhtmlx-info, -.dhtmlx-error { - font-size: 14px; - color: #000; - box-shadow: 3px 3px 3px rgba(0, 0, 0, 0.07); - padding: 0px; - background-color: #FFF; - border-radius: 3px; - border: 1px solid #ffffff; -} -.dhtmlx-info div { - padding: 5px 10px 5px 10px; - background-color: #fff; - border-radius: 3px; - border: 1px solid #a4bed4; -} -.dhtmlx-error { - background-color: #d81b1b; - border: 1px solid #ff3c3c; - box-shadow: 3px 3px 3px rgba(0, 0, 0, 0.07); -} -.dhtmlx-error div { - background-color: #d81b1b; - border: 1px solid #940000; - color: #FFF; -} -.gantt_grid div, -.gantt_data_area div { - -ms-touch-action: none; - -webkit-tap-highlight-color: rgba(0, 0, 0, 0); -} -.gantt_data_area { - position: relative; - overflow-x: hidden; - overflow-y: hidden; - -moz-user-select: -moz-none; - -webkit-user-select: none; - -user-select: none; -} -.gantt_links_area { - position: absolute; - left: 0px; - top: 0px; -} -.gantt_task_content, -.gantt_task_progress, -.gantt_side_content { - line-height: inherit; - overflow: hidden; - height: 100%; -} -.gantt_task_content { - font-size: 12px; - color: #1e2022; - width: 100%; - top: 0; - position: absolute; - white-space: nowrap; - text-align: center; -} -.gantt_task_progress { - text-align: center; - z-index: 0; - background: #5aa0d3; - background-color: #82b7de; - background-image: -webkit-linear-gradient(top, #abcee8 0%, #5aa0d3 36%, #bfdaee 100%); - background-image: -moz-linear-gradient(top, #abcee8 0%, #5aa0d3 36%, #bfdaee 100%); - background-image: -ms-linear-gradient(top, #abcee8 0%, #5aa0d3 36%, #bfdaee 100%); - background-image: linear-gradient(to top, #abcee8 0%, #5aa0d3 36%, #bfdaee 100%); -} -.gantt_task_line { - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; - position: absolute; - -moz-box-sizing: border-box; - box-sizing: border-box; - background-color: #eff6fb; - border: 1px solid #3588c5; - -webkit-user-select: none; - -moz-user-select: none; - -moz-user-select: -moz-none; -} -.gantt_task_line.gantt_drag_move div { - cursor: move; -} -.gantt_touch_move, -.gantt_touch_progress .gantt_touch_resize { - -moz-transform: scale(1.02, 1.1); - -o-transform: scale(1.02, 1.1); - -webkit-transform: scale(1.02, 1.1); - transform: scale(1.02, 1.1); - -moz-transform-origin: 50%; - -o-transform-origin: 50%; - -webkit-transform-origin: 50%; - transform-origin: 50%; -} -.gantt_touch_progress .gantt_task_progress_drag, -.gantt_touch_resize .gantt_task_drag { - -moz-transform: scaleY(1.3); - -o-transform: scaleY(1.3); - -webkit-transform: scaleY(1.3); - transform: scaleY(1.3); - -moz-transform-origin: 50%; - -o-transform-origin: 50%; - -webkit-transform-origin: 50%; - transform-origin: 50%; -} -.gantt_side_content { - position: absolute; - white-space: nowrap; - color: #6e6e6e; - bottom: 7px; - font-size: 11px; -} -.gantt_side_content.gantt_left { - right: 100%; - padding-right: 15px; -} -.gantt_side_content.gantt_right { - left: 100%; - padding-left: 15px; -} -.gantt_side_content.gantt_link_crossing { - bottom: 6.75px; -} -.gantt_task_link .gantt_line_wrapper, -.gantt_link_arrow { - position: absolute; - cursor: pointer; -} -.gantt_line_wrapper div { - background-color: #4a8f43; -} -.gantt_task_link:hover .gantt_line_wrapper div { - box-shadow: 0 0 5px 0px #4a8f43; -} -.gantt_task_link div.gantt_link_arrow { - background-color: transparent; - border-style: solid; - width: 0px; - height: 0px; -} -.gantt_link_control { - position: absolute; - width: 13px; - top: 0px; -} -.gantt_link_control div { - display: none; - cursor: pointer; - box-sizing: border-box; - position: relative; - top: 50%; - margin-top: -7.5px; - vertical-align: middle; - border: 1px solid #929292; - -webkit-border-radius: 6.5px; - -moz-border-radius: 6.5px; - border-radius: 6.5px; - height: 13px; - width: 13px; - background-color: #f0f0f0; -} -.gantt_link_control div:hover { - background-color: #ffffff; -} -.gantt_link_control.task_left { - left: -13px; -} -.gantt_link_control.task_right { - right: -13px; -} -.gantt_task_line.gantt_selected .gantt_link_control div, -.gantt_task_line:hover .gantt_link_control div { - display: block; -} -.gantt_link_target .gantt_link_control div { - display: block; -} -.gantt_link_source, -.gantt_link_target { - box-shadow: 0px 0px 3px #0070fe; -} -.gantt_link_target.link_start_allow, -.gantt_link_target.link_finish_allow { - box-shadow: 0px 0px 3px #6eb867; -} -.gantt_link_target.link_start_deny, -.gantt_link_target.link_finish_deny { - box-shadow: 0px 0px 3px #e87e7b; -} -.link_start_allow .gantt_link_control.task_left div, -.link_finish_allow .gantt_link_control.task_right div { - background-color: #6eb867; - border-color: #4a8f43; -} -.link_start_deny .gantt_link_control.task_left div, -.link_finish_deny .gantt_link_control.task_right div { - background-color: #e87e7b; - border-color: #dd3e3a; -} -.gantt_link_arrow_right { - border-width: 4px 0 4px 8px; - border-top-color: transparent !important; - border-right-color: transparent !important; - border-bottom-color: transparent !important; - border-left-color: #4a8f43; - margin-top: -1px; -} -.gantt_link_arrow_left { - border-width: 4px 8px 4px 0; - margin-top: -1px; - border-top-color: transparent !important; - border-right-color: #4a8f43; - border-bottom-color: transparent !important; - border-left-color: transparent !important; -} -.gantt_link_arrow_top { - border-width: 0 4px 8px 4px; - border-color: transparent transparent #4a8f43 transparent; - border-top-color: transparent !important; - border-right-color: transparent !important; - border-bottom-color: #4a8f43; - border-left-color: transparent !important; -} -.gantt_link_arrow_down { - border-width: 4px 8px 0 4px; - border-top-color: #4a8f43; - border-right-color: transparent !important; - border-bottom-color: transparent !important; - border-left-color: transparent !important; -} -.gantt_task_drag, -.gantt_task_progress_drag { - cursor: w-resize; - height: 100%; - display: none; - position: absolute; -} -.gantt_task_line.gantt_selected .gantt_task_progress_drag, -.gantt_task_line:hover .gantt_task_progress_drag, -.gantt_task_line.gantt_selected .gantt_task_drag, -.gantt_task_line:hover .gantt_task_drag { - display: block; -} -.gantt_task_drag { - width: 6px; - background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAACCAYAAACUn8ZgAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MDEyNDQ5RDdCRTQ5MTFFMjhBQzlGRDA2RDIyNDc5NzEiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MDEyNDQ5RDhCRTQ5MTFFMjhBQzlGRDA2RDIyNDc5NzEiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDowMTI0NDlENUJFNDkxMUUyOEFDOUZEMDZEMjI0Nzk3MSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDowMTI0NDlENkJFNDkxMUUyOEFDOUZEMDZEMjI0Nzk3MSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pv8NECcAAAAaSURBVHjaYvz//z8DLsAEIsw6j/3HRgMEGAARnwqNiuFmdQAAAABJRU5ErkJggg==); - z-index: 1; - top: 0px; -} -.gantt_task_drag.task_left { - left: 0px; -} -.gantt_task_drag.task_right { - right: 0px; -} -.gantt_task_progress_drag { - height: 8px; - width: 8px; - bottom: -4px; - margin-left: -4px; - background-position: bottom; - background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NDNGNzQ1MTZCQkRBMTFFMjlBMjRBRkU0RkNCMTUzNkUiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NDNGNzQ1MTdCQkRBMTFFMjlBMjRBRkU0RkNCMTUzNkUiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo0M0Y3NDUxNEJCREExMUUyOUEyNEFGRTRGQ0IxNTM2RSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo0M0Y3NDUxNUJCREExMUUyOUEyNEFGRTRGQ0IxNTM2RSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PrBLI3EAAACISURBVHjafE07DkMhDAuftQdgYuCWbZ9a0WtwGJC4BgMbYmVGaZLpqWpryZFjOwrACSmlSLzCN1DwrLUik/TtM3yUUnDOiWMMZE3enTNF4gghRO89KKXkABGh9w6ttcPSHp1zsNaCvbcUjDHAHhVemg1rrVxprYWs2ZOMR84ZfoGfXuAP3gIMABorQUvC1invAAAAAElFTkSuQmCC); - background-repeat: no-repeat; - z-index: 2; -} -.gantt_link_tooltip { - box-shadow: 3px 3px 3px #888888; - background-color: #ffffff; - border-left: 1px dotted #cecece; - border-top: 1px dotted #cecece; - font-family: Tahoma; - font-size: 8pt; - color: #444444; - padding: 6px; - line-height: 20px; -} -.gantt_link_direction { - height: 0px; - border: 0px none #4a8f43; - border-bottom-style: dashed; - border-bottom-width: 2px; - transform-origin: 0% 0%; - -ms-transform-origin: 0% 0%; - -webkit-transform-origin: 0% 0%; - z-index: 2; - margin-left: 1px; - position: absolute; -} -.gantt_grid_data .gantt_row.gantt_selected, -.gantt_grid_data .gantt_row.odd.gantt_selected { - background-color: #ffe6b1 !important; - border-bottom-color: #ffc341; -} -.gantt_task_row.gantt_selected { - background-color: #ffe6b1 !important; - background-color: #ffebc1; - background-image: -webkit-linear-gradient(top, #ffe09d 0%, #ffeabb 100%); - background-image: -moz-linear-gradient(top, #ffe09d 0%, #ffeabb 100%); - background-image: -ms-linear-gradient(top, #ffe09d 0%, #ffeabb 100%); - background-image: linear-gradient(to top, #ffe09d 0%, #ffeabb 100%); - border-top-color: #ffc341; - border-bottom-color: #ffc341; -} -.gantt_task_row.gantt_selected .gantt_task_cell { - border-right-color: #ffb30e; -} -.gantt_task_row.gantt_selected .gantt_task_cell { - border-right-color: #ffce65; -} -.gantt_task_line.gantt_selected { - box-shadow: 0 0 5px #5aa0d3; -} -.gantt_task_line.gantt_project.gantt_selected { - box-shadow: 0 0 5px #9ab9f1; -} -.gantt_task_line.gantt_milestone { - visibility: hidden; - background-color: #db7dc5; - border: 0px solid #cd49ae; - box-sizing: content-box; - -moz-box-sizing: content-box; -} -.gantt_task_line.gantt_milestone div { - visibility: visible; -} -.gantt_task_line.gantt_milestone .gantt_task_content { - background: inherit; - border: inherit; - border-width: 1px; - border-radius: inherit; - box-sizing: border-box; - -moz-box-sizing: border-box; - -webkit-transform: rotate(45deg); - -moz-transform: rotate(45deg); - -ms-transform: rotate(45deg); - -o-transform: rotate(45deg); - transform: rotate(45deg); -} -.gantt_task_line.gantt_task_inline_color { - border-color: #999999; -} -.gantt_task_line.gantt_task_inline_color .gantt_task_progress { - background-color: #363636; - opacity: 0.2; -} -.gantt_task_line.gantt_task_inline_color.gantt_selected { - box-shadow: 0 0 5px #999999; -} -.gantt_task_line.gantt_task_inline_color.gantt_project.gantt_selected { - box-shadow: 0 0 5px #999999; -} -.gantt_task_link.gantt_link_inline_color:hover .gantt_line_wrapper div { - box-shadow: 0 0 5px 0px #999999; -} -.gantt_critical_task { - background-color: #e63030; - border-color: #9d3a3a; -} -.gantt_critical_task .gantt_task_progress { - background-color: rgba(0, 0, 0, 0.4); -} -.gantt_critical_link .gantt_line_wrapper > div { - background-color: #e63030; -} -.gantt_critical_link .gantt_link_arrow { - border-color: #e63030; -} -.gantt_unselectable, -.gantt_unselectable div { - -webkit-user-select: none; - -moz-user-select: none; - -moz-user-select: -moz-none; -} -.gantt_cal_light { - -webkit-tap-highlight-color: transparent; - background-color: #eff6fb; - border-radius: 0; - font-family: "Tahoma"; - font-size: 11px; - border: 1px solid #a4bed4; - color: #42464b; - position: absolute; - z-index: 10001; - width: 550px; - height: 250px; - box-shadow: 3px 3px 3px rgba(0, 0, 0, 0.07); -} -.gantt_cal_light_wide { - width: 650px; -} -.gantt_cal_light select { - font-family: "Tahoma"; - border: 1px solid #a4bed4; - font-size: 11px; - padding: 2px; - margin: 0px; -} -.gantt_cal_ltitle { - padding: 7px 10px; - overflow: hidden; - white-space: nowrap; - -webkit-border-top-left-radius: 0; - -webkit-border-bottom-left-radius: 0; - -webkit-border-top-right-radius: 0; - -webkit-border-bottom-right-radius: 0; - -moz-border-radius-topleft: 0; - -moz-border-radius-bottomleft: 0; - -moz-border-radius-topright: 0; - -moz-border-radius-bottomright: 0; - border-top-left-radius: 0; - border-bottom-left-radius: 0; - border-top-right-radius: 0; - border-bottom-right-radius: 0; -} -.gantt_cal_ltitle span { - white-space: nowrap; -} -.gantt_cal_lsection { - color: #727272; - font-weight: bold; - padding: 12px 0px 5px 10px; -} -.gantt_cal_lsection .gantt_fullday { - float: right; - margin-right: 5px; - font-size: 12px; - font-weight: normal; - line-height: 20px; - vertical-align: top; - cursor: pointer; -} -.gantt_cal_lsection { - font-size: 13px; -} -.gantt_cal_ltext { - padding: 2px 10px; - overflow: hidden; -} -.gantt_cal_ltext textarea { - overflow: auto; - font-family: "Tahoma"; - font-size: 11px; - -moz-box-sizing: border-box; - -webkit-box-sizing: border-box; - box-sizing: border-box; - border: 1px solid #a4bed4; - height: 100%; - width: 100%; - outline: none !important; - resize: none; -} -.gantt_time { - font-weight: bold; -} -.gantt_cal_light .gantt_title { - padding-left: 10px; -} -.gantt_cal_larea { - border: 1px solid #a4bed4; - border-left: none; - border-right: none; - background-color: #fff; - overflow: hidden; - height: 1px; -} -.gantt_btn_set { - margin: 10px 7px 5px 10px; - padding: 2px 25px 2px 10px; - float: left; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - border-width: 1px; - border-color: #a4bed4; - border-style: solid; - height: 26px; - color: #42464b; - background-color: #f8f8f8; - background-image: -webkit-linear-gradient(top, #e6e6e6 0%, #ffffff 100%); - background-image: -moz-linear-gradient(top, #e6e6e6 0%, #ffffff 100%); - background-image: -ms-linear-gradient(top, #e6e6e6 0%, #ffffff 100%); - background-image: linear-gradient(to top, #e6e6e6 0%, #ffffff 100%); - -moz-box-sizing: border-box; - -webkit-box-sizing: border-box; - box-sizing: border-box; - cursor: pointer; -} -.gantt_btn_set div { - float: left; - font-size: 13px; - height: 20px; - line-height: 20px; - background-repeat: no-repeat; - vertical-align: middle; -} -.gantt_save_btn { - background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6QkE5Nzc4RENDMzAzMTFFMjk4QjNBODhDMUM4QUUwNEQiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6QkE5Nzc4RERDMzAzMTFFMjk4QjNBODhDMUM4QUUwNEQiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpCQTk3NzhEQUMzMDMxMUUyOThCM0E4OEMxQzhBRTA0RCIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpCQTk3NzhEQkMzMDMxMUUyOThCM0E4OEMxQzhBRTA0RCIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pr5Ot2UAAAFoSURBVHjapFO7SgNRED0rxkjEELbcQksLBUMg4EfkG7YV/AFTpBAUfNQisVDQD7CQlBaWwoZ8gNEiFttmg3GTfbF6JtzFTUJYyIHhDnfOnJm5Dy2OYywDjQJnF5ex/dXDweENNtaAzT/jur46IY1D4McHvv3J+nZ7BGNrG436sSaU3ucHqtUqzP1sVcflMizLEl8EwjBEFEXwomwC5DInEeDGaDSC62cTIJc5iUAQBGJukE1A8YkVNYLv++h232WMRUYOuakRlOLTwzU8z1tYPZ/Po1QqJR0kAgQDWTEjwLaIWq0GwzDmJtm2jVarNSvAeeQQXVe6ME1Tgs1mMyXA2GAwQKFQmH8G/X4fjuOgWCxKkP40yMnlcukO1MNgAivoui5B+tMgh3H1DuQa66fnaLfbGA6HMgY7oNGfNnL+v0RN/cbnl9f46qSBSqUiM9J4ZQSvVgl0Oh1pf2d3D4/3d5q27Hf+FWAAc90EKSR5k78AAAAASUVORK5CYII=); - margin-top: 2px; - width: 21px; -} -.gantt_cancel_btn { - margin-top: 2px; - background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6QzU4NTQ3NUZDMzAzMTFFMkE0MjRGNTQzQjE0MTNDQkIiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6QzU4NTQ3NjBDMzAzMTFFMkE0MjRGNTQzQjE0MTNDQkIiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpDNTg1NDc1REMzMDMxMUUyQTQyNEY1NDNCMTQxM0NCQiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpDNTg1NDc1RUMzMDMxMUUyQTQyNEY1NDNCMTQxM0NCQiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PkVB3hoAAAEYSURBVHjapJM9CsJAEIUTFStbQRA8gKCNKSIIeohUVraC9oKiGBRsBDvBylbwEkJQCys9gJUgeIOAxDfwEpYNpsmDL7PZ+cn+TMwgCIw0yhgplZPH3bbVuRqYgiYogxe4ABc8wqD69RpbQR6MwQ04TDZoHc6LP/tvC2uw4Fi+Vgcmrct58W9iW4BaYAB80OGSQ8my7xz7jDsAT11Bn3alJYvUa1pp8VGBNu0uIVm2s9fiowJF8OWJ/0sWPRlX1At8eLqlhGRRhXEfvcCJtpeQLOpq8VGBLe04Ibmh+Ld6AY8HWOBVzUCVvio780z/LrxCtQ9EQ+5tBOZElRzeUmmqWCfKlyfAAkfw5vyb7xb9vlrATPs7/wQYAISgQGDaq6hUAAAAAElFTkSuQmCC); - width: 20px; -} -.gantt_delete_btn { - background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6RTA3M0M1MzJDMzAzMTFFMkE5ODZDRjhENzQ2MUZFNzkiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6RTA3M0M1MzNDMzAzMTFFMkE5ODZDRjhENzQ2MUZFNzkiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpFMDczQzUzMEMzMDMxMUUyQTk4NkNGOEQ3NDYxRkU3OSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpFMDczQzUzMUMzMDMxMUUyQTk4NkNGOEQ3NDYxRkU3OSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pplu0sEAAAErSURBVHja3FOxboMwED0nIQNbJoaOZM0YyMhGqwz8BOQ3mm5I/AHwCayoGVlhZUSMHTIhsSCEhOtzawRIlZDY+qTTs893z6fzmVBKYQ12YhEEweB0HAf3tCxLUFUVXWSeiDGIzW/ynRE9HA7coihCBtd1AVn40TCO2X1ewbthGCBJEiiKAtvtFggh0HUdWJYFfd9zez6f3JckiS1EhEDmeZ623+9BlmWejCaAfWqahou0bQumab7MK9DP5zM9nU5c4Hg8ch4nF0XBOc9zuF6vg/pm3pw0TSdNDcPwp8QsG2LiOIY/BZagqqp1AmP8M4Gvuq5B1/XJqNq2zVnTNMBzjBsLEHxnHBrf91/Z/nPBpW+32+0hPuFODAt79wtbfiwQuLD4x6SCNfgWYAAfQYJFsOV+5AAAAABJRU5ErkJggg==); - margin-top: 2px; - width: 20px; -} -.gantt_cal_cover { - width: 100%; - height: 100%; - position: absolute; - z-index: 10000; - top: 0px; - left: 0px; - background-color: black; - opacity: 0.1; - filter: progid:DXImageTransform.Microsoft.Alpha(opacity=10); -} -.gantt_custom_button { - padding: 0px 3px 0px 3px; - font-family: "Tahoma"; - font-size: 11px; - font-weight: normal; - margin-right: 10px; - margin-top: -5px; - cursor: pointer; - float: right; - height: 21px; - width: 90px; - border: 1px solid #CECECE; - text-align: center; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - -ms-border-radius: 4px; - -o-border-radius: 4px; - border-radius: 4px; -} -.gantt_custom_button div { - cursor: pointer; - float: none; - height: 21px; - line-height: 21px; - vertical-align: middle; -} -.gantt_custom_button div:first-child { - display: none; -} -.gantt_cal_light_wide { - width: 580px; - padding: 2px 4px; -} -.gantt_cal_light_wide .gantt_cal_larea { - -moz-box-sizing: border-box; - -webkit-box-sizing: border-box; - box-sizing: border-box; - border: 1px solid #a4bed4; -} -.gantt_cal_light_wide .gantt_cal_lsection { - border: 0px; - float: left; - text-align: right; - width: 80px; - height: 20px; - padding: 5px 10px 0px 0px; -} -.gantt_cal_light_wide .gantt_wrap_section { - position: relative; - padding: 10px 0; - overflow: hidden; - border-bottom: 1px solid #ebebeb; -} -.gantt_cal_light_wide .gantt_section_time { - overflow: hidden; - padding-top: 2px !important; - padding-right: 0px; - height: 20px !important; -} -.gantt_cal_light_wide .gantt_cal_ltext { - padding-right: 0px; -} -.gantt_cal_light_wide .gantt_cal_larea { - padding: 0 10px; - width: 100%; -} -.gantt_cal_light_wide .gantt_section_time { - background: transparent; -} -.gantt_cal_light_wide .gantt_cal_checkbox label { - padding-left: 0px; -} -.gantt_cal_light_wide .gantt_cal_lsection .gantt_fullday { - float: none; - margin-right: 0px; - font-weight: bold; - cursor: pointer; -} -.gantt_cal_light_wide .gantt_custom_button { - position: absolute; - top: 0; - right: 0; - margin-top: 2px; -} -.gantt_cal_light_wide .gantt_repeat_right { - margin-right: 55px; -} -.gantt_cal_light_wide.gantt_cal_light_full { - width: 738px; -} -.gantt_cal_wide_checkbox input { - margin-top: 8px; - margin-left: 14px; -} -.gantt_cal_light input { - font-size: 11px; -} -.gantt_section_time { - background-color: white; - white-space: nowrap; - padding: 2px 10px 5px; - padding-top: 2px !important; -} -.gantt_section_time .gantt_time_selects { - float: left; - height: 25px; -} -.gantt_section_time .gantt_time_selects select { - height: 23px; - padding: 2px; - border: 1px solid #a4bed4; -} -.gantt_duration { - width: 100px; - height: 23px; - float: left; - white-space: nowrap; - margin-left: 20px; - line-height: 23px; -} -.gantt_duration .gantt_duration_value, -.gantt_duration .gantt_duration_dec, -.gantt_duration .gantt_duration_inc { - -moz-box-sizing: border-box; - -webkit-box-sizing: border-box; - box-sizing: border-box; - text-align: center; - vertical-align: top; - height: 100%; - border: 1px solid #a4bed4; -} -.gantt_duration .gantt_duration_value { - width: 40px; - padding: 3px 4px; - border-left-width: 0; - border-right-width: 0; -} -.gantt_duration .gantt_duration_dec, -.gantt_duration .gantt_duration_inc { - width: 20px; - padding: 1px; - padding-bottom: 3px; - background-color: #f8f8f8; - background-image: -webkit-linear-gradient(top, #e6e6e6 0%, #ffffff 100%); - background-image: -moz-linear-gradient(top, #e6e6e6 0%, #ffffff 100%); - background-image: -ms-linear-gradient(top, #e6e6e6 0%, #ffffff 100%); - background-image: linear-gradient(to top, #e6e6e6 0%, #ffffff 100%); -} -.gantt_duration .gantt_duration_dec { - -moz-border-top-left-radius: 4px; - -moz-border-bottom-left-radius: 4px; - -webkit-border-top-left-radius: 4px; - -webkit-border-bottom-left-radius: 4px; - border-top-left-radius: 4px; - border-bottom-left-radius: 4px; -} -.gantt_duration .gantt_duration_inc { - margin-right: 4px; - -moz-border-top-right-radius: 4px; - -moz-border-bottom-right-radius: 4px; - -webkit-border-top-right-radius: 4px; - -webkit-border-bottom-right-radius: 4px; - border-top-right-radius: 4px; - border-bottom-right-radius: 4px; -} -/* Quick info */ -.gantt_cal_quick_info { - border: 1px solid #a4bed4; - border-radius: 0; - position: absolute; - z-index: 300; - box-shadow: 3px 3px 3px rgba(0, 0, 0, 0.07); - background-color: #ffffff; - width: 300px; - transition: left 0.5s ease, right 0.5s; - -moz-transition: left 0.5s ease, right 0.5s; - -webkit-transition: left 0.5s ease, right 0.5s; - -o-transition: left 0.5s ease, right 0.5s; -} -.gantt_no_animate { - transition: none; - -moz-transition: none; - -webkit-transition: none; - -o-transition: none; -} -.gantt_cal_quick_info.gantt_qi_left .gantt_qi_big_icon { - float: right; -} -.gantt_cal_qi_title { - -webkit-border-top-left-radius: 0; - -webkit-border-bottom-left-radius: 0; - -webkit-border-top-right-radius: 0; - -webkit-border-bottom-right-radius: 0; - -moz-border-radius-topleft: 0; - -moz-border-radius-bottomleft: 0; - -moz-border-radius-topright: 0; - -moz-border-radius-bottomright: 0; - border-top-left-radius: 0; - border-bottom-left-radius: 0; - border-top-right-radius: 0; - border-bottom-right-radius: 0; - padding: 5px 0px 8px 12px; - color: #1e2022; - box-shadow: 0px 1px 1px #fff inset; - background-color: #dfedff; - background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #e4f0ff), color-stop(50%, #dfedff), color-stop(100%, #d5e8ff)); - /* old webkit */ - background-image: -webkit-linear-gradient(top, #e4f0ff 0%, #dfedff 50%, #d5e8ff 100%); - background-image: -moz-linear-gradient(top, #e4f0ff 0%, #dfedff 60%, #d5e8ff 100%); - background-image: -ms-linear-gradient(top, #e4f0ff 0%, #dfedff 60%, #d5e8ff 100%); - background-image: -o-linear-gradient(top, #e4f0ff 0%, #dfedff 60%, #d5e8ff 100%); - background-position: 0px 1px; - background-repeat: repeat-x; - border-bottom: 1px solid #a4bed4; -} -.gantt_cal_qi_tdate { - font-size: 14px; - font-weight: bold; -} -.gantt_cal_qi_tcontent { - font-size: 11px; -} -.gantt_cal_qi_content { - padding: 16px 8px; - font-size: 13px; - color: #1e2022; - overflow: hidden; -} -.gantt_cal_qi_controls { - -webkit-border-top-left-radius: 0; - -webkit-border-bottom-left-radius: 0; - -webkit-border-top-right-radius: 0; - -webkit-border-bottom-right-radius: 0; - -moz-border-radius-topleft: 0; - -moz-border-radius-bottomleft: 0; - -moz-border-radius-topright: 0; - -moz-border-radius-bottomright: 0; - border-top-left-radius: 0; - border-bottom-left-radius: 0; - border-top-right-radius: 0; - border-bottom-right-radius: 0; - padding-left: 7px; -} -.gantt_cal_qi_controls .gantt_menu_icon { - margin-top: 3px; - background-repeat: no-repeat; -} -.gantt_cal_qi_controls .gantt_menu_icon.icon_edit { - width: 20px; - background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH3QYFDhEuX3ujFgAAAFNJREFUOMvt0zEOACAIA0DksTyqn8XJTRTKZGJXyaWEKPKTCQAH4Ls37cItcDUzsxHNDLZNhCq7Gt1wh9ErV7EjyGAhyGLphlnsClWuS32rn0czAV+sNUIROnQoAAAAAElFTkSuQmCC); -} -.gantt_cal_qi_controls .gantt_menu_icon.icon_delete { - width: 20px; - background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6RTA3M0M1MzJDMzAzMTFFMkE5ODZDRjhENzQ2MUZFNzkiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6RTA3M0M1MzNDMzAzMTFFMkE5ODZDRjhENzQ2MUZFNzkiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpFMDczQzUzMEMzMDMxMUUyQTk4NkNGOEQ3NDYxRkU3OSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpFMDczQzUzMUMzMDMxMUUyQTk4NkNGOEQ3NDYxRkU3OSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pplu0sEAAAErSURBVHja3FOxboMwED0nIQNbJoaOZM0YyMhGqwz8BOQ3mm5I/AHwCayoGVlhZUSMHTIhsSCEhOtzawRIlZDY+qTTs893z6fzmVBKYQ12YhEEweB0HAf3tCxLUFUVXWSeiDGIzW/ynRE9HA7coihCBtd1AVn40TCO2X1ewbthGCBJEiiKAtvtFggh0HUdWJYFfd9zez6f3JckiS1EhEDmeZ623+9BlmWejCaAfWqahou0bQumab7MK9DP5zM9nU5c4Hg8ch4nF0XBOc9zuF6vg/pm3pw0TSdNDcPwp8QsG2LiOIY/BZagqqp1AmP8M4Gvuq5B1/XJqNq2zVnTNMBzjBsLEHxnHBrf91/Z/nPBpW+32+0hPuFODAt79wtbfiwQuLD4x6SCNfgWYAAfQYJFsOV+5AAAAABJRU5ErkJggg==); -} -.gantt_qi_big_icon { - font-size: 13px; - border-radius: 4px; - color: #42464b; - background-color: #f8f8f8; - background-image: -webkit-linear-gradient(top, #e6e6e6 0%, #ffffff 100%); - background-image: -moz-linear-gradient(top, #e6e6e6 0%, #ffffff 100%); - background-image: -ms-linear-gradient(top, #e6e6e6 0%, #ffffff 100%); - background-image: linear-gradient(to top, #e6e6e6 0%, #ffffff 100%); - margin: 5px 9px 8px 0px; - min-width: 60px; - line-height: 26px; - vertical-align: middle; - padding: 0px 10px 0px 5px; - cursor: pointer; - border: 1px solid #a4bed4; -} -.gantt_cal_qi_controls div { - float: left; - height: 26px; - text-align: center; - line-height: 26px; -} -.gantt_tooltip { - box-shadow: 3px 3px 3px rgba(0, 0, 0, 0.07); - background-color: white; - border-left: 1px solid rgba(0, 0, 0, 0.07); - border-top: 1px solid rgba(0, 0, 0, 0.07); - font-family: "Tahoma"; - font-size: 8pt; - color: #1e2022; - padding: 10px; - position: absolute; - z-index: 50; -} -.gantt_marker { - height: 100%; - width: 2px; - top: 0; - position: absolute; - text-align: center; - background-color: rgba(255, 0, 0, 0.4); - -moz-box-sizing: border-box; - -webkit-box-sizing: border-box; - box-sizing: border-box; -} -.gantt_marker .gantt_marker_content { - padding: 5px; - background: inherit; - color: white; - position: absolute; - font-size: 12px; - line-height: 12px; - opacity: 0.8; -} -.gantt_marker_area { - position: absolute; - top: 0; - left: 0; -} -.gantt_noselect { - -moz-user-select: -moz-none; - -webkit-user-select: none; - -user-select: none; -} -.gantt_drag_marker { - position: absolute; - font-family: "Tahoma"; - font-size: 11px; -} -.gantt_drag_marker .gantt_tree_indent, -.gantt_drag_marker .gantt_tree_icon.gantt_blank, -.gantt_drag_marker .gantt_tree_icon.gantt_open, -.gantt_drag_marker .gantt_tree_icon.gantt_close { - display: none; -} -.gantt_drag_marker, -.gantt_drag_marker .gantt_row.odd { - background-color: #ffffff; -} -.gantt_drag_marker .gantt_row { - border-left: 1px solid #d2d2d2; - border-top: 1px solid #d2d2d2; -} -.gantt_drag_marker .gantt_cell { - border-color: #d2d2d2; -} -.gantt_row.gantt_over, -.gantt_task_row.gantt_over { - background-color: #0070fe; -} -.gantt_row.gantt_transparent .gantt_cell { - opacity: 0.7; -} -.gantt_task_row.gantt_transparent { - background-color: #e4f0ff; -} diff --git a/libraries/dhtmlxgantt/sources/skins/dhtmlxgantt_terrace.css b/libraries/dhtmlxgantt/sources/skins/dhtmlxgantt_terrace.css deleted file mode 100644 index 6a7f499..0000000 --- a/libraries/dhtmlxgantt/sources/skins/dhtmlxgantt_terrace.css +++ /dev/null @@ -1,1422 +0,0 @@ -/* -@license - -dhtmlxGantt v.3.2.0 Stardard -This software is covered by GPL license. You also can obtain Commercial or Enterprise license to use it in non-GPL project - please contact sales@dhtmlx.com. Usage without proper license is prohibited. - -(c) Dinamenta, UAB. -*/ -/* colors for items with inline styles assigned (task.color, link.color)*/ -.gridHoverStyle { - background-color: #fff3a1; -} -.gridSelection { - background-color: #fff3a1; -} -.timelineSelection { - background-color: #fff3a1; -} -.gantt_grid_scale .gantt_grid_head_cell { - color: #a6a6a6; - border-top: none !important; - border-right: none !important; -} -.gantt_grid_data .gantt_cell { - border-right: none; - color: #454545; -} -/* - Tasks -*/ -.gantt_task_link .gantt_link_arrow_right { - border-width: 6px 6px 6px 6px; - margin-top: -3px; -} -.gantt_task_link .gantt_link_arrow_left { - border-width: 6px 6px 6px 6px; - margin-left: -6px; - margin-top: -3px; -} -.gantt_task_link .gantt_link_arrow_top { - border-width: 6px 6px 6px 6px; -} -.gantt_task_link .gantt_link_arrow_down { - border-width: 6px 6px 6px 6px; -} -.gantt_task_line .gantt_task_progress_drag { - bottom: -4px; - height: 16px; - margin-left: -8px; - width: 16px; -} -.chartHeaderBg { - background-color: #fff; -} -.gantt_task .gantt_task_scale .gantt_scale_cell { - color: #a6a6a6; - border-right: 1px solid #ebebeb; -} -/* - project highlight -*/ -.gantt_row.gantt_project, -.gantt_row.odd.gantt_project { - background-color: #edffef; -} -.gantt_task_row.gantt_project, -.gantt_task_row.odd.gantt_project { - background-color: #f5fff6; -} -.gantt_task_line.gantt_project { - background-color: #65c16f; - border: 1px solid #3c9445; -} -.gantt_task_line.gantt_project .gantt_task_progress { - background-color: #46ad51; -} -/* - milestone -*/ -/* - lightbox -*/ -.buttonBg { - background: #fff; -} -.gantt_cal_light .gantt_btn_set { - margin: 5px 10px; -} -.gantt_btn_set.gantt_cancel_btn_set { - background: #fff; - color: #454545; - border: 1px solid #cecece; -} -.gantt_btn_set.gantt_save_btn_set { - background: #3db9d3; - text-shadow: 0 -1px 0 #248a9f; - color: #fff; -} -.gantt_btn_set.gantt_delete_btn_set { - text-shadow: 0 -1px 0 #6f6f6f; - background: #ec8e00; - text-shadow: 0 -1px 0 #aa6600; - color: #fff; -} -.gantt_delete_btn { - margin-top: 2px; - width: 20px; -} -.gantt_cal_light_wide { - padding-left: 0 !important; - padding-right: 0 !important; -} -.gantt_cal_light_wide .gantt_cal_larea { - border-left: none !important; - border-right: none !important; -} -/* - Message -*/ -.dhtmlx_popup_button.dhtmlx_ok_button { - background: #3db9d3; - text-shadow: 0 -1px 0 #248a9f; - color: #fff; - font-weight: bold; - border-width: 0; -} -.dhtmlx_popup_button.dhtmlx_cancel_button { - font-weight: bold; - color: #454544; -} -/* - Quick info -*/ -.gantt_qi_big_icon.icon_edit { - color: #454545; - background: #fff; -} -.gantt_qi_big_icon.icon_delete { - text-shadow: 0 -1px 0 #aa6600; - background: #ec8e00; - color: #fff; - border-width: 0; -} -/*links dnd*/ -.gantt_container { - font-family: "Arial"; - font-size: 13px; - border: 1px solid #cecece; - position: relative; - white-space: nowrap; -} -.gantt_grid { - border-right: 1px solid #cecece; -} -.gantt_task_scroll { - overflow-x: scroll; -} -.gantt_task { - position: relative; -} -.gantt_task, -.gantt_grid { - overflow-x: hidden; - overflow-y: hidden; - display: inline-block; - vertical-align: top; -} -.gantt_grid_scale, -.gantt_task_scale { - color: #6b6b6b; - font-size: 12px; - border-bottom: 1px solid #cecece; -} -.gantt_grid_scale { - background-color: #fff; -} -.gantt_task_scale { - background-color: #fff; -} -.gantt_scale_line { - box-sizing: border-box; - -moz-box-sizing: border-box; - border-top: 1px solid #cecece; -} -.gantt_scale_line:first-child { - border-top: none; -} -.gantt_grid_head_cell { - display: inline-block; - vertical-align: top; - border-right: 1px solid #cecece; - text-align: center; - position: relative; - cursor: default; - height: 100%; - box-sizing: border-box; - -moz-box-sizing: border-box; - line-height: 33px; - -moz-user-select: -moz-none; - -webkit-user-select: none; - -user-select: none; - overflow: hidden; -} -.gantt_scale_line { - clear: both; -} -.gantt_grid_data { - width: 100%; - overflow: hidden; -} -.gantt_row { - position: relative; - -webkit-user-select: none; - -moz-user-select: none; - -moz-user-select: -moz-none; -} -.gantt_add, -.gantt_grid_head_add { - width: 100%; - height: 100%; - background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NTQ3MjMyMENDNkI0MTFFMjk4MTI5QTg3MDhFNDVDQTkiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NTQ3MjMyMERDNkI0MTFFMjk4MTI5QTg3MDhFNDVDQTkiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo1NDcyMzIwQUM2QjQxMUUyOTgxMjlBODcwOEU0NUNBOSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo1NDcyMzIwQkM2QjQxMUUyOTgxMjlBODcwOEU0NUNBOSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PshZT8UAAABbSURBVHjaYrTdeZmBEsCER+4wEP+H4sPkGGCDg020ARR7gb4GIAcYDKMDdPnDyAbYkGG5DVW9cIQMvUdBBAuUY4vDz8iAcZinA2zgCHqAYQMseAywJcYFAAEGAM+UFGuohFczAAAAAElFTkSuQmCC); - background-position: center center; - background-repeat: no-repeat; - cursor: pointer; - position: relative; - -moz-opacity: 0.3; - opacity: 0.3; -} -.gantt_grid_head_cell.gantt_grid_head_add { - -moz-opacity: 0.6; - opacity: 0.6; - top: 0; -} -.gantt_grid_head_cell.gantt_grid_head_add:hover { - -moz-opacity: 1; - opacity: 1; -} -.gantt_grid_data .gantt_row:hover, -.gantt_grid_data .gantt_row.odd:hover { - background-color: #fff3a1; -} -.gantt_grid_data .gantt_row:hover .gantt_add, -.gantt_grid_data .gantt_row.odd:hover .gantt_add { - -moz-opacity: 1; - opacity: 1; -} -.gantt_task_row, -.gantt_row { - border-bottom: 1px solid #ebebeb; -} -.gantt_row, -.gantt_task_row { - background-color: #ffffff; -} -.gantt_row.odd, -.gantt_task_row.odd { - background-color: #ffffff; -} -.gantt_row, -.gantt_cell, -.gantt_task_row, -.gantt_task_cell, -.gantt_grid_head_cell, -.gantt_scale_cell { - box-sizing: border-box; - -moz-box-sizing: border-box; -} -.gantt_grid_head_cell, -.gantt_scale_cell { - line-height: inherit; -} -.gantt_grid_scale .gantt_grid_column_resize_wrap { - cursor: col-resize; - position: absolute; - width: 13px; -} -.gantt_grid_column_resize_wrap .gantt_grid_column_resize { - background-color: #cecece; - height: 100%; - width: 1px; - margin: 0 auto; -} -.gantt_grid .gantt_grid_resize_wrap { - cursor: col-resize; - position: absolute; - width: 13px; - z-index: 1; -} -.gantt_grid_resize_wrap .gantt_grid_resize { - background-color: #cecece; - width: 1px; - margin: 0 auto; -} -.gantt_drag_marker.gantt_grid_resize_area { - background-color: rgba(231, 231, 231, 0.5); - border-left: 1px solid #cecece; - border-right: 1px solid #cecece; - height: 100%; - width: 100%; - -moz-box-sizing: border-box; - -webkit-box-sizing: border-box; - box-sizing: border-box; -} -.gantt_cell { - display: inline-block; - vertical-align: top; - border-right: 1px solid #ebebeb; - padding-left: 6px; - padding-right: 6px; - height: 100%; - overflow: hidden; - white-space: nowrap; - font-size: 13px; -} -.gantt_grid_scale .gantt_last_cell, -.gantt_grid_data .gantt_last_cell, -.gantt_task_scale .gantt_last_cell, -.gantt_task_bg .gantt_last_cell { - border-right-width: 0px; -} -.gantt_task_bg { - overflow: hidden; -} -.gantt_scale_cell { - display: inline-block; - white-space: nowrap; - overflow: hidden; - border-right: 1px solid #cecece; - text-align: center; - height: 100%; -} -.gantt_task_cell { - display: inline-block; - height: 100%; - border-right: 1px solid #ebebeb; -} -.gantt_ver_scroll { - width: 0px; - background-color: transparent; - height: 1px; - overflow-x: hidden; - overflow-y: scroll; - display: none; - position: absolute; - right: 0px; -} -.gantt_ver_scroll > div { - width: 1px; - height: 1px; -} -.gantt_hor_scroll { - height: 0px; - background-color: transparent; - width: 100%; - clear: both; - overflow-x: scroll; - overflow-y: hidden; - display: none; -} -.gantt_hor_scroll > div { - width: 5000px; - height: 1px; -} -.gantt_tree_indent { - width: 15px; - height: 100%; - display: inline-block; -} -.gantt_tree_content, -.gantt_tree_icon { - vertical-align: top; -} -.gantt_tree_icon { - width: 28px; - height: 100%; - display: inline-block; - background-repeat: no-repeat; - background-position: center center; -} -.gantt_tree_content { - height: 100%; - display: inline-block; -} -.gantt_tree_icon.gantt_open { - background-image: url(data:image/gif;base64,R0lGODlhEgASALMJAMrKyt3d3ejp6d7f3+/v75aWlvf39////wAAAP///wAAAAAAAAAAAAAAAAAAAAAAACH/C1hNUCBEYXRhWE1QPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS4wLWMwNjAgNjEuMTM0Nzc3LCAyMDEwLzAyLzEyLTE3OjMyOjAwICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdFJlZj0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlUmVmIyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M1IFdpbmRvd3MiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6M0I5RTczQjVDMDdBMTFFMTgxRjc4Mzk4M0Q3MjVFQzAiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6M0I5RTczQjZDMDdBMTFFMTgxRjc4Mzk4M0Q3MjVFQzAiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDozQjlFNzNCM0MwN0ExMUUxODFGNzgzOTgzRDcyNUVDMCIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDozQjlFNzNCNEMwN0ExMUUxODFGNzgzOTgzRDcyNUVDMCIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PgH//v38+/r5+Pf29fTz8vHw7+7t7Ovq6ejn5uXk4+Lh4N/e3dzb2tnY19bV1NPS0dDPzs3My8rJyMfGxcTDwsHAv769vLu6ubi3trW0s7KxsK+urayrqqmop6alpKOioaCfnp2cm5qZmJeWlZSTkpGQj46NjIuKiYiHhoWEg4KBgH9+fXx7enl4d3Z1dHNycXBvbm1sa2ppaGdmZWRjYmFgX15dXFtaWVhXVlVUU1JRUE9OTUxLSklIR0ZFRENCQUA/Pj08Ozo5ODc2NTQzMjEwLy4tLCsqKSgnJiUkIyIhIB8eHRwbGhkYFxYVFBMSERAPDg0MCwoJCAcGBQQDAgEAACH5BAEAAAkALAAAAAASABIAAARJMMlJq704661B+SAIXAVhnKhBFKSZnmuLImhslXPN3ibi+6pdBXc4IIpB2YkGE1IKAoL0ICUInJNCYMDtDgJYiScUGnHO6LQkAgA7); - width: 18px; - cursor: pointer; -} -.gantt_tree_icon.gantt_close { - background-image: url(data:image/gif;base64,R0lGODlhEgASALMJAMrKyt3d3ejp6d7f3+/v75aWlvf39wAAAP///////wAAAAAAAAAAAAAAAAAAAAAAACH/C1hNUCBEYXRhWE1QPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS4wLWMwNjAgNjEuMTM0Nzc3LCAyMDEwLzAyLzEyLTE3OjMyOjAwICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdFJlZj0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlUmVmIyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M1IFdpbmRvd3MiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MzY0QzNGM0VDMDdBMTFFMUE3MDlCNUM2QjU1NDA5RjgiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MzY0QzNGM0ZDMDdBMTFFMUE3MDlCNUM2QjU1NDA5RjgiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDozNjRDM0YzQ0MwN0ExMUUxQTcwOUI1QzZCNTU0MDlGOCIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDozNjRDM0YzREMwN0ExMUUxQTcwOUI1QzZCNTU0MDlGOCIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PgH//v38+/r5+Pf29fTz8vHw7+7t7Ovq6ejn5uXk4+Lh4N/e3dzb2tnY19bV1NPS0dDPzs3My8rJyMfGxcTDwsHAv769vLu6ubi3trW0s7KxsK+urayrqqmop6alpKOioaCfnp2cm5qZmJeWlZSTkpGQj46NjIuKiYiHhoWEg4KBgH9+fXx7enl4d3Z1dHNycXBvbm1sa2ppaGdmZWRjYmFgX15dXFtaWVhXVlVUU1JRUE9OTUxLSklIR0ZFRENCQUA/Pj08Ozo5ODc2NTQzMjEwLy4tLCsqKSgnJiUkIyIhIB8eHRwbGhkYFxYVFBMSERAPDg0MCwoJCAcGBQQDAgEAACH5BAEAAAkALAAAAAASABIAAARDMMlJq704661B+SAIXAVhnKhBFKSZnmv7wqxVzmpd3Uff5zKEUAi0uV4xm4DAbBIEOkohMKhaB4HoxBMKjTjgsFgSAQA7); - width: 18px; - cursor: pointer; -} -.gantt_tree_icon.gantt_blank { - width: 18px; -} -.gantt_tree_icon.gantt_folder_open { - background-image: url(data:image/gif;base64,R0lGODlhEgASAJECAJeXl7Gvrf///wAAACH/C1hNUCBEYXRhWE1QPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS4wLWMwNjAgNjEuMTM0Nzc3LCAyMDEwLzAyLzEyLTE3OjMyOjAwICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdFJlZj0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlUmVmIyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M1IFdpbmRvd3MiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NTdDRDM3QzVDMDZEMTFFMUJGMzhFMDhCN0RGRjBGQ0YiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NTdDRDM3QzZDMDZEMTFFMUJGMzhFMDhCN0RGRjBGQ0YiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo1N0NEMzdDM0MwNkQxMUUxQkYzOEUwOEI3REZGMEZDRiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo1N0NEMzdDNEMwNkQxMUUxQkYzOEUwOEI3REZGMEZDRiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PgH//v38+/r5+Pf29fTz8vHw7+7t7Ovq6ejn5uXk4+Lh4N/e3dzb2tnY19bV1NPS0dDPzs3My8rJyMfGxcTDwsHAv769vLu6ubi3trW0s7KxsK+urayrqqmop6alpKOioaCfnp2cm5qZmJeWlZSTkpGQj46NjIuKiYiHhoWEg4KBgH9+fXx7enl4d3Z1dHNycXBvbm1sa2ppaGdmZWRjYmFgX15dXFtaWVhXVlVUU1JRUE9OTUxLSklIR0ZFRENCQUA/Pj08Ozo5ODc2NTQzMjEwLy4tLCsqKSgnJiUkIyIhIB8eHRwbGhkYFxYVFBMSERAPDg0MCwoJCAcGBQQDAgEAACH5BAEAAAIALAAAAAASABIAAAIzlI+pywcPm3mhWgkCsjBOvVkimElG9ZlCBlXd+2XjjLKg5GqoeZXqvsOQXK/ijUZTKVUFADs=); -} -.gantt_tree_icon.gantt_folder_closed { - background-image: url(data:image/gif;base64,R0lGODlhEgASAJECAJeXl7Gvrf///wAAACH/C1hNUCBEYXRhWE1QPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS4wLWMwNjAgNjEuMTM0Nzc3LCAyMDEwLzAyLzEyLTE3OjMyOjAwICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdFJlZj0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlUmVmIyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M1IFdpbmRvd3MiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NTAyMTU1RTNDMDZEMTFFMUJGNzZCRThBRkFCRjg4MTIiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NTAyMTU1RTRDMDZEMTFFMUJGNzZCRThBRkFCRjg4MTIiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo1MDIxNTVFMUMwNkQxMUUxQkY3NkJFOEFGQUJGODgxMiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo1MDIxNTVFMkMwNkQxMUUxQkY3NkJFOEFGQUJGODgxMiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PgH//v38+/r5+Pf29fTz8vHw7+7t7Ovq6ejn5uXk4+Lh4N/e3dzb2tnY19bV1NPS0dDPzs3My8rJyMfGxcTDwsHAv769vLu6ubi3trW0s7KxsK+urayrqqmop6alpKOioaCfnp2cm5qZmJeWlZSTkpGQj46NjIuKiYiHhoWEg4KBgH9+fXx7enl4d3Z1dHNycXBvbm1sa2ppaGdmZWRjYmFgX15dXFtaWVhXVlVUU1JRUE9OTUxLSklIR0ZFRENCQUA/Pj08Ozo5ODc2NTQzMjEwLy4tLCsqKSgnJiUkIyIhIB8eHRwbGhkYFxYVFBMSERAPDg0MCwoJCAcGBQQDAgEAACH5BAEAAAIALAAAAAASABIAAAIwlI+pywcPm3mhWgkCsjBOvVkimElG9ZlCuYIY6TYs+6bmHDO4igfdD3GNhheV0VQAADs=); -} -.gantt_tree_icon.gantt_file { - background-image: url(data:image/gif;base64,R0lGODlhEgASAJECAJeXl7Gvrf///wAAACH/C1hNUCBEYXRhWE1QPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS4wLWMwNjAgNjEuMTM0Nzc3LCAyMDEwLzAyLzEyLTE3OjMyOjAwICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdFJlZj0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlUmVmIyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M1IFdpbmRvd3MiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NzkxQzI4RjZDMDZEMTFFMTgwRjhBQURDQzI3NDU3QUEiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NzkxQzI4RjdDMDZEMTFFMTgwRjhBQURDQzI3NDU3QUEiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo3OTFDMjhGNEMwNkQxMUUxODBGOEFBRENDMjc0NTdBQSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo3OTFDMjhGNUMwNkQxMUUxODBGOEFBRENDMjc0NTdBQSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PgH//v38+/r5+Pf29fTz8vHw7+7t7Ovq6ejn5uXk4+Lh4N/e3dzb2tnY19bV1NPS0dDPzs3My8rJyMfGxcTDwsHAv769vLu6ubi3trW0s7KxsK+urayrqqmop6alpKOioaCfnp2cm5qZmJeWlZSTkpGQj46NjIuKiYiHhoWEg4KBgH9+fXx7enl4d3Z1dHNycXBvbm1sa2ppaGdmZWRjYmFgX15dXFtaWVhXVlVUU1JRUE9OTUxLSklIR0ZFRENCQUA/Pj08Ozo5ODc2NTQzMjEwLy4tLCsqKSgnJiUkIyIhIB8eHRwbGhkYFxYVFBMSERAPDg0MCwoJCAcGBQQDAgEAACH5BAEAAAIALAAAAAASABIAAAIylI+pwN16QJiUQiFThRlJm3RRFYSlR5qXMKmXaMDuuMoyOi8n/e6xn8NMHETgh5RaKQsAOw==); -} -.gantt_grid_head_cell .gantt_sort { - position: absolute; - right: 5px; - top: 8px; - width: 7px; - height: 13px; - background-repeat: no-repeat; - background-position: center center; -} -.gantt_grid_head_cell .gantt_sort.gantt_asc { - background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAANCAYAAABlyXS1AAAARUlEQVR4nGNgQAKGxib/GbABkIS7b8B/DAUwCRiGK0CXwFBAb1DfP/U/LszwHwi2X7qFgUEArBtdAVwCBmAKMCSQFSDzAWXXaOHsXeqkAAAAAElFTkSuQmCC); -} -.gantt_grid_head_cell .gantt_sort.gantt_desc { - background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAANCAYAAABlyXS1AAAARUlEQVR42mNgQAL1/VP/M2ADIIntF2/9x1AAlrh0C47hCmA60DFYwX88gIFGwNDY5D8uDFbg7hvwHx2jmIBTAlkB0e4BAEjlaNtBWJPnAAAAAElFTkSuQmCC); -} -.gantt_inserted, -.gantt_updated { - font-weight: bold; -} -.gantt_deleted { - text-decoration: line-through; -} -.gantt_invalid { - background-color: FFE0E0; -} -.gantt_error { - color: red; -} -.gantt_status { - right: 1px; - padding: 5px 10px; - background: rgba(155, 155, 155, 0.1); - position: absolute; - top: 1px; - -webkit-transition: opacity 0.2s; - transition: opacity 0.2s; - opacity: 0; -} -.gantt_status.gantt_status_visible { - opacity: 1; -} -#gantt_ajax_dots span { - -webkit-transition: opacity 0.2s; - transition: opacity 0.2s; - background-repeat: no-repeat; - opacity: 0; -} -#gantt_ajax_dots span.gantt_dot_visible { - opacity: 1; -} -.dhtmlx_message_area { - position: fixed; - right: 5px; - width: 250px; - z-index: 1000; -} -.dhtmlx-info { - min-width: 120px; - padding: 4px 4px 4px 20px; - font-family: "Arial"; - z-index: 10000; - margin: 5px; - margin-bottom: 10px; - -webkit-transition: all .5s ease; - -moz-transition: all .5s ease; - -o-transition: all .5s ease; - transition: all .5s ease; -} -.dhtmlx-info.hidden { - height: 0px; - padding: 0px; - border-width: 0px; - margin: 0px; - overflow: hidden; -} -.dhtmlx_modal_box { - overflow: hidden; - display: inline-block; - min-width: 250px; - width: 250px; - text-align: center; - position: fixed; - z-index: 20000; - box-shadow: 3px 3px 3px rgba(0, 0, 0, 0.07); - font-family: "Arial"; - border-radius: 6px; - border: 1px solid #cecece; - background: #ffffff; -} -.dhtmlx_popup_title { - border-top-left-radius: 6px; - border-top-right-radius: 6px; - border-width: 0px; -} -.dhtmlx_button, -.dhtmlx_popup_button { - border: 1px solid #cecece; - height: 30px; - line-height: 30px; - display: inline-block; - margin: 0 5px; - border-radius: 4px; - background: #fff; -} -.dhtmlx-info, -.dhtmlx_popup_button, -.dhtmlx_button { - user-select: none; - -webkit-user-select: none; - -moz-user-select: -moz-none; - cursor: pointer; -} -.dhtmlx_popup_text { - overflow: hidden; -} -.dhtmlx_popup_controls { - border-radius: 6px; - padding: 10px; -} -.dhtmlx_popup_button { - min-width: 100px; -} -div.dhx_modal_cover { - background-color: #000; - cursor: default; - filter: progid:DXImageTransform.Microsoft.Alpha(opacity=20); - opacity: 0.2; - position: fixed; - z-index: 19999; - left: 0px; - top: 0px; - width: 100%; - height: 100%; - border: none; - zoom: 1; -} -.dhtmlx-info img, -.dhtmlx_modal_box img { - float: left; - margin-right: 20px; -} -.dhtmlx-alert-error, -.dhtmlx-confirm-error { - border: 1px solid #ff0000; -} -/*Skin section*/ -.dhtmlx_button input, -.dhtmlx_popup_button div { - border-radius: 4px; - font-size: 14px; - -moz-box-sizing: content-box; - box-sizing: content-box; - padding: 0px; - margin: 0px; - vertical-align: top; -} -.dhtmlx_popup_title { - color: #fff; - text-shadow: 1px 1px #000; - height: 40px; - line-height: 40px; - font-size: 20px; -} -.dhtmlx_popup_text { - margin: 15px 15px 5px 15px; - font-size: 14px; - color: #000; - min-height: 30px; - border-radius: 6px; -} -.dhtmlx-info, -.dhtmlx-error { - font-size: 14px; - color: #000; - box-shadow: 3px 3px 3px rgba(0, 0, 0, 0.07); - padding: 0px; - background-color: #FFF; - border-radius: 3px; - border: 1px solid #ffffff; -} -.dhtmlx-info div { - padding: 5px 10px 5px 10px; - background-color: #fff; - border-radius: 3px; - border: 1px solid #cecece; -} -.dhtmlx-error { - background-color: #d81b1b; - border: 1px solid #ff3c3c; - box-shadow: 3px 3px 3px rgba(0, 0, 0, 0.07); -} -.dhtmlx-error div { - background-color: #d81b1b; - border: 1px solid #940000; - color: #FFF; -} -.gantt_grid div, -.gantt_data_area div { - -ms-touch-action: none; - -webkit-tap-highlight-color: rgba(0, 0, 0, 0); -} -.gantt_data_area { - position: relative; - overflow-x: hidden; - overflow-y: hidden; - -moz-user-select: -moz-none; - -webkit-user-select: none; - -user-select: none; -} -.gantt_links_area { - position: absolute; - left: 0px; - top: 0px; -} -.gantt_task_content, -.gantt_task_progress, -.gantt_side_content { - line-height: inherit; - overflow: hidden; - height: 100%; -} -.gantt_task_content { - font-size: 12px; - color: #ffffff; - width: 100%; - top: 0; - position: absolute; - white-space: nowrap; - text-align: center; -} -.gantt_task_progress { - text-align: center; - z-index: 0; - background: #299cb4; -} -.gantt_task_line { - -webkit-border-radius: 2px; - -moz-border-radius: 2px; - border-radius: 2px; - position: absolute; - -moz-box-sizing: border-box; - box-sizing: border-box; - background-color: #3db9d3; - border: 1px solid #2898b0; - -webkit-user-select: none; - -moz-user-select: none; - -moz-user-select: -moz-none; -} -.gantt_task_line.gantt_drag_move div { - cursor: move; -} -.gantt_touch_move, -.gantt_touch_progress .gantt_touch_resize { - -moz-transform: scale(1.02, 1.1); - -o-transform: scale(1.02, 1.1); - -webkit-transform: scale(1.02, 1.1); - transform: scale(1.02, 1.1); - -moz-transform-origin: 50%; - -o-transform-origin: 50%; - -webkit-transform-origin: 50%; - transform-origin: 50%; -} -.gantt_touch_progress .gantt_task_progress_drag, -.gantt_touch_resize .gantt_task_drag { - -moz-transform: scaleY(1.3); - -o-transform: scaleY(1.3); - -webkit-transform: scaleY(1.3); - transform: scaleY(1.3); - -moz-transform-origin: 50%; - -o-transform-origin: 50%; - -webkit-transform-origin: 50%; - transform-origin: 50%; -} -.gantt_side_content { - position: absolute; - white-space: nowrap; - color: #6e6e6e; - bottom: 7px; - font-size: 11px; -} -.gantt_side_content.gantt_left { - right: 100%; - padding-right: 15px; -} -.gantt_side_content.gantt_right { - left: 100%; - padding-left: 15px; -} -.gantt_side_content.gantt_link_crossing { - bottom: 8.75px; -} -.gantt_task_link .gantt_line_wrapper, -.gantt_link_arrow { - position: absolute; - cursor: pointer; -} -.gantt_line_wrapper div { - background-color: #ffa011; -} -.gantt_task_link:hover .gantt_line_wrapper div { - box-shadow: 0 0 5px 0px #ffa011; -} -.gantt_task_link div.gantt_link_arrow { - background-color: transparent; - border-style: solid; - width: 0px; - height: 0px; -} -.gantt_link_control { - position: absolute; - width: 13px; - top: 0px; -} -.gantt_link_control div { - display: none; - cursor: pointer; - box-sizing: border-box; - position: relative; - top: 50%; - margin-top: -7.5px; - vertical-align: middle; - border: 1px solid #929292; - -webkit-border-radius: 6.5px; - -moz-border-radius: 6.5px; - border-radius: 6.5px; - height: 13px; - width: 13px; - background-color: #f0f0f0; -} -.gantt_link_control div:hover { - background-color: #ffffff; -} -.gantt_link_control.task_left { - left: -13px; -} -.gantt_link_control.task_right { - right: -13px; -} -.gantt_task_line.gantt_selected .gantt_link_control div, -.gantt_task_line:hover .gantt_link_control div { - display: block; -} -.gantt_link_target .gantt_link_control div { - display: block; -} -.gantt_link_source, -.gantt_link_target { - box-shadow: 0px 0px 3px #3db9d3; -} -.gantt_link_target.link_start_allow, -.gantt_link_target.link_finish_allow { - box-shadow: 0px 0px 3px #ffbf5e; -} -.gantt_link_target.link_start_deny, -.gantt_link_target.link_finish_deny { - box-shadow: 0px 0px 3px #e87e7b; -} -.link_start_allow .gantt_link_control.task_left div, -.link_finish_allow .gantt_link_control.task_right div { - background-color: #ffbf5e; - border-color: #ffa011; -} -.link_start_deny .gantt_link_control.task_left div, -.link_finish_deny .gantt_link_control.task_right div { - background-color: #e87e7b; - border-color: #dd3e3a; -} -.gantt_link_arrow_right { - border-width: 4px 0 4px 6px; - border-top-color: transparent !important; - border-right-color: transparent !important; - border-bottom-color: transparent !important; - border-left-color: #ffa011; - margin-top: -1px; -} -.gantt_link_arrow_left { - border-width: 4px 6px 4px 0; - margin-top: -1px; - border-top-color: transparent !important; - border-right-color: #ffa011; - border-bottom-color: transparent !important; - border-left-color: transparent !important; -} -.gantt_link_arrow_top { - border-width: 0 4px 6px 4px; - border-color: transparent transparent #ffa011 transparent; - border-top-color: transparent !important; - border-right-color: transparent !important; - border-bottom-color: #ffa011; - border-left-color: transparent !important; -} -.gantt_link_arrow_down { - border-width: 4px 6px 0 4px; - border-top-color: #ffa011; - border-right-color: transparent !important; - border-bottom-color: transparent !important; - border-left-color: transparent !important; -} -.gantt_task_drag, -.gantt_task_progress_drag { - cursor: w-resize; - height: 100%; - display: none; - position: absolute; -} -.gantt_task_line.gantt_selected .gantt_task_progress_drag, -.gantt_task_line:hover .gantt_task_progress_drag, -.gantt_task_line.gantt_selected .gantt_task_drag, -.gantt_task_line:hover .gantt_task_drag { - display: block; -} -.gantt_task_drag { - width: 6px; - background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAACCAYAAAB7Xa1eAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3QYDDjkw3UJvAwAAABRJREFUCNdj/P//PwM2wASl/6PTAKrrBf4+lD8LAAAAAElFTkSuQmCC); - z-index: 1; - top: 0px; -} -.gantt_task_drag.task_left { - left: 0px; -} -.gantt_task_drag.task_right { - right: 0px; -} -.gantt_task_progress_drag { - height: 8px; - width: 8px; - bottom: -4px; - margin-left: -4px; - background-position: bottom; - background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAALCAYAAAB24g05AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MkY3Rjk0RUVDMkYzMTFFMkI1OThEQTA3ODU0OTkzMEEiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MkY3Rjk0RUZDMkYzMTFFMkI1OThEQTA3ODU0OTkzMEEiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDoyRjdGOTRFQ0MyRjMxMUUyQjU5OERBMDc4NTQ5OTMwQSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDoyRjdGOTRFREMyRjMxMUUyQjU5OERBMDc4NTQ5OTMwQSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PobPBzIAAADkSURBVHjaYpk2bRoDDsAExL1QdjEQ/8OmiAWHZk4gXqymqhQM4ty6fU8OSMUA8XdiDBAB4k0a6iqWRga6EKcwMQXduHlnL5DpB8Rv0J2JDFSA+JiOtgZcMwiA2CAxkBxUDVYDLEAKgIpV9XQ0MZwFEgPJAZnHoWpRDAgC4n2W5saiQKfjClQGkBxQDciL+6B6wAbkA/EqJwdrTkUFOQZCAKQGpBbIXA3SCzJggo+XK7OEuBgDsQCkFqgHrBfsBT5eHgZSAUwP2IBfv36TbABMDygdtK1Zv6UESLORaAbIhG6AAAMAKN8wE24DXWcAAAAASUVORK5CYII=); - background-repeat: no-repeat; - z-index: 2; -} -.gantt_link_tooltip { - box-shadow: 3px 3px 3px #888888; - background-color: #ffffff; - border-left: 1px dotted #cecece; - border-top: 1px dotted #cecece; - font-family: Tahoma; - font-size: 8pt; - color: #444444; - padding: 6px; - line-height: 20px; -} -.gantt_link_direction { - height: 0px; - border: 0px none #ffa011; - border-bottom-style: dashed; - border-bottom-width: 2px; - transform-origin: 0% 0%; - -ms-transform-origin: 0% 0%; - -webkit-transform-origin: 0% 0%; - z-index: 2; - margin-left: 1px; - position: absolute; -} -.gantt_grid_data .gantt_row.gantt_selected, -.gantt_grid_data .gantt_row.odd.gantt_selected { - background-color: #fff3a1; -} -.gantt_task_row.gantt_selected { - background-color: #fff3a1; -} -.gantt_task_row.gantt_selected .gantt_task_cell { - border-right-color: #ffec6e; -} -.gantt_task_line.gantt_selected { - box-shadow: 0 0 5px #299cb4; -} -.gantt_task_line.gantt_project.gantt_selected { - box-shadow: 0 0 5px #46ad51; -} -.gantt_task_line.gantt_milestone { - visibility: hidden; - background-color: #d33daf; - border: 0px solid #61164f; - box-sizing: content-box; - -moz-box-sizing: content-box; -} -.gantt_task_line.gantt_milestone div { - visibility: visible; -} -.gantt_task_line.gantt_milestone .gantt_task_content { - background: inherit; - border: inherit; - border-width: 1px; - border-radius: inherit; - box-sizing: border-box; - -moz-box-sizing: border-box; - -webkit-transform: rotate(45deg); - -moz-transform: rotate(45deg); - -ms-transform: rotate(45deg); - -o-transform: rotate(45deg); - transform: rotate(45deg); -} -.gantt_task_line.gantt_task_inline_color { - border-color: #999999; -} -.gantt_task_line.gantt_task_inline_color .gantt_task_progress { - background-color: #363636; - opacity: 0.2; -} -.gantt_task_line.gantt_task_inline_color.gantt_selected { - box-shadow: 0 0 5px #999999; -} -.gantt_task_line.gantt_task_inline_color.gantt_project.gantt_selected { - box-shadow: 0 0 5px #999999; -} -.gantt_task_link.gantt_link_inline_color:hover .gantt_line_wrapper div { - box-shadow: 0 0 5px 0px #999999; -} -.gantt_critical_task { - background-color: #e63030; - border-color: #9d3a3a; -} -.gantt_critical_task .gantt_task_progress { - background-color: rgba(0, 0, 0, 0.4); -} -.gantt_critical_link .gantt_line_wrapper > div { - background-color: #e63030; -} -.gantt_critical_link .gantt_link_arrow { - border-color: #e63030; -} -.gantt_unselectable, -.gantt_unselectable div { - -webkit-user-select: none; - -moz-user-select: none; - -moz-user-select: -moz-none; -} -.gantt_cal_light { - -webkit-tap-highlight-color: transparent; - background: #fff; - border-radius: 6px; - font-family: "Arial"; - font-size: 13px; - border: 1px solid #cecece; - color: #6b6b6b; - font-size: 12px; - position: absolute; - z-index: 10001; - width: 550px; - height: 250px; - box-shadow: 3px 3px 3px rgba(0, 0, 0, 0.07); -} -.gantt_cal_light_wide { - width: 650px; -} -.gantt_cal_light select { - font-family: "Arial"; - border: 1px solid #cecece; - font-size: 13px; - padding: 2px; - margin: 0px; -} -.gantt_cal_ltitle { - padding: 7px 10px; - overflow: hidden; - white-space: nowrap; - -webkit-border-top-left-radius: 6px; - -webkit-border-bottom-left-radius: 0; - -webkit-border-top-right-radius: 6px; - -webkit-border-bottom-right-radius: 0; - -moz-border-radius-topleft: 6px; - -moz-border-radius-bottomleft: 0; - -moz-border-radius-topright: 6px; - -moz-border-radius-bottomright: 0; - border-top-left-radius: 6px; - border-bottom-left-radius: 0; - border-top-right-radius: 6px; - border-bottom-right-radius: 0; -} -.gantt_cal_ltitle span { - white-space: nowrap; -} -.gantt_cal_lsection { - color: #727272; - font-weight: bold; - padding: 12px 0px 5px 10px; -} -.gantt_cal_lsection .gantt_fullday { - float: right; - margin-right: 5px; - font-size: 12px; - font-weight: normal; - line-height: 20px; - vertical-align: top; - cursor: pointer; -} -.gantt_cal_lsection { - font-size: 13px; -} -.gantt_cal_ltext { - padding: 2px 10px; - overflow: hidden; -} -.gantt_cal_ltext textarea { - overflow: auto; - font-family: "Arial"; - font-size: 13px; - -moz-box-sizing: border-box; - -webkit-box-sizing: border-box; - box-sizing: border-box; - border: 1px solid #cecece; - height: 100%; - width: 100%; - outline: none !important; - resize: none; -} -.gantt_time { - font-weight: bold; -} -.gantt_cal_light .gantt_title { - padding-left: 10px; -} -.gantt_cal_larea { - border: 1px solid #cecece; - border-left: none; - border-right: none; - background-color: #fff; - overflow: hidden; - height: 1px; -} -.gantt_btn_set { - margin: 10px 7px 5px 10px; - padding: 5px 15px 5px 10px; - float: left; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - border-width: 0; - border-color: #cecece; - border-style: solid; - height: 32px; - font-weight: bold; - background: #fff; - -moz-box-sizing: border-box; - -webkit-box-sizing: border-box; - box-sizing: border-box; - cursor: pointer; -} -.gantt_btn_set div { - float: left; - font-size: 13px; - height: 22px; - line-height: 22px; - background-repeat: no-repeat; - vertical-align: middle; -} -.gantt_save_btn { - background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MTk1OUU5RDFDMzA0MTFFMkExMUZBQTdDNDAzOUE5RjMiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MTk1OUU5RDJDMzA0MTFFMkExMUZBQTdDNDAzOUE5RjMiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDoxOTU5RTlDRkMzMDQxMUUyQTExRkFBN0M0MDM5QTlGMyIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDoxOTU5RTlEMEMzMDQxMUUyQTExRkFBN0M0MDM5QTlGMyIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PjDroXYAAAEXSURBVHjaYvz//z8DJYCRUgPIAUxAbAnEHiAHMIBcQCwGaRYXF3e6evXqoffv39/dv38/CymaGSUkJBzv3LlzCsj///fv3wdAihkkIQnEvkAshU8zLy+v7a1bt06ANP/79+87kDIAy505cybq06dPr3p7ezuwGQLTfOPGjWP/ESAZLg8kPKBO+g01RBJNszWyZqC6uSgWgIg/f/4shxnS2dnZBjMEqNkSFGBImi8CKTYMA4BYCGjIczRDHC5dunQQSfN7IKWI4UUkjjdMMdCwnw8ePLjwHxV4Yw1gZA5Q47z/2EELzhhCE+ABGvIQWSeQvwcU38QaAML2wHj+C/X3MyAlijeB4ZBoBOIPQGxJKIVSnBsBAgwABddBclWfcZUAAAAASUVORK5CYII=); - margin-top: 2px; - width: 21px; -} -.gantt_cancel_btn { - margin-top: 2px; - background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MDkzMDA3MzlDMzA0MTFFMjg2QTVFMzFEQzgwRkJERDYiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MDkzMDA3M0FDMzA0MTFFMjg2QTVFMzFEQzgwRkJERDYiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDowOTMwMDczN0MzMDQxMUUyODZBNUUzMURDODBGQkRENiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDowOTMwMDczOEMzMDQxMUUyODZBNUUzMURDODBGQkRENiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PmYuYOUAAAEdSURBVHjaYvz//z8DJYAFXWDlypU8QKoIiD2A2AwqfAqIdwBxX3h4+Bdk9YzILgBqtgdS84FYEYeF94E4EWjIQZgAE5LmQCB1AKoZZKMPEAtAMYh9GSp3AKjWD8UFQAEhIPshEIOc3wHENUBb/qJ57SyQMoJyPwKxElDNO1gYFEE17wMKVmIJlzNQzeegrjaA6qmBecEbSvfh0GwMxGeBhoPoemQ9MAO0kEIbl2YTqPAFKK2IbMB3AjabYIkRZmQD7kNpMyI0G0PpO8gGbIUFJj7NQDk2INWIrIcJKfBAKcwJqvkcDs0TgFgXGo19KCkRmpDWQdWDEk0NUoCBoq0FqhkE/IEWbKJKUmZEz43QzFSKIzN1481M5ACAAAMAlfl/lCwRpagAAAAASUVORK5CYII=); - width: 20px; -} -.gantt_delete_btn { - background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MjFENzI3NUNDMzA0MTFFMjhBNjJGQTc3MUIyQzYzNEYiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MjFENzI3NURDMzA0MTFFMjhBNjJGQTc3MUIyQzYzNEYiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDoyMUQ3Mjc1QUMzMDQxMUUyOEE2MkZBNzcxQjJDNjM0RiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDoyMUQ3Mjc1QkMzMDQxMUUyOEE2MkZBNzcxQjJDNjM0RiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PmUD0gAAAABvSURBVHjaYvz//z8DIyMjAxYQicReji4J0ofKQNP8HwmgGQbXB8IsWGwDSSwDuioKjY9uBthVjFAXYHUGAQA2kYmBUoAUBpGk0LAwgBvwH+YX4mkwptgLowYMRgOITUyYKRFIN/wnDjQgJySAAAMApryKzL8wjfUAAAAASUVORK5CYII=); - margin-top: 2px; - width: 20px; -} -.gantt_cal_cover { - width: 100%; - height: 100%; - position: absolute; - z-index: 10000; - top: 0px; - left: 0px; - background-color: black; - opacity: 0.1; - filter: progid:DXImageTransform.Microsoft.Alpha(opacity=10); -} -.gantt_custom_button { - padding: 0px 3px 0px 3px; - font-family: "Arial"; - font-size: 13px; - font-weight: normal; - margin-right: 10px; - margin-top: -5px; - cursor: pointer; - float: right; - height: 21px; - width: 90px; - border: 1px solid #CECECE; - text-align: center; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - -ms-border-radius: 4px; - -o-border-radius: 4px; - border-radius: 4px; -} -.gantt_custom_button div { - cursor: pointer; - float: none; - height: 21px; - line-height: 21px; - vertical-align: middle; -} -.gantt_custom_button div:first-child { - display: none; -} -.gantt_cal_light_wide { - width: 580px; - padding: 2px 4px; -} -.gantt_cal_light_wide .gantt_cal_larea { - -moz-box-sizing: border-box; - -webkit-box-sizing: border-box; - box-sizing: border-box; - border: 1px solid #cecece; -} -.gantt_cal_light_wide .gantt_cal_lsection { - border: 0px; - float: left; - text-align: right; - width: 80px; - height: 20px; - padding: 5px 10px 0px 0px; -} -.gantt_cal_light_wide .gantt_wrap_section { - position: relative; - padding: 10px 0; - overflow: hidden; - border-bottom: 1px solid #ebebeb; -} -.gantt_cal_light_wide .gantt_section_time { - overflow: hidden; - padding-top: 2px !important; - padding-right: 0px; - height: 20px !important; -} -.gantt_cal_light_wide .gantt_cal_ltext { - padding-right: 0px; -} -.gantt_cal_light_wide .gantt_cal_larea { - padding: 0 10px; - width: 100%; -} -.gantt_cal_light_wide .gantt_section_time { - background: transparent; -} -.gantt_cal_light_wide .gantt_cal_checkbox label { - padding-left: 0px; -} -.gantt_cal_light_wide .gantt_cal_lsection .gantt_fullday { - float: none; - margin-right: 0px; - font-weight: bold; - cursor: pointer; -} -.gantt_cal_light_wide .gantt_custom_button { - position: absolute; - top: 0; - right: 0; - margin-top: 2px; -} -.gantt_cal_light_wide .gantt_repeat_right { - margin-right: 55px; -} -.gantt_cal_light_wide.gantt_cal_light_full { - width: 738px; -} -.gantt_cal_wide_checkbox input { - margin-top: 8px; - margin-left: 14px; -} -.gantt_cal_light input { - font-size: 13px; -} -.gantt_section_time { - background-color: white; - white-space: nowrap; - padding: 2px 10px 5px; - padding-top: 2px !important; -} -.gantt_section_time .gantt_time_selects { - float: left; - height: 25px; -} -.gantt_section_time .gantt_time_selects select { - height: 23px; - padding: 2px; - border: 1px solid #cecece; -} -.gantt_duration { - width: 100px; - height: 23px; - float: left; - white-space: nowrap; - margin-left: 20px; - line-height: 23px; -} -.gantt_duration .gantt_duration_value, -.gantt_duration .gantt_duration_dec, -.gantt_duration .gantt_duration_inc { - -moz-box-sizing: border-box; - -webkit-box-sizing: border-box; - box-sizing: border-box; - text-align: center; - vertical-align: top; - height: 100%; - border: 1px solid #cecece; -} -.gantt_duration .gantt_duration_value { - width: 40px; - padding: 3px 4px; - border-left-width: 0; - border-right-width: 0; -} -.gantt_duration .gantt_duration_dec, -.gantt_duration .gantt_duration_inc { - width: 20px; - padding: 1px; - padding-bottom: 3px; - background: #fff; -} -.gantt_duration .gantt_duration_dec { - -moz-border-top-left-radius: 4px; - -moz-border-bottom-left-radius: 4px; - -webkit-border-top-left-radius: 4px; - -webkit-border-bottom-left-radius: 4px; - border-top-left-radius: 4px; - border-bottom-left-radius: 4px; -} -.gantt_duration .gantt_duration_inc { - margin-right: 4px; - -moz-border-top-right-radius: 4px; - -moz-border-bottom-right-radius: 4px; - -webkit-border-top-right-radius: 4px; - -webkit-border-bottom-right-radius: 4px; - border-top-right-radius: 4px; - border-bottom-right-radius: 4px; -} -/* Quick info */ -.gantt_cal_quick_info { - border: 1px solid #cecece; - border-radius: 6px; - position: absolute; - z-index: 300; - box-shadow: 3px 3px 3px rgba(0, 0, 0, 0.07); - background-color: #ffffff; - width: 300px; - transition: left 0.5s ease, right 0.5s; - -moz-transition: left 0.5s ease, right 0.5s; - -webkit-transition: left 0.5s ease, right 0.5s; - -o-transition: left 0.5s ease, right 0.5s; -} -.gantt_no_animate { - transition: none; - -moz-transition: none; - -webkit-transition: none; - -o-transition: none; -} -.gantt_cal_quick_info.gantt_qi_left .gantt_qi_big_icon { - float: right; -} -.gantt_cal_qi_title { - -webkit-border-top-left-radius: 6px; - -webkit-border-bottom-left-radius: 0; - -webkit-border-top-right-radius: 6px; - -webkit-border-bottom-right-radius: 0; - -moz-border-radius-topleft: 6px; - -moz-border-radius-bottomleft: 0; - -moz-border-radius-topright: 6px; - -moz-border-radius-bottomright: 0; - border-top-left-radius: 6px; - border-bottom-left-radius: 0; - border-top-right-radius: 6px; - border-bottom-right-radius: 0; - padding: 5px 0px 8px 12px; - color: #454545; - background-color: #fff; - border-bottom: 1px solid #cecece; -} -.gantt_cal_qi_tdate { - font-size: 14px; - font-weight: bold; -} -.gantt_cal_qi_tcontent { - font-size: 13px; -} -.gantt_cal_qi_content { - padding: 16px 8px; - font-size: 13px; - color: #454545; - overflow: hidden; -} -.gantt_cal_qi_controls { - -webkit-border-top-left-radius: 0; - -webkit-border-bottom-left-radius: 6px; - -webkit-border-top-right-radius: 0; - -webkit-border-bottom-right-radius: 6px; - -moz-border-radius-topleft: 0; - -moz-border-radius-bottomleft: 6px; - -moz-border-radius-topright: 0; - -moz-border-radius-bottomright: 6px; - border-top-left-radius: 0; - border-bottom-left-radius: 6px; - border-top-right-radius: 0; - border-bottom-right-radius: 6px; - padding-left: 7px; -} -.gantt_cal_qi_controls .gantt_menu_icon { - margin-top: 6px; - background-repeat: no-repeat; -} -.gantt_cal_qi_controls .gantt_menu_icon.icon_edit { - width: 20px; - background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH3QYFCjI5ZQj5bAAAAFNJREFUOMvt0zEOACAIA0DkwTymH8bJTRTKZGJXyaWEKPKTCQAH4Ls37cItcDUzsxHNDLZNhCq7Gt1wh9ErV7EjyGAhyGLphlnsClWuS32rn0czAV+vNGrM/LBtAAAAAElFTkSuQmCC); -} -.gantt_cal_qi_controls .gantt_menu_icon.icon_delete { - width: 20px; - background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MjFENzI3NUNDMzA0MTFFMjhBNjJGQTc3MUIyQzYzNEYiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MjFENzI3NURDMzA0MTFFMjhBNjJGQTc3MUIyQzYzNEYiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDoyMUQ3Mjc1QUMzMDQxMUUyOEE2MkZBNzcxQjJDNjM0RiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDoyMUQ3Mjc1QkMzMDQxMUUyOEE2MkZBNzcxQjJDNjM0RiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PmUD0gAAAABvSURBVHjaYvz//z8DIyMjAxYQicReji4J0ofKQNP8HwmgGQbXB8IsWGwDSSwDuioKjY9uBthVjFAXYHUGAQA2kYmBUoAUBpGk0LAwgBvwH+YX4mkwptgLowYMRgOITUyYKRFIN/wnDjQgJySAAAMApryKzL8wjfUAAAAASUVORK5CYII=); -} -.gantt_qi_big_icon { - font-size: 13px; - border-radius: 4px; - font-weight: bold; - background: #fff; - margin: 5px 9px 8px 0px; - min-width: 60px; - line-height: 32px; - vertical-align: middle; - padding: 0px 10px 0px 5px; - cursor: pointer; - border: 1px solid #cecece; -} -.gantt_cal_qi_controls div { - float: left; - height: 32px; - text-align: center; - line-height: 32px; -} -.gantt_tooltip { - box-shadow: 3px 3px 3px rgba(0, 0, 0, 0.07); - background-color: white; - border-left: 1px solid rgba(0, 0, 0, 0.07); - border-top: 1px solid rgba(0, 0, 0, 0.07); - font-family: "Arial"; - font-size: 8pt; - color: #454545; - padding: 10px; - position: absolute; - z-index: 50; -} -.gantt_marker { - height: 100%; - width: 2px; - top: 0; - position: absolute; - text-align: center; - background-color: rgba(255, 0, 0, 0.4); - -moz-box-sizing: border-box; - -webkit-box-sizing: border-box; - box-sizing: border-box; -} -.gantt_marker .gantt_marker_content { - padding: 5px; - background: inherit; - color: white; - position: absolute; - font-size: 12px; - line-height: 12px; - opacity: 0.8; -} -.gantt_marker_area { - position: absolute; - top: 0; - left: 0; -} -.gantt_noselect { - -moz-user-select: -moz-none; - -webkit-user-select: none; - -user-select: none; -} -.gantt_drag_marker { - position: absolute; - font-family: "Arial"; - font-size: 13px; -} -.gantt_drag_marker .gantt_tree_indent, -.gantt_drag_marker .gantt_tree_icon.gantt_blank, -.gantt_drag_marker .gantt_tree_icon.gantt_open, -.gantt_drag_marker .gantt_tree_icon.gantt_close { - display: none; -} -.gantt_drag_marker, -.gantt_drag_marker .gantt_row.odd { - background-color: #ffffff; -} -.gantt_drag_marker .gantt_row { - border-left: 1px solid #d2d2d2; - border-top: 1px solid #d2d2d2; -} -.gantt_drag_marker .gantt_cell { - border-color: #d2d2d2; -} -.gantt_row.gantt_over, -.gantt_task_row.gantt_over { - background-color: #0070fe; -} -.gantt_row.gantt_transparent .gantt_cell { - opacity: 0.7; -} -.gantt_task_row.gantt_transparent { - background-color: #f8fdfd; -} -.dhtmlx_popup_button.dhtmlx_delete_button { - background: #3db9d3; - text-shadow: 0 -1px 0 #248a9f; - color: #fff; - font-weight: bold; - border-width: 0; -}