From e8e32f7a1194baabd6e158805f40396c667e6c56 Mon Sep 17 00:00:00 2001 From: Unrud Date: Fri, 10 Mar 2017 23:02:35 +0100 Subject: Add InfCloud --- radicale_web/web/infcloud/.htaccess | 35 + radicale_web/web/infcloud/addressbook.js | 1714 ++ radicale_web/web/infcloud/auth/.htaccess | 24 + radicale_web/web/infcloud/auth/common.inc | 41 + radicale_web/web/infcloud/auth/config.inc | 58 + radicale_web/web/infcloud/auth/cross_domain.inc | 14 + .../infcloud/auth/doc/example_config_response.xml | 88 + radicale_web/web/infcloud/auth/doc/readme.txt | 7 + radicale_web/web/infcloud/auth/index.php | 33 + radicale_web/web/infcloud/auth/plugins/generic.inc | 58 + .../web/infcloud/auth/plugins/generic_conf.inc | 12 + radicale_web/web/infcloud/auth/plugins/ldap.inc | 37 + .../web/infcloud/auth/plugins/ldap_conf.inc | 12 + radicale_web/web/infcloud/cache.manifest | 167 + radicale_web/web/infcloud/cache_handler.js | 79 + radicale_web/web/infcloud/cache_update.sh | 5 + radicale_web/web/infcloud/changelog.txt | 17 + radicale_web/web/infcloud/changelog_caldavzap.txt | 294 + .../web/infcloud/changelog_carddavmate.txt | 503 + radicale_web/web/infcloud/common.js | 2136 ++ radicale_web/web/infcloud/config.js | 1440 + radicale_web/web/infcloud/css/default.css | 3632 +++ radicale_web/web/infcloud/css/default_ie.css | 81 + .../web/infcloud/css/default_integration.css | 180 + radicale_web/web/infcloud/css/fullcalendar.css | 1464 + radicale_web/web/infcloud/css/jquery-ui.custom.css | 203 + radicale_web/web/infcloud/css/jquery.tagsinput.css | 14 + radicale_web/web/infcloud/css/spectrum.custom.css | 553 + radicale_web/web/infcloud/data_process.js | 7792 ++++++ .../web/infcloud/fonts/Roboto-Bold-webfont.eot | Bin 0 -> 80347 bytes .../web/infcloud/fonts/Roboto-Bold-webfont.svg | 7496 +++++ .../web/infcloud/fonts/Roboto-Bold-webfont.ttf | Bin 0 -> 233632 bytes .../web/infcloud/fonts/Roboto-Bold-webfont.woff | Bin 0 -> 106512 bytes .../infcloud/fonts/Roboto-BoldItalic-webfont.eot | Bin 0 -> 91716 bytes .../infcloud/fonts/Roboto-BoldItalic-webfont.svg | 8652 ++++++ .../infcloud/fonts/Roboto-BoldItalic-webfont.ttf | Bin 0 -> 280136 bytes .../infcloud/fonts/Roboto-BoldItalic-webfont.woff | Bin 0 -> 120664 bytes .../web/infcloud/fonts/Roboto-Italic-webfont.eot | Bin 0 -> 91372 bytes .../web/infcloud/fonts/Roboto-Italic-webfont.svg | 8164 ++++++ .../web/infcloud/fonts/Roboto-Italic-webfont.ttf | Bin 0 -> 281700 bytes .../web/infcloud/fonts/Roboto-Italic-webfont.woff | Bin 0 -> 120260 bytes .../web/infcloud/fonts/Roboto-Light-webfont.eot | Bin 0 -> 79718 bytes .../web/infcloud/fonts/Roboto-Light-webfont.svg | 8162 ++++++ .../web/infcloud/fonts/Roboto-Light-webfont.ttf | Bin 0 -> 239772 bytes .../web/infcloud/fonts/Roboto-Light-webfont.woff | Bin 0 -> 105544 bytes .../infcloud/fonts/Roboto-LightItalic-webfont.eot | Bin 0 -> 92934 bytes .../infcloud/fonts/Roboto-LightItalic-webfont.svg | 8162 ++++++ .../infcloud/fonts/Roboto-LightItalic-webfont.ttf | Bin 0 -> 294168 bytes .../infcloud/fonts/Roboto-LightItalic-webfont.woff | Bin 0 -> 123428 bytes .../web/infcloud/fonts/Roboto-Medium-webfont.eot | Bin 0 -> 81472 bytes .../web/infcloud/fonts/Roboto-Medium-webfont.svg | 7496 +++++ .../web/infcloud/fonts/Roboto-Medium-webfont.ttf | Bin 0 -> 235252 bytes .../web/infcloud/fonts/Roboto-Medium-webfont.woff | Bin 0 -> 107504 bytes .../infcloud/fonts/Roboto-MediumItalic-webfont.eot | Bin 0 -> 93106 bytes .../infcloud/fonts/Roboto-MediumItalic-webfont.svg | 8652 ++++++ .../infcloud/fonts/Roboto-MediumItalic-webfont.ttf | Bin 0 -> 284196 bytes .../fonts/Roboto-MediumItalic-webfont.woff | Bin 0 -> 121828 bytes .../web/infcloud/fonts/Roboto-Regular-webfont.eot | Bin 0 -> 79547 bytes .../web/infcloud/fonts/Roboto-Regular-webfont.svg | 7606 ++++++ .../web/infcloud/fonts/Roboto-Regular-webfont.ttf | Bin 0 -> 234464 bytes .../web/infcloud/fonts/Roboto-Regular-webfont.woff | Bin 0 -> 105700 bytes radicale_web/web/infcloud/fonts/license.txt | 202 + radicale_web/web/infcloud/forms.js | 3307 +++ radicale_web/web/infcloud/images/add_cal.svg | 14 + radicale_web/web/infcloud/images/add_cal_white.svg | 14 + radicale_web/web/infcloud/images/arrow.svg | 14 + radicale_web/web/infcloud/images/arrow_next.svg | 9 + .../web/infcloud/images/arrow_next_red.svg | 9 + radicale_web/web/infcloud/images/arrow_prev.svg | 9 + .../web/infcloud/images/arrow_prev_red.svg | 9 + .../web/infcloud/images/banner_addressbook.svg | 33 + .../web/infcloud/images/banner_calendar.svg | 26 + radicale_web/web/infcloud/images/banner_logout.svg | 12 + .../web/infcloud/images/banner_refresh.svg | 55 + radicale_web/web/infcloud/images/banner_todo.svg | 21 + radicale_web/web/infcloud/images/calendarB.svg | 20 + radicale_web/web/infcloud/images/cdm_logo.svg | 36 + radicale_web/web/infcloud/images/cdz_logo.svg | 49 + radicale_web/web/infcloud/images/cloud.svg | 22 + radicale_web/web/infcloud/images/company.svg | 45 + radicale_web/web/infcloud/images/company_s_b.svg | 19 + radicale_web/web/infcloud/images/company_s_w.svg | 19 + radicale_web/web/infcloud/images/delegation.svg | 11 + radicale_web/web/infcloud/images/dp_left.svg | 14 + radicale_web/web/infcloud/images/dp_right.svg | 14 + radicale_web/web/infcloud/images/drag.svg | 32 + radicale_web/web/infcloud/images/error_b.svg | 18 + radicale_web/web/infcloud/images/error_badge.svg | 9 + radicale_web/web/infcloud/images/error_w.svg | 18 + radicale_web/web/infcloud/images/in_progress_b.svg | 19 + .../web/infcloud/images/in_progress_dr.svg | 19 + radicale_web/web/infcloud/images/in_progress_r.svg | 19 + radicale_web/web/infcloud/images/in_progress_w.svg | 19 + radicale_web/web/infcloud/images/infcloud_logo.svg | 69 + .../web/infcloud/images/jumper_bottom_b.svg | 14 + .../web/infcloud/images/jumper_bottom_w.svg | 13 + radicale_web/web/infcloud/images/jumper_top_b.svg | 14 + radicale_web/web/infcloud/images/jumper_top_w.svg | 13 + radicale_web/web/infcloud/images/loadinfo.gif | Bin 0 -> 6462 bytes radicale_web/web/infcloud/images/loadinfo_s1.gif | Bin 0 -> 1985 bytes radicale_web/web/infcloud/images/loadinfo_s2.gif | Bin 0 -> 1987 bytes radicale_web/web/infcloud/images/loadinfo_s3.gif | Bin 0 -> 1992 bytes radicale_web/web/infcloud/images/loadinfo_s4.gif | Bin 0 -> 1981 bytes radicale_web/web/infcloud/images/login.svg | 11 + radicale_web/web/infcloud/images/logout.svg | 13 + .../web/infcloud/images/needs_action_b.svg | 21 + .../web/infcloud/images/needs_action_dr.svg | 21 + .../web/infcloud/images/needs_action_r.svg | 21 + .../web/infcloud/images/needs_action_w.svg | 21 + radicale_web/web/infcloud/images/new_item.svg | 15 + radicale_web/web/infcloud/images/op_add.svg | 15 + radicale_web/web/infcloud/images/op_del.svg | 14 + radicale_web/web/infcloud/images/popupArrow.svg | 32 + radicale_web/web/infcloud/images/priority-1-dr.svg | 31 + radicale_web/web/infcloud/images/priority-1-r.svg | 10 + radicale_web/web/infcloud/images/priority-1-w.svg | 10 + radicale_web/web/infcloud/images/priority-1.svg | 10 + radicale_web/web/infcloud/images/priority-2-dr.svg | 43 + radicale_web/web/infcloud/images/priority-2-r.svg | 12 + radicale_web/web/infcloud/images/priority-2-w.svg | 12 + radicale_web/web/infcloud/images/priority-2.svg | 12 + radicale_web/web/infcloud/images/priority-3-dr.svg | 55 + radicale_web/web/infcloud/images/priority-3-r.svg | 14 + radicale_web/web/infcloud/images/priority-3-w.svg | 14 + radicale_web/web/infcloud/images/priority-3.svg | 14 + radicale_web/web/infcloud/images/read_only_b.svg | 15 + radicale_web/web/infcloud/images/read_only_w.svg | 15 + radicale_web/web/infcloud/images/remove_cal.svg | 13 + .../web/infcloud/images/remove_cal_white.svg | 13 + radicale_web/web/infcloud/images/reset_b.svg | 15 + radicale_web/web/infcloud/images/reset_dr.svg | 15 + radicale_web/web/infcloud/images/reset_drw.svg | 15 + radicale_web/web/infcloud/images/reset_r.svg | 15 + radicale_web/web/infcloud/images/reset_rw.svg | 15 + radicale_web/web/infcloud/images/reset_w.svg | 15 + .../web/infcloud/images/resource_arrow_down.svg | 37 + .../web/infcloud/images/resource_arrow_right.svg | 33 + .../web/infcloud/images/resource_arrow_up.svg | 37 + radicale_web/web/infcloud/images/resources.svg | 12 + radicale_web/web/infcloud/images/search.svg | 9 + .../web/infcloud/images/searchWhiteNew.svg | 11 + radicale_web/web/infcloud/images/select.svg | 15 + radicale_web/web/infcloud/images/select_bg.svg | 13 + .../web/infcloud/images/select_bg_black.svg | 13 + radicale_web/web/infcloud/images/select_bg_dis.svg | 13 + radicale_web/web/infcloud/images/select_black.svg | 15 + radicale_web/web/infcloud/images/select_dis.svg | 13 + radicale_web/web/infcloud/images/select_inv.svg | 15 + radicale_web/web/infcloud/images/select_login.svg | 13 + radicale_web/web/infcloud/images/success_b.svg | 21 + radicale_web/web/infcloud/images/success_dr.svg | 21 + radicale_web/web/infcloud/images/success_drw.svg | 21 + radicale_web/web/infcloud/images/success_r.svg | 21 + radicale_web/web/infcloud/images/success_rw.svg | 21 + radicale_web/web/infcloud/images/success_w.svg | 21 + radicale_web/web/infcloud/images/todoB.svg | 15 + radicale_web/web/infcloud/images/user.svg | 24 + radicale_web/web/infcloud/index.html | 1658 ++ radicale_web/web/infcloud/interface.js | 7196 +++++ radicale_web/web/infcloud/lib/fullcalendar.js | 7196 +++++ radicale_web/web/infcloud/lib/ie_base64.js | 176 + radicale_web/web/infcloud/lib/jquery-2.1.4.min.js | 4 + .../web/infcloud/lib/jquery-ui-1.11.4.custom.js | 8226 ++++++ radicale_web/web/infcloud/lib/jquery.autosize.js | 258 + radicale_web/web/infcloud/lib/jquery.browser.js | 43 + .../web/infcloud/lib/jquery.placeholder-1.1.9.js | 195 + .../web/infcloud/lib/jquery.quicksearch.js | 205 + radicale_web/web/infcloud/lib/jquery.tagsinput.js | 436 + radicale_web/web/infcloud/lib/jshash-2.2_sha256.js | 337 + radicale_web/web/infcloud/lib/rrule.js | 1910 ++ radicale_web/web/infcloud/lib/spectrum.js | 2027 ++ radicale_web/web/infcloud/license.txt | 661 + radicale_web/web/infcloud/localization.js | 10673 ++++++++ radicale_web/web/infcloud/main.js | 2331 ++ .../web/infcloud/misc/baikal-flat-0.2.7.diff | 35 + radicale_web/web/infcloud/misc/calendarserver.diff | 70 + radicale_web/web/infcloud/misc/config_davical.txt | 24 + .../web/infcloud/misc/readme_baikal_sabredav.txt | 41 + radicale_web/web/infcloud/misc/readme_osx.txt | 40 + radicale_web/web/infcloud/readme.txt | 132 + radicale_web/web/infcloud/resource.js | 1449 + radicale_web/web/infcloud/timezones.js | 27081 +++++++++++++++++++ radicale_web/web/infcloud/vcalendar.js | 353 + radicale_web/web/infcloud/vcalendar_rfc_regex.js | 538 + radicale_web/web/infcloud/vcard_rfc_regex.js | 288 + radicale_web/web/infcloud/vtodo.js | 3531 +++ radicale_web/web/infcloud/webdav_protocol.js | 4948 ++++ 187 files changed, 172385 insertions(+) create mode 100644 radicale_web/web/infcloud/.htaccess create mode 100644 radicale_web/web/infcloud/addressbook.js create mode 100644 radicale_web/web/infcloud/auth/.htaccess create mode 100644 radicale_web/web/infcloud/auth/common.inc create mode 100644 radicale_web/web/infcloud/auth/config.inc create mode 100644 radicale_web/web/infcloud/auth/cross_domain.inc create mode 100644 radicale_web/web/infcloud/auth/doc/example_config_response.xml create mode 100644 radicale_web/web/infcloud/auth/doc/readme.txt create mode 100644 radicale_web/web/infcloud/auth/index.php create mode 100644 radicale_web/web/infcloud/auth/plugins/generic.inc create mode 100644 radicale_web/web/infcloud/auth/plugins/generic_conf.inc create mode 100644 radicale_web/web/infcloud/auth/plugins/ldap.inc create mode 100644 radicale_web/web/infcloud/auth/plugins/ldap_conf.inc create mode 100644 radicale_web/web/infcloud/cache.manifest create mode 100644 radicale_web/web/infcloud/cache_handler.js create mode 100755 radicale_web/web/infcloud/cache_update.sh create mode 100644 radicale_web/web/infcloud/changelog.txt create mode 100644 radicale_web/web/infcloud/changelog_caldavzap.txt create mode 100644 radicale_web/web/infcloud/changelog_carddavmate.txt create mode 100644 radicale_web/web/infcloud/common.js create mode 100644 radicale_web/web/infcloud/config.js create mode 100644 radicale_web/web/infcloud/css/default.css create mode 100644 radicale_web/web/infcloud/css/default_ie.css create mode 100644 radicale_web/web/infcloud/css/default_integration.css create mode 100644 radicale_web/web/infcloud/css/fullcalendar.css create mode 100644 radicale_web/web/infcloud/css/jquery-ui.custom.css create mode 100644 radicale_web/web/infcloud/css/jquery.tagsinput.css create mode 100644 radicale_web/web/infcloud/css/spectrum.custom.css create mode 100644 radicale_web/web/infcloud/data_process.js create mode 100644 radicale_web/web/infcloud/fonts/Roboto-Bold-webfont.eot create mode 100644 radicale_web/web/infcloud/fonts/Roboto-Bold-webfont.svg create mode 100644 radicale_web/web/infcloud/fonts/Roboto-Bold-webfont.ttf create mode 100644 radicale_web/web/infcloud/fonts/Roboto-Bold-webfont.woff create mode 100644 radicale_web/web/infcloud/fonts/Roboto-BoldItalic-webfont.eot create mode 100644 radicale_web/web/infcloud/fonts/Roboto-BoldItalic-webfont.svg create mode 100644 radicale_web/web/infcloud/fonts/Roboto-BoldItalic-webfont.ttf create mode 100644 radicale_web/web/infcloud/fonts/Roboto-BoldItalic-webfont.woff create mode 100644 radicale_web/web/infcloud/fonts/Roboto-Italic-webfont.eot create mode 100644 radicale_web/web/infcloud/fonts/Roboto-Italic-webfont.svg create mode 100644 radicale_web/web/infcloud/fonts/Roboto-Italic-webfont.ttf create mode 100644 radicale_web/web/infcloud/fonts/Roboto-Italic-webfont.woff create mode 100644 radicale_web/web/infcloud/fonts/Roboto-Light-webfont.eot create mode 100644 radicale_web/web/infcloud/fonts/Roboto-Light-webfont.svg create mode 100644 radicale_web/web/infcloud/fonts/Roboto-Light-webfont.ttf create mode 100644 radicale_web/web/infcloud/fonts/Roboto-Light-webfont.woff create mode 100644 radicale_web/web/infcloud/fonts/Roboto-LightItalic-webfont.eot create mode 100644 radicale_web/web/infcloud/fonts/Roboto-LightItalic-webfont.svg create mode 100644 radicale_web/web/infcloud/fonts/Roboto-LightItalic-webfont.ttf create mode 100644 radicale_web/web/infcloud/fonts/Roboto-LightItalic-webfont.woff create mode 100644 radicale_web/web/infcloud/fonts/Roboto-Medium-webfont.eot create mode 100644 radicale_web/web/infcloud/fonts/Roboto-Medium-webfont.svg create mode 100644 radicale_web/web/infcloud/fonts/Roboto-Medium-webfont.ttf create mode 100644 radicale_web/web/infcloud/fonts/Roboto-Medium-webfont.woff create mode 100644 radicale_web/web/infcloud/fonts/Roboto-MediumItalic-webfont.eot create mode 100644 radicale_web/web/infcloud/fonts/Roboto-MediumItalic-webfont.svg create mode 100644 radicale_web/web/infcloud/fonts/Roboto-MediumItalic-webfont.ttf create mode 100644 radicale_web/web/infcloud/fonts/Roboto-MediumItalic-webfont.woff create mode 100644 radicale_web/web/infcloud/fonts/Roboto-Regular-webfont.eot create mode 100644 radicale_web/web/infcloud/fonts/Roboto-Regular-webfont.svg create mode 100644 radicale_web/web/infcloud/fonts/Roboto-Regular-webfont.ttf create mode 100644 radicale_web/web/infcloud/fonts/Roboto-Regular-webfont.woff create mode 100644 radicale_web/web/infcloud/fonts/license.txt create mode 100644 radicale_web/web/infcloud/forms.js create mode 100644 radicale_web/web/infcloud/images/add_cal.svg create mode 100644 radicale_web/web/infcloud/images/add_cal_white.svg create mode 100644 radicale_web/web/infcloud/images/arrow.svg create mode 100644 radicale_web/web/infcloud/images/arrow_next.svg create mode 100644 radicale_web/web/infcloud/images/arrow_next_red.svg create mode 100644 radicale_web/web/infcloud/images/arrow_prev.svg create mode 100644 radicale_web/web/infcloud/images/arrow_prev_red.svg create mode 100644 radicale_web/web/infcloud/images/banner_addressbook.svg create mode 100644 radicale_web/web/infcloud/images/banner_calendar.svg create mode 100644 radicale_web/web/infcloud/images/banner_logout.svg create mode 100644 radicale_web/web/infcloud/images/banner_refresh.svg create mode 100644 radicale_web/web/infcloud/images/banner_todo.svg create mode 100644 radicale_web/web/infcloud/images/calendarB.svg create mode 100644 radicale_web/web/infcloud/images/cdm_logo.svg create mode 100644 radicale_web/web/infcloud/images/cdz_logo.svg create mode 100644 radicale_web/web/infcloud/images/cloud.svg create mode 100644 radicale_web/web/infcloud/images/company.svg create mode 100644 radicale_web/web/infcloud/images/company_s_b.svg create mode 100644 radicale_web/web/infcloud/images/company_s_w.svg create mode 100644 radicale_web/web/infcloud/images/delegation.svg create mode 100644 radicale_web/web/infcloud/images/dp_left.svg create mode 100644 radicale_web/web/infcloud/images/dp_right.svg create mode 100644 radicale_web/web/infcloud/images/drag.svg create mode 100644 radicale_web/web/infcloud/images/error_b.svg create mode 100644 radicale_web/web/infcloud/images/error_badge.svg create mode 100644 radicale_web/web/infcloud/images/error_w.svg create mode 100644 radicale_web/web/infcloud/images/in_progress_b.svg create mode 100644 radicale_web/web/infcloud/images/in_progress_dr.svg create mode 100644 radicale_web/web/infcloud/images/in_progress_r.svg create mode 100644 radicale_web/web/infcloud/images/in_progress_w.svg create mode 100644 radicale_web/web/infcloud/images/infcloud_logo.svg create mode 100644 radicale_web/web/infcloud/images/jumper_bottom_b.svg create mode 100644 radicale_web/web/infcloud/images/jumper_bottom_w.svg create mode 100644 radicale_web/web/infcloud/images/jumper_top_b.svg create mode 100644 radicale_web/web/infcloud/images/jumper_top_w.svg create mode 100644 radicale_web/web/infcloud/images/loadinfo.gif create mode 100644 radicale_web/web/infcloud/images/loadinfo_s1.gif create mode 100644 radicale_web/web/infcloud/images/loadinfo_s2.gif create mode 100644 radicale_web/web/infcloud/images/loadinfo_s3.gif create mode 100644 radicale_web/web/infcloud/images/loadinfo_s4.gif create mode 100644 radicale_web/web/infcloud/images/login.svg create mode 100644 radicale_web/web/infcloud/images/logout.svg create mode 100644 radicale_web/web/infcloud/images/needs_action_b.svg create mode 100644 radicale_web/web/infcloud/images/needs_action_dr.svg create mode 100644 radicale_web/web/infcloud/images/needs_action_r.svg create mode 100644 radicale_web/web/infcloud/images/needs_action_w.svg create mode 100644 radicale_web/web/infcloud/images/new_item.svg create mode 100644 radicale_web/web/infcloud/images/op_add.svg create mode 100644 radicale_web/web/infcloud/images/op_del.svg create mode 100644 radicale_web/web/infcloud/images/popupArrow.svg create mode 100644 radicale_web/web/infcloud/images/priority-1-dr.svg create mode 100644 radicale_web/web/infcloud/images/priority-1-r.svg create mode 100644 radicale_web/web/infcloud/images/priority-1-w.svg create mode 100644 radicale_web/web/infcloud/images/priority-1.svg create mode 100644 radicale_web/web/infcloud/images/priority-2-dr.svg create mode 100644 radicale_web/web/infcloud/images/priority-2-r.svg create mode 100644 radicale_web/web/infcloud/images/priority-2-w.svg create mode 100644 radicale_web/web/infcloud/images/priority-2.svg create mode 100644 radicale_web/web/infcloud/images/priority-3-dr.svg create mode 100644 radicale_web/web/infcloud/images/priority-3-r.svg create mode 100644 radicale_web/web/infcloud/images/priority-3-w.svg create mode 100644 radicale_web/web/infcloud/images/priority-3.svg create mode 100644 radicale_web/web/infcloud/images/read_only_b.svg create mode 100644 radicale_web/web/infcloud/images/read_only_w.svg create mode 100644 radicale_web/web/infcloud/images/remove_cal.svg create mode 100644 radicale_web/web/infcloud/images/remove_cal_white.svg create mode 100644 radicale_web/web/infcloud/images/reset_b.svg create mode 100644 radicale_web/web/infcloud/images/reset_dr.svg create mode 100644 radicale_web/web/infcloud/images/reset_drw.svg create mode 100644 radicale_web/web/infcloud/images/reset_r.svg create mode 100644 radicale_web/web/infcloud/images/reset_rw.svg create mode 100644 radicale_web/web/infcloud/images/reset_w.svg create mode 100644 radicale_web/web/infcloud/images/resource_arrow_down.svg create mode 100644 radicale_web/web/infcloud/images/resource_arrow_right.svg create mode 100644 radicale_web/web/infcloud/images/resource_arrow_up.svg create mode 100644 radicale_web/web/infcloud/images/resources.svg create mode 100644 radicale_web/web/infcloud/images/search.svg create mode 100644 radicale_web/web/infcloud/images/searchWhiteNew.svg create mode 100644 radicale_web/web/infcloud/images/select.svg create mode 100644 radicale_web/web/infcloud/images/select_bg.svg create mode 100644 radicale_web/web/infcloud/images/select_bg_black.svg create mode 100644 radicale_web/web/infcloud/images/select_bg_dis.svg create mode 100644 radicale_web/web/infcloud/images/select_black.svg create mode 100644 radicale_web/web/infcloud/images/select_dis.svg create mode 100644 radicale_web/web/infcloud/images/select_inv.svg create mode 100644 radicale_web/web/infcloud/images/select_login.svg create mode 100644 radicale_web/web/infcloud/images/success_b.svg create mode 100644 radicale_web/web/infcloud/images/success_dr.svg create mode 100644 radicale_web/web/infcloud/images/success_drw.svg create mode 100644 radicale_web/web/infcloud/images/success_r.svg create mode 100644 radicale_web/web/infcloud/images/success_rw.svg create mode 100644 radicale_web/web/infcloud/images/success_w.svg create mode 100644 radicale_web/web/infcloud/images/todoB.svg create mode 100644 radicale_web/web/infcloud/images/user.svg create mode 100644 radicale_web/web/infcloud/index.html create mode 100644 radicale_web/web/infcloud/interface.js create mode 100644 radicale_web/web/infcloud/lib/fullcalendar.js create mode 100644 radicale_web/web/infcloud/lib/ie_base64.js create mode 100644 radicale_web/web/infcloud/lib/jquery-2.1.4.min.js create mode 100644 radicale_web/web/infcloud/lib/jquery-ui-1.11.4.custom.js create mode 100644 radicale_web/web/infcloud/lib/jquery.autosize.js create mode 100644 radicale_web/web/infcloud/lib/jquery.browser.js create mode 100644 radicale_web/web/infcloud/lib/jquery.placeholder-1.1.9.js create mode 100644 radicale_web/web/infcloud/lib/jquery.quicksearch.js create mode 100644 radicale_web/web/infcloud/lib/jquery.tagsinput.js create mode 100644 radicale_web/web/infcloud/lib/jshash-2.2_sha256.js create mode 100644 radicale_web/web/infcloud/lib/rrule.js create mode 100644 radicale_web/web/infcloud/lib/spectrum.js create mode 100644 radicale_web/web/infcloud/license.txt create mode 100644 radicale_web/web/infcloud/localization.js create mode 100644 radicale_web/web/infcloud/main.js create mode 100644 radicale_web/web/infcloud/misc/baikal-flat-0.2.7.diff create mode 100644 radicale_web/web/infcloud/misc/calendarserver.diff create mode 100644 radicale_web/web/infcloud/misc/config_davical.txt create mode 100644 radicale_web/web/infcloud/misc/readme_baikal_sabredav.txt create mode 100644 radicale_web/web/infcloud/misc/readme_osx.txt create mode 100644 radicale_web/web/infcloud/readme.txt create mode 100644 radicale_web/web/infcloud/resource.js create mode 100644 radicale_web/web/infcloud/timezones.js create mode 100644 radicale_web/web/infcloud/vcalendar.js create mode 100644 radicale_web/web/infcloud/vcalendar_rfc_regex.js create mode 100644 radicale_web/web/infcloud/vcard_rfc_regex.js create mode 100644 radicale_web/web/infcloud/vtodo.js create mode 100644 radicale_web/web/infcloud/webdav_protocol.js (limited to 'radicale_web/web/infcloud') diff --git a/radicale_web/web/infcloud/.htaccess b/radicale_web/web/infcloud/.htaccess new file mode 100644 index 0000000..b8583d1 --- /dev/null +++ b/radicale_web/web/infcloud/.htaccess @@ -0,0 +1,35 @@ +######################################################################################################################### +# Apache configuration (REQUIRED for correct HTML5 cache functionality in browsers): +# 1.) You NEED to enable the following Apache modules: mod_mime, mod_headers (optionally you can also enable mod_deflate) +# 2.) You NEED to add the following lines into your Apache vhost configuration (without the # character): +# +# AllowOverride FileInfo Limit +# = 2.3> +# Require all granted +# +# +# Order allow,deny +# Allow from all +# +# +######################################################################################################################### + +# Add "Content-Type: text/cache-manifest" header for .manifest files + + AddType text/cache-manifest .manifest + + +# Add "Cache-Control: max-age=0, must-revalidate, no-cache, no-transform, private" header for all files +# for more information see: https://tools.ietf.org/html/rfc7234 + + Header set Cache-Control "max-age=0, must-revalidate, no-cache, no-transform, private" + + + + SetOutputFilter DEFLATE + + +# If you use mod_cache set the correct path for the cache.manifest here +# +# CacheDisable cache.manifest +# diff --git a/radicale_web/web/infcloud/addressbook.js b/radicale_web/web/infcloud/addressbook.js new file mode 100644 index 0000000..fcde7ef --- /dev/null +++ b/radicale_web/web/infcloud/addressbook.js @@ -0,0 +1,1714 @@ +/* +InfCloud - the open source CalDAV/CardDAV Web Client +Copyright (C) 2011-2015 + Jan Mate + Andrej Lezo + Matej Mihalik + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as +published by the Free Software Foundation, either version 3 of the +License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . +*/ + +// AddressbookList Class +function AddressbookList() +{ + this.contacts=new Array(); + this.contacts_hash=new Object(); + this.contacts_hash_uidattr=new Object(); + this.companies=new Array(); + this.companies_hash=new Object(); + this.companies_hash_uidattr=new Object(); + this.vcard_groups=new Object(); + this.contact_categories=new Object(); + this.contact_companies=new Object(); + this.contactLoaded=null; + this.contactToReload=null; + this.vcardGroupLoaded=null; + + this.reset=function() + { + this.contacts.splice(0,this.contacts.length); + this.contacts_hash=new Object(); + this.contacts_hash_uidattr=new Object(); + this.companies.splice(0,this.companies.length); + this.companies_hash=new Object(); + this.companies_hash_uidattr=new Object(); + this.vcard_groups=new Object(); // these are not removed from the interface (it's OK) + this.contact_categories=new Object(); + this.contact_companies=new Object(); + this.contactLoaded=null; + this.contactToReload=null; + this.vcardGroupLoaded=null; + }; + + this.getNewUID=function() + { + // we count with uniqueness of generated hash string + var newUID=null; + newUID=generateUID(); + return newUID; + }; + + this.getLoadedContactUID=function() + { + if(this.contactLoaded!=null) + return this.contactLoaded.uid; + else + return ''; + }; + + this.getSortKey=function(inputContact, inputSettings, inputMode) // inputMode (0=sort, 1=display) + { + var vcard_element=('\r\n'+inputContact.vcard).match(vCard.pre['contentline_N']); + if(vcard_element===null || vcard_element.length!==1) // if the N attribute is not present exactly once, vCard is considered invalid + return false; + + var sortKeyCompanyPart=''; + if(typeof (getCRMSortKey)== 'function' && inputMode==0) + { + sortKeyCompanyPart=getCRMSortKey(inputContact); + if(inputContact.isCompany!=undefined && inputContact.isCompany) + return sortKeyCompanyPart; // for company contact we can return here + } + else if(typeof globalGroupContactsByCompanies!='undefined' && globalGroupContactsByCompanies==true) + { + var sortKeyCompanyPart='\u0009'; + var vcard_orgname=('\r\n'+inputContact.vcard).match(vCard.pre['contentline_ORG']); + if(vcard_orgname!=null && vcard_orgname.length>0) // if more than one ORG is present, use the first one + { + // parsed (contentline_parse) = [1]->"group.", [2]->"name", [3]->";param;param", [4]->"value" + var parsed=vcard_orgname[0].match(vCard.pre['contentline_parse']); + var parsed_value=vcardSplitValue(parsed[4], ';'); + + sortKeyCompanyPart=parsed_value[0]+'\u0009'+(parsed_value[1]!=undefined ? parsed_value[1] : '')+'\u0009'; + + if(inputMode==0 && inputContact.isCompany!=undefined && inputContact.isCompany) + return sortKeyCompanyPart; // for company contact we can return here + } + } + + var tmp = []; + var isGroup = this.isContactGroup(inputContact.vcard); + /* backward compatibility for stupid users (remove it in future) */ + if(typeof inputSettings==='string') + tmp = inputSettings.replace(RegExp(',','g'), ', ').split(','); + else if($.isArray(inputSettings)) /* new configuration options (arrays) */ + tmp = inputSettings.slice(); // copy the configuration array + + // display settings for non-group contacts need some flattening + if(inputMode===1 && !isGroup) { + tmp = $.map(tmp, function(el) { + if($.isPlainObject(el.value)) { + return el.value; + } + else { + return [el.value]; + } + + }); + } + + // now flatten the array completely to a company / personal version + tmp = $.map(tmp, function(el) { + if($.isPlainObject(el)) { + if(inputContact.isCompany && el.hasOwnProperty('company')) { + return [el.company]; + } + else if(!inputContact.isCompany && el.hasOwnProperty('personal')) { + return [el.personal]; + } + + return []; + } + + return [el]; + }); + + for(var i=0; i"group.", [2]->"name", [3]->";param;param", [4]->"value" + var parsed=vcard_element2[0].match(vCard.pre['contentline_parse']); + var sort_value=parsed[4]; + } + } + + return (inputMode===0 ? sortKeyCompanyPart+sort_value : sort_value); + }; + + this.isContactGroup=function(inputVcard) + { + var vcard_element=null; + if((vcard_element=('\r\n'+inputVcard).match(vCard.pre['X-ADDRESSBOOKSERVER-KIND']))!=null) + { + // parsed (contentline_parse) = [1]->"group.", [2]->"name", [3]->";param;param", [4]->"value" + var parsed=vcard_element[0].match(vCard.pre['contentline_parse']); + if(parsed[4].toLowerCase()=='group') + return true; + } + return false; + }; + + this.getMyContactGroups=function(inputUid) + { + if(this.contacts_hash[inputUid]!=undefined) + { + var myContactGroups=new Array(); + + if((vcard_element=this.contacts_hash[inputUid].vcard.match(vCard.pre['contentline_UID']))!=null) + { + // parsed (contentline_parse) = [1]->"group.", [2]->"name", [3]->";param;param", [4]->"value" + parsed=vcard_element[0].match(vCard.pre['contentline_parse']); + + for(var j=0;j"group.", [2]->"name", [3]->";param;param", [4]->"value" + parsed=vcard_element[0].match(vCard.pre['contentline_parse']); + + for(var j=0;j"group.", [2]->"name", [3]->";param;param", [4]->"value" + parsed=vcard_element[0].match(vCard.pre['contentline_parse']); + + var changedContactGroups=new Array(); + + for(var j=0;j0) return false; else globalAddressbookList.applyABFilter(groupChBoxClick(this, \'#ResourceCardDAVList\', \'.resourceCardDAV_header\', \'.resourceCardDAV\', \'.contact_group\', true), false);'}); + + newElement.append(vcardUnescapeValue(inputContact.displayvalue)); + newElement.css('display',''); + if($('#ResourceCardDAVList').find('[data-id="'+jqueryEscapeSelector(inputContact.uid.replace(RegExp('/[^/]*$',''),'/'))+'"]').next('.contact_group').find('[data-id="'+jqueryEscapeSelector(inputContact.uid)+'"]').length==0) + $('#ResourceCardDAVList').find('[data-id="'+jqueryEscapeSelector(inputContact.uid.replace(RegExp('/[^/]*$',''),'/'))+'"]').next('.contact_group').children().eq(insertIndex).after(newElement); + + // make the area droppable if the collection is not read-only + if(globalResourceCardDAVList.getCollectionPrivByUID(inputContact.uid.replace(RegExp('[^/]*$',''),''))==false && (typeof globalDisableDragAndDrop=='undefined' || globalDisableDragAndDrop!=true)) + $('#ResourceCardDAVList').find('[data-id="'+jqueryEscapeSelector(inputContact.uid.replace(RegExp('[^/]*$',''),''))+'"]').parent().find('.contact_group').children().eq(insertIndex+1).droppable({ + accept: '.ablist_item', + tolerance: 'pointer', + hoverClass: 'group_dropped_to', + drop: function(event, ui){ + // animate the clone of the dropped (draggable) element + var tmp=ui.helper.clone(); + tmp.appendTo('body') + .animate({opacity: 0, color: 'transparent', height: 0, width: 0, fontSize: 0, lineHeight: 0, paddingLeft: 0, paddingRight: 0},750,function(){tmp.remove()}); + + // disallow to drag the original dropped element until the processing is finished + ui.draggable.draggable('option', 'disabled', true); + + // animate the original dropped element + ui.draggable.animate({opacity: 0.3}, 750); + + // disallow to drop any new element until the processing is finished + $(this).droppable('option', 'disabled', true); + + // show the loader icon + $(this).addClass('r_operate'); + + var tmp2=globalAddressbookList.getContactByUID(ui.draggable.attr('data-id')); + tmp2.addToContactGroupUID=''; + tmp2.removeToContactGroupUID=new Array(); + tmp2.addToContactGroupUID=$(this).attr('data-id'); + tmp2.uiObjects={contact: ui.draggable, resource: $(this).attr('data-id')}; + + lockAndPerformToCollection(tmp2, globalRefAddContact.attr('data-filter-url'), 'ADD_TO_GROUP'); + } + }); + + // if no new makeActive but forceReload is true then reload the current contact group + if(makeActive==null && forceReload==true) + makeActive=globalRefAddContact.attr('data-filter-url'); + + // load the contact group if it was selected + if(makeActive!=null) + { + $('#ResourceCardDAVList').find('.resourceCardDAV_item').find('.resourceCardDAV_selected').removeClass('resourceCardDAV_selected'); + $('#ResourceCardDAVList').find('[data-id='+jqueryEscapeSelector(makeActive.replace(RegExp('[^/]*$',''),''))+']').addClass('resourceCardDAV_selected'); + $('#ResourceCardDAVList').find('[data-id='+jqueryEscapeSelector(makeActive)+']').addClass('resourceCardDAV_selected'); + } + if(makeChecked!=null) + { + $('#ResourceCardDAVList').find('[data-id='+jqueryEscapeSelector(makeChecked)+']').find('input[type=checkbox]').prop('checked',true); + this.applyABFilter(dataGetChecked('#ResourceCardDAVList'), false); + } + }; + + this.removeContactGroup=function(inputUid, loadNext) + { + for(var i=this.vcard_groups[inputUid.replace(RegExp('/[^/]*$',''),'/')].length-1;i>=0;i--) + if(this.vcard_groups[inputUid.replace(RegExp('/[^/]*$',''),'/')][i].uid==inputUid) + { + var uidRemoved=this.vcard_groups[inputUid.replace(RegExp('/[^/]*$',''),'/')][i].uid; + var item=$('#ResourceCardDAVList').find('[data-id^="'+jqueryEscapeSelector(this.vcard_groups[inputUid.replace(RegExp('/[^/]*$',''),'/')][i].uid)+'"]'); + + // remove the item + item.remove(); + this.vcard_groups[inputUid.replace(RegExp('/[^/]*$',''),'/')].splice(i,1); + +// vcardGroupLoaded bolo zrusene, pozriet co s tym + if(loadNext && this.vcardGroupLoaded!=null && this.vcardGroupLoaded.uid==inputUid) + { + this.vcardGroupLoaded=null; + + // set the whole collection as active + var tmp=uidRemoved.match(RegExp('(^.*/)'),''); +// XXX it is no longer needed +// globalResourceCardDAVList.loadAddressbookByUID(tmp[1]); + } + break; + } + }; + + // hide/show contacts in the interface according to contactGroupOrResourceUid or search filter in the interface (contactGroupOrResourceUid==false) + this.applyABFilter=function(contactGroupOrResourceUid, inputForceLoadNext) + { + if(globalCardDAVInitLoad) + return false; + +// XXX docasne, potom dame prec + if(!(contactGroupOrResourceUid instanceof Array)) + return false; + + var vcardGroupOrCollection=[]; + for(var i=0;i"group.", [2]->"name", [3]->";param;param", [4]->"value" + parsed=vcard_element[0].match(vCard.pre['contentline_parse']); + vcardUIDList[vcardUIDList.length]=parsed[4].replace('urn:uuid:',''); + // remove the processed parameter + vcard=vcard.replace(vcard_element[0],'\r\n'); + } + + // update the contacts' "show" attribute + for(var j=0;j"group.", [2]->"name", [3]->";param;param", [4]->"value" + parsed=vcard_element[0].match(vCard.pre['contentline_parse']); + + if(vcardUIDList[j]==parsed[4] && this.contacts[k].search_hide==false) + { + this.contacts[k].show=true; + this.contacts_hash[this.contacts[k].uid].show=true + } + } + } + } + } + + var lastActive=null; + var prevHeader=null; + var lastContactForHeader=this.contacts.length-1; + // performance + var tmpListRefChildren=globalRefABListTable.children(); + // init displayed columns text length cache + var columnLengths = []; + for(var i=0; i=0;i--) + { + if(this.contacts[i].headerOnly==undefined) + { + // find the previous header index + for(var j=i-1;j>=0;j--) + if(this.contacts[j].headerOnly!=undefined && this.contacts[j].headerOnly==true) + { + prevHeader=j; + break; + } + + // performance + var tmpListRefChildren_i=tmpListRefChildren.eq(i); + var tmpListRefChildren_prev=tmpListRefChildren.eq(prevHeader); + + var coll_tmp=this.contacts[i].uid.match(RegExp('^(https?://)([^@/]+(?:@[^@/]+)?)@([^/]+)(.*/)([^/]+/)([^/]*)','i')); + var collection_uid=coll_tmp[1]+coll_tmp[2]+'@'+coll_tmp[3]+coll_tmp[4]+coll_tmp[5]; + var coll_color=globalResourceCardDAVList.getCollectionByUID(collection_uid).color; + this.contacts[i].color = coll_color; + tmpListRefChildren_i.find('.ablist_item_color').css('background-color', coll_color); + switch(this.contacts[i].show) + { + case false: + tmpListRefChildren_i.css('display','none'); + if(tmpListRefChildren_i.hasClass('ablist_item_selected')) + lastActive=i; + + var hideHeader=true; + for(j=prevHeader+1;j<=lastContactForHeader;j++) + if(this.contacts[j].show==true) + { + hideHeader=false; + break; + } + + if(hideHeader) + tmpListRefChildren_prev.css('display','none'); + + break; + case true: + // set the contact header to visible + tmpListRefChildren_prev.css('display',''); + + // set the contact to visible + tmpListRefChildren_i.css('display',''); + + // save column text length into cache + tmpListRefChildren_i.children().slice(globalFixedContactDataColumnsCount).each(function(ind) { + columnLengths[ind].push($(this).text().length); + }); + + break; + default: + break; + } + } + else + lastContactForHeader=i-1; + } + + setDataColumnsWidth(columnLengths); + + // the previously loaded contact is hidden or not exists we need to select a new one + if(inputForceLoadNext==true || $('#vCardEditor').attr('data-editor-state')!='edit' && (lastActive!=null || globalRefABListTable.children('.ablist_item_selected').length==0)) + { + var nextCandidateToLoad=null; + // get the nearest candidate to load + // if we can go forward + if(this.contactToReload!=null) + nextCandidateToLoad=this.contactToReload; + else + { + for(j=(previousActiveIndex==null ? 0 : previousActiveIndex);j=0;j--) + if((this.contacts[j].headerOnly==undefined || this.contacts[j].headerOnly==false) && (this.contacts[j].show==true)) + { + nextCandidateToLoad=this.contacts[j]; + break; + } + } + } + // make the contact active + globalRefABListTable.children('.ablist_item.ablist_item_selected').removeClass('ablist_item_selected'); + if(nextCandidateToLoad!=null) + { + // prevent re-loading the contact if it is already loaded + if((this.contactToReload!=null||$('#vCardEditor').attr('data-url')!=nextCandidateToLoad.uid) && !globalCardDAVInitLoad) + { + this.loadContactByUID(nextCandidateToLoad.uid); + } + else // because the collection click unselects the active contact we need to re-select it + { + // Make the selected contact active + globalRefABListTable.children('.ablist_item.ablist_item_selected').removeClass('ablist_item_selected'); + globalRefABListTable.children('[data-id='+jqueryEscapeSelector(nextCandidateToLoad.uid)+']').addClass('ablist_item_selected'); + } + // move scrollbar to ensure that the contact is visible in the interface + if((selected_contact=globalRefABListTable.children('.ablist_item_selected')).length==1) + globalRefABList.scrollTop(globalRefABList.scrollTop()+selected_contact.offset().top-globalRefABList.offset().top-globalRefABList.height()*globalKBNavigationPaddingRate); + } + else + { + this.contactLoaded=null; + $('#ABContactColor').css('background-color', ''); + $('#ABContact').html(''); + } + } + if(this.contactToReload!=null&& (selected_contact=globalRefABListTable.find('[data-id="'+this.contactToReload.uid+'"]')).length==1) + { + selected_contact.addClass('ablist_item_selected'); + globalRefABList.scrollTop(globalRefABList.scrollTop()+selected_contact.offset().top-globalRefABList.offset().top-globalRefABList.height()*globalKBNavigationPaddingRate); + + } + } + + this.getABCategories=function(returnSorted) + { + var categoriesArr=[]; + + for(var category in this.contact_categories) + categoriesArr.push(category); + + if(returnSorted) + return categoriesArr.sort(function(x,y){return x.customCompare(y,globalSortAlphabet,1,false)}); + else + return categoriesArr; + } + + this.getABCompanies=function(returnSorted) + { + var companiesArr=[]; + + for(var company in this.contact_companies) + companiesArr.push(company); + + if(returnSorted) + return companiesArr.sort(function(x,y){return x.customCompare(y,globalSortAlphabet,1,false)}); + else + return companiesArr; + } + + this.getABCompanyDepartments=function(inputCompany) + { + var departmentsArr=[]; + + if(this.contact_companies[inputCompany]!=undefined) + departmentsArr=this.contact_companies[inputCompany].departments.slice(); + + return departmentsArr.sort(function(x,y){return x.customCompare(y,globalSortAlphabet,1,false)}); + } + + // Contact list is not sorted, instead "insert sort" is performed + this.insertContact=function(inputContact, forceReload, disableDOM) + { + // Apple "group" vCards + if(this.isContactGroup(inputContact.vcard)) + return this.insertContactGroup(inputContact, forceReload, false); + + // check for company contact + inputContact.isCompany=false; + var vcard_element=inputContact.vcard.match(vCard.pre['X-ABShowAs']); + if(vcard_element!=null) + { + // parsed (contentline_parse) = [1]->"group.", [2]->"name", [3]->";param;param", [4]->"value" + parsed=vcard_element[0].match(vCard.pre['contentline_parse']); + if(vcardUnescapeValue(parsed[4]).match(RegExp('^company$','i'))) + inputContact.isCompany=true; + } + + // check for company contact + if((typeof globalContactsExtVcardToData)=='function') + { + inputContact.isLegacy=false; + var vcard_element=inputContact.vcard.match(RegExp('\r\nX-IsLegacy:.*\r\n', 'mi')); + if(vcard_element!=null) + { + // parsed (contentline_parse) = [1]->"group.", [2]->"name", [3]->";param;param", [4]->"value" + var parsed=vcard_element[0].match(vCard.pre['contentline_parse']); + if(vcardUnescapeValue(parsed[4]).match(RegExp('^(?:yes|1|true)$', 'i'))) + inputContact.isLegacy=true; + } + } + + // contact UID attr + var vcard_element=inputContact.vcard.match(vCard.pre['contentline_UID']); + if(vcard_element!=null) + { + // parsed (contentline_parse) = [1]->"group.", [2]->"name", [3]->";param;param", [4]->"value" + parsed=vcard_element[0].match(vCard.pre['contentline_parse']); + inputContact.uidattr=vcardUnescapeValue(parsed[4]); + } + else // UID attr is REQUIRED + return false; // invalud vcard + + var this_destination=this.contacts; + var this_destination_hash=this.contacts_hash; + var this_destination_hash_uidattr=this.contacts_hash_uidattr; + + // search plugin requirement + inputContact.search_hide=false; + + // CATEGORIES suggestion + var categoriesArr=(inputContact.categories=='' ? [] : vcardSplitValue(inputContact.categories,',')); + var allCategoriesArr=this.getABCategories(false); + + // The search funcionality uses this ASCII value (you can add additional data here) + + // ORG attribute + var tmp=inputContact.vcard; + var orgArr=[]; + var depArr=[]; + var tmpCurrentCompany=''; + var tmpCurrentDepartment=''; + while((vcard_element=tmp.match(vCard.pre['contentline_ORG']))!=null) + { + // parsed (contentline_parse) = [1]->"group.", [2]->"name", [3]->";param;param", [4]->"value" + var parsed=vcard_element[0].match(vCard.pre['contentline_parse']); + var parsed_valArr=vcardSplitValue(parsed[4], ';'); + + if(isDataColumnDefined('COMPANY')) { + setContactDataColumn(inputContact, 'COMPANY', vcardUnescapeValue(parsed_valArr[0])); + } + + if(isDataColumnDefined('DEPARTMENT')) { + setContactDataColumn(inputContact, 'DEPARTMENT', vcardUnescapeValue(parsed_valArr[1])); + } + + tmpCurrentCompany=(parsed_valArr[0]==undefined || parsed_valArr[0]=='' ? '' : parsed_valArr[0]); + tmpCurrentDepartment=(parsed_valArr[1]==undefined || parsed_valArr[1]=='' ? '' : parsed_valArr[1]); + + if(tmpCurrentCompany!='') + orgArr[orgArr.length]=vcardUnescapeValue(tmpCurrentCompany); + + if(tmpCurrentDepartment) + depArr[depArr.length]=vcardUnescapeValue(tmpCurrentDepartment); + + // remove the processed parameter + tmp=tmp.replace(vcard_element[0],'\r\n'); + } + var allOrgArr=this.getABCompanies(false); + + // N attribute + while((vcard_element=tmp.match(vCard.pre['contentline_N']))!=null) + { + // parsed (contentline_parse) = [1]->"group.", [2]->"name", [3]->";param;param", [4]->"value" + var parsed=vcard_element[0].match(vCard.pre['contentline_parse']); + var parsed_valArr=vcardSplitValue(parsed[4],';'); + + if(isDataColumnDefined('LASTNAME')) { + setContactDataColumn(inputContact, 'LASTNAME', vcardUnescapeValue(parsed_valArr[0])); + } + + if(isDataColumnDefined('FIRSTNAME')) { + setContactDataColumn(inputContact, 'FIRSTNAME', vcardUnescapeValue(parsed_valArr[1])); + } + + if(isDataColumnDefined('MIDDLENAME')) { + setContactDataColumn(inputContact, 'MIDDLENAME', vcardUnescapeValue(parsed_valArr[2])); + } + + if(isDataColumnDefined('PREFIX')) { + setContactDataColumn(inputContact, 'PREFIX', vcardUnescapeValue(parsed_valArr[3])); + } + + if(isDataColumnDefined('SUFFIX')) { + setContactDataColumn(inputContact, 'SUFFIX', vcardUnescapeValue(parsed_valArr[4])); + } + + // remove the processed parameter + tmp=tmp.replace(vcard_element[0],'\r\n'); + } + + // NICKNAME attribute + while((vcard_element=tmp.match(vCard.pre['contentline_NICKNAME']))!=null) + { + // parsed (contentline_parse) = [1]->"group.", [2]->"name", [3]->";param;param", [4]->"value" + parsed=vcard_element[0].match(vCard.pre['contentline_parse']); + + if(isDataColumnDefined('NICKNAME')) { + setContactDataColumn(inputContact, 'NICKNAME', parsed[4]); + } + + // remove the processed parameter + tmp=tmp.replace(vcard_element[0],'\r\n'); + } + + // X-PHONETIC-LAST-NAME attribute + while((vcard_element=tmp.match(vCard.pre['contentline_X-PHONETIC-LAST-NAME']))!=null) + { + // parsed (contentline_parse) = [1]->"group.", [2]->"name", [3]->";param;param", [4]->"value" + parsed=vcard_element[0].match(vCard.pre['contentline_parse']); + + if(isDataColumnDefined('PHONETICLASTNAME')) { + setContactDataColumn(inputContact, 'PHONETICLASTNAME', parsed[4]); + } + + // remove the processed parameter + tmp=tmp.replace(vcard_element[0],'\r\n'); + } + + // X-PHONETIC-FIRST-NAME attribute + while((vcard_element=tmp.match(vCard.pre['contentline_X-PHONETIC-FIRST-NAME']))!=null) + { + // parsed (contentline_parse) = [1]->"group.", [2]->"name", [3]->";param;param", [4]->"value" + parsed=vcard_element[0].match(vCard.pre['contentline_parse']); + + if(isDataColumnDefined('PHONETICFIRSTNAME')) { + setContactDataColumn(inputContact, 'PHONETICFIRSTNAME', parsed[4]); + } + + // remove the processed parameter + tmp=tmp.replace(vcard_element[0],'\r\n'); + } + + // BDAY attribute + while((vcard_element=tmp.match(vCard.pre['contentline_BDAY']))!=null) + { + // parsed (contentline_parse) = [1]->"group.", [2]->"name", [3]->";param;param", [4]->"value" + parsed=vcard_element[0].match(vCard.pre['contentline_parse']); + + if(isDataColumnDefined('BIRTHDAY')) { + var bday = null; + try { + bday = $.datepicker.parseDate('yy-mm-dd', parsed[4]); + } + catch(e) { + + } + + if(bday) { + setContactDataColumn(inputContact, 'BIRTHDAY', $.datepicker.formatDate(globalSettings.datepickerformat.value, bday)); + } + } + + // remove the processed parameter + tmp=tmp.replace(vcard_element[0],'\r\n'); + } + + // TITLE attribute + while((vcard_element=tmp.match(vCard.pre['contentline_TITLE']))!=null) + { + // parsed (contentline_parse) = [1]->"group.", [2]->"name", [3]->";param;param", [4]->"value" + parsed=vcard_element[0].match(vCard.pre['contentline_parse']); + + if(isDataColumnDefined('JOBTITLE')) { + setContactDataColumn(inputContact, 'JOBTITLE', vcardUnescapeValue(parsed[4])); + } + + // remove the processed parameter + tmp=tmp.replace(vcard_element[0],'\r\n'); + } + + // NOTE attribute + while((vcard_element=tmp.match(vCard.pre['contentline_NOTE']))!=null) + { + // parsed (contentline_parse) = [1]->"group.", [2]->"name", [3]->";param;param", [4]->"value" + parsed=vcard_element[0].match(vCard.pre['contentline_parse']); + + if(isDataColumnDefined('NOTETEXT')) { + setContactDataColumn(inputContact, 'NOTETEXT', vcardUnescapeValue(parsed[4])); + } + + // remove the processed parameter + tmp=tmp.replace(vcard_element[0],'\r\n'); + } + + // ADR attribute + while((vcard_element=tmp.match(vCard.pre['contentline_ADR']))!=null) + { + // parsed (contentline_parse) = [1]->"group.", [2]->"name", [3]->";param;param", [4]->"value" + var parsed=vcard_element[0].match(vCard.pre['contentline_parse']); + var parsed_valArr=vcardSplitValue(parsed[4],';'); + + if(isDataColumnDefined('ADDRESS')) { + var unescapedArr = $.map(parsed_valArr, function(el) { + if(el) { + return vcardUnescapeValue(el); + } + }); + + setContactDataColumn(inputContact, 'ADDRESS', unescapedArr.join(' '), {'TYPE': getParamsFromContentlineParse(tmp, parsed, 'TYPE', 'X-ABLabel', 'address_type_store_as')}); + } + + // remove the processed parameter + tmp=tmp.replace(vcard_element[0],'\r\n'); + } + + // TEL attribute + while((vcard_element=tmp.match(vCard.pre['contentline_TEL']))!=null) + { + // parsed (contentline_parse) = [1]->"group.", [2]->"name", [3]->";param;param", [4]->"value" + parsed=vcard_element[0].match(vCard.pre['contentline_parse']); + + if(isDataColumnDefined('PHONE')) { + setContactDataColumn(inputContact, 'PHONE', parsed[4], {'TYPE': getParamsFromContentlineParse(tmp, parsed, 'TYPE', 'X-ABLabel', 'phone_type_store_as')}); + } + + // remove the processed parameter + tmp=tmp.replace(vcard_element[0],'\r\n'); + } + + // EMAIL attribute + while((vcard_element=tmp.match(vCard.pre['contentline_EMAIL']))!=null) + { + // parsed (contentline_parse) = [1]->"group.", [2]->"name", [3]->";param;param", [4]->"value" + parsed=vcard_element[0].match(vCard.pre['contentline_parse']); + + if(isDataColumnDefined('EMAIL')) { + setContactDataColumn(inputContact, 'EMAIL', parsed[4], {'TYPE': getParamsFromContentlineParse(tmp, parsed, 'TYPE', 'X-ABLabel', 'email_type_store_as')}); + } + + // remove the processed parameter + tmp=tmp.replace(vcard_element[0],'\r\n'); + } + + // URL attribute + while((vcard_element=tmp.match(vCard.pre['contentline_URL']))!=null) + { + // parsed (contentline_parse) = [1]->"group.", [2]->"name", [3]->";param;param", [4]->"value" + parsed=vcard_element[0].match(vCard.pre['contentline_parse']); + + if(isDataColumnDefined('URL')) { + setContactDataColumn(inputContact, 'URL', parsed[4], {'TYPE': getParamsFromContentlineParse(tmp, parsed, 'TYPE', 'X-ABLabel', 'url_type_store_as')}); + } + + // remove the processed parameter + tmp=tmp.replace(vcard_element[0],'\r\n'); + } + + // X-ABDATE attribute + while((vcard_element=tmp.match(vCard.pre['contentline_X-ABDATE']))!=null) + { + // parsed (contentline_parse) = [1]->"group.", [2]->"name", [3]->";param;param", [4]->"value" + parsed=vcard_element[0].match(vCard.pre['contentline_parse']); + + if(isDataColumnDefined('DATES')) { + var abdate = null; + try { + abdate = $.datepicker.parseDate('yy-mm-dd', parsed[4]); + } + catch(e) { + + } + + if(abdate) { + setContactDataColumn(inputContact, 'DATES', $.datepicker.formatDate(globalSettings.datepickerformat.value, abdate), {'TYPE': getParamsFromContentlineParse(tmp, parsed, 'TYPE', 'X-ABLabel', 'date_store_as')}); + } + } + + // remove the processed parameter + tmp=tmp.replace(vcard_element[0],'\r\n'); + } + + // X-ABRELATEDNAMES attribute + while((vcard_element=tmp.match(vCard.pre['contentline_X-ABRELATEDNAMES']))!=null) + { + // parsed (contentline_parse) = [1]->"group.", [2]->"name", [3]->";param;param", [4]->"value" + parsed=vcard_element[0].match(vCard.pre['contentline_parse']); + + if(isDataColumnDefined('RELATED')) { + setContactDataColumn(inputContact, 'RELATED', parsed[4], {'TYPE': getParamsFromContentlineParse(tmp, parsed, 'TYPE', 'X-ABLabel', 'person_type_store_as')}); + } + + // remove the processed parameter + tmp=tmp.replace(vcard_element[0],'\r\n'); + } + + // X-SOCIALPROFILE attribute + while((vcard_element=tmp.match(vCard.pre['contentline_X-SOCIALPROFILE']))!=null) + { + // parsed (contentline_parse) = [1]->"group.", [2]->"name", [3]->";param;param", [4]->"value" + parsed=vcard_element[0].match(vCard.pre['contentline_parse']); + + if(isDataColumnDefined('PROFILE')) { + setContactDataColumn(inputContact, 'PROFILE', getParamsFromContentlineParse(tmp, parsed, 'X-USER', null, null, true)[0], {'TYPE': getParamsFromContentlineParse(tmp, parsed, 'TYPE', 'X-ABLabel', 'profile_type_store_as')}); + } + + // remove the processed parameter + tmp=tmp.replace(vcard_element[0],'\r\n'); + } + + // IMPP attribute + while((vcard_element=tmp.match(vCard.pre['contentline_IMPP']))!=null) + { + // parsed (contentline_parse) = [1]->"group.", [2]->"name", [3]->";param;param", [4]->"value" + parsed=vcard_element[0].match(vCard.pre['contentline_parse']); + if(isDataColumnDefined('IM')) { + setContactDataColumn(inputContact, 'IM', parsed[4].replace(vCard.pre['vcardToData_before_val'], ''), { + 'TYPE': getParamsFromContentlineParse(tmp, parsed, 'TYPE', 'X-ABLabel', 'im_type_store_as'), + 'SERVICE-TYPE': getParamsFromContentlineParse(tmp, parsed, 'X-SERVICE-TYPE', null, 'im_service_type_store_as') + }); + } + + // remove the processed parameter + tmp=tmp.replace(vcard_element[0],'\r\n'); + } + + // CATEGORIES attribute (preparsed) + if(isDataColumnDefined('CATEGORIES')) { + setContactDataColumn(inputContact, 'CATEGORIES', inputContact.categories.splitCustom(',')); + } + + if((inputContact.sortkey=this.getSortKey(inputContact, globalSettings.collectionsort.value || $.map(globalSettings.collectiondisplay.value, function(el) {if($.isPlainObject(el.value)) {return el.value;} else {return [el.value];}}), 0))===false || (inputContact.displayvalue=this.getSortKey(inputContact, globalSettings.collectiondisplay.value, 1))===false) + return false; //invalid vcard + + // if company headers are used add also the header to the searchvalue + var companyHeader=''; + if(typeof globalGroupContactsByCompanies!='undefined' && globalGroupContactsByCompanies==true) + { + if(tmpCurrentCompany!='' || tmpCurrentDepartment!='') + { + if(typeof (getCRMSortKey)=='function') + companyHeader=getCRMSortKey(inputContact); + else + companyHeader=tmpCurrentCompany+'\u0009'+tmpCurrentDepartment+'\u0009'; + } + } + + inputContact.searchvalue=(companyHeader+inputContact.displayvalue).multiReplace(globalSearchTransformAlphabet); + + // CATEGORIES suggestion + for(var i=0;i90 && unicodeValue<97) || (unicodeValue>122 && unicodeValue<127)) + { + headerValue='#'; + inputContact.sortkey='#'+inputContact.sortkey; + } + else + headerValue=inputContact.sortkey.charAt(0).toUpperCase(); + } + else + { + headerValue='#'; + inputContact.sortkey='#'; + } + + headerSortKey=headerValue; + } + + // create the header + var headerObject={headerOnly: true, sortkey: headerSortKey, displayvalue: headerValue}; + + // find the index where to insert the new contact O(n*log(n)) + insertIndex=0; + low=0; + high=this_destination.length-1; + if(this_destination.length>0) + while(low').text(getContactDataColumn(inputContact, columns[i])).appendTo(newElement); + } + + newElement.click(function() { + if($(this).hasClass('ablist_item_selected') || globalObjectLoading) + return false; + else + globalAddressbookList.loadContactByUID(this.getAttribute('data-id')); + }); + + // set the company icon + if(inputContact.isCompany==true) + newElement.addClass('company'); + + if(typeof globalDisableDragAndDrop=='undefined' || globalDisableDragAndDrop!=true) + newElement.draggable({ + delay: 250, + revert: 'invalid', + scroll: false, + opacity: 0.8, + stack: '#SystemCardDavMATE', + containment: '#SystemCardDavMATE', + appendTo: 'body', + start: function( event, ui ){ + // disallow on read-only collection + if(globalResourceCardDAVList.getCollectionPrivByUID($(this).attr('data-id').replace(RegExp('[^/]*$'),''))==true) + return false; + }, + helper: function(){ + $('#ResourceCardDAVList').find('.resourceCardDAV.ui-droppable').droppable( 'option', 'accept', false); + $('#ResourceCardDAVList').find('.group.ui-droppable').droppable( 'option', 'accept', false); + + $('#ResourceCardDAVList').find('.resourceCardDAV[data-id!='+jqueryEscapeSelector($(this).attr('data-id').replace(RegExp('[^/]+$'),''))+'].ui-droppable').droppable( 'option', 'accept', '.ablist_item'); + var myContactGroups=globalAddressbookList.getMyContactGroups($(this).attr('data-id')); + $('#ResourceCardDAVList').find('.group[data-id^='+jqueryEscapeSelector($(this).attr('data-id').replace(RegExp('[^/]+$'),''))+'].ui-droppable').each(function(index, element){ + if(myContactGroups.indexOf($(element).attr('data-id'))==-1) + $(element).droppable( 'option', 'accept', '.ablist_item'); + }); + + var tmp=$(this).clone(); + tmp.addClass('ablist_item_dragged'); + // we cannot use .css() here, because we need to add !important (problem with Gecko based browsers) + var tmp_style='max-width: '+$(this).outerWidth()+'px;'; + if($(this).css('background-image')!='none') + tmp_style+='background-image: url(images/company_s_w.svg) !important;'; + tmp.attr('style', tmp_style); + + return tmp; + } + }); + + globalRefABListTable.children().eq(insertIndex+headerMiss-1).after(newElement); + + if($('#vCardEditor').attr('data-editor-state')=='edit') + { + if((selected_contact=globalRefABListTable.children('.ablist_item_selected')).length==1) + globalRefABList.scrollTop(globalRefABList.scrollTop()+selected_contact.offset().top-globalRefABList.offset().top-globalRefABList.height()*globalKBNavigationPaddingRate); + } +// toto tu asi nahradit zavolanim trigger('click') co vyrazne sprehladni kod +// => + // load the updated contact (because we first deleted it, we need to set it active) + if(makeActive!=null) + { + // make the contact active + globalRefABListTable.children('.ablist_item.ablist_item_selected').removeClass('ablist_item_selected'); + globalRefABListTable.children().eq(insertIndex+headerMiss).addClass('ablist_item_selected'); + this.loadContactByUID(makeActive); + } + } + } + + this.renderContacs=function() + { + var this_destination=this.contacts; + var this_destination_hash=this.contacts_hash; + + var tmpResultObject=[]; + + for(var i=0;i').text(getContactDataColumn(this_destination[i], columns[j])).appendTo(newElement); + } + for(; j').appendTo(newElement); + } + + newElement.click(function() { + if($(this).hasClass('ablist_item_selected') || globalObjectLoading) + return false; + else + globalAddressbookList.loadContactByUID(this.getAttribute('data-id')); + }); + + // set the company icon + if(this_destination[i].isCompany==true) + newElement.addClass('company'); + + if(typeof globalDisableDragAndDrop=='undefined' || globalDisableDragAndDrop!=true) + newElement.draggable({ + delay: 250, + revert: 'invalid', + scroll: false, + opacity: 0.8, + stack: '#SystemCardDavMATE', + containment: '#SystemCardDavMATE', + appendTo: 'body', + start: function( event, ui ){ + // disallow on read-only collection + if(globalResourceCardDAVList.getCollectionPrivByUID($(this).attr('data-id').replace(RegExp('[^/]*$'),''))==true) + return false; + }, + helper: function(){ + $('#ResourceCardDAVList').find('.resourceCardDAV.ui-droppable').droppable( 'option', 'accept', false); + $('#ResourceCardDAVList').find('.group.ui-droppable').droppable( 'option', 'accept', false); + + $('#ResourceCardDAVList').find('.resourceCardDAV[data-id!='+jqueryEscapeSelector($(this).attr('data-id').replace(RegExp('[^/]+$'),''))+'].ui-droppable').droppable( 'option', 'accept', '.ablist_item'); + var myContactGroups=globalAddressbookList.getMyContactGroups($(this).attr('data-id')); + $('#ResourceCardDAVList').find('.group[data-id^='+jqueryEscapeSelector($(this).attr('data-id').replace(RegExp('[^/]+$'),''))+'].ui-droppable').each(function(index, element){ + if(myContactGroups.indexOf($(element).attr('data-id'))==-1) + $(element).droppable( 'option', 'accept', '.ablist_item'); + }); + + var tmp=$(this).clone(); + tmp.addClass('ablist_item_dragged'); + // we cannot use .css() here, because we need to add !important (problem with Gecko based browsers) + var tmp_style='max-width: '+$(this).outerWidth()+'px;'; + if($(this).css('background-image')!='none') + tmp_style+='background-image: url(images/company_s_w.svg) !important;'; + tmp.attr('style', tmp_style); + + return tmp; + } + }); + } + tmpResultObject.push(newElement); + } + + globalRefABListTable.empty().append(tmpResultObject); + } + + this.removeContact=function(inputUid, loadNext, isFromPUT) + { + if(!(inputUid instanceof Array)) + inputUid=[inputUid]; + var tmpRex=new RegExp('/[^/]*$',''); + + // Apple "group" vCards + for(var i=inputUid.length-1;i>=0;i--) + for(var j=this.vcard_groups[inputUid[i].replace(tmpRex,'/')].length-1;j>=0;j--) + if(inputUid.indexOf(this.vcard_groups[inputUid[i].replace(tmpRex,'/')][j].uid)!=-1) + return this.removeContactGroup(inputUid[i], loadNext); + + for(var i=this.contacts.length-1;i>=0;i--) + if(this.contacts[i]!=undefined&&inputUid.indexOf(this.contacts[i].uid)!=-1) + { + var inUID=this.contacts[i].uid; + // CATEGORIES suggestion + var categoriesArr=vcardSplitValue(this.contacts[i].categories,','); + for(var j=0;j"group.", [2]->"name", [3]->";param;param", [4]->"value" + parsed=vcard_element[0].match(vCard.pre['contentline_parse']); + orgArr[orgArr.length]=vcardUnescapeValue(vcardSplitValue(parsed[4],';')[0]); + + // remove the processed parameter + tmp=tmp.replace(vcard_element[0],'\r\n'); + } + for(var j=0;j=0;j--) + if(this.contacts[j].headerOnly!=true && this.contacts[j].show==true) + { + nextCandidateToLoad=this.contacts[j]; + break; + } + } + + // remove the item + item.remove(); + this.contacts.splice(i,1); + if(this.contacts_hash[inUID]!=undefined) + { + delete this.contacts_hash_uidattr[this.contacts_hash[inUID].uidattr]; + delete this.contacts_hash[inUID]; + } + else if(this.companies_hash[inUID]!=undefined) + { + delete this.companies_hash_uidattr[this.contacts_hash[inUID].uidattr]; + delete this.companies_hash[inUID]; + } + + // remove the header if there is no more contact + var removeHeader=true; + var prevHeader=null; + // find the previous header index + for(var j=i-1;j>=0;j--) + if(this.contacts[j].headerOnly!=undefined && this.contacts[j].headerOnly==true) + { + prevHeader=j; + break; + } + + // check for contact existence for the found header + if((prevHeader+1)=0;i--) + if(this.contacts[i]!=undefined /* because the header can be deleted with the contact */ && this.contacts[i].timestamp!=undefined && this.contacts[i].uid.indexOf(inputUidBase)==0 && this.contacts[i].timestamp no animation */ + globalObjectLoading=false; // re-enable keyboard navigation + }); + else + { + $('#ABContactColor').css('background-color', ''); + $('#ABContact').empty(); + globalDisableAnimationMessageHiding='contactRfcNotCompliant'; + var tmpTime=show_editor_message('out','message_error', localization[globalInterfaceLanguage].contactRfcNotCompliant, globalHideInfoMessageAfter); + setTimeout(function(){globalObjectLoading=false;}, tmpTime); // re-enable keyboard navigation + } + // Make the selected contact active + globalRefABListTable.children('.ablist_item.ablist_item_selected').removeClass('ablist_item_selected'); + globalRefABListTable.children('[data-id='+jqueryEscapeSelector(this.contacts_hash[inputUID].uid)+']').addClass('ablist_item_selected'); + this.contactToReload=null; + if(globalRefABListTable.children('[data-id='+jqueryEscapeSelector(this.contacts_hash[inputUID].uid)+']:visible').length>0&&$('#ABInMessageEditBox').css('display')!='none') + { + animate_message('#ABInMessageEditBox', '#ABInMessageTextEditBox', 0, '-='); + $('#ABInMessageEditBox').css('display',''); + + } + else if(globalRefABListTable.children('[data-id='+jqueryEscapeSelector(this.contacts_hash[inputUID].uid)+']:visible').length==0&&$('#ABInMessageEditBox').css('display')=='none') + { + this.contactToReload=this.contacts_hash[inputUID]; + globalDisableAnimationMessageHiding='errContactHidden'; + $('#ABInMessageEditBox').css('display','block'); + $('#ABInMessageTextEditBox').attr('class','message_success'); + $('#ABInMessageTextEditBox').text(localization[globalInterfaceLanguage][globalDisableAnimationMessageHiding]); + animate_message('#ABInMessageEditBox', '#ABInMessageTextEditBox', globalHideInfoMessageAfter); + } + if($('#ResourceCardDAVListOverlay').is(':visible')) + { + if($('#ABContactOverlay').is(':visible')) + { + var animation = 400; + var duration = globalHideInfoMessageAfter + 2*animation; + setTimeout(function(){ + $('#ResourceCardDAVListOverlay').fadeOut(animation); + $('#ABListOverlay').fadeOut(animation,function(){}); + $('#ABContactOverlay').fadeOut(animation,function(){globalRefAddContact.prop('disabled',false);}); + },duration-animation); + } + else + { + $('#ResourceCardDAVListOverlay').fadeOut(globalEditorFadeAnimation); + $('#ABListOverlay').fadeOut(globalEditorFadeAnimation,function(){}); + } + } + } + else + { + $('#ABContactColor').css('background-color', ''); + $('#ABContact').empty(); +// CardDAVeditor_cleanup(false, false); // editor initialization + } + checkContactFormScrollBar(); + } + + this.loadContactByVcard=function(vcard, color, isCompany, inputEditorMode, inputEditorLockedEntries) + { +// sem callback pre index.html a v pripade ak pridavame usera (nie firmu) pridat do vcard prislusny atribut + if(typeof(globalContactsExtLoadByVcardBefore)=='function') + vcard=globalContactsExtLoadByVcardBefore(vcard, isCompany); + + var loadContact=new Object(); + loadContact.vcard=vcard; + loadContact.isCompany=isCompany; + loadContact.color=color; + + globalObjectLoading=true; // temporary disable keyboard navigation + if(vcardToData(loadContact, false /* XXX check this */, isCompany, inputEditorMode, inputEditorLockedEntries)) + $('#EditorBox').fadeTo(0, 1, function(){ /* 0 => no animation */ + // append the UID of previous contact into "data-id" for "cancel" functionality + $('#vCardEditor').find('[data-type="cancel"]').attr('data-id', globalAddressbookList.getLoadedContactUID()); + this.contactLoaded=null; // do not do this earlier + globalObjectLoading=false; // re-enable keyboard navigation + }); + else + { + // todo: replace with icon or text in the editor div + globalDisableAnimationMessageHiding='contactRfcNotCompliant'; + show_editor_message('out', 'message_error', localization[globalInterfaceLanguage].contactRfcNotCompliant, globalHideInfoMessageAfter); + this.contactLoaded=null; // do not do this earlier + globalObjectLoading=false; // re-enable keyboard navigation + } + checkContactFormScrollBar(); + } + + // DONE + this.getContactByUID=function(inputUID) + { + // find the inputUID contact + if(this.contacts_hash[inputUID]!=undefined) + return this.contacts_hash[inputUID]; + else + return null; + } + + // DONE + this.getContactGroupByUID=function(inputUID) + { + var collectionUID=inputUID.replace(RegExp('[^/]*$'),''); + for(var i=0;i +# AllowOverride Limit +# = 2.3> +# Require all granted +# +# +# Order allow,deny +# Allow from all +# +# +##################################################################################################### + + + = 2.3> + Require all granted + + + Order allow,deny + Deny from all + + diff --git a/radicale_web/web/infcloud/auth/common.inc b/radicale_web/web/infcloud/auth/common.inc new file mode 100644 index 0000000..419cefb --- /dev/null +++ b/radicale_web/web/infcloud/auth/common.inc @@ -0,0 +1,41 @@ +\n"; + + foreach($array as $k => $v) + { + if(is_numeric($k)) + array_to_xml($v, $skip_top_closing, $level); + else + { + for($j=0; $j<$level; $j++) + $result.=" "; + + $result.="<".htmlspecialchars($k); + if($k=='resources') + $result.=" xmlns=\"urn:com.inf-it:configuration\""; + if($v=='') + $result.=" />\n"; + else + { + $result.=">"; + + if(is_array($v)) + { + $result.="\n"; + array_to_xml($v, $skip_top_closing, $level+1); + for($j=0; $j<$level; $j++) + $result.=" "; + } + else + $result.=htmlspecialchars($v); + + if($level!==0 || $skip_top_closing===false) + $result.="\n"; + } + } + } + return $result; + } +?> \ No newline at end of file diff --git a/radicale_web/web/infcloud/auth/config.inc b/radicale_web/web/infcloud/auth/config.inc new file mode 100644 index 0000000..534e524 --- /dev/null +++ b/radicale_web/web/infcloud/auth/config.inc @@ -0,0 +1,58 @@ +array()); + + // note: if you want to use regex values, then use one of the following formats (the second example is with regex modifier): 're:.*someregex.*[0-9]$' or 're|i:.*someregex.*[0-9]$' + // note: 'crossdomain' and 'withcredentials' are still available but there is NO REASON to use them (crossDomain is detected automatically, and I've never seen anyone who understand when to use withCredentials /there is NO REASON to set it to true!/) + // note: 'syncinterval' was removed - use globalSyncResourcesInterval in config.js instead + $config['accounts']['resources'][]=array( + 'resource'=>array( + 'type'=>array('addressbook'=>'', 'calendar'=>''), + 'href'=>(empty($_SERVER['HTTPS']) ? 'http' : 'https').'://www.server.com:80/caldav.php/'.$_SERVER['PHP_AUTH_USER'].'/', + 'hreflabel'=>'null', // if undefined or empty href value is used (see above) + 'forcereadonly'=>'null', // see auth/doc/example_config_response.xml for proper use, for example: 'forcereadonly'=>array(array('collection'=>'/caldav.php/user/collection/'), array('collection'=>'re:^/caldav.php/user/collection[0-9]/$')), + 'settingsaccount'=>'true', // client properties are saved here (note: set it to true only for ONE account) + 'checkcontenttype'=>'true', // check content-type in the server response (if you cannot see data in the interface /buggy server response/ you may try to disable it) + 'delegation'=>'true', // see auth/doc/example_config_response.xml for proper use, for example: 'delegation'=>array(array('resource'=>'/caldav.php/user%40domain.com/'), array('resource'=>'re|i:^/caldav.php/a[b-x].+/$')), + 'ignorealarms'=>'false', // see auth/doc/example_config_response.xml for proper use, for example: 'ignorealarms'=>array(array('collection'=>'/caldav.php/user/collection/'), array('collection'=>'re:^/caldav.php/user/collection[0-9]/$')), + 'backgroundcalendars'=>'', // see auth/doc/example_config_response.xml for proper use, for example: 'backgroundcalendars'=>array(array('collection'=>'/caldav.php/user/collection/'), array('collection'=>'re|i:^/caldav.php/user/collection[0-9]/$')), + 'userauth'=>array( + 'username'=>$_SERVER['PHP_AUTH_USER'], + 'password'=>$_SERVER['PHP_AUTH_PW'] + ), + 'timeout'=>90000, + 'locktimeout'=>10000 + ) + ); + +/* + // additional accounts + $config['accounts']['resources'][]=array( + 'resource'=>array( + 'type'=>array('addressbook'=>'', 'calendar'=>''), + 'href'=>'http://www.server.com:80/caldav.php/resource/', + 'hreflabel'=>'null', // if undefined or empty href value is used (see above) + 'forcereadonly'=>'null', // see auth/doc/example_config_response.xml for proper use, for example: 'forcereadonly'=>array(array('collection'=>'/caldav.php/user/collection/'), array('collection'=>'re:^/caldav.php/user/collection[0-9]/$')), + 'settingsaccount'=>'false', // client properties are saved here (note: set it to true only for ONE account) + 'checkcontenttype'=>'true', // check content-type in the server response (if you cannot see data in the interface /buggy server response/ you may try to disable it) + 'delegation'=>'true', // see auth/doc/example_config_response.xml for proper use, for example: 'delegation'=>array(array('resource'=>'/caldav.php/user%40domain.com/'), array('resource'=>'re|i:^/caldav.php/a[b-x].+/$')), + 'ignorealarms'=>'false', // see auth/doc/example_config_response.xml for proper use, for example: 'ignorealarms'=>array(array('collection'=>'/caldav.php/user/collection/'), array('collection'=>'re:^/caldav.php/user/collection[0-9]/$')), + 'backgroundcalendars'=>'', // see auth/doc/example_config_response.xml for proper use, for example: 'backgroundcalendars'=>array(array('collection'=>'/caldav.php/user/collection/'), array('collection'=>'re|i:^/caldav.php/user/collection[0-9]/$')), + 'userauth'=>array( + 'username'=>$_SERVER['PHP_AUTH_USER'], + 'password'=>$_SERVER['PHP_AUTH_PW'] + ), + 'timeout'=>90000, + 'locktimeout'=>10000 + ) + ); +*/ + +?> \ No newline at end of file diff --git a/radicale_web/web/infcloud/auth/cross_domain.inc b/radicale_web/web/infcloud/auth/cross_domain.inc new file mode 100644 index 0000000..a6a10e0 --- /dev/null +++ b/radicale_web/web/infcloud/auth/cross_domain.inc @@ -0,0 +1,14 @@ + \ No newline at end of file diff --git a/radicale_web/web/infcloud/auth/doc/example_config_response.xml b/radicale_web/web/infcloud/auth/doc/example_config_response.xml new file mode 100644 index 0000000..9568049 --- /dev/null +++ b/radicale_web/web/infcloud/auth/doc/example_config_response.xml @@ -0,0 +1,88 @@ + + + + + + + http://www.server.com:8080/principals/users/user/ + + null + null + false + true + true + true + false + + + user + password + + 90000 + 10000 + + + + + + + http://www.server2.com:80/caldav.php/user/ + + null + true + false + false + true + + /caldav.php/user/ + /principals/users/user%40domain.com/ + re:^/caldav.php/a[b-x].+/$ + re|i:^/caldav.php/a[b-x].+/$ + + + /caldav.php/user/collection/ + /caldav.php/user%40domain.com/collection/ + re:^/caldav.php/user/collection[0-9]/$ + re|i:^/caldav.php/user/collection[0-9]/$ + + + /caldav.php/user/collection/ + /caldav.php/user%40domain.com/collection/ + re:^/caldav.php/user/collection[0-9]/$ + re|i:^/caldav.php/user/collection[0-9]/$ + + + user + password + + 90000 + 10000 + + + + + + + https://www.server3.com:8443/caldav.php/user/ + + null + + /caldav.php/user/collection/ + /caldav.php/user%40domain.com/collection/ + re:^/caldav.php/user/collection[0-9]/$ + re|i:^/caldav.php/user/collection[0-9]/$ + + false + false + true + false + false + + + user + password + + 90000 + 10000 + + diff --git a/radicale_web/web/infcloud/auth/doc/readme.txt b/radicale_web/web/infcloud/auth/doc/readme.txt new file mode 100644 index 0000000..860d29c --- /dev/null +++ b/radicale_web/web/infcloud/auth/doc/readme.txt @@ -0,0 +1,7 @@ +1.) configure your auth method (see the plugins directory) and the response XML in auth/config.inc and set $config['auth_send_authenticate_header']=true +2.) configure the selected auth module in plugins/PLUGIN_conf.inc +3.) check the correct response by visiting http://your-server.com/client_dir/auth/ and entering username and password +4.) set $config['auth_send_authenticate_header']=false in auth/config.inc + +By default the generic plugin is used for basic HTTP authentication ($config['auth_method']='generic'; in config.inc). + diff --git a/radicale_web/web/infcloud/auth/index.php b/radicale_web/web/infcloud/auth/index.php new file mode 100644 index 0000000..e92f005 --- /dev/null +++ b/radicale_web/web/infcloud/auth/index.php @@ -0,0 +1,33 @@ + + + + 401 Authorization Required + + +

Authorization Required

+

This server could not verify that you are authorized to access the document requested. Either you supplied the wrong credentials (e.g., bad password), or your browser doesn't understand how to supply the credentials required.

+ + +HTML; + exit(0); + } + else + { + header('Content-type: text/xml; charset="utf-8"'); + header('Cache-Control: max-age=0, must-revalidate, no-cache, no-store, no-transform, private'); + echo array_to_xml($config['accounts']); + } +?> \ No newline at end of file diff --git a/radicale_web/web/infcloud/auth/plugins/generic.inc b/radicale_web/web/infcloud/auth/plugins/generic.inc new file mode 100644 index 0000000..8e6b14b --- /dev/null +++ b/radicale_web/web/infcloud/auth/plugins/generic.inc @@ -0,0 +1,58 @@ +\n"; + return -2; + } + else + { + $request=""; + + $out="PROPFIND ".$pluginconfig['request']." HTTP/1.1\r\n"; + $out.="Host: $hostname_clean\r\n"; + $out.="Authorization: Basic ".base64_encode($_SERVER['PHP_AUTH_USER'].':'.$_SERVER['PHP_AUTH_PW'])."\r\n"; + $out.="Depth: 0\r\n"; + $out.="Content-Type: text/xml; charset=\"utf-8\"\r\n"; + $out.="Content-Length:". strlen($request)."\r\n\r\n"; + $out.=$request; + fwrite($fp, $out); + + $result=''; + if(!feof($fp)) + $result.=fgets($fp); + fclose($fp); + + if(strpos($result, 'HTTP/1.1 207')===0) + return 1; // auth successful + else + return -1; // auth unsuccessful + } + } + return 0; // empty username or password + } +?> \ No newline at end of file diff --git a/radicale_web/web/infcloud/auth/plugins/generic_conf.inc b/radicale_web/web/infcloud/auth/plugins/generic_conf.inc new file mode 100644 index 0000000..01c2b32 --- /dev/null +++ b/radicale_web/web/infcloud/auth/plugins/generic_conf.inc @@ -0,0 +1,12 @@ + \ No newline at end of file diff --git a/radicale_web/web/infcloud/auth/plugins/ldap.inc b/radicale_web/web/infcloud/auth/plugins/ldap.inc new file mode 100644 index 0000000..f7012e5 --- /dev/null +++ b/radicale_web/web/infcloud/auth/plugins/ldap.inc @@ -0,0 +1,37 @@ + \ No newline at end of file diff --git a/radicale_web/web/infcloud/auth/plugins/ldap_conf.inc b/radicale_web/web/infcloud/auth/plugins/ldap_conf.inc new file mode 100644 index 0000000..c9242c7 --- /dev/null +++ b/radicale_web/web/infcloud/auth/plugins/ldap_conf.inc @@ -0,0 +1,12 @@ + \ No newline at end of file diff --git a/radicale_web/web/infcloud/cache.manifest b/radicale_web/web/infcloud/cache.manifest new file mode 100644 index 0000000..973f958 --- /dev/null +++ b/radicale_web/web/infcloud/cache.manifest @@ -0,0 +1,167 @@ +CACHE MANIFEST +#V 20150922153011 + +CACHE: +addressbook.js +common.js +config.js +data_process.js +forms.js +interface.js +localization.js +main.js +resource.js +timezones.js +vcalendar.js +vcalendar_rfc_regex.js +vcard_rfc_regex.js +vtodo.js +webdav_protocol.js +css/default.css +css/default_ie.css +css/default_integration.css +css/fullcalendar.css +css/jquery.tagsinput.css +css/jquery-ui.custom.css +css/spectrum.custom.css +fonts/Roboto-BoldItalic-webfont.eot +fonts/Roboto-BoldItalic-webfont.svg +fonts/Roboto-BoldItalic-webfont.ttf +fonts/Roboto-BoldItalic-webfont.woff +fonts/Roboto-Bold-webfont.eot +fonts/Roboto-Bold-webfont.svg +fonts/Roboto-Bold-webfont.ttf +fonts/Roboto-Bold-webfont.woff +fonts/Roboto-Italic-webfont.eot +fonts/Roboto-Italic-webfont.svg +fonts/Roboto-Italic-webfont.ttf +fonts/Roboto-Italic-webfont.woff +fonts/Roboto-LightItalic-webfont.eot +fonts/Roboto-LightItalic-webfont.svg +fonts/Roboto-LightItalic-webfont.ttf +fonts/Roboto-LightItalic-webfont.woff +fonts/Roboto-Light-webfont.eot +fonts/Roboto-Light-webfont.svg +fonts/Roboto-Light-webfont.ttf +fonts/Roboto-Light-webfont.woff +fonts/Roboto-MediumItalic-webfont.eot +fonts/Roboto-MediumItalic-webfont.svg +fonts/Roboto-MediumItalic-webfont.ttf +fonts/Roboto-MediumItalic-webfont.woff +fonts/Roboto-Medium-webfont.eot +fonts/Roboto-Medium-webfont.svg +fonts/Roboto-Medium-webfont.ttf +fonts/Roboto-Medium-webfont.woff +fonts/Roboto-Regular-webfont.eot +fonts/Roboto-Regular-webfont.svg +fonts/Roboto-Regular-webfont.ttf +fonts/Roboto-Regular-webfont.woff +images/add_cal.svg +images/add_cal_white.svg +images/arrow_next_red.svg +images/arrow_next.svg +images/arrow_prev_red.svg +images/arrow_prev.svg +images/arrow.svg +images/banner_addressbook.svg +images/banner_calendar.svg +images/banner_logout.svg +images/banner_refresh.svg +images/banner_todo.svg +images/calendarB.svg +images/cdm_logo.svg +images/cdz_logo.svg +images/cloud.svg +images/company_s_b.svg +images/company.svg +images/company_s_w.svg +images/delegation.svg +images/dp_left.svg +images/dp_right.svg +images/drag.svg +images/error_badge.svg +images/error_b.svg +images/error_w.svg +images/infcloud_logo.svg +images/in_progress_b.svg +images/in_progress_dr.svg +images/in_progress_r.svg +images/in_progress_w.svg +images/jumper_bottom_b.svg +images/jumper_bottom_w.svg +images/jumper_top_b.svg +images/jumper_top_w.svg +images/loadinfo.gif +images/loadinfo_s1.gif +images/loadinfo_s2.gif +images/loadinfo_s3.gif +images/loadinfo_s4.gif +images/login.svg +images/logout.svg +images/needs_action_b.svg +images/needs_action_dr.svg +images/needs_action_r.svg +images/needs_action_w.svg +images/new_item.svg +images/op_add.svg +images/op_del.svg +images/popupArrow.svg +images/priority-1-dr.svg +images/priority-1-r.svg +images/priority-1.svg +images/priority-1-w.svg +images/priority-2-dr.svg +images/priority-2-r.svg +images/priority-2.svg +images/priority-2-w.svg +images/priority-3-dr.svg +images/priority-3-r.svg +images/priority-3.svg +images/priority-3-w.svg +images/read_only_b.svg +images/read_only_w.svg +images/remove_cal.svg +images/remove_cal_white.svg +images/reset_b.svg +images/reset_dr.svg +images/reset_drw.svg +images/reset_r.svg +images/reset_rw.svg +images/reset_w.svg +images/resource_arrow_down.svg +images/resource_arrow_right.svg +images/resource_arrow_up.svg +images/resources.svg +images/search.svg +images/searchWhiteNew.svg +images/select_bg_black.svg +images/select_bg_dis.svg +images/select_bg.svg +images/select_black.svg +images/select_dis.svg +images/select_inv.svg +images/select_login.svg +images/select.svg +images/success_b.svg +images/success_dr.svg +images/success_drw.svg +images/success_r.svg +images/success_rw.svg +images/success_w.svg +images/todoB.svg +images/user.svg +lib/fullcalendar.js +lib/ie_base64.js +lib/jquery-2.1.4.min.js +lib/jquery.autosize.js +lib/jquery.browser.js +lib/jquery.placeholder-1.1.9.js +lib/jquery.quicksearch.js +lib/jquery.tagsinput.js +lib/jquery-ui-1.11.4.custom.js +lib/jshash-2.2_sha256.js +lib/rrule.js +lib/spectrum.js + +NETWORK: +* diff --git a/radicale_web/web/infcloud/cache_handler.js b/radicale_web/web/infcloud/cache_handler.js new file mode 100644 index 0000000..e21fb63 --- /dev/null +++ b/radicale_web/web/infcloud/cache_handler.js @@ -0,0 +1,79 @@ +// OFFLINE CACHE DEBUGGING + +/*var cacheStatusValues=[]; +cacheStatusValues[0]='uncached'; +cacheStatusValues[1]='idle'; +cacheStatusValues[2]='checking'; +cacheStatusValues[3]='downloading'; +cacheStatusValues[4]='updateready'; +cacheStatusValues[5]='obsolete'; + +var cache=window.applicationCache; +cache.addEventListener('cached', logEvent, false); +cache.addEventListener('checking', logEvent, false); +cache.addEventListener('downloading', logEvent, false); +cache.addEventListener('error', logEvent, false); +cache.addEventListener('noupdate', logEvent, false); +cache.addEventListener('obsolete', logEvent, false); +cache.addEventListener('progress', logEvent, false); +cache.addEventListener('updateready', logEvent, false); + +function logEvent(e) +{ + var online, status, type, message; + online=(navigator.onLine) ? 'yes' : 'no'; + status=cacheStatusValues[cache.status]; + type=e.type; + message='online: '+online; + message+=', event: '+type; + message+=', status: '+status; + if(type=='error' && navigator.onLine) + message+=' (prolly a syntax error in manifest)'; + console.log(message); +} + +window.applicationCache.addEventListener('updateready', function(){ + window.applicationCache.swapCache(); + console.log('swap cache has been called'); + }, false +); + +//setInterval(function(){cache.update()}, 10000);*/ + +// Check if a new cache is available on page load. +window.addEventListener('load', function(e) +{ + window.applicationCache.addEventListener('cached', function(e) + { + if(!isUserLogged) + window.location.reload(); + else + $('#cacheDialog').css('display','block'); + }, false); + + window.applicationCache.addEventListener('updateready', function(e) + { + if(!isUserLogged) + window.location.reload(); + else + $('#cacheDialog').css('display','block'); + }, false); + + window.applicationCache.addEventListener('obsolete', function(e) + { + if(!isUserLogged) + window.location.reload(); + else + $('#cacheDialog').css('display','block'); + }, false); + + window.applicationCache.addEventListener('noupdate', function(e) + { + if(!isUserLogged) + { + clearInterval(globalCacheUpdateInterval); + globalCacheUpdateInterval=setInterval(function(){window.applicationCache.update();}, 300000); + //$('#LoginPage .window').css('display', 'inline-block'); + } + }, false); +}, false); diff --git a/radicale_web/web/infcloud/cache_update.sh b/radicale_web/web/infcloud/cache_update.sh new file mode 100755 index 0000000..77f8670 --- /dev/null +++ b/radicale_web/web/infcloud/cache_update.sh @@ -0,0 +1,5 @@ +#! /bin/bash +# Use this script every time you modify any file to force browsers to reload it (empty HTML5 cache). + +command -v ed &> /dev/null || { echo "Error: 'ed' not installed. Aborting." > /dev/stderr; exit 1; } +printf ",s/#V.*/#V $(date '+%Y%m%d%H%M%S')/\nw\nq\n" | ed -s cache.manifest diff --git a/radicale_web/web/infcloud/changelog.txt b/radicale_web/web/infcloud/changelog.txt new file mode 100644 index 0000000..386820f --- /dev/null +++ b/radicale_web/web/infcloud/changelog.txt @@ -0,0 +1,17 @@ +InfCloud Changelog + +version 0.13.1 [2015-09-22]: + - includes CalDavZAP 0.13.1 (see changelog_caldavzap.txt) + - includes CardDavMATE 0.13.1 (see changelog_carddavmate.txt) + +version 0.13.0 [2015-09-16]: + - includes CalDavZAP 0.13.0 (see changelog_caldavzap.txt) + - includes CardDavMATE 0.13.0 (see changelog_carddavmate.txt) + +version 0.12.1 [2015-03-16]: + - includes CalDavZAP 0.12.1 (see changelog_caldavzap.txt) + - includes CardDavMATE 0.12.1 (see changelog_carddavmate.txt) + +version 0.12.0 [2015-01-26]: + - includes CalDavZAP 0.12.0 (see changelog_caldavzap.txt) + - includes CardDavMATE 0.12.0 (see changelog_carddavmate.txt) diff --git a/radicale_web/web/infcloud/changelog_caldavzap.txt b/radicale_web/web/infcloud/changelog_caldavzap.txt new file mode 100644 index 0000000..18ccfab --- /dev/null +++ b/radicale_web/web/infcloud/changelog_caldavzap.txt @@ -0,0 +1,294 @@ +CalDavZAP Changelog + + +NOTE: if you are interested in integrated version of CalDavZAP and CardDavMATE (our CardDAV web client) please use InfCloud - http://www.inf-it.com/open-source/clients/infcloud/ + +version 0.13.1 [2015-09-22]: +- note: do not forget to execute the cache_update.sh script every time you update your configuration or any other file (otherwise your browser will use the previous version of files stored in HTML5 cache); alternatively you can update the cache.manifest manually - edit the second line beginning with "#V 20" to anything else (this file simple needs "some" change) +- changed login screen autocomplete behaviour - we do not prevent browsers from remembering login/password anymore + +version 0.13.0 [2015-09-16]: +- note: do not forget to execute the cache_update.sh script every time you update your configuration or any other file (otherwise your browser will use the previous version of files stored in HTML5 cache); alternatively you can update the cache.manifest manually - edit the second line beginning with "#V 20" to anything else (this file simple needs "some" change) +- note: if you use a server with cross-domain setup see the modified Access-Control-Allow-Headers and Access-Control-Expose-Headers in readme.txt (or misc/config_davical.txt or misc/calendarserver.diff); you MUST update these headers, otherwise the client will NOT work +- configuration - added globalEnableRefresh option which enables/disables the new "refresh all resources" icon in the left application menu (disabled by default) +- added Chinese localization (zh_CN) - thanks Fandy +- added shift+login shortcut to ignore settings stored on the server and use the default settings (this functionality was added long time ago, but I forgot to mention about it) +- added support for "Prefer: return=representation" (and related "Preference-Applied: return=representation") for PUT requests (see http://tools.ietf.org/html/rfc7240); this change REQUIRES update of Access-Control-Allow-Headers and Access-Control-Expose-Headers if cross-domain setup is used +- added full RFC2445 support - RRULE processing is now performed by rrule.js (see: https://github.com/jakubroztocil/rrule); thanks to this library we now support/expand all recurrences, although the most exotic ones are "read-only" (for these you will see "Other (modification not supported)" in the interface) +- added DESCRIPTION property for VALARM components to make them RFC compliant +- added check for unsupported XML 1.0 characters in user entered data - these are replaced by a space character (to prevent client and/or server side parsing errors) +- added title with version number for the software name/description (login screen) +- added vCalendar line folding (RFC2445 - section 4.1) +- fixed event processing when multiple VEVENT and VTIMEZONE components are intermingled +- fixed VTODO COMPLETED property (UTC time format) +- fixed alarm window not being localized properly +- fixed an occasional issue where all collections are double loaded on login +- changed version checking - use internal build number for software version comparison to support update notification also for beta and rc builds +- changed format and comments in config.js +- changed storing of user settings (PROPPATCH request) - no server request will be made if there is no change in settings +- updated jQuery to 2.1.4 +- updated localizations - thanks Niels Bo Andersen [da_DK], Marten Gajda [de_DE], Damian Vila [es_ES], Gabriela Vattier [fr_FR], Luca Ferrario [it_IT], Muimu Nakayama [ja_JP], Johan Vromans [nl_NL], Selcuk Pultar [tr_TR], Александр Симонов [ru_RU], Serge Yakimchuck [uk_UA] +- updated timezone.js to latest IANA timezone database +- other improvements and fixes + +version 0.12.1 [2015-03-16]: +- note: do not forget to execute the cache_update.sh script every time you update your configuration or any other file (otherwise your browser will use the previous version of files stored in HTML5 cache); alternatively you can update the cache.manifest manually - edit the second line beginning with "#V 20" to anything else (this file simple needs "some" change) +- note: you NEED to enable "mod_headers" in Apache (for other servers see your server documentation) which is used to generate proper HTTP headers (required for correct support of HTML5 cache in browsers); the previously used mod_expire is not longer used (see the changelog entry below) +- added support for absolute collection URLs returned in PROPFIND request +- fixed HTML5 cache related problems (especially in Firefox) by returning "Cache-Control: max-age=0, must-revalidate, no-cache, no-transform, private" header instead of "Cache-Control: max-age=0" - this fix requires enabled "mod_headers" (you can disable the previously used "mod_expires") in Apache - for more details see .htaccess +- fixed processing of the language parameter in the title of event/todo +- changed displaying of event/todo calendar list in event/todo form - now it is possible to create new event/todo also into inactive event/todo collection +- updated jQuery-UI to 1.11.4 +- other improvements and fixes + +version 0.12.0 [2015-01-26]: +- note: do not forget to execute the cache_update.sh script every time you update your configuration or any other file (otherwise your browser will use the previous version of files stored in HTML5 cache); alternatively you can update the cache.manifest manually - edit the second line beginning with "#V 20" to anything else (this file simple needs "some" change) +- configuration - added globalDefaultEventDuration configuration variable - set the default duration (in minutes) for newly created events +- added widened todo list with dynamic number of columns +- added checkboxes for todos in the todo list - now you can change the status of a todo by clicking on its checkbox +- added duplicate button for copying of events/todos +- fixed loading of future/past todos - now the loading of additional future/past todos is performed also by clicking on datepicker calendar (in the todo list view) +- updated jQuery to 2.1.3 +- updated jQuery-UI to 1.11.2 +- other improvements and fixes + +version 0.11.1 [2014-10-07]: +- note: do not forget to execute the cache_update.sh script every time you update your configuration or any other file (otherwise your browser will use the previous version of files stored in HTML5 cache); alternatively you can update the cache.manifest manually - edit the second line beginning with "#V 20" to anything else (this file simple needs "some" change) +- updated timezone.js to latest IANA timezone database +- updated jQuery to 2.1.1 +- updated jQuery-UI to 1.11.1 +- fixed calendar color change functionality +- other improvements and fixes + +version 0.11.0 [2014-10-02]: +- note: do not forget to execute the cache_update.sh script every time you update your configuration or any other file (otherwise your browser will use the previous version of files stored in HTML5 cache); alternatively you can update the cache.manifest manually - edit the second line beginning with "#V 20" to anything else (this file simple needs "some" change) +- note: this release contains new, changed and also removed configuration options (always use the latest config.js) +- configuration - removed showHeader option from globalAccountSettings, globalNetworkCheckSettings and globalNetworkAccountSettings - it is incompatible with new functionality +- configuration - added globalCrossServerSettingsURL configuration option - enable this option if your CalDavZAP installation is accessible from multiple URLs (URL1, URL2), otherwise settings (such as enabled/active collections) stored from the URL1 will be incompatible with settings stored from URL2 +- configuration - added globalCalendarColorPropertyXmlns configuration option - used to define the namespace for calendar-color property (see below) +- configuration - changed default value for delegation option to true (in globalAccountSettings, globalNetworkCheckSettings and globalNetworkAccountSettings) +- configuration - changed default value for globalEventStartPastLimit and globalEventStartFutureLimit from 2 to 3 +- added Japan localization (ja_JP) - thanks Muimu Nakayama +- added support for loading and unloading of user collections and delegated collections (delegation functionality) +- added support for calendar color change (write support for calendar-color property) +- added arrow icons for agenda views to indicate out of view events +- added currently logged user into the page title +- added hover element for calendar events +- updated localizations - thanks Michael Rasmussen [da_DK], Marten Gajda [de_DE], Damián Vila [es_ES], Jean-Christophe Bach [fr_FR], Luca Ferrario [it_IT], Johan Vromans [nl_NL], Selcuk Pultar [tr_TR], Александр Симонов [ru_RU], Yevgen Martsenyuk [uk_UA] +- fixed occasional wrong UID processing when moving events/todos between different calendar collections +- fixed issues with subscribed calendars +- fixed processing of alarms +- fixed an occasional parseDate bug due to daylight saving time in specific timezones +- various fixes, optimalizations, improvements, visual updates and more + +version 0.10.0.5 [2014-04-14]: +- note: do not forget to execute the cache_update.sh script every time you update your configuration or any other file (otherwise your browser will use the previous version of files stored in HTML5 cache); alternatively you can update the cache.manifest manually - edit the second line beginning with "#V 20" to anything else (this file simple needs "some" change) +- updated Russian localization (ru_RU) +- fixed wrong processing of RECURRENCE-ID property in UTC (Z) timezone +- fixed occasional wrong processing of repeating events generated in future + +version 0.10.0.4 [2014-03-15]: +- note: do not forget to execute the cache_update.sh script every time you update your configuration or any other file (otherwise your browser will use the previous version of files stored in HTML5 cache); alternatively you can update the cache.manifest manually - edit the second line beginning with "#V 20" to anything else (this file simple needs "some" change) +- added Russian localization (ru_RU) - thanks Александр Симонов +- fixed synchronization of removed events for servers without sync-collection report support +- minor translation fixes + +version 0.10.0.3 [2014-03-12]: +- note: do not forget to execute the cache_update.sh script every time you update your configuration or any other file (otherwise your browser will use the previous version of files stored in HTML5 cache); alternatively you can update the cache.manifest manually - edit the second line beginning with "#V 20" to anything else (this file simple needs "some" change) +- added support for LDAP binding in auth/ldap module (see auth/plugins/ldap_conf.inc) +- fixed occasional wrong processing of DTEND attribute +- fixed incorrect creation of recurring events which caused that multiple different UIDs can be present in one calendar object (edit + save of previously created events will split them into multiple objects) + +version 0.10.0.2 [2014-02-17]: +- note: do not forget to execute the cache_update.sh script every time you update your configuration or any other file (otherwise your browser will use the previous version of files stored in HTML5 cache); alternatively you can update the cache.manifest manually - edit the second line beginning with "#V 20" to anything else (this file simple needs "some" change) +- added Ukrainian localization (uk_UA) - thanks Serge Yakimchuck +- added misc/readme_baikal_sabredav.txt and misc/baikal-flat-0.2.7.diff to solve issues related to storing CalDavZAP properties on SabreDAV and Baïkal - thanks Johannes Zellner +- fixed invalid XML response processing (SabreDAV and Baïkal) +- fixed invalid XML request if globalEventStartPastLimit and globalEventStartFutureLimit are set to null +- fixed "delegation" XML processing +- updated French [fr_FR] localization - thanks Jean-Christophe Bach + +version 0.10.0.1 [2014-02-04]: +- note: do not forget to execute the cache_update.sh script every time you update your configuration or any other file (otherwise your browser will use the previous version of files stored in HTML5 cache); alternatively you can update the cache.manifest manually - edit the second line beginning with "#V 20" to anything else (this file simple needs "some" change) +- added Spanish localization (es_ES) - thanks Damián Vila +- updated jQuery to 2.1.0 +- updated jQuery-UI to 1.10.4 +- changed various default date formats +- changed alarm behaviour - it is no longer possible to create multiple identical alarms (they are automatically merged into one) +- fixed a visual bug when displaying a simple todo alert +- fixed rare issue where UNTIL attribute of recurrent events was not processed correctly + +version 0.10.0 [2014-01-22]: +- note: do not forget to execute the cache_update.sh script every time you update your configuration or any other file (otherwise your browser will use the previous version of files stored in HTML5 cache); alternatively you can update the cache.manifest manually - edit the second line beginning with "#V 20" to anything else (this file simple needs "some" change) +- note: this release contains new, changed and also removed configuration options (always use the latest config.js) +- configuration - added globalEventStartPastLimit and globalEventStartFutureLimit for time-range filtering - note: for servers without time-range filtering support you need to set both variables to null (see config.js) +- configuration - replaced globalInactiveCollections and globalInactiveTodoCollections by globalActiveCalendarCollections and globalActiveTodoCollections (see config.js) +- configuration - removed globalResourceHeaderShowLogin option - it is replaced by much more flexible hrefLabel option in globalAccountSettings and globalNetworkCheckSettings (see config.js) +- configuration - removed syncInterval option from globalAccountSettings and globalNetworkCheckSettings - detection of sync-token changes is now performed by ONE request instead of N (number of collections) - use globalSyncResourcesInterval instead +- configuration - removed crossDomain and withCredentials options from default globalAccountSettings, globalNetworkCheckSettings and globalNetworkAccountSettings - both settings are still available but there is NO REASON to use them (crossDomain is detected automatically, and I've never seen anyone who understand when to use withCredentials /there is NO REASON to set it to true!/) +- major improvements and changes in sychronization code - MUCH reduced number of HTTP request to server +- major design changes (including the open source Roboto font) +- major readme.txt update with detailed descriptions of most common setup problems +- added support for time-range filtering (requires server with time-range filtering support) - EXTREME performance improvements +- added workaround for buggy HTML5 cache handling in the latest Firefox +- added "equivalency" for todo filters (globalAppleRemindersMode) - NEEDS-ACTION, IN-PROGRESS and CANCELLED are processed as NEEDS-ACTION +- added calendar color indicator for event/todo forms (unified with the upcoming CardDavMATE) +- added handling of unsupported settings +- added support for 'headervalue' collection property (namespace: http://inf-it.com/ns/dav/) - useful for collection grouping +- added new overlay with refresh button, when cache manifest change is detected (it forces users to reload the page) +- added support/mapping for alternative timezone names - e.g. 'US/Pacific' (legacy name) is mapped to 'America/Los_Angeles' (current name) +- changed resource list design (unified with the upcoming CardDavMATE) +- changed todo processing if globalAppleRemindersMode is enabled - todos with start and no end are processed as simple todos +- changed displaying of repeating todo confirm question +- changed time-range filtering for todos - all todos from future are loaded from server initially +- updated French [fr_FR] localization - thanks Jean-Christophe Bach +- optimized window resizing functionality +- fixed local timezone processing +- fixed loader hanging after login if subscribed calendar list is empty +- fixed generating of repeating events in future +- fixed RRULE processing if specified in YYYYMMDD format +- fixed displaying of arrows for repeating events +- fixed sorting of resources +- fixed various search issues +- disabled opening of new event/todo form if only read-only collections are present +- removed jQuery source mapping file reference +- LOT of other improvements and fixes + +version 0.9.1.2 [2013-08-05]: +- fixed processing of recurrent events (special recurrences - correct BYMONTHDAY processing) +- fixed globalTimeFormatBasic configuration option processing (it is no longer ignored) +- removed old and unused configuration options (globalDefaultDisplayTodo and globalTodoHideExpired) + +version 0.9.1.1 [2013-07-30]: +- fixed processing of recurrent events with until date +- fixed saving of until dates values in recurrent events +- fixed parsing of double quoted TZID param values + +version 0.9.1 [2013-07-26]: +- note: do not forget to execute the cache_update.sh script every time you update your configuration or any other file (otherwise your browser will use the previous version of files stored in HTML5 cache); alternatively you can update the cache.manifest manually - edit the second line beginning with "#V 20" to anything else (this file simple needs "some" change) +- note: this release contains changed configuration options (always use the latest config.js) +- configuration - changed globalAppleRemindersMode option values - newly supported values are iOS6, iOS7, true (it is set to latest supported iOS - in this case iOS7) and false (see config.js) +- added Turkish localization (tr_TR) - thanks Selcuk Pultar +- updated localizations - thanks Michael Rasmussen [da_DK], Marten Gajda [de_DE], John Fischer [fr_FR], Luca Ferrario [it_IT] and Johan Vromans [nl_NL] +- added additional automatic fixes for invalid events +- added support for STATUS attribute +- added support for CALSCALE attribute (only GREGORIAN is supported; missing attribute = GREGORIAN) +- added automatic change of "time to" after "time from" change (preserve the event/todo duration) +- added support for dynamic height of NOTE field - thanks http://www.jacklmoore.com/autosize/ +- fixed problem with always visible completed todos when globalAppleRemindersMode enabled +- fixed window resize callback +- fixed incorrect detection of privileges for binded resources +- fixed processing of RECURRENCE-ID in events/todos +- fixed parsing of todo/event components with same UID in subscribed calendars +- fixed parsing of due date timezone +- fixed processing of DURATION value for allday events +- fixed problem with multiple URL and LOCATION attributes +- fixed handling of VERSION attribute +- fixed repeating todo and event processing +- fixed timezone picker problems +- updated jQuery to 2.0.3 +- changed default "due date" for todos to date selected in the todo calendar +- other improvements and fixes + +version 0.9.0 [2013-06-27]: +- note: do not forget to execute the cache_update.sh script every time you update your configuration or any other file (otherwise your browser will use the previous version of files stored in HTML5 cache); alternatively you can update the cache.manifest manually - edit the second line beginning with "#V 20" to anything else (this file simple needs "some" change) +- note: if you use DAViCal with cross-domain setup see the modified Apache configuration in misc/config_davical.txt (added Access-Control-Expose-Headers header) +- note: if you use OS X Calendarserver it is recommended to re-patch your installation (added Access-Control-Expose-Headers header; see misc/readme_osx.txt) +- note: this release contains new and also changed configuration options (always use the latest config.js) +- configuration - added globalSettingsType option - set the destination for client settings on server (useful if your server not allows to store properties to "principal-URL" but allows to store them to "calendar-home-set") +- configuration - added checkContentType option into globalAccountSettings and globalNetworkCheckSettings - enables content-type checking for server response (only objects with proper content-type are inserted into interface) - if you cannot see data in the interface you may try to disable it +- configuration - added globalAppleRemindersMode option (enabled by default) - it enables workarounds for Apple clients (see config.js) +- configuration - added globalIgnoreCompletedAlarms option (enabled by default) - it disables alarm for completed todos (see config.js) +- MAJOR performance improvements +- added support for Cyrus server - thanks Ken Murchison +- added support for additional CalDAV servers (should work with the same servers as CardDavMATE) +- added completely new and shiny interface for todos +- added support for additional todo properties and repeating todos +- added support for PRODID property for both events and todos +- added new custom formats for time and day strings based on currently selected localization +- added Hungarian localization (hu_HU) +- changed cache.manifest - cache all image files in HTML5 cache +- changed ordering of calendars in selectbox (globalSortAlphabet is used) +- changed internal logic of resource loading, synchronization and version check functionality (to prepare for integration with CardDavMATE) +- changed minimum height of events to height of "30 minutes" event +- fixed Firefox placeholder colors +- fixed and updated various localization strings +- fixed events and todos sometimes being editable even with forceReadOnly flag enabled +- fixed various timezone processing issues +- fixed visual event form bug when using repeat option with weekend/business days +- fixed current time indicator error during day/week transition +- fixed timezone picker (at the bottom of the resource list) - it is no longer editable using keyboard navigation while editing event/todo +- fixed wrong ajax parameter which may cause warnings in server log +- fixed an issue when timezone picker was not always visible after login +- updated left menu with new icons (thanks Kelecsenyi Timotej - http://timotejos.com/) +- updated jQuery to 2.0.2 (and related fixes) +- updated jQuery-UI to 1.10.3 (and related fixes) +- updated auth module to reflect the latest changes in configuration options +- updated misc directory (it is the same as in CardDavMATE) +- updated localizations - thanks Marten Gajda [de_DE], John Fischer [fr_FR], Luca Ferrario [it_IT] and Johan Vromans [nl_NL] (note: Danish [da_DK] localization contains some untranslated strings) +- LOT of other improvements and fixes + +version 0.8.1.1 [2013-02-25]: +- fixed multiple bugs related to processing of recurrent events +- fixed forced lower case problem of some strings in the interface +- other minor fixes + +version 0.8.1 [2013-02-21]: +- note: do not forget to execute the cache_update.sh script every time you update your configuration or any other file (otherwise your browser will use the previous version of files stored in HTML5 cache) +- added support for background calendars in day view event list +- added missing misc directory +- fixed syntax error if configured using globalAccountSettings +- fixed issues with delegation proccessing if multiple accounts are configured +- fixed issue with pinned tab in Firefox (manual reloading is not required anymore) +- fixed privileges for binded calendars - these are now strictly read only +- fixed wrong proccessing of number of occurrences for recurrent events +- fixed issue where readonly events could still be edited via drag and drop and resizing +- fixed and optimized the "Revert" button functionality +- fixed issue with saving empty URL property +- fixed incorrect alarm box position +- fixed bad positioning of error image for "repeat end" date field + +version 0.8.0 [2013-02-13]: +- note: do not forget to execute the cache_update.sh script every time you update your configuration or any other file (otherwise your browser will use the previous version of files stored in HTML5 cache) +- note: this release contains new configuration option (always use the latest config.js) +- configuration - added globalUseJqueryAuth option - use jQuery .ajax() auth or custom header for HTTP basic auth (default); set this option to true if your server uses digest auth (note: you may experience auth popups on some browsers) +- configuration - added globalRemoveUnknownTimezone (disabled by default) - it removes non-standard/unknown timezones if event/todo is edited (and saved) +- configuration - added delegation option into globalAccountSettings and globalNetworkCheckSettings (sets additional delegated resources - if true then delegation is enabled for all available resources; if false (default) then delegation is disabled; if an array of URL encoded resources or regexes (for example: ['/caldav.php/user/', '/caldav.php/user%40domain.com/', new RegExp('^/caldav.php/a[b-x].+/$', 'i')] then delegation is enabled for all specified resources +- configuration - added ignoreAlarms option into globalAccountSettings and globalNetworkCheckSettings (defines an array calendars with disabled alarm - if true then all alarms are ignored; if false (default) then alarms are enabled; if an array of URL encoded collections or regexes (for example: ['/caldav.php/user/collection/', '/caldav.php/user%40domain.com/collection/', new RegExp('^/caldav.php/user/collection[0-9]/$', 'i')] then alarm is disabled for all specified resources +- configuration - added backgroundCalendars option into globalAccountSettings and globalNetworkCheckSettings - defines an array of background calendars - if there is at least one event defined for the given day in a background calendar, the background color for that day will be pink/light-red; to use this feature define an array of URL encoded collections or regexes (for example: ['/caldav.php/user/collection/', '/caldav.php/user%40domain.com/collection/', new RegExp('^/caldav.php/user/collection[0-9]/$', 'i')]) +- configuration - added user defined time format support for events via globalTimeFormatBasic and globalTimeFormatAgenda variables (see config.js) +- configuration - changed forceReadonly property proccessing - URL encoded collections and also regexes are now supported (see config.js) +- configuration - changed globalCalendarSelected variable proccessing - full UID (for example: http://username@domain.com:8080/caldav.php/user/calendar/) and also UID matching regexes are now supported (see config.js) +- configuration - date and time formats are now predefined for each localization - if you want to use custom date and time formats instead of predefined formats (defined by localizations) use globalAMPMFormat and globalDatepickerFormat variables (commented out by default) +- added Danish localization (da_DK) - thanks Niels Bo Andersen +- added German localization (de_DE) - thanks Marten Gajda and Thomas Scheel +- added Italian localization (it_IT) - thanks Luca Ferrario +- added French localization (fr_FR) - thanks John Fischer +- added Dutch localization (nl_NL) - thanks Johan Vromans +- added additional functionality for today button - now it scrolls the calendar to ensure that the today slot is visible in the top of the view +- added support for fallback to PROPFIND if REPORT is not supported and server returns incorrect 403 error code (instead of 400 or 501) +- added support for events without DTEND or DURATION values +- added support for DURATION property +- added support for CLASS property (Privacy) +- added support for TRANSP property (Availability) +- added support for URL property +- updated timezone.js to latest IANA timezone database +- updated auth module to reflect the latest changes in configuration options +- changed button label from "All future events" to "This and all future events" for more clarity +- changed the "repeat end" option text from "after" to "occurences" for more clarity (event ends after X occurences, including the first one) +- changed event listing in day view - now it scrolls to the very top if the currently displayed day is the first day of month (the button for loading the previous month is now visible) +- changed event listing in day view - now it scrolls to the closest following day if the currently displayed day is not found (no events exist for that day) +- fixed login => logout => relogin as different user bug +- fixed "Unable to save" bug when creating/editing an event/todo +- fixed cache_update.sh - replaced sed by ed due to cross OS compatibility problems +- fixed duplicate scrollbar problem in week and day views +- fixed useless revert button - it is no longer visible when creating a new event or todo +- fixed position of the error image in todo completed field +- fixed processing of UNTIL values in repeating events +- fixed EXDATE value processing and saving +- fixed January specific bug +- fixed BYMONTH value processing - anniversaries +- other improvements and fixes + +version 0.7.0 [2012-11-20]: +- initial public release \ No newline at end of file diff --git a/radicale_web/web/infcloud/changelog_carddavmate.txt b/radicale_web/web/infcloud/changelog_carddavmate.txt new file mode 100644 index 0000000..3059ad9 --- /dev/null +++ b/radicale_web/web/infcloud/changelog_carddavmate.txt @@ -0,0 +1,503 @@ +CardDavMATE Changelog + + +NOTE: if you are interested in integrated version of CardDavMATE and CalDavZAP (our CalDAV web client) please use InfCloud - http://www.inf-it.com/open-source/clients/infcloud/ + +version 0.13.1 [2015-09-22]: +- note: do not forget to execute the cache_update.sh script every time you update your configuration or any other file (otherwise your browser will use the previous version of files stored in HTML5 cache); alternatively you can update the cache.manifest manually - edit the second line beginning with "#V 20" to anything else (this file simple needs "some" change) +- changed login screen autocomplete behaviour - we do not prevent browsers from remembering login/password anymore +- fixed a bug related to vCard PHOTO attribute processing (and the related "The contact on the server was changed and reloaded!" message) + +version 0.13.0 [2015-09-16]: +- note: do not forget to execute the cache_update.sh script every time you update your configuration or any other file (otherwise your browser will use the previous version of files stored in HTML5 cache); alternatively you can update the cache.manifest manually - edit the second line beginning with "#V 20" to anything else (this file simple needs "some" change) +- note: if you use a server with cross-domain setup see the modified Access-Control-Allow-Headers and Access-Control-Expose-Headers in readme.txt (or misc/config_davical.txt or misc/calendarserver.diff); you MUST update these headers, otherwise the client will NOT work +- configuration - added globalEnableRefresh option which enables/disables the new "refresh all resources" icon in the left application menu (disabled by default) +- configuration - added globalCollectionDisplay, globalCollectionSort and globalContactDataMinVisiblePercentage - these options allow to configure our new fully customizable wide contact list (see config.js) +- added Chinese localization (zh_CN) - thanks Fandy +- added shift+login shortcut to ignore settings stored on the server and use the default settings (this functionality was added long time ago, but I forgot to mention about it) +- added support for "Prefer: return=representation" (and related "Preference-Applied: return=representation") for PUT requests (see http://tools.ietf.org/html/rfc7240); this change REQUIRES update of Access-Control-Allow-Headers and Access-Control-Expose-Headers if cross-domain setup is used +- added support for automatically expanding fields in the editor (e.g. if you enter a phone number, another phone number field is automatically expanded) +- added support for multiple street components in a single address field (additional fields are automatically expanded) +- added an option to specify a remote URL as photo source - use shift+click on a photo box to add an URL +- added check for unsupported XML 1.0 characters in user entered data - these are replaced by a space character (to prevent client and/or server side parsing errors) +- added title with version number for the software name/description (login screen) +- fixed vCard line folding (RFC2426 - section 2.6) +- changed version checking - use internal build number for software version comparison to support update notification also for beta and rc builds +- changed initialy enabled collections behaviour - if there are no enabled collections during the login, enable all available collections owned by the logged user +- changed format and comments in config.js +- changed storing of user settings (PROPPATCH request) - no server request will be made if there is no change in settings +- updated jQuery to 2.1.4 +- updated localizations - thanks Niels Bo Andersen [da_DK], Marten Gajda [de_DE], Damian Vila [es_ES], Gabriela Vattier [fr_FR], Luca Ferrario [it_IT], Muimu Nakayama [ja_JP], Johan Vromans [nl_NL], Selcuk Pultar [tr_TR], Александр Симонов [ru_RU], Serge Yakimchuck [uk_UA] +- other improvements and fixes + +version 0.12.1 [2015-03-16]: +- note: do not forget to execute the cache_update.sh script every time you update your configuration or any other file (otherwise your browser will use the previous version of files stored in HTML5 cache); alternatively you can update the cache.manifest manually - edit the second line beginning with "#V 20" to anything else (this file simple needs "some" change) +- note: you NEED to enable "mod_headers" in Apache (for other servers see your server documentation) which is used to generate proper HTTP headers (required for correct support of HTML5 cache in browsers); the previously used mod_expire is not longer used (see the changelog entry below) +- added support for absolute collection URLs returned in PROPFIND request +- fixed HTML5 cache related problems (especially in Firefox) by returning "Cache-Control: max-age=0, must-revalidate, no-cache, no-transform, private" header instead of "Cache-Control: max-age=0" - this fix requires enabled "mod_headers" (you can disable the previously used "mod_expires") in Apache - for more details see .htaccess +- updated jQuery-UI to 1.11.4 +- other improvements and fixes + +version 0.12.0 [2015-01-26]: +- note: do not forget to execute the cache_update.sh script every time you update your configuration or any other file (otherwise your browser will use the previous version of files stored in HTML5 cache); alternatively you can update the cache.manifest manually - edit the second line beginning with "#V 20" to anything else (this file simple needs "some" change) +- note: this release contains new, changed and also removed configuration options (always use the latest config.js) +- configuration - removed showHeader option from globalAccountSettings, globalNetworkCheckSettings and globalNetworkAccountSettings - it is incompatible with new functionality +- configuration - removed globalResourceHeaderShowLogin option - it is replaced by much more flexible hrefLabel option in globalAccountSettings and globalNetworkCheckSettings (see config.js) +- configuration - removed syncInterval option from globalAccountSettings and globalNetworkCheckSettings - detection of sync-token changes is now performed by ONE request instead of N (number of collections) - use globalSyncResourcesInterval instead +- configuration - removed crossDomain and withCredentials options from default globalAccountSettings, globalNetworkCheckSettings and globalNetworkAccountSettings - both settings are still available but there is NO REASON to use them (crossDomain is detected automatically, and I've never seen anyone who understand when to use withCredentials /there is NO REASON to set it to true!/) +- configuration - added globalGroupContactsByCompanies configuration option - used to group contacts by company/department name instead of simple alphabetical sort (default false) +- configuration - added globalCrossServerSettingsURL configuration option - enable this option if your CardDavMATE installation is accessible from multiple URLs (URL1, URL2), otherwise settings (such as enabled/active collections) stored from the URL1 will be incompatible with settings stored from URL2 +- configuration - added globalAddrColorPropertyXmlns configuration option - used to define the namespace for addressbook-color property (see below) +- configuration - changed default value for delegation option to true (in globalAccountSettings, globalNetworkCheckSettings and globalNetworkAccountSettings) +- added Spanish localization (es_ES) - thanks Damián Vila +- added Japan localization (ja_JP) - thanks Muimu Nakayama +- added Russian localization (ru_RU) - thanks Александр Симонов +- added Ukrainian localization (uk_UA) - thanks Serge Yakimchuck +- MAJOR functionality and design changes (including the open source Roboto font) +- MAJOR performacne improvements +- major improvements and changes in the sychronization code +- major readme.txt update with detailed descriptions of most common setup problems +- added support for loading and unloading of user collections and delegated collections (delegation functionality) +- added addressbook color functionality (we hope you will like the new approach :-)) +- added automatic photo resize functionality (no more photo size limit - we simply resize it in the browser) +- added support for generic (Apple-like) date attributes (instead of fixed BDAY and ANNIVERSARY) +- added support for 'headervalue' collection property (namespace: http://inf-it.com/ns/dav/) - useful for collection grouping +- added new overlay with refresh button which is shown when cache manifest change is detected (it forces users to reload the page) +- added support for LDAP binding in auth/ldap module (see auth/plugins/ldap_conf.inc) +- added currently logged user into the page title +- added misc/readme_baikal_sabredav.txt and misc/baikal-flat-0.2.7.diff to solve issues related to storing CardDavMATE (and also CalDavZAP) properties on SabreDAV and Baïkal - thanks Johannes Zellner +- removed globalSearchAutoCleanup configuration option (it is no longer required) +- updated auth module to reflect the latest changes in configuration options +- updated jQuery to 2.1.3 +- updated jQuery-UI to 1.11.2 +- various fixes, optimalizations, improvements, visual updates and more + +version 0.11.1 [2013-07-26]: +- note: do not forget to execute the cache_update.sh script every time you update your configuration or any other file (otherwise your browser will use the previous version of files stored in HTML5 cache); alternatively you can update the cache.manifest manually - edit the second line beginning with "#V 20" to anything else (this file simple needs "some" change) +- added support for dynamic height of NOTE field - thanks http://www.jacklmoore.com/autosize/ +- added Turkish localization (tr_TR) - thanks Selcuk Pultar +- updated Danish [da_DK] localization - thanks Michael Rasmussen +- updated jQuery to 2.0.3 +- fixed incorrect detection of privileges for binded resources + +version 0.11.0 [2013-06-27]: +- note: do not forget to execute the cache_update.sh script every time you update your configuration or any other file (otherwise your browser will use the previous version of files stored in HTML5 cache); alternatively you can update the cache.manifest manually - edit the second line beginning with "#V 20" to anything else (this file simple needs "some" change) +- note: if you use DAViCal with cross-domain setup see the modified Apache configuration in misc/config_davical.txt (added Access-Control-Expose-Headers header) +- note: if you use OS X Calendarserver it is recommended to re-patch your installation (added Access-Control-Expose-Headers header; see misc/readme_osx.txt) +- note: this release contains new and also changed configuration options (always use the latest config.js) +- configuration - globalCollectionSort, globalCollectionDisplay and globalContactStoreFN - removed equivalents for last (surname, lastname, family), middle (middlename) and first (firstname, given) for faster regex processing +- configuration - added globalSettingsType option - set the destination for client settings on server (useful if your server not allows to store properties to "principal-URL" but allows to store them to "addressbook-home-set") +- configuration - added checkContentType option into globalAccountSettings and globalNetworkCheckSettings - enables content-type checking for server response (only objects with proper content-type are inserted into interface) - if you cannot see data in the interface you may try to disable it +- EXTREME performance improvements (especially for large collections) +- added support for image editing by clicking to the image (it opens a file chooser) +- added functionality to remember the latest selected addressbook (stored as DAV property on the server) +- added support for html5 cache (fixes minor bugs when used offline after initial login) +- added support for Cyrus server - thanks Ken Murchison +- changed loading of collections - all collections are loaded immediately after login (required for future features) +- changed XML requests (adds support for more servers) +- changed LOCK support detection - it is detected using PROPFIND request instead of DAV header +- fixed Firefox placeholder colors +- fixed problem with PHOTO attribute - "PHOTO;BASE64:" is obsolete but now it is supported +- fixed problem with removing categories using backspace if the editor is in "show" mode +- fixed problem with duplicate IM values if vCards are edited by Android (or other) devices/editors +- improved vCard processing performance (MAJOR improvements especially for large vCards with PHOTO) +- improved processing of the PHOTO attribute value +- updated jQuery to 2.0.2 (and related fixes) +- updated jQuery-UI to 1.10.3 (and related fixes) +- updated auth module to reflect the latest changes in configuration options +- updated placeholder plugin to support the current version of jQuery (replaced .live(...) with .on(...)) +- updated localizations - thanks Marten Gajda [de_DE], John Fischer [fr_FR], Luca Ferrario [it_IT] and Johan Vromans [nl_NL] (note: Danish [da_DK] localization contains some untranslated strings) +- updated misc/readme_osx.txt for OS X 10.8 (instructions to add CORS headers into Calendarserver used by OS X) +- renamed misc/calendarserver_CardDavMATE.diff to misc/calendarserver.diff (the patch works also for CalDavZAP) +- renamed misc/readme_lion.txt to misc/readme_osx.txt +- LOT of other improvements and fixes + +version 0.10.1 [2013-02-21]: +- note: this release contains new configuration option (always use the latest config.js) +- configuration - added globalUseJqueryAuth option - use jQuery .ajax() auth or custom header for HTTP basic auth (default); set this option to true if your server uses digest auth such as Baïkal (note: you may experience auth popups on some browsers) +- configuration - added delegation option into globalAccountSettings and globalNetworkCheckSettings (sets additional delegated resources - if true then delegation is enabled for all available resources; if false (default) then delegation is disabled; if an array of URL encoded resources or regexes (for example: ['/caldav.php/user/', '/caldav.php/user%40domain.com/', new RegExp('^/caldav.php/a[b-x].+/$', 'i')] then delegation is enabled for all specified resources +- configuration - changed forceReadonly property proccessing - URL encoded collections and also regexes are now supported (see config.js) +- configuration - date format is now predefined for each localization - if you want to use custom date format instead of predefined format (defined by localizations) use globalDatepickerFormat variable (commented out by default) +- added support for fallback to PROPFIND if REPORT is not supported and server returns incorrect 403 error code (instead of 400 or 501) +- added support for SOGO (it required only two minor bugfixes) +- added title text for "Logout" and "Add Contact" buttons +- fixed minor CSS problems (missing animations and icons during the drag&drop operations) +- updated auth module to reflect the latest changes in configuration options + +version 0.10.0 [2012-12-19]: +- note: this release contains new and also changed configuration options (always use the latest config.js) +- configuration - added globalSearchAutocleanup (disabled by default) - it allows to enable automatic search filter cleanup on collection (not vCard group) change +- configuration - changed globalDatepickerFormat default value from 'yy-mm-dd' to 'dd.mm.yy' +- added write support for PHOTO attribute (frequently requested) - just drag your photo into the photo box - note: only photos with size up to 64KiB (65536 B) are accepted, bigger photos are silently ignored ("best" size for your photo: 164 x 183 px) +- added Dutch localization (nl_NL) - thanks Johan Vromans +- fixed major version checking bug +- fixed invalid template usage for unsupported parameters +- fixed X-ABLabel attribute matching (now it is case insensitive) +- fixed country switching (if a user switches to different country after he entered the address fields, these are preserved) +- fixed invalid addressbook list content if collection is changed with non-empty search filter and enabled globalSearchAutocleanup (note: it was enabled by default in previous versions) +- fixed "undefined" text in addressbook list if N attribute value not uses full format +- fixed "Error: 'unable to save': correct the highlighted invalid values!" error message (related to custom labels) +- fixed country ordering for non-en_US localizations +- fixed problem with editor image dimensions (if a vCard contains PHOTO) +- fixed datepicker "Uncaught Unexpected literal at position" warning in the console log +- fixed "add contact" button state when the editor is in "edit" mode +- fixed translation of "Resources" string +- fixed minor bugs in SVG images +- improved search support - search is now possible by N [surname, firstname, middle name, prefix, suffix], NICKNAME, ORG, EMAIL and TEL attribute values (for TEL search use only numbers without spaces or other characters /leading '+' is supported/) +- improved support for custom attribute types - if the custom value is already defined also as a standard value, then the standard value is used +- improved parsing of very "exotic" vCards +- updated jQuery to 1.8.3 (it fixes IE cross domain problems) +- updated jQuery-UI to 1.9.1 (and related fixes) + +version 0.9.9 [2012-11-06]: +- note: replaced custom headers in .htaccess by mod_expires options (you need to set "AllowOverride FileInfo Limit Indexes" for CardDavMATE directory and enable mod_expires in Apache /you can disable the previously used mod_headers/) - the client will also work without the .htaccess but browsers can/will cache the javascript files what can cause problems when you update your installation +- note: this release contains new configuration options (always use the latest config.js) +- configuration - added globalCollectionDisplayOrg (enabled by default) - it allows to choose which attribute value is used for "company contacts" (ORG or N/FN) +- configuration - added globalDatepickerFirstDayOfWeek (default 1 => Monday) - it allows to set the first day of week for datepicker (see config.js) +- configuration - added globalUriHandlerProfile - it allows to set profile URLs for X-SOCIALPROFILE (see config.js) +- configuration - updated default globalNetworkCheckSettings and globalNetworkAccountSettings - fixed bug if you use full URL (with "/index.html" included) +- added write support for custom labels (frequently requested) +- added support for X-PHONETIC-FIRST-NAME and X-PHONETIC-LAST-NAME attributes (used by Apple clients) +- added support for X-SOCIALPROFILE attribute (used by Apple clients) +- added IE 10 support +- design changes and MAJOR cross OS/browser CSS fixes +- new login screen logo +- rearrangement of options for "Related" attribute (more frequently used options are moved to top) +- changed editor width - vCard editor is now wider (frequently requested) +- disallow to drag a contact into contact group if the contact is already a member of that group +- fixed parsing of very exotic vCards with "/" character in param values +- fixed GUI bugs related to contact group drag&drop operations +- fixed suggestion width for Categories +- fixed Firefox "AddCategory" placeholder color (Firefox bug?) +- LOT of other improvements and fixes (sorry, I am too lazy to write changelog entry for all changes :-)) + +version 0.9.8 [2012-10-04]: +- note: this release contains new and also changed configuration options (always use the latest config.js) +- configuration - changed globalCollectionSort, globalCollectionDisplay and globalContactStoreFN options - string values are replaced by more flexible array values (see config.js) +- configuration - added globalBackgroundSync (enabled by default) - support for synchronisation if browser window/tab is not focused (see config.js) +- configuration - added globalResourceAlphabetSorting (enabled by default) - support for user defined resource (server account) sorting instead of forced alphabetical sorting /applicable only if more than one resource is configured/ (see config.js) +- configuration - added forceReadOnly option into globalAccountSettings, globalNetworkCheckSettings and globalNetworkAccountSettings (sets the resource or list of collections as "read-only" - if true then the whole resource will be marked as "read-only"; if an array of collections /for example: ['collection1','collection2']/ then collections in the list will be marked as "read-only"; if null /default/, unset or unknown then real server detected privileges are used) +- configuration - added new globalNetworkAccountSettings example (by default it refers to CURRENT_URL/auth/ subdirectory) +- added support for simultaneously loaded collections (when switching to a different collection the previous collection is not unloaded - if you want back the previous behaviour use "var globalForceUnloadPrevCollection=true;" in config.js) +- added support for remembering of the currently selected contact when switching to a different collection/contact group (when switching back, this contact is re-selected) +- added support for automatic scrollbar move when a collection/contact group is clicked to ensure that the contact is visible in the interface +- added support for folding long lines in newly created vCards (RFC2426 - section 2.6) +- added support for detection of DAV compliance classes (don't try to LOCK the collection if there is no LOCK support /class 2/) +- added support for content type checking (only 'text/vcard' and 'text/x-vcard' are accepted) +- changed auth module XML configuration format and related changes (see misc/example_config_response.xml and auth/config.inc) +- changed company contacts displayvalue to ORG attribute value (if present, otherwise N or FN is used) +- changed vCard UID generation (no "-CardDavMATE" suffix in newly generated UIDs) +- improved collection and addressbook insert sort - O(n*log(n)) /major performance improvement especially for large collections/ +- improved suggestion sorting for company, department and categories (globalSortAlphabet is used) +- fixed possible missing contact groups in the interface if more than one adressbook contains contact groups +- fixed possible wrong header position if non-null hrefLabel is used with non-empty additionalResources +- fixed login screen language switching bug after unsuccessful authentication +- fixed sortkey comparison if a compared character is not present in globalSortAlphabet +- fixed header removal when deleting contacts from addressbooks +- fixed error if globalAddressCountryFavorites is undefined +- fixed incorrect scrollbar position for keyboard navigation functionality +- fixed undefined variable problem with empty company name and non-empty department +- fixed crossDomain value for the software update check +- fixed image resizing bug when contacts are switched too quickly using keyboard navigation +- fixed minor iOS bugs in CSS +- other improvements, fixes and internal code reorganisation +- workaround for displaying of images created with Evolution ("X-EVOLUTION-UNKNOWN" image type) +- workaround for undefined image type in PHOTO attribute +- changed "reset search button" cursor to pointer +- moved all CSS files into css/ directory and related changes +- updated readme.txt with up to date instructions +- updated CSS files for integration with the upcoming CalDAV web client +- updated jQuery to 1.8.2 +- updated jQuery-UI to 1.8.23 + +version 0.9.7.1 [2012-06-19]: +- support for RFC 6578 final (proper synchronization of deleted contacts with Davical 1.1.0) + +version 0.9.7 [2012-05-29]: +- note: this release contains new configuration options (always use the latest config.js) +- configuration - added globalEditorFadeAnimation - support for custom fade in/out animation speed (see config.js) +- configuration - added globalInterfaceCustomLanguages option - it allows to limit/reorder the interface languages shown in the login screen +- configuration - added hrefLabel option into globalAccountSettings and globalNetworkCheckSettings - support for custom server name in the resource header instead of the full href value (see config.js) +- configuration - added globalEnableKbNavigation option - it allows to enable/disable the keyboard navigation functionality [key up/key down] in the contact list (see config.js and the changelog below) +- configuration - changed default value for globalSyncResourcesInterval to 300000 miliseconds (resource list changes are rare) +- configuration - changed default syncInterval from 30000 to 60000 miliseconds +- configuration - updated globalSortAlphabet and globalSearchTransformAlphabet +- major internal code cleanup - all ajax operations (even subsequent) are now async => better performance, fixed Firefox 11+ unable to delete contact and unable to perform drag&drop operations +- major internal code cleanup - number of requests to the server is minimized => better performance, better bandwidth usage +- improved performance of adding new elements in vCard editor by ~40% +- added keyboard navigation functionality for contact switching by pressing [key up/key down] (enabled by default) +- added support to search by ORG and EMAIL attribute values +- added text suggestion for company (from current collection) and department (from current collection but only for the current company) fields in vCard editor +- added French localization (fr_FR) - thanks John Fischer +- fixed lost sync-token during resource sync (every globalSyncResourcesInterval miliseconds) => result: MUCH less bandwidth usage! +- fixed possible missing contacts in the interface if network error occurs during the addressbook-multiget REPORT (after the successful sync-collection REPORT) +- fixed vCard value escaping - colon is not escaped anymore (ambiguity of the vCard 3.0 standard) +- fixed country selectbox lost focus if the country is changed by keyboard +- fixed editor remains in the "edit" mode after the "save" operation if newly created contact is hidden due to active search filter +- fixed contact list "header" hiding in vCard group with active search filter +- fixed set next contact as active when removing contact from vCard group (previously always the first contact was set as active) +- fixed "add contact" button state - now it is inactive during a collection loading +- fixed compatibility with future versions of jQuery +- moved logout button to the resource list header (to match the position in the upcoming CalDav web client) +- updated .htaccess to support image caching and output compression using mod_deflate +- updated jQuery-UI to 1.8.20 + +version 0.9.6 [2012-04-25]: +- note: if you use DAViCal with cross-domain setup see the modified Apache configuration in misc/config_davical.txt (solved problem with CardDAV-Sync from Marten Gajda) +- note: if you use MacOS X Lion calendarserver it is recommended to re-patch your installation (see misc/readme_lion.txt and the changelog below) +- configuration - changed default syncInterval from 15000 to 30000 +- added support for automatic detection of crossDomain option in globalAccountSettings, globalNetworkCheckSettings and globalNetworkAccountSettings (if not set to boolean true/false it is automatically detected; default is null - autodetect) +- added IE9+ support (non cross-domain setup only /IE9 & jQuery limitation/; minor graphics glitches due to missing CSS support for "disabled" html elements) +- added support for prefix and suffix (vCard N attribute) +- added Czech localization (cs_CZ) +- added Danish localization (da_DK) - thanks Niels Bo Andersen +- fixed search with upper case letters not present in globalSearchTransformAlphabet +- fixed parsing of double quoted vCard param values (who use this?) +- fixed Andorra address fields +- fixed minor graphics glitch with update notification after logout and new login +- updated auth module to support multiple resources in response + updated auth/config.inc with modified templates +- updated misc/config_davical.txt (better handling of preflighted OPTION requests) +- updated misc/calendarserver_CardDavMATE.diff (support for cross-domain queries with X-Requested-With header /upcoming Safari 5.2/) +- updated default globalSearchTransformAlphabet in config.js +- updated CSS detection rule for iPad (new screen resolution for iPad 3) +- updated jQuery to 1.7.2 +- updated jQuery-UI to 1.8.19 +- replaced .attr('value'[, ...]) with .val([...]) +- many other fixes + +version 0.9.5 [2012-03-12]: +- note: this release contains new configuration option (always use the latest config.js) +- configuration - added globalSearchTransformAlphabet setting - used for transformation of non-ASCII characters to ASCII (for search support) +- added search support (search is performed on the addressbook values in the interface + category names) +- added language selector to login screen (use globalInterfaceLanguage to set the preselected language) +- added Hungarian localization (hu_HU) +- scrollable resource list (only if needed) +- minor bug fixes + +version 0.9.4 [2012-02-29]: +- fixed vCard parameter parsing (TYPE=X,Y now works correctly again) +- fixed date parsing for BDAY and X-ANNIVERSARY attributes (dates with missing '-' caused non-RFC vCard error) +- correct "\n" unescaping in vCard values if the previous character is '\' +- updated phone parameter definitions (iOS5 uses "TYPE=voice" in addition of other types) +- correct header removing from addressbook if contact is removed +- changed default value for undefined phone type from "main" to "cell" ("main" is Apple specific) +- added "TYPE=internet" into EMAIL parameters if it is missing (better non-RFC vCard compatibility) +- added "fax" phone type (in addition of "home fax" and "work fax") +- use of .prop() instead of .attr() to set 'readonly', 'disabled', 'selected', 'checked' and 'src' properties +- minor fixes for Slovak and German (thanks Thomas Scheel) localizations +- other minor fixes + +version 0.9.3 [2012-02-17]: +- added German localization (de_DE) - thanks Marten Gajda +- fixed invalid switch to PROPFIND if REPORT/sync-collection is unsupported (+ related bugfixes) +- changed DOM operations to fix Firefox only bugs with 0.9.2 (Firefox or jQuery bug?) +- fixed "active editor -> logout -> login" problem (inactive resource/addressbook list) + +version 0.9.2 [2012-02-13]: +- security fix: correct globalAccountSettings cleanup after logout +- note: this release contains new configuration options (always use the latest config.js) +- configuration - increased default timeout value for configuration account templates from 10 to 30 seconds +- configuration - changed default configuration for Davical - works also if Davical is installed into subdirectory (instead of domain root directory) +- configuration - added globalContactStoreFN option - support for custom FN formatting instead of fixed 'prefix,last,middle,first,suffix' (see config.js) +- configuration - added globalCompatibility option - customizations for 3rd party clients +- configuration - globalCompatibility: added anniversaryOutputFormat option - supported values: 'apple' (default) and 'other' (see config.js) +- configuration - added globalInterfaceLanguage option (see config.js and the changelog below) +- added localization support (new localizations are welcome!) +- added English localization (en_US) +- added Slovak localization (sk_SK) +- added Italian localization (it_IT) - thanks Luca Ferrario +- added support for Oracle, SabreDav and probably many other CardDav servers +- added support for CATEGORIES attribute with auto-suggest for categories in active collection (category separator: Enter) +- 100% performance improvement for PUT requests (add/edit/move/... operations) - get the modified Etag from PUT response header instead of additional REPORT requests (if the server support this feature, otherwise get the modified vCard with new Etag from the server) +- notable performance improvements for DOM operations (contact loading and manipulation) +- correct '\' character escaping in vCard values +- removed write support for X-EVOLUTION-* attributes (caused many problems and Evolution already support the X-* attributes without "-EVOLUTION" prefix) +- many other fixes + +version 0.9.1 [2012-01-29]: +- note: this release contains new configuration options (always use the latest config.js) +- configuration - added lockTimeOut option into globalAccountSettings and globalNetworkCheckSettings - this option is used by the LOCK method and sets the lock timeout for the resource (default: 10000 miliseconds) +- configuration - new globalDatepickerFormat option - datepicker date format setting (see config.js) +- added support for BDAY attribute +- added support for X-ANNIVERSARY, X-EVOLUTION-ANNIVERSARY and X-ABDATE (with "anniversary flag") attributes +- added support for multiple URL attributes with params (many clients use this approach in vCard 3.0 even if params are not RFC compliant) +- contact images are displayed with correct aspect ratio +- CSS fixes (login page padding problem, icon positioning problem for data handler icons in Firefox and many Windows only Firefox fixes) +- major performance improvement for country/address format switching +- added "Note: your browser is unsupported!" message to login screen for IE and Opera +- increased default timeOut values in config.js to 10000 (reported problems with slow/overloaded servers) +- updated jQuery-UI to 1.8.17 +- "add contact" and edit operations automatically set focus on "Firstname" in the editor +- click on the active contact is ignored (there is no reason to reload it into editor) +- renamed account-uid to data-account-uid (HTML5 compliance) +- added missing alt attributes in index.html (HTML5 compliance) +- removed "meta http-equiv" from index.html (HTML5 compliance) +- updated readme.txt + +version 0.9.0 [2012-01-10]: +- note: if you use DAViCal with cross-domain setup you need to update your apache configuration (see misc/config_davical.txt) +- note: if you use MacOS X Lion calendarserver you need to re-patch your installation (see misc/readme_lion.txt and the changelog below) +- added support for drag&drop contact move operation (not available if the source or destination collection is read-only) +- added support for "Delete from Group" (available if an Apple contact group is loaded) +- added support for drag&drop add contact to contact group (available for active resource and its contact groups) +- major internal cleanup and bugfixes +- fixed auth module/generic plugin HTTP request used for authentication +- minor iOS related and other CSS fixes + +version 0.8.3 [2011-12-25]: +- configuration: new globalAddressCountryFavorites option - favorite countries at the top of the country list in the editor +- increase of RegExp performance by ~70% (use of pre-built regular expressions) +- additional major performance improvements (especially for large collections) by using late vCard processing (the slowest vCard transformations are performed first time when the contact is loaded into the editor) +- added read/write backward compatibility support for the following non-standard vCard attributes: X-ASSISTANT, X-EVOLUTION-ASSISTANT, X-MANAGER, X-EVOLUTION-MANAGER, X-SPOUSE, X-EVOLUTION-SPOUSE +- added "home mobile" and "work mobile" options for PHONE attribute +- the loading animation (spinning ball) now disappears only after the entire collection is loaded and inserted into DOM +- fixed the "The contact on the server was changed and reloaded!" message error caused by wrong vCard comparison +- the collection list key value for empty string is defined as '#' +- major CSS cleanup and cross browser CSS fixes +- new login screen :-) + +version 0.8.2 [2011-12-15]: +- configuration: new globalAddressCountryEquivalence option - support for regex based country detection in ADR attribute (see config.js) +- added absolute URL support to resource search +- added PRODID attribute support +- added support for non-RFC vCards with missing N and/or FN attributes (SOGo Connector bug related to company vCards) +- added automatic transformation for non-RFC TEL, EMAIL and URL attributes (Evolution bugs) +- CSS tweaks (no select boxes if the editor is not in "edit" mode) and fixes +- X-* IM attributes are ignored only if there is an IMPP attribute with the same value +- the collection list key value for most common non-alphabet characters is defined as '#' + +version 0.8.1 [2011-12-10]: +- minor svg icon fixes +- better non-RFC vCard compatibility (now it is possible to delete contacts without UID attribute) +- fixed problems with the N attribute if not all parts of the value are defined +- fixed problems with the X-* IM attributes if no parameters defined for the attribute + +version 0.8.0 [2011-12-05]: +- new vector graphics (replaced png icons with svg icons) +- added support for MiddleName (vCard N attribute) with possibility to use "middle" in globalCollectionSort and globalCollectionDisplay configuration options +- changed default values for globalCollectionSort and globalCollectionDisplay to "last,middle,first" +- added support for Department (vCard ORG attribute) +- added support for NickName (vCard NICKNAME attribute) +- added support for JobTitle (vCard TITLE attribute) +- added support for URL (vCard URL attribute) +- added URI handler for TEL attributes - the default handler is tel: (see config.js) +- added URI handler for EMAIL attributes - the default handler is mailto: (see config.js) +- added URI handler for URL attribute - if no handler defined in the URL value the default handler is http:// (see config.js) +- added update notification (see config.js) +- removed Opera support (there are too many issues with Opera CSS support, SVG, missing CORS, ...) +- update jQuery to version 1.7.1 (minimized version) +- currently unused regexes in vcard_rfc_regex.js are commented out (minor performance improvement) +- CSS fixes and tweaks +- fixed undefined variable problem with non-RFC N attribute in Apple vCard groups +- clicking to the active collection not reloads it from the server (there is no reason if it is already loaded) +- switching back from vCard group to the collection not reloads the collection from the server (there is no reason if it is already loaded) +- if there is no valid photo in the vCard, checking/unchecking the "Company Contact" changes the default picture in the editor (note: CardDavMATE default pictures are not saved to the server) +- fixed several bugs by disallowing to click to resource or contact when editing another contact (fade in/out animation on resource and collection list) + +version 0.7.3 [2011-11-17]: +- note: this release contains new configuration options (always use the latest config.js) +- configuration: new globalCollectionSort and globalCollectionDisplay options (see config.js) +- configuration: new additionalResources option available for globalNetworkCheckSettings (see config.js) +- configuration: changed default values for timeOut to 6000 and globalSyncResourcesInterval to 30000 +- configuration: added additional examples for globalNetworkCheckSettings +- configuration: added comments for timeOut +- changed default settings - CardDavMATE now works without any additional setup if installed into Davical subdirectory (default setup allows access to own collections for logged user) +- renamed DAViCal auth module to generic (this module uses basic HTTP authentication to remote server) +- added error message if non-RFC vCard is detected (please send me the problematic vCard and I will try to fix your issue) +- added support for Opera (only for non cross domain setup) +- fixed timeout value for LOCK requests (previously the milisecond value was used as second value) +- fixed resource removal bug +- added animation for contact switching (fix for graphic glitches with slow Javascript engines) +- added default user and company icons for vCard editor +- added icon for company contacts in contact list +- added cancel button when creating a new contact (it reloads the previously active contact) +- disabled edit button in vCard editor for read-only collections +- disabled "add icon" in contact list for read-only collections +- moved the delete button in the editor more to the right +- autofocus for the login field (disabled for demo mode) +- new cross browser CSS for buttons +- fixed checkbox CSS for Opera +- added apple-mobile-web-app-capable meta tag into index.html (useful for web app shortcuts on iOS) +- minor CSS fixes for iOS +- minor CSS fixes - scrollbars are shown only when needed + +version 0.7.2 [2011-11-10]: +- configuration: new globalNetworkCheckSettings configuration option for rapid client setup + +version 0.7.1 [2011-11-10]: +- improved support for non-RFC vCards by adding missing newlines (Evolution problem) +- support for non-RFC vCards without UID parameter +- fixed a bug that caused the vCard groups to remain in the interface even after deletion from the server +- minor vCard group related bugfixes + +version 0.7.0 [2011-11-09]: +- note: this release contains many configuration changes (always use the latest config.js) +- note: if you use DAViCal you need to update your apache configuration (see misc/config_davical.txt) +- note: if you use MacOS X Lion calendarserver you need to re-patch your installation (see misc/readme_lion.txt and the changelog below) +- configuration - renamed updateInterval option in globalAccountSettings to syncInterval (now the name corresponds to reality) +- configuration - removed globalReloadCollection setting (use the syncInterval in globalAccountSettings instead) +- configuration - added globalSyncResourcesInterval configuration option +- configuration - added crossDomain option into globalAccountSettings and globalNetworkAccountSettings (default: true - set to false if your CardDavMATE protocol/server/port is the same as your Davical installation or if you use unsupported browser with mod_proxy /if you don't know what is mod_proxy do not set to false/) +- configuration - updated auth module to exactly match the changed configuration options +- configuration - renamed configuration variable in auth/plugins/ldap_conf.inc +- new patch for MacOS X Lion calendarserver to support cross domain queries in Gecko based browsers (http://www.w3.org/TR/cors/) with updated instructions (see misc/readme_lion.txt in misc directory) +- new auth module for DAViCal server (see auth/config.inc and auth/plugins/davical_conf.inc) +- much better synchronization (bandwidth optimization) +- added "vCard group" support used by Apple +- major style sheet changes, tweaks and cleanup +- update jQuery to version 1.7 and related fixes +- migrate to jQuery 1.7 API +- added IRC option into IM types +- fixed fast collection switching concurrency problem (contacts from the previous collection are removed from the contact list) +- fixed a bug from 0.6.x that caused the contacts to remain in the interface even after deletion from the server +- improved support for non-RFC vCards by removing redundant newlines +- better IMPP equivalence checking with old X-* IM attributes +- better handling of namespaces in XML responses using custom minimalist jQuery plugin +- added readme.txt with setup instructions +- added help for common network/installation problems: misc/readme_network.txt +- disallow browser to show login window popup after unsuccessful authentication using auth module (see the new $config['auth_send_authenticate_header'] option in the auth/config.inc) +- the auth/modules/ renamed to auth/plugins/ (and related fixes) +- fixed resource and collection sorting (wrong function call) +- the logout button is shown only if you use globalNetworkAccountSettings +- fixed Andorra, Jordan, Kazakhstan and Ukraine address fields + +version 0.6.3 [2011-10-22]: +- patch for MacOS X Lion calendarserver to support cross domain queries (misc directory) +- updated instructions for MacOS X Lion server and moved readme.txt to misc/lion_readme.txt + +version 0.6.2 [2011-10-22]: +- fixed undefined variable in the error message + +version 0.6.1 [2011-10-21]: +- MacOSX Lion Server support (more info in readme.txt) +- fixed login problems after previous logout +- various bugfixes and improvements + +version 0.6.0 [2011-10-19]: +- major internal code cleanup +- added default .htaccess file to prevent caching (mod_headers must be enabled!) +- various config.js changes (always use the latest version of configuration file!) +- instead of the static client configuration, now it is possible to set configuration URL in config.js (this URL must return valid configuration XML after successful HTTP auth) +- added LDAP auth module which generates XML configuration for the client (after successful HTTP authentication) +- if the configuration URL is set, the client shows login screen and deny access until the user is not authenticated (and no valid XML returned) +- fixed a bug which causes unaccessible resources if user has no access to read the resource privileges +- fixed an undefined variable bug which occurs when new contact is created in empty collection +- correct UID generation for new contacts +- correct unprocessed (unknown) elements handling when contact is edited +- correct behavior when deleting the last contact from the collection +- major bug fixes in resource.js and addressbook.js +- default picture for contact (shown if picture not present in vCard) +- added logout button (right top corner key icon) + +version 0.5.2 [2011-10-06]: +- fixed regular expressions for login matching in deleteVcardFromCollection and putVcardToCollection functions (fixes add/update/delete operations) +- fixed several CSS issues +- added new configuration option globalWithCredentials which sets withCredentials for cross domain queries in jQuery (note: if the value is set to true, use of Access-Control-Allow-Origin "*" is not allowed) + +version 0.5.1 [2011-10-03]: +- changed the delete operation to asynchronous (now all operations are async) +- the contact is now reloaded in the interface immediately after the successful "save" operation (in the middle of the "save" animation) +- minor animation fixes (especially for contact deletion) + +version 0.5.0 [2011-10-01]: +- initial public release diff --git a/radicale_web/web/infcloud/common.js b/radicale_web/web/infcloud/common.js new file mode 100644 index 0000000..b5b8029 --- /dev/null +++ b/radicale_web/web/infcloud/common.js @@ -0,0 +1,2136 @@ +/* +InfCloud - the open source CalDAV/CardDAV Web Client +Copyright (C) 2011-2015 + Jan Mate + Andrej Lezo + Matej Mihalik + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as +published by the Free Software Foundation, either version 3 of the +License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . +*/ + +// Used to match XML element names with any namespace +jQuery.fn.filterNsNode=function(nameOrRegex) +{ + return this.filter( + function() + { + if(nameOrRegex instanceof RegExp) + return (this.nodeName.match(nameOrRegex) || this.nodeName.replace(RegExp('^[^:]+:',''),'').match(nameOrRegex)); + else + return (this.nodeName===nameOrRegex || this.nodeName.replace(RegExp('^[^:]+:',''),'')===nameOrRegex); + } + ); +}; + +// Escape jQuery selector +function jqueryEscapeSelector(inputValue) +{ + return (inputValue==undefined ? '' : inputValue).toString().replace(/([ !"#$%&'()*+,./:;<=>?@[\\\]^`{|}~])/g,'\\$1'); +} + +// Generate random string (UID) +function generateUID() +{ + uidChars='0123456789abcdefghijklmnopqrstuvwxyz'; + UID=''; + for(i=0;i<32;i++) + { + if(i==8 || i==12 || i==16 || i==20) UID+='-'; + UID+=uidChars.charAt(Math.floor(Math.random()*(uidChars.length-1))); + } + return UID; +} + + +// IE compatibility +if (typeof window.btoa=='undefined' && typeof base64.encode!='undefined') window.btoa=base64.encode; + +// Create Basic auth string (for HTTP header) +function basicAuth(user, password) +{ + var tok=user+':'+password; + var hash=btoa(tok); + return 'Basic '+hash; +} + +// multiply regex replace {'regex': value, 'regex': value} +String.prototype.multiReplace=function(hash) +{ + var str=this, key; + for(key in hash) + str=str.replace(new RegExp(key,'g'), hash[key]); + return str; +}; + +// Used for sorting the contact and resource list ... +String.prototype.customCompare=function(stringB, alphabet, dir, caseSensitive) +{ + var stringA=this; + + if(alphabet==undefined || alphabet==null) + return stringA.localeCompare(stringB); + else + { + var pos=0, + min=Math.min(stringA.length, stringB.length); + dir=dir || 1; + caseSensitive=caseSensitive || false; + if(!caseSensitive) + { + stringA=stringA.toLowerCase(); + stringB=stringB.toLowerCase(); + } + while(stringA.charAt(pos)===stringB.charAt(pos) && pos 3) + NumberOfWeek = Math.round((((now-then)/86400000)+Compensation)/7); + else + { + if(Firstday.getDay()>4 || Firstday.getDay()==0) + NumberOfWeek = 53; + } + return NumberOfWeek; +} + +function zeroPad(n) { + return (n < 10 ? '0' : '') + n; +} + +var dateFormatters = { + s : function(d) {return d.getSeconds() }, + ss : function(d) {return zeroPad(d.getSeconds())}, + m : function(d) {return d.getMinutes()}, + mm : function(d) {return zeroPad(d.getMinutes())}, + h : function(d) {return d.getHours() % 12 || 12}, + hh : function(d) {return zeroPad(d.getHours() % 12 || 12)}, + H : function(d) {return d.getHours()}, + HH : function(d) {return zeroPad(d.getHours())}, + d : function(d) {return d.getDate()}, + dd : function(d) {return zeroPad(d.getDate())}, + ddd : function(d,o) {return o.dayNamesShort[d.getDay()]}, + dddd: function(d,o) {return o.dayNames[d.getDay()]}, + W : function(d) {return d.getWeekNo()}, + M : function(d) {return d.getMonth() + 1}, + MM : function(d) {return zeroPad(d.getMonth() + 1)}, + MMM : function(d,o) {return o.monthNamesShort[d.getMonth()]}, + MMMM: function(d,o) {return o.monthNames[d.getMonth()]}, + yy : function(d) {return (d.getFullYear()+'').substring(2)}, + yyyy: function(d) {return d.getFullYear()}, + t : function(d) {return d.getHours() < 12 ? 'a' : 'p'}, + tt : function(d) {return d.getHours() < 12 ? 'am' : 'pm'}, + T : function(d) {return d.getHours() < 12 ? 'A' : 'P'}, + TT : function(d) {return d.getHours() < 12 ? 'AM' : 'PM'}, + u : function(d) {return formatDates(d, null, "yyyy-MM-dd'T'HH:mm:ss'Z'")}, + S : function(d) { + var date = d.getDate(); + if (date > 10 && date < 20) { + return 'th'; + } + return ['st', 'nd', 'rd'][date%10-1] || 'th'; + } +}; + + +function formatDates(date1, date2, format, options) { + options = options; + var date = date1, + otherDate = date2, + i, len = format.length, c, + i2, formatter, + res = ''; + for (i=0; ii; i2--) { + if (formatter = dateFormatters[format.substring(i, i2)]) { + if (date) { + res += formatter(date, options); + } + i = i2 - 1; + break; + } + } + if (i2 == i) { + if (date) { + res += c; + } + } + } + } + return res; +}; + +// possible address field positions [fid] (value = text input, ?country?= country select input) +// 0: [ value ] +// 1: [ ?country? ] +// 2: [ value ] +// 3: [ value ] +// 4: [ value ] +// 5: [ value ] 6: [ value ] +// 7: [ value ] 8: [ ?country? ] +// 9: [ value ] +// 10: [ value ] +// 11: [ ?country? ] <- here is the country defined by default +// 12: [ value ] +// +// address field in vCard has the following format: pobox;extaddr;street;locality;region;code;country +// only these can be used as 'data-addr-field' values +var addressTypes=null; +function localizeAddressTypes() +{ + addressTypes={ + 'af': [ 'Afghanistan', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 3, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 11, type: 'country'} + ], + 'al': [ 'Albania', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 3, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 11, type: 'country'} + ], + 'dz': [ 'Algeria', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 5, type: 'input', 'data-addr-field': 'code', placeholder: localization[globalInterfaceLanguage].pholderAddressPostalCode}, + {fid: 6, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 11, type: 'country'} + ], + 'ad': [ 'Andorra', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 5, type: 'input', 'data-addr-field': 'code', placeholder: localization[globalInterfaceLanguage].pholderAddressPostalCode}, + {fid: 6, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 11, type: 'country'} + ], + 'ao': [ 'Angola', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 3, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 11, type: 'country'} + ], + 'ag': [ 'Antigua and Barbuda', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 3, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 11, type: 'country'} + ], + 'ar': [ 'Argentina', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 5, type: 'input', 'data-addr-field': 'code', placeholder: localization[globalInterfaceLanguage].pholderAddressPostalCode}, + {fid: 6, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 9, type: 'input', 'data-addr-field': 'region', placeholder: localization[globalInterfaceLanguage].pholderAddressProvince}, + {fid: 11, type: 'country'} + ], + 'am': [ 'Armenia', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 5, type: 'input', 'data-addr-field': 'code', placeholder: localization[globalInterfaceLanguage].pholderAddressPostalCode}, + {fid: 6, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 11, type: 'country'} + ], + 'au': [ 'Australia', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 5, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressSuburb}, + {fid: 6, type: 'input', 'data-addr-field': 'region', placeholder: localization[globalInterfaceLanguage].pholderAddressState}, + {fid: 7, type: 'input', 'data-addr-field': 'code', placeholder: localization[globalInterfaceLanguage].pholderAddressPostal}, + {fid: 8, type: 'country'} + ], + 'at': [ 'Austria', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 5, type: 'input', 'data-addr-field': 'code', placeholder: localization[globalInterfaceLanguage].pholderAddressPostalCode}, + {fid: 6, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 11, type: 'country'} + ], + 'az': [ 'Azerbaijan', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 5, type: 'input', 'data-addr-field': 'code', placeholder: localization[globalInterfaceLanguage].pholderAddressPostalCode}, + {fid: 6, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 11, type: 'country'} + ], + 'bs': [ 'The Bahamas', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 5, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 6, type: 'input', 'data-addr-field': 'region', placeholder: localization[globalInterfaceLanguage].pholderAddressIslandName}, + {fid: 11, type: 'country'} + ], + 'bh': [ 'Bahrain', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 5, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 6, type: 'input', 'data-addr-field': 'code', placeholder: localization[globalInterfaceLanguage].pholderAddressPostalCode}, + {fid: 11, type: 'country'} + ], + 'bd': [ 'Bangladesh', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 5, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 6, type: 'input', 'data-addr-field': 'code', placeholder: localization[globalInterfaceLanguage].pholderAddressPostalCode}, + {fid: 11, type: 'country'} + ], + 'bb': [ 'Barbados', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 3, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 11, type: 'country'} + ], + 'by': [ 'Belarus', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 5, type: 'input', 'data-addr-field': 'code', placeholder: localization[globalInterfaceLanguage].pholderAddressPostalCode}, + {fid: 6, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 9, type: 'input', 'data-addr-field': 'region', placeholder: localization[globalInterfaceLanguage].pholderAddressProvince}, + {fid: 11, type: 'country'} + ], + 'be': [ 'Belgium', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 5, type: 'input', 'data-addr-field': 'code', placeholder: localization[globalInterfaceLanguage].pholderAddressPostalCode}, + {fid: 6, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 11, type: 'country'} + ], + 'bz': [ 'Belize', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 3, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 9, type: 'input', 'data-addr-field': 'region', placeholder: localization[globalInterfaceLanguage].pholderAddressProvince}, + {fid: 11, type: 'country'} + ], + 'bj': [ 'Benin', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 3, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 11, type: 'country'} + ], + 'bm': [ 'Bermuda', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 5, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 6, type: 'input', 'data-addr-field': 'code', placeholder: localization[globalInterfaceLanguage].pholderAddressPostalCode}, + {fid: 11, type: 'country'} + ], + 'bt': [ 'Bhutan', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 3, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 11, type: 'country'} + ], + 'bo': [ 'Bolivia', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 3, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 11, type: 'country'} + ], + 'ba': [ 'Bosnia and Herzegovina', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 5, type: 'input', 'data-addr-field': 'code', placeholder: localization[globalInterfaceLanguage].pholderAddressPostalCode}, + {fid: 6, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 11, type: 'country'} + ], + 'bw': [ 'Botswana', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 3, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 11, type: 'country'} + ], + 'br': [ 'Brazil', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 5, type: 'input', 'data-addr-field': 'code', placeholder: localization[globalInterfaceLanguage].pholderAddressZip}, + {fid: 6, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 7, type: 'input', 'data-addr-field': 'region', placeholder: localization[globalInterfaceLanguage].pholderAddressProvince}, + {fid: 8, type: 'country'} + ], + 'bn': [ 'Brunei Darussalam', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 5, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 6, type: 'input', 'data-addr-field': 'code', placeholder: localization[globalInterfaceLanguage].pholderAddressPostalCode}, + {fid: 11, type: 'country'} + ], + 'bg': [ 'Bulgaria', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 5, type: 'input', 'data-addr-field': 'code', placeholder: localization[globalInterfaceLanguage].pholderAddressPostalCode}, + {fid: 6, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 11, type: 'country'} + ], + 'bf': [ 'Burkina Faso', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 5, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 6, type: 'input', 'data-addr-field': 'code', placeholder: localization[globalInterfaceLanguage].pholderAddressPostalCode}, + {fid: 11, type: 'country'} + ], + 'bi': [ 'Burundi', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 3, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 11, type: 'country'} + ], + 'kh': [ 'Cambodia', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 5, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 6, type: 'input', 'data-addr-field': 'code', placeholder: localization[globalInterfaceLanguage].pholderAddressPostalCode}, + {fid: 11, type: 'country'} + ], + 'cm': [ 'Cameroon', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 3, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 11, type: 'country'} + ], + 'ca': [ 'Canada', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 5, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 6, type: 'input', 'data-addr-field': 'region', placeholder: localization[globalInterfaceLanguage].pholderAddressProvince}, + {fid: 7, type: 'input', 'data-addr-field': 'code', placeholder: localization[globalInterfaceLanguage].pholderAddressPostalCode}, + {fid: 8, type: 'country'} + ], + 'cv': [ 'Cape Verde', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 5, type: 'input', 'data-addr-field': 'code', placeholder: localization[globalInterfaceLanguage].pholderAddressPostalCode}, + {fid: 6, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 11, type: 'country'} + ], + 'ky': [ 'Cayman Islands', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 3, type: 'input', 'data-addr-field': 'region', placeholder: localization[globalInterfaceLanguage].pholderAddressProvince}, + {fid: 11, type: 'country'} + ], + 'cf': [ 'Central African Republic', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 3, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 11, type: 'country'} + ], + 'td': [ 'Chad', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 3, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 11, type: 'country'} + ], + 'cl': [ 'Chile', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 5, type: 'input', 'data-addr-field': 'code', placeholder: localization[globalInterfaceLanguage].pholderAddressPostalCode}, + {fid: 6, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 11, type: 'country'} + ], + 'cn': [ 'China', + {fid: 1, type: 'country'}, + {fid: 5, type: 'input', 'data-addr-field': 'region', placeholder: localization[globalInterfaceLanguage].pholderAddressProvince}, + {fid: 6, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 9, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 10, type: 'input', 'data-addr-field': 'code', placeholder: localization[globalInterfaceLanguage].pholderAddressPostal} + ], + 'co': [ 'Colombia', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 3, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 11, type: 'country'} + ], + 'km': [ 'Comoros', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 3, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 11, type: 'country'} + ], + 'cd': [ 'Democratic Republic of the Congo', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 5, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 6, type: 'input', 'data-addr-field': 'code', placeholder: localization[globalInterfaceLanguage].pholderAddressPostalCode}, + {fid: 11, type: 'country'} + ], + 'cg': [ 'Republic of the Congo', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 3, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 11, type: 'country'} + ], + 'cr': [ 'Costa Rica', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 5, type: 'input', 'data-addr-field': 'code', placeholder: localization[globalInterfaceLanguage].pholderAddressPostalCode}, + {fid: 6, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 11, type: 'country'} + ], + 'ci': [ 'Côte d’Ivoire', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 5, type: 'input', 'data-addr-field': 'code', placeholder: localization[globalInterfaceLanguage].pholderAddressPostalCode}, + {fid: 6, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 11, type: 'country'} + ], + 'hr': [ 'Croatia', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 5, type: 'input', 'data-addr-field': 'code', placeholder: localization[globalInterfaceLanguage].pholderAddressPostalCode}, + {fid: 6, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 11, type: 'country'} + ], + 'cu': [ 'Cuba', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 5, type: 'input', 'data-addr-field': 'code', placeholder: localization[globalInterfaceLanguage].pholderAddressPostalCode}, + {fid: 6, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 11, type: 'country'} + ], + 'cy': [ 'Cyprus', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 5, type: 'input', 'data-addr-field': 'code', placeholder: localization[globalInterfaceLanguage].pholderAddressPostalCode}, + {fid: 6, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 11, type: 'country'} + ], + 'cz': [ 'Czech Republic', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 5, type: 'input', 'data-addr-field': 'code', placeholder: localization[globalInterfaceLanguage].pholderAddressPostalCode}, + {fid: 6, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 11, type: 'country'} + ], + 'dk': [ 'Denmark', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 5, type: 'input', 'data-addr-field': 'code', placeholder: localization[globalInterfaceLanguage].pholderAddressPostalCode}, + {fid: 6, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 11, type: 'country'} + ], + 'dj': [ 'Djibouti', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 3, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 11, type: 'country'} + ], + 'dm': [ 'Dominica', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 3, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 11, type: 'country'} + ], + 'do': [ 'Dominican Republic', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 3, type: 'input', 'data-addr-field': 'region', placeholder: localization[globalInterfaceLanguage].pholderAddressPostalDistrict}, + {fid: 5, type: 'input', 'data-addr-field': 'code', placeholder: localization[globalInterfaceLanguage].pholderAddressPostalCode}, + {fid: 6, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 11, type: 'country'} + ], + 'ec': [ 'Ecuador', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 3, type: 'input', 'data-addr-field': 'code', placeholder: localization[globalInterfaceLanguage].pholderAddressPostalCode}, + {fid: 9, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 11, type: 'country'} + ], + 'eg': [ 'Egypt', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 3, type: 'input', 'data-addr-field': 'region', placeholder: localization[globalInterfaceLanguage].pholderAddressDistrict}, + {fid: 9, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressGovernorate}, + {fid: 11, type: 'country'} + ], + 'sv': [ 'El Salvador', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 5, type: 'input', 'data-addr-field': 'code', placeholder: localization[globalInterfaceLanguage].pholderAddressPostalCode}, + {fid: 6, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 9, type: 'input', 'data-addr-field': 'region', placeholder: localization[globalInterfaceLanguage].pholderAddressDepartment}, + {fid: 11, type: 'country'} + ], + 'gq': [ 'Equatorial Guinea', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 3, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 11, type: 'country'} + ], + 'er': [ 'Eritrea', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 3, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 11, type: 'country'} + ], + 'ee': [ 'Estonia', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 5, type: 'input', 'data-addr-field': 'code', placeholder: localization[globalInterfaceLanguage].pholderAddressPostalCode}, + {fid: 6, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 11, type: 'country'} + ], + 'et': [ 'Ethiopia', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 5, type: 'input', 'data-addr-field': 'code', placeholder: localization[globalInterfaceLanguage].pholderAddressPostalCode}, + {fid: 6, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 11, type: 'country'} + ], + 'fk': [ 'Falkland Islands', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 3, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 9, type: 'input', 'data-addr-field': 'code', placeholder: localization[globalInterfaceLanguage].pholderAddressPostalCode}, + {fid: 11, type: 'country'} + ], + 'fo': [ 'Faroe Islands', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 5, type: 'input', 'data-addr-field': 'code', placeholder: localization[globalInterfaceLanguage].pholderAddressPostalCode}, + {fid: 6, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 11, type: 'country'} + ], + 'fj': [ 'Fiji', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 3, type: 'input', 'data-addr-field': 'region', placeholder: localization[globalInterfaceLanguage].pholderAddressPostalDistrict}, + {fid: 9, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 11, type: 'country'} + ], + 'fi': [ 'Finland', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 5, type: 'input', 'data-addr-field': 'code', placeholder: localization[globalInterfaceLanguage].pholderAddressPostalCode}, + {fid: 6, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 11, type: 'country'} + ], + 'fr': [ 'France', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 5, type: 'input', 'data-addr-field': 'code', placeholder: localization[globalInterfaceLanguage].pholderAddressPostalCode}, + {fid: 6, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 11, type: 'country'} + ], + 'pf': [ 'French Polynesia', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 5, type: 'input', 'data-addr-field': 'code', placeholder: localization[globalInterfaceLanguage].pholderAddressPostalCode}, + {fid: 6, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 7, type: 'input', 'data-addr-field': 'region', placeholder: localization[globalInterfaceLanguage].pholderAddressIslandName}, + {fid: 8, type: 'country'} + ], + 'ga': [ 'Gabon', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 5, type: 'input', 'data-addr-field': 'code', placeholder: localization[globalInterfaceLanguage].pholderAddressPostalCode}, + {fid: 6, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 11, type: 'country'} + ], + 'gm': [ 'The Gambia', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 3, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 11, type: 'country'} + ], + 'ge': [ 'Georgia', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 5, type: 'input', 'data-addr-field': 'code', placeholder: localization[globalInterfaceLanguage].pholderAddressPostalCode}, + {fid: 6, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 11, type: 'country'} + ], + 'de': [ 'Germany', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 5, type: 'input', 'data-addr-field': 'code', placeholder: localization[globalInterfaceLanguage].pholderAddressPostalCode}, + {fid: 6, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 11, type: 'country'} + ], + 'gh': [ 'Ghana', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 3, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 11, type: 'country'} + ], + 'gr': [ 'Greece', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 5, type: 'input', 'data-addr-field': 'code', placeholder: localization[globalInterfaceLanguage].pholderAddressPostalCode}, + {fid: 6, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 11, type: 'country'} + ], + 'gl': [ 'Greenland', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 5, type: 'input', 'data-addr-field': 'code', placeholder: localization[globalInterfaceLanguage].pholderAddressPostalCode}, + {fid: 6, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressPostalDistrict}, + {fid: 11, type: 'country'} + ], + 'gd': [ 'Grenada', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 3, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 11, type: 'country'} + ], + 'gp': [ 'Guadeloupe', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 5, type: 'input', 'data-addr-field': 'code', placeholder: localization[globalInterfaceLanguage].pholderAddressPostalCode}, + {fid: 6, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 11, type: 'country'} + ], + 'gt': [ 'Guatemala', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 5, type: 'input', 'data-addr-field': 'code', placeholder: localization[globalInterfaceLanguage].pholderAddressPostalCode}, + {fid: 6, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 11, type: 'country'} + ], + 'gn': [ 'Guinea', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 5, type: 'input', 'data-addr-field': 'code', placeholder: localization[globalInterfaceLanguage].pholderAddressPostalCode}, + {fid: 6, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 11, type: 'country'} + ], + 'gw': [ 'Guinea-Bissau', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 5, type: 'input', 'data-addr-field': 'code', placeholder: localization[globalInterfaceLanguage].pholderAddressPostalCode}, + {fid: 6, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 11, type: 'country'} + ], + 'gy': [ 'Guyana', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 3, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 11, type: 'country'} + ], + 'ht': [ 'Haiti', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 5, type: 'input', 'data-addr-field': 'code', placeholder: localization[globalInterfaceLanguage].pholderAddressPostalCode}, + {fid: 6, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 11, type: 'country'} + ], + 'hn': [ 'Honduras', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 5, type: 'input', 'data-addr-field': 'code', placeholder: localization[globalInterfaceLanguage].pholderAddressPostalCode}, + {fid: 6, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 7, type: 'input', 'data-addr-field': 'region', placeholder: localization[globalInterfaceLanguage].pholderAddressDepartment}, + {fid: 8, type: 'country'} + ], + 'hk': [ 'Hong Kong', + {fid: 1, type: 'country'}, + {fid: 5, type: 'input', 'data-addr-field': 'code', placeholder: localization[globalInterfaceLanguage].pholderAddressDistrict}, + {fid: 6, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 9, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + ], + 'hu': [ 'Hungary', + {fid: 5, type: 'input', 'data-addr-field': 'code', placeholder: localization[globalInterfaceLanguage].pholderAddressPostalCode}, + {fid: 6, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 9, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 11, type: 'country'} + ], + 'is': [ 'Iceland', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 5, type: 'input', 'data-addr-field': 'code', placeholder: localization[globalInterfaceLanguage].pholderAddressPostalCode}, + {fid: 6, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 11, type: 'country'} + ], + 'in': [ 'India', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 3, type: 'input', 'data-addr-field': 'region', placeholder: localization[globalInterfaceLanguage].pholderAddressProvince}, + {fid: 5, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 6, type: 'input', 'data-addr-field': 'code', placeholder: localization[globalInterfaceLanguage].pholderAddressPinCode}, + {fid: 11, type: 'country'} + ], + 'id': [ 'Indonesia', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 3, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 5, type: 'input', 'data-addr-field': 'region', placeholder: localization[globalInterfaceLanguage].pholderAddressProvince}, + {fid: 6, type: 'input', 'data-addr-field': 'code', placeholder: localization[globalInterfaceLanguage].pholderAddressPostalCode}, + {fid: 11, type: 'country'} + ], + 'ir': [ 'Iran', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 5, type: 'input', 'data-addr-field': 'code', placeholder: localization[globalInterfaceLanguage].pholderAddressPostalCode}, + {fid: 6, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 11, type: 'country'} + ], + 'iq': [ 'Iraq', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 3, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 9, type: 'input', 'data-addr-field': 'code', placeholder: localization[globalInterfaceLanguage].pholderAddressPostalCode}, + {fid: 11, type: 'country'} + ], + 'ie': [ 'Ireland', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 5, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 6, type: 'input', 'data-addr-field': 'region', placeholder: localization[globalInterfaceLanguage].pholderAddressCounty}, + {fid: 7, type: 'input', 'data-addr-field': 'code', placeholder: localization[globalInterfaceLanguage].pholderAddressPostalCode}, + {fid: 8, type: 'country'} + ], + 'im': [ 'Isle of Man', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 3, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 9, type: 'input', 'data-addr-field': 'code', placeholder: localization[globalInterfaceLanguage].pholderAddressPostalCode}, + {fid: 11, type: 'country'} + ], + 'il': [ 'Israel', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 5, type: 'input', 'data-addr-field': 'code', placeholder: localization[globalInterfaceLanguage].pholderAddressPostalCode}, + {fid: 6, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 11, type: 'country'} + ], + 'it': [ 'Italy', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 5, type: 'input', 'data-addr-field': 'code', placeholder: localization[globalInterfaceLanguage].pholderAddressPostalCode}, + {fid: 6, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 7, type: 'input', 'data-addr-field': 'region', placeholder: localization[globalInterfaceLanguage].pholderAddressProvince}, + {fid: 8, type: 'country'} + ], + 'jm': [ 'Jamaica', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 5, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 6, type: 'input', 'data-addr-field': 'code', placeholder: localization[globalInterfaceLanguage].pholderAddressPostalCode}, + {fid: 11, type: 'country'} + ], + 'jp': [ 'Japan', + {fid: 2, type: 'input', 'data-addr-field': 'code', placeholder: localization[globalInterfaceLanguage].pholderAddressPostalCode}, + {fid: 5, type: 'input', 'data-addr-field': 'region', placeholder: localization[globalInterfaceLanguage].pholderAddressPrefecture}, + {fid: 6, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCountyCity}, + {fid: 9, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressFurtherDivisions}, + {fid: 11, type: 'country'} + ], + 'jo': [ 'Jordan', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 5, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 6, type: 'input', 'data-addr-field': 'code', placeholder: localization[globalInterfaceLanguage].pholderAddressPostalCode}, + {fid: 11, type: 'country'} + ], + 'kz': [ 'Kazakhstan', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 3, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 4, type: 'input', 'data-addr-field': 'code', placeholder: localization[globalInterfaceLanguage].pholderAddressPostalCode}, + {fid: 11, type: 'country'} + ], + 'ke': [ 'Kenya', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 3, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 4, type: 'input', 'data-addr-field': 'code', placeholder: localization[globalInterfaceLanguage].pholderAddressPostalCode}, + {fid: 11, type: 'country'} + ], + 'ki': [ 'Kiribati', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 3, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 4, type: 'input', 'data-addr-field': 'region', placeholder: localization[globalInterfaceLanguage].pholderAddressIslandName}, + {fid: 11, type: 'country'} + ], + 'kp': [ 'North Korea', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 3, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 11, type: 'country'} + ], + 'kr': [ 'South Korea', + {fid: 0, type: 'input', 'data-addr-field': 'code', placeholder: localization[globalInterfaceLanguage].pholderAddressPostalCode}, + {fid: 1, type: 'country'}, + {fid: 5, type: 'input', 'data-addr-field': 'region', placeholder: localization[globalInterfaceLanguage].pholderAddressProvince}, + {fid: 6, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 9, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet} + ], + 'kw': [ 'Kuwait', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 5, type: 'input', 'data-addr-field': 'code', placeholder: localization[globalInterfaceLanguage].pholderAddressPostalCode}, + {fid: 6, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 9, type: 'input', 'data-addr-field': 'region', placeholder: localization[globalInterfaceLanguage].pholderAddressProvince}, + {fid: 11, type: 'country'} + ], + 'kg': [ 'Kyrgyzstan', + {fid: 5, type: 'input', 'data-addr-field': 'code', placeholder: localization[globalInterfaceLanguage].pholderAddressPostalCode}, + {fid: 6, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 9, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 11, type: 'country'} + ], + 'la': [ 'Laos', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 5, type: 'input', 'data-addr-field': 'code', placeholder: localization[globalInterfaceLanguage].pholderAddressPostalCode}, + {fid: 6, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 11, type: 'country'} + ], + 'lv': [ 'Latvia', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 5, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 6, type: 'input', 'data-addr-field': 'code', placeholder: localization[globalInterfaceLanguage].pholderAddressPostalCode}, + {fid: 11, type: 'country'} + ], + 'lb': [ 'Lebanon', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 5, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 6, type: 'input', 'data-addr-field': 'code', placeholder: localization[globalInterfaceLanguage].pholderAddressPostalCode}, + {fid: 11, type: 'country'} + ], + 'ls': [ 'Lesotho', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 5, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 6, type: 'input', 'data-addr-field': 'code', placeholder: localization[globalInterfaceLanguage].pholderAddressPostalCode}, + {fid: 11, type: 'country'} + ], + 'lr': [ 'Liberia', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 5, type: 'input', 'data-addr-field': 'code', placeholder: localization[globalInterfaceLanguage].pholderAddressPostalCode}, + {fid: 6, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 11, type: 'country'} + ], + 'ly': [ 'Libya', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 3, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 11, type: 'country'} + ], + 'li': [ 'Liechtenstein', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 5, type: 'input', 'data-addr-field': 'code', placeholder: localization[globalInterfaceLanguage].pholderAddressPostalCode}, + {fid: 6, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 11, type: 'country'} + ], + 'lt': [ 'Lithuania', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 5, type: 'input', 'data-addr-field': 'code', placeholder: localization[globalInterfaceLanguage].pholderAddressPostalCode}, + {fid: 6, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 11, type: 'country'} + ], + 'lu': [ 'Luxembourg', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 5, type: 'input', 'data-addr-field': 'code', placeholder: localization[globalInterfaceLanguage].pholderAddressPostalCode}, + {fid: 6, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 11, type: 'country'} + ], + 'mo': [ 'Macau', + {fid: 1, type: 'country'}, + {fid: 5, type: 'input', 'data-addr-field': 'code', placeholder: localization[globalInterfaceLanguage].pholderAddressDistrict}, + {fid: 6, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 9, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + ], + 'mk': [ 'Macedonia', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 5, type: 'input', 'data-addr-field': 'code', placeholder: localization[globalInterfaceLanguage].pholderAddressPostalCode}, + {fid: 6, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 11, type: 'country'} + ], + 'mg': [ 'Madagascar', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 5, type: 'input', 'data-addr-field': 'code', placeholder: localization[globalInterfaceLanguage].pholderAddressPostalCode}, + {fid: 6, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 11, type: 'country'} + ], + 'mw': [ 'Malawi', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 5, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 6, type: 'input', 'data-addr-field': 'code', placeholder: localization[globalInterfaceLanguage].pholderAddressPostalCode}, + {fid: 11, type: 'country'} + ], + 'my': [ 'Malaysia', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 5, type: 'input', 'data-addr-field': 'code', placeholder: localization[globalInterfaceLanguage].pholderAddressPostalCode}, + {fid: 6, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 7, type: 'input', 'data-addr-field': 'region', placeholder: localization[globalInterfaceLanguage].pholderAddressState}, + {fid: 8, type: 'country'} + ], + 'mv': [ 'Maldives', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 5, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 6, type: 'input', 'data-addr-field': 'code', placeholder: localization[globalInterfaceLanguage].pholderAddressPostalCode}, + {fid: 11, type: 'country'} + ], + 'ml': [ 'Mali', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 3, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 11, type: 'country'} + ], + 'mt': [ 'Malta', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 3, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 4, type: 'input', 'data-addr-field': 'code', placeholder: localization[globalInterfaceLanguage].pholderAddressPostalCode}, + {fid: 11, type: 'country'} + ], + 'mh': [ 'Marshall Islands', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 5, type: 'input', 'data-addr-field': 'code', placeholder: localization[globalInterfaceLanguage].pholderAddressPostalCode}, + {fid: 6, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 11, type: 'country'} + ], + 'mq': [ 'Martinique', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 5, type: 'input', 'data-addr-field': 'code', placeholder: localization[globalInterfaceLanguage].pholderAddressPostalCode}, + {fid: 6, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 11, type: 'country'} + ], + 'mr': [ 'Mauritania', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 3, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 11, type: 'country'} + ], + 'mu': [ 'Mauritius', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 3, type: 'input', 'data-addr-field': 'code', placeholder: localization[globalInterfaceLanguage].pholderAddressPostalCode}, + {fid: 4, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 11, type: 'country'} + ], + 'mx': [ 'Mexico', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 5, type: 'input', 'data-addr-field': 'code', placeholder: localization[globalInterfaceLanguage].pholderAddressPostalCode}, + {fid: 6, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 7, type: 'input', 'data-addr-field': 'region', placeholder: localization[globalInterfaceLanguage].pholderAddressState}, + {fid: 8, type: 'country'} + ], + 'fm': [ 'Micronesia', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 5, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 6, type: 'input', 'data-addr-field': 'region', placeholder: localization[globalInterfaceLanguage].pholderAddressState}, + {fid: 7, type: 'input', 'data-addr-field': 'code', placeholder: localization[globalInterfaceLanguage].pholderAddressZip}, + {fid: 8, type: 'country'} + ], + 'md': [ 'Moldova', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 5, type: 'input', 'data-addr-field': 'code', placeholder: localization[globalInterfaceLanguage].pholderAddressPostalCode}, + {fid: 6, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 11, type: 'country'} + ], + 'mc': [ 'Monaco', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 5, type: 'input', 'data-addr-field': 'code', placeholder: localization[globalInterfaceLanguage].pholderAddressPostalCode}, + {fid: 6, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 11, type: 'country'} + ], + 'mn': [ 'Mongolia', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 5, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 6, type: 'input', 'data-addr-field': 'code', placeholder: localization[globalInterfaceLanguage].pholderAddressPostalCode}, + {fid: 11, type: 'country'} + ], + 'me': [ 'Montenegro', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 5, type: 'input', 'data-addr-field': 'code', placeholder: localization[globalInterfaceLanguage].pholderAddressPostalCode}, + {fid: 6, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 11, type: 'country'} + ], + 'ma': [ 'Morocco', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 5, type: 'input', 'data-addr-field': 'code', placeholder: localization[globalInterfaceLanguage].pholderAddressPostalCode}, + {fid: 6, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 11, type: 'country'} + ], + 'mz': [ 'Mozambique', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 5, type: 'input', 'data-addr-field': 'code', placeholder: localization[globalInterfaceLanguage].pholderAddressPostalCode}, + {fid: 6, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 9, type: 'input', 'data-addr-field': 'region', placeholder: localization[globalInterfaceLanguage].pholderAddressProvince}, + {fid: 11, type: 'country'} + ], + 'mm': [ 'Myanmar', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 5, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 6, type: 'input', 'data-addr-field': 'code', placeholder: localization[globalInterfaceLanguage].pholderAddressPostalCode}, + {fid: 11, type: 'country'} + ], + 'na': [ 'Namibia', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 3, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 11, type: 'country'} + ], + 'nr': [ 'Nauru', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 5, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 6, type: 'input', 'data-addr-field': 'region', placeholder: localization[globalInterfaceLanguage].pholderAddressDistrict}, + {fid: 11, type: 'country'}, + ], + 'np': [ 'Nepal', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 5, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 6, type: 'input', 'data-addr-field': 'code', placeholder: localization[globalInterfaceLanguage].pholderAddressPostalCode}, + {fid: 11, type: 'country'} + ], + 'nl': [ 'Netherlands', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 5, type: 'input', 'data-addr-field': 'code', placeholder: localization[globalInterfaceLanguage].pholderAddressPostalCode}, + {fid: 6, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 11, type: 'country'} + ], + 'nc': [ 'New Caledonia', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 5, type: 'input', 'data-addr-field': 'code', placeholder: localization[globalInterfaceLanguage].pholderAddressPostalCode}, + {fid: 6, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 11, type: 'country'} + ], + 'nz': [ 'New Zealand', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 3, type: 'input', 'data-addr-field': 'region', placeholder: localization[globalInterfaceLanguage].pholderAddressSuburb}, + {fid: 5, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 6, type: 'input', 'data-addr-field': 'code', placeholder: localization[globalInterfaceLanguage].pholderAddressPostal}, + {fid: 11, type: 'country'} + ], + 'ni': [ 'Nicaragua', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 3, type: 'input', 'data-addr-field': 'code', placeholder: localization[globalInterfaceLanguage].pholderAddressPostalCode}, + {fid: 5, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 6, type: 'input', 'data-addr-field': 'region', placeholder: localization[globalInterfaceLanguage].pholderAddressDepartment}, + {fid: 11, type: 'country'} + ], + 'ne': [ 'Niger', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 5, type: 'input', 'data-addr-field': 'code', placeholder: localization[globalInterfaceLanguage].pholderAddressPostalCode}, + {fid: 6, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 11, type: 'country'} + ], + 'ng': [ 'Nigeria', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 5, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 6, type: 'input', 'data-addr-field': 'code', placeholder: localization[globalInterfaceLanguage].pholderAddressPostalCode}, + {fid: 9, type: 'input', 'data-addr-field': 'region', placeholder: localization[globalInterfaceLanguage].pholderAddressState}, + {fid: 11, type: 'country'} + ], + 'no': [ 'Norway', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 5, type: 'input', 'data-addr-field': 'code', placeholder: localization[globalInterfaceLanguage].pholderAddressPostalCode}, + {fid: 6, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 11, type: 'country'} + ], + 'om': [ 'Oman', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 3, type: 'input', 'data-addr-field': 'code', placeholder: localization[globalInterfaceLanguage].pholderAddressPostalCode}, + {fid: 4, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 9, type: 'input', 'data-addr-field': 'region', placeholder: localization[globalInterfaceLanguage].pholderAddressProvince}, + {fid: 11, type: 'country'} + ], + 'pk': [ 'Pakistan', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 5, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 6, type: 'input', 'data-addr-field': 'code', placeholder: localization[globalInterfaceLanguage].pholderAddressPostalCode}, + {fid: 11, type: 'country'} + ], + 'pw': [ 'Palau', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 5, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 6, type: 'input', 'data-addr-field': 'region', placeholder: localization[globalInterfaceLanguage].pholderAddressState}, + {fid: 7, type: 'input', 'data-addr-field': 'code', placeholder: localization[globalInterfaceLanguage].pholderAddressZip}, + {fid: 8, type: 'country'} + ], + 'ps': [ 'Palestinian Territories', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 5, type: 'input', 'data-addr-field': 'code', placeholder: localization[globalInterfaceLanguage].pholderAddressPostalCode}, + {fid: 6, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 11, type: 'country'} + ], + 'pa': [ 'Panama', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 5, type: 'input', 'data-addr-field': 'code', placeholder: localization[globalInterfaceLanguage].pholderAddressPostalCode}, + {fid: 6, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 9, type: 'input', 'data-addr-field': 'region', placeholder: localization[globalInterfaceLanguage].pholderAddressProvince}, + {fid: 11, type: 'country'} + ], + 'pg': [ 'Papua New Guinea', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 5, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 6, type: 'input', 'data-addr-field': 'code', placeholder: localization[globalInterfaceLanguage].pholderAddressPostalCode}, + {fid: 7, type: 'input', 'data-addr-field': 'region', placeholder: localization[globalInterfaceLanguage].pholderAddressProvince}, + {fid: 8, type: 'country'} + ], + 'py': [ 'Paraguay', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 5, type: 'input', 'data-addr-field': 'code', placeholder: localization[globalInterfaceLanguage].pholderAddressPostalCode}, + {fid: 6, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 11, type: 'country'} + ], + 'pe': [ 'Peru', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 5, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 6, type: 'input', 'data-addr-field': 'code', placeholder: localization[globalInterfaceLanguage].pholderAddressPostalCode}, + {fid: 11, type: 'country'} + ], + 'ph': [ 'Philippines', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 5, type: 'input', 'data-addr-field': 'region', placeholder: localization[globalInterfaceLanguage].pholderAddressDistrictSubdivision}, + {fid: 6, type: 'input', 'data-addr-field': 'code', placeholder: localization[globalInterfaceLanguage].pholderAddressPostCode}, + {fid: 7, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 8, type: 'country'} + ], + 'pl': [ 'Poland', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 5, type: 'input', 'data-addr-field': 'code', placeholder: localization[globalInterfaceLanguage].pholderAddressPostalCode}, + {fid: 6, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 11, type: 'country'} + ], + 'pt': [ 'Portugal', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 5, type: 'input', 'data-addr-field': 'code', placeholder: localization[globalInterfaceLanguage].pholderAddressPostalCode}, + {fid: 6, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 11, type: 'country'} + ], + 'pr': [ 'Puerto Rico', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 5, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 6, type: 'input', 'data-addr-field': 'region', placeholder: localization[globalInterfaceLanguage].pholderAddressState}, + {fid: 7, type: 'input', 'data-addr-field': 'code', placeholder: localization[globalInterfaceLanguage].pholderAddressZip}, + {fid: 8, type: 'country'} + ], + 'qa': [ 'Qatar', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 5, type: 'input', 'data-addr-field': 'code', placeholder: localization[globalInterfaceLanguage].pholderAddressPostalCode}, + {fid: 6, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 11, type: 'country'} + ], + 're': [ 'Réunion', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 5, type: 'input', 'data-addr-field': 'code', placeholder: localization[globalInterfaceLanguage].pholderAddressPostalCode}, + {fid: 6, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 11, type: 'country'} + ], + 'ro': [ 'Romania', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 5, type: 'input', 'data-addr-field': 'code', placeholder: localization[globalInterfaceLanguage].pholderAddressPostalCode}, + {fid: 6, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 11, type: 'country'} + ], + 'ru': [ 'Russia', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 3, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCityRegion}, + {fid: 4, type: 'input', 'data-addr-field': 'region', placeholder: localization[globalInterfaceLanguage].pholderAddressProvince}, + {fid: 11, type: 'country'}, + {fid: 12, type: 'input', 'data-addr-field': 'code', placeholder: localization[globalInterfaceLanguage].pholderAddressPostalCode} + ], + 'rw': [ 'Rwanda', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 3, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 11, type: 'country'} + ], + 'bl': [ 'Saint Barthélemy', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 5, type: 'input', 'data-addr-field': 'code', placeholder: localization[globalInterfaceLanguage].pholderAddressPostalCode}, + {fid: 6, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 11, type: 'country'} + ], + 'sh': [ 'Saint Helena', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 3, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 4, type: 'input', 'data-addr-field': 'code', placeholder: localization[globalInterfaceLanguage].pholderAddressPostalCode}, + {fid: 11, type: 'country'} + ], + 'kn': [ 'Saint Kitts and Nevis', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 5, type: 'input', 'data-addr-field': 'code', placeholder: localization[globalInterfaceLanguage].pholderAddressPostalCode}, + {fid: 6, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 7, type: 'input', 'data-addr-field': 'region', placeholder: localization[globalInterfaceLanguage].pholderAddressIslandName}, + {fid: 8, type: 'country'} + ], + 'lc': [ 'Saint Lucia', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 3, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 11, type: 'country'} + ], + 'mf': [ 'Saint Martin', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 5, type: 'input', 'data-addr-field': 'code', placeholder: localization[globalInterfaceLanguage].pholderAddressPostalCode}, + {fid: 6, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 11, type: 'country'} + ], + 'vc': [ 'Saint Vincent and the Grenadines', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 3, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 11, type: 'country'} + ], + 'ws': [ 'Samoa', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 3, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 11, type: 'country'} + ], + 'sm': [ 'San Marino', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 5, type: 'input', 'data-addr-field': 'code', placeholder: localization[globalInterfaceLanguage].pholderAddressPostalCode}, + {fid: 6, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 7, type: 'input', 'data-addr-field': 'region', placeholder: localization[globalInterfaceLanguage].pholderAddressProvince}, + {fid: 8, type: 'country'} + ], + 'st': [ 'Sao Tome and Principe', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 3, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 11, type: 'country'} + ], + 'sa': [ 'Saudi Arabia', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 5, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 6, type: 'input', 'data-addr-field': 'code', placeholder: localization[globalInterfaceLanguage].pholderAddressPostalCode}, + {fid: 11, type: 'country'} + ], + 'sn': [ 'Senegal', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 5, type: 'input', 'data-addr-field': 'code', placeholder: localization[globalInterfaceLanguage].pholderAddressPostalCode}, + {fid: 6, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 11, type: 'country'} + ], + 'rs': [ 'Serbia', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 5, type: 'input', 'data-addr-field': 'code', placeholder: localization[globalInterfaceLanguage].pholderAddressPostalCode}, + {fid: 6, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 11, type: 'country'} + ], + 'sc': [ 'Seychelles', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 3, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 11, type: 'country'} + ], + 'sl': [ 'Sierra Leone', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 3, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 11, type: 'country'} + ], + 'sg': [ 'Singapore', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 5, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 6, type: 'input', 'data-addr-field': 'code', placeholder: localization[globalInterfaceLanguage].pholderAddressPostalCode}, + {fid: 11, type: 'country'} + ], + 'sk': [ 'Slovak Republic', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 5, type: 'input', 'data-addr-field': 'code', placeholder: localization[globalInterfaceLanguage].pholderAddressPostalCode}, + {fid: 6, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 11, type: 'country'} + ], + 'si': [ 'Slovenia', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 5, type: 'input', 'data-addr-field': 'code', placeholder: localization[globalInterfaceLanguage].pholderAddressPostalCode}, + {fid: 6, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 11, type: 'country'} + ], + 'sb': [ 'Solomon Islands', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 3, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 11, type: 'country'} + ], + 'so': [ 'Somalia', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 5, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 6, type: 'input', 'data-addr-field': 'region', placeholder: localization[globalInterfaceLanguage].pholderAddressRegion}, + {fid: 7, type: 'input', 'data-addr-field': 'code', placeholder: localization[globalInterfaceLanguage].pholderAddressPostalCode}, + {fid: 8, type: 'country'} + ], + 'za': [ 'South Africa', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 3, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 4, type: 'input', 'data-addr-field': 'region', placeholder: localization[globalInterfaceLanguage].pholderAddressProvince}, + {fid: 9, type: 'input', 'data-addr-field': 'code', placeholder: localization[globalInterfaceLanguage].pholderAddressPostalCode}, + {fid: 11, type: 'country'} + ], + 'gs': [ 'South Georgia and South Sandwich Islands', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 3, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 4, type: 'input', 'data-addr-field': 'code', placeholder: localization[globalInterfaceLanguage].pholderAddressPostalCode}, + {fid: 11, type: 'country'} + ], + 'es': [ 'Spain', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 5, type: 'input', 'data-addr-field': 'code', placeholder: localization[globalInterfaceLanguage].pholderAddressPostalCode}, + {fid: 6, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 7, type: 'input', 'data-addr-field': 'region', placeholder: localization[globalInterfaceLanguage].pholderAddressProvince}, + {fid: 8, type: 'country'} + ], + 'lk': [ 'Sri Lanka', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 3, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 4, type: 'input', 'data-addr-field': 'code', placeholder: localization[globalInterfaceLanguage].pholderAddressPostalCode}, + {fid: 11, type: 'country'} + ], + 'sd': [ 'Sudan', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 3, type: 'input', 'data-addr-field': 'code', placeholder: localization[globalInterfaceLanguage].pholderAddressPostalCode}, + {fid: 4, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 11, type: 'country'} + ], + 'sr': [ 'Suriname', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 3, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 4, type: 'input', 'data-addr-field': 'region', placeholder: localization[globalInterfaceLanguage].pholderAddressPostalDistrict}, + {fid: 11, type: 'country'} + ], + 'sz': [ 'Swaziland', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 3, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 4, type: 'input', 'data-addr-field': 'code', placeholder: localization[globalInterfaceLanguage].pholderAddressPostalCode}, + {fid: 11, type: 'country'} + ], + 'se': [ 'Sweden', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 5, type: 'input', 'data-addr-field': 'code', placeholder: localization[globalInterfaceLanguage].pholderAddressPostalCode}, + {fid: 6, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 11, type: 'country'} + ], + 'ch': [ 'Switzerland', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 5, type: 'input', 'data-addr-field': 'code', placeholder: localization[globalInterfaceLanguage].pholderAddressPostalCode}, + {fid: 6, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 11, type: 'country'} + ], + 'sy': [ 'Syria', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 5, type: 'input', 'data-addr-field': 'code', placeholder: localization[globalInterfaceLanguage].pholderAddressPostalCode}, + {fid: 6, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 11, type: 'country'} + ], + 'tw': [ 'Taiwan', + {fid: 1, type: 'country'}, + {fid: 2, type: 'input', 'data-addr-field': 'code', placeholder: localization[globalInterfaceLanguage].pholderAddressZip}, + {fid: 3, type: 'input', 'data-addr-field': 'region', placeholder: localization[globalInterfaceLanguage].pholderAddressCountyCity}, + {fid: 4, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressTownshipDistrict}, + {fid: 9, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet} + ], + 'tj': [ 'Tajikistan', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 5, type: 'input', 'data-addr-field': 'code', placeholder: localization[globalInterfaceLanguage].pholderAddressPostalCode}, + {fid: 6, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 11, type: 'country'} + ], + 'tz': [ 'Tanzania', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 3, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 11, type: 'country'} + ], + 'th': [ 'Thailand', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 3, type: 'input', 'data-addr-field': 'region', placeholder: localization[globalInterfaceLanguage].pholderAddressDistrictSubdivision}, + {fid: 5, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressProvince}, + {fid: 6, type: 'input', 'data-addr-field': 'code', placeholder: localization[globalInterfaceLanguage].pholderAddressPostCode}, + {fid: 11, type: 'country'} + ], + 'tl': [ 'Timor-Leste', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 3, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 11, type: 'country'} + ], + 'tg': [ 'Togo', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 3, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 11, type: 'country'} + ], + 'to': [ 'Tonga', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 3, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 11, type: 'country'} + ], + 'tt': [ 'Trinidad and Tobago', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 3, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 11, type: 'country'} + ], + 'tn': [ 'Tunisia', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 5, type: 'input', 'data-addr-field': 'code', placeholder: localization[globalInterfaceLanguage].pholderAddressPostalCode}, + {fid: 6, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 11, type: 'country'} + ], + 'tr': [ 'Turkey', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 5, type: 'input', 'data-addr-field': 'code', placeholder: localization[globalInterfaceLanguage].pholderAddressPostalCode}, + {fid: 6, type: 'input', 'data-addr-field': 'region', placeholder: localization[globalInterfaceLanguage].pholderAddressDistrict}, + {fid: 7, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 8, type: 'country'} + ], + 'tm': [ 'Turkmenistan', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 5, type: 'input', 'data-addr-field': 'code', placeholder: localization[globalInterfaceLanguage].pholderAddressPostalCode}, + {fid: 6, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 11, type: 'country'} + ], + 'tv': [ 'Tuvalu', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 3, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 11, type: 'country'} + ], + 'vi': [ 'U.S. Virgin Islands', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 5, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 6, type: 'input', 'data-addr-field': 'region', placeholder: localization[globalInterfaceLanguage].pholderAddressState}, + {fid: 7, type: 'input', 'data-addr-field': 'code', placeholder: localization[globalInterfaceLanguage].pholderAddressZip}, + {fid: 8, type: 'country'} + ], + 'ug': [ 'Uganda', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 3, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 11, type: 'country'} + ], + 'ua': [ 'Ukraine', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 3, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 4, type: 'input', 'data-addr-field': 'code', placeholder: localization[globalInterfaceLanguage].pholderAddressPostalCode}, + {fid: 11, type: 'country'} + ], + 'ae': [ 'United Arab Emirates', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 5, type: 'input', 'data-addr-field': 'code', placeholder: localization[globalInterfaceLanguage].pholderAddressPostalCode}, + {fid: 6, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 11, type: 'country'} + ], + 'gb': [ 'United Kingdom', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 3, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 4, type: 'input', 'data-addr-field': 'region', placeholder: localization[globalInterfaceLanguage].pholderAddressCounty}, + {fid: 9, type: 'input', 'data-addr-field': 'code', placeholder: localization[globalInterfaceLanguage].pholderAddressPostCode}, + {fid: 11, type: 'country'} + ], + 'us': [ 'United States', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 5, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 6, type: 'input', 'data-addr-field': 'region', placeholder: localization[globalInterfaceLanguage].pholderAddressState}, + {fid: 7, type: 'input', 'data-addr-field': 'code', placeholder: localization[globalInterfaceLanguage].pholderAddressZip}, + {fid: 8, type: 'country'} + ], + 'uy': [ 'Uruguay', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 5, type: 'input', 'data-addr-field': 'code', placeholder: localization[globalInterfaceLanguage].pholderAddressPostalCode}, + {fid: 6, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 7, type: 'input', 'data-addr-field': 'region', placeholder: localization[globalInterfaceLanguage].pholderAddressDepartment}, + {fid: 8, type: 'country'} + ], + 'uz': [ 'Uzbekistan', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 3, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 11, type: 'country'}, + {fid: 12, type: 'input', 'data-addr-field': 'code', placeholder: localization[globalInterfaceLanguage].pholderAddressPostalCode} + ], + 'vu': [ 'Vanuatu', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 3, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 11, type: 'country'} + ], + 'va': [ 'Vatican', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 5, type: 'input', 'data-addr-field': 'code', placeholder: localization[globalInterfaceLanguage].pholderAddressPostalCode}, + {fid: 6, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 11, type: 'country'} + ], + 've': [ 'Venezuela', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 5, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 6, type: 'input', 'data-addr-field': 'code', placeholder: localization[globalInterfaceLanguage].pholderAddressPostalCode}, + {fid: 7, type: 'input', 'data-addr-field': 'region', placeholder: localization[globalInterfaceLanguage].pholderAddressState}, + {fid: 8, type: 'country'} + ], + 'vn': [ 'Vietnam', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 3, type: 'input', 'data-addr-field': 'region', placeholder: localization[globalInterfaceLanguage].pholderAddressProvince}, + {fid: 5, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 6, type: 'input', 'data-addr-field': 'code', placeholder: localization[globalInterfaceLanguage].pholderAddressPostalCode}, + {fid: 11, type: 'country'} + ], + 'ye': [ 'Yemen', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 5, type: 'input', 'data-addr-field': 'code', placeholder: localization[globalInterfaceLanguage].pholderAddressPostalCode}, + {fid: 6, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 11, type: 'country'} + ], + 'zm': [ 'Zambia', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 5, type: 'input', 'data-addr-field': 'code', placeholder: localization[globalInterfaceLanguage].pholderAddressPostalCode}, + {fid: 6, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 11, type: 'country'} + ], + 'zw': [ 'Zimbabwe', + {fid: 2, type: 'input', 'data-addr-field': 'street', placeholder: localization[globalInterfaceLanguage].pholderAddressStreet}, + {fid: 3, type: 'input', 'data-addr-field': 'locality', placeholder: localization[globalInterfaceLanguage].pholderAddressCity}, + {fid: 11, type: 'country'} + ] + }; +} +function vObjectLineFolding(inputText) +{ + var outputText=''; + var maxLineOctetLength=75; + var count=0; + + for(var i=0; inputText[i]!=undefined; i++) + { + var currentChar=inputText.charCodeAt(i); + var nextChar=inputText.charCodeAt(i+1); + if(currentChar==0x000D && nextChar==0x000A) + { + count=0; + outputText+='\r\n'; + i++; + continue; + } + + var surrogatePair=false; + if(currentChar<0x0080) + var charNum=1; + else if(currentChar<0x0800) + var charNum=2; + else if(currentChar<0xd800 || currentChar>=0xe000) + var charNum=3; + else + { + // surrogate pair + // UTF-16 encodes 0x10000-0x10FFFF by subtracting 0x10000 and splitting + // the 20 bits of 0x0-0xFFFFF into two halves + charNum=4; + surrogatePair=true; + } + + if(count>maxLineOctetLength-charNum) + { + outputText+='\r\n '; + count=1; + } + outputText+=String.fromCharCode(currentChar); + if(surrogatePair) + { + outputText+=String.fromCharCode(vCardText.charCodeAt(i+1)); + i++; + } + count+=charNum; + } + return outputText; +} + +function rgbToHex(rgb) +{ + rgb=rgb.match(/^rgba?\((\d+),\s*(\d+),\s*(\d+)(?:,\s*(\d+(?:\.\d*)?|(?:\.\d+)))?\)$/); + function hex(x) + { + return ("0"+parseInt(x).toString(16)).slice(-2); + } + return "#"+hex(rgb[1])+hex(rgb[2])+hex(rgb[3]); +} + +function hexToRgba(hex, transparency) { + var bigint=parseInt(hex.substring(1), 16); + var r=(bigint >> 16) & 255; + var g=(bigint >> 8) & 255; + var b=bigint & 255; + + return 'rgba('+r+','+g+','+b+','+transparency+')'; +} + +function rgbToRgba(rgb, transparency) +{ + rgb=rgb.match(/^rgba?\((\d+),\s*(\d+),\s*(\d+)(?:,\s*(\d+(?:\.\d*)?|(?:\.\d+)))?\)$/); + return 'rgba('+rgb[1]+','+rgb[2]+','+rgb[3]+','+transparency+')'; +} + +function dataGetChecked(resourceListSelector) +{ + var checkedArr=$(resourceListSelector).find('input[type=checkbox]:checked').not('.unloadCheck').filter('[data-id]').filter(function(){return this.indeterminate==false}).map(function(){return $(this).attr('data-id')}).get(); + + for(i=checkedArr.length-1; i>=0; i--) + if(checkedArr[i].match(new RegExp('[^/]$'))!=null && checkedArr.indexOf(checkedArr[i].replace(new RegExp('[^/]+$'), ''))!=-1) + checkedArr.splice(i, 1); + + return checkedArr; +} + +function resourceChBoxClick(obj, resourceListSelector, headerSelector, returnChecked) +{ + $(obj).parent().nextUntil(headerSelector).find('input[type=checkbox]:visible').prop('checked', $(obj).prop('checked')).prop('indeterminate', false); + if(returnChecked) + return dataGetChecked(resourceListSelector); +} + +function collectionChBoxClick(obj, resourceListSelector, headerSelector, collectionSelector, groupSelector, returnChecked) +{ + if(collectionSelector.match('_item$')) + { + var tmp_coh=$(obj).parent().prevAll(headerSelector).first(); + var tmp_co_chbxs=tmp_coh.nextUntil(headerSelector).find('input[type=checkbox]:visible'); + } + else + { + var tmp_coh=$(obj).parent().parent().prevAll(headerSelector).first(); + var tmp_co_chbxs=tmp_coh.nextUntil(headerSelector).find(collectionSelector).find('input[type=checkbox]:visible'); + } + + if(groupSelector!=null) + { + if($(obj).prop('checked')==false && $(obj).prop('indeterminate')==false && $(obj).attr('data-ind')=='false' && + $(obj).parent().next(groupSelector).height()>0/* note: ':visible' is not working! */) + { + $(obj).prop('indeterminate', true); + $(obj).prop('checked', true); + $(obj).attr('data-ind', 'true'); + tmp_coh.find('input[type=checkbox]:visible').prop('indeterminate', true).prop('checked', false); + + if(returnChecked) + return dataGetChecked(resourceListSelector); + return true; + } + else if($(obj).attr('data-ind')=='true') + $(obj).attr('data-ind', 'false'); + + $(obj).parent().next(groupSelector).find('input[type=checkbox]').prop('checked', $(obj).prop('checked')); + } + + if(tmp_co_chbxs.length==tmp_co_chbxs.filter(':checked').length) + tmp_coh.find('input[type=checkbox]:visible').prop('checked', true).prop('indeterminate', false); + else if(tmp_co_chbxs.filter(':checked').length==0 && tmp_co_chbxs.filter(function(){return this.indeterminate==true}).length==0) + tmp_coh.find('input[type=checkbox]:visible').prop('checked', false).prop('indeterminate', false); + else + tmp_coh.find('input[type=checkbox]:visible').prop('indeterminate', true).prop('checked', false); + + if(returnChecked) + return dataGetChecked(resourceListSelector); +} + +function groupChBoxClick(obj, resourceListSelector, headerSelector, collectionSelector, groupSelector, returnChecked) +{ + var tmp_cg=$(obj).closest(groupSelector); + var tmp_cg_chbxs=tmp_cg.find('input[type=checkbox]:visible'); + var tmp_co_chbxs=tmp_cg.prev().find('input[type=checkbox]:visible'); + + if(tmp_cg_chbxs.filter(':checked').length==0) + tmp_co_chbxs.prop('checked', false).prop('indeterminate', false); + else + tmp_co_chbxs.prop('indeterminate', true).prop('checked', false); + + return collectionChBoxClick(tmp_co_chbxs, resourceListSelector, headerSelector, collectionSelector, null, returnChecked); +} + +function loadResourceChBoxClick(obj, resourceListSelector, headerSelector, collectionSelector, resourceItemSelector) +{ + if(collectionSelector.match('_item$')) + { + var firstCollection=$(obj).parent().nextUntil(headerSelector).first(); + if($(obj).prop('checked')) + $(obj).parent().nextUntil(headerSelector).addBack().removeClass('unloaded'); + else + $(obj).parent().nextUntil(headerSelector).addBack().addClass('unloaded'); + } + else + { + var firstCollection=$(obj).parent().nextUntil(headerSelector).first().find(collectionSelector); + if($(obj).prop('checked')) + { + $(obj).parent().nextUntil(headerSelector).find(collectionSelector).removeClass('unloaded'); + $(obj).parent().removeClass('unloaded'); + } + else + { + $(obj).parent().nextUntil(headerSelector).find(collectionSelector).addClass('unloaded'); + $(obj).parent().addClass('unloaded'); + } + } + + $(resourceListSelector).find(headerSelector).find('.unloadCheckHeader:checked').prop('disabled',false); + $(resourceListSelector).find(collectionSelector).find('.unloadCheck:checked').prop('disabled',false); + if(!$(resourceListSelector).find(headerSelector).find('.unloadCheckHeader').filter(function(){return $(this).prop('checked') || $(this).prop('indeterminate');}).length) + { + $(obj).prop({'checked':false,'indeterminate':true}); + $(obj).parent().removeClass('unloaded'); + $(obj).parent().nextUntil(headerSelector).find('.unloadCheck').prop({'checked':false,'indeterminate':false}); + firstCollection.removeClass('unloaded').find('.unloadCheck').prop({'checked':true,'indeterminate':false,'disabled':true}); + } + else + { + $(obj).parent().nextUntil(headerSelector).find('.unloadCheck').prop({'checked':$(obj).prop('checked'),'indeterminate':false}); + var checkedCollections=$(resourceListSelector).find(collectionSelector).find('.unloadCheck:checked'); + if(checkedCollections.length==1) + { + var collection=checkedCollections.parents(resourceItemSelector); + if(!collection.prev().hasClass(resourceItemSelector.slice(1)) && !collection.next().hasClass(resourceItemSelector.slice(1))) + collection.prev().find('.unloadCheckHeader').prop('disabled',true); + checkedCollections.prop('disabled',true); + } + } +} + +function loadCollectionChBoxClick(obj, resourceListSelector, headerSelector, collectionSelector, resourceItemSelector) +{ + if($(obj).prop('checked')) + $(obj).parent().removeClass('unloaded'); + else + $(obj).parent().addClass('unloaded'); + + var checkedCollections=$(resourceListSelector).find(collectionSelector).find('.unloadCheck:checked'); + if(checkedCollections.length==1) + { + var collection=checkedCollections.parents(resourceItemSelector); + if(!collection.prev().hasClass(resourceItemSelector.slice(1)) && !collection.next().hasClass(resourceItemSelector.slice(1))) + collection.prev().find('.unloadCheckHeader').prop('disabled',true); + checkedCollections.prop('disabled',true); + } + else + { + $(resourceListSelector).find(headerSelector).find('.unloadCheckHeader:checked').prop('disabled',false); + checkedCollections.prop('disabled',false); + } + + if(collectionSelector.match('_item$')) + { + var tmp_coh=$(obj).parent().prevAll(headerSelector).first(); + var tmp_co_chbxs=tmp_coh.nextUntil(headerSelector).find('.unloadCheck'); + } + else + { + var tmp_coh=$(obj).parent().parent().prevAll(headerSelector).first(); + var tmp_co_chbxs=tmp_coh.nextUntil(headerSelector).find(collectionSelector).find('.unloadCheck'); + } + + if(tmp_co_chbxs.length==tmp_co_chbxs.filter(':checked').length) + tmp_coh.removeClass('unloaded').find('.unloadCheckHeader').prop('checked', true).prop('indeterminate', false); + else if(tmp_co_chbxs.filter(':checked').length==0 && tmp_co_chbxs.filter(function(){return this.indeterminate==true}).length==0) + tmp_coh.addClass('unloaded').find('.unloadCheckHeader').prop('checked', false).prop('indeterminate', false); + else + tmp_coh.removeClass('unloaded').find('.unloadCheckHeader').prop('indeterminate', true).prop('checked', false); +} + +// Escape vCalendar value - RFC2426 (Section 2.4.2) +function vcalendarEscapeValue(inputValue) +{ + return (inputValue==undefined ? '' : inputValue).replace(vCalendar.pre['escapeRex'],"\\$1").replace(vCalendar.pre['escapeRex2'],'\\n'); +} + +// Unescape vCalendar value - RFC2426 (Section 2.4.2) +function vcalendarUnescapeValue(inputValue) +{ + var outputValue=''; + + if(inputValue!=undefined) + { + for(var i=0;i!$_:': RegExp('^(?::_\\$!!\\$_:|other)$') +}; + +dataTypes['address_type_store_as']={ + '_$!!$_':'_$!!$_' +}; + +dataTypes['phone_type']={ + 'work': RegExp('^(?:voice,)?work$'), + 'home': RegExp('^home(?:,voice)?$'), + 'cell': RegExp('^cell(?:,voice)?$'), + 'cell,work': RegExp('^cell(?:,voice)?,work$'), + 'cell,home': RegExp('^cell,home(?:,voice)?$'), + 'main': RegExp('^main(?:,voice)?$'), + 'pager': RegExp('^pager$'), + 'fax': RegExp('^fax$'), + 'fax,work': RegExp('^fax,work$'), + 'fax,home': RegExp('^fax,home$'), + 'iphone': RegExp('^(?::_\\$!!\\$_:|(?:cell,)?iphone(?:,voice)?)$'), + 'other': RegExp('^(?::_\\$!!\\$_:|other)(?:,voice)?$') +}; + +dataTypes['phone_type_store_as']={ + '_$!!$_':'_$!!$_', + '_$!!$_':'_$!!$_' +}; + +dataTypes['email_type']={ + 'internet,work': RegExp('^internet,work$'), + 'home,internet': RegExp('^home,internet$'), + ':mobileme:,internet': RegExp('^(?::mobileme:,internet|internet,mobileme)$'), + ':_$!!$_:,internet': RegExp('^(?::_\\$!!\\$_:,internet|internet,other)$') +}; + +dataTypes['email_type_store_as']={ + '_$!!$_':'_$!!$_', + '_$!!$_':'_$!!$_' +}; + +dataTypes['url_type']={ + 'work': RegExp('^work$'), + 'home': RegExp('^home$'), + ':_$!!$_:': RegExp('^(?::_\\$!!\\$_:|homepage)$'), + ':_$!!$_:': RegExp('^(?::_\\$!!\\$_:|other)$') +}; + +dataTypes['url_type_store_as']={ + '_$!!$_':'_$!!$_', + '_$!!$_':'_$!!$_' +}; + +dataTypes['date_type']={ + ':_$!!$_:': RegExp('^:_\\$!!\\$_:$'), + ':_$!!$_:': RegExp('^:_\\$!!\\$_:$') +}; + +dataTypes['date_store_as']={ + '_$!!$_':'_$!!$_', + '_$!!$_':'_$!!$_' +}; + +dataTypes['person_type']={ + ':_$!!$_:': RegExp('^:_\\$!!\\$_:$'), + ':_$!!$_:': RegExp('^:_\\$!!\\$_:$'), + ':_$!!$_:': RegExp('^:_\\$!!\\$_:$'), + ':_$!!$_:': RegExp('^:_\\$!!\\$_:$'), + ':_$!!$_:': RegExp('^:_\\$!!\\$_:$'), + ':_$!!$_:': RegExp('^:_\\$!!\\$_:$'), + ':_$!!$_:': RegExp('^:_\\$!!\\$_:$'), + ':_$!!$_:': RegExp('^:_\\$!!\\$_:$'), + ':_$!!$_:': RegExp('^:_\\$!!\\$_:$'), + ':_$!!$_:': RegExp('^:_\\$!!\\$_:$'), + ':_$!!$_:': RegExp('^:_\\$!!\\$_:$'), + ':_$!!$_:': RegExp('^:_\\$!!\\$_:$') +}; + +dataTypes['person_type_store_as']={ + '_$!!$_':'_$!!$_', + '_$!!$_':'_$!!$_', + '_$!!$_':'_$!!$_', + '_$!!$_':'_$!!$_', + '_$!!$_':'_$!!$_', + '_$!!$_':'_$!!$_', + '_$!!$_':'_$!!$_', + '_$!!$_':'_$!!$_', + '_$!!$_':'_$!!$_', + '_$!!$_':'_$!!$_', + '_$!!$_':'_$!!$_', + '_$!!$_':'_$!!$_' +}; + +dataTypes['im_type']={ + 'work': RegExp('^work$'), + 'home': RegExp('^home$'), + ':mobileme:': RegExp('^(?::mobileme:|mobileme)$'), + ':_$!!$_:': RegExp('^(?::_\\$!!\\$_:|other)$') +}; + +dataTypes['im_type_store_as']={ + '_$!!$_':'_$!!$_', + '_$!!$_':'_$!!$_' +}; + +dataTypes['im_service_type_store_as']={ + 'aim':'AIM', + 'icq':'ICQ', + 'irc':'IRC', + 'jabber':'Jabber', + 'msn':'MSN', + 'yahoo':'Yahoo', + 'facebook':'Facebook', + 'gadugadu':'GaduGadu', + 'googletalk':'GoogleTalk', + 'qq':'QQ', + 'skype':'Skype' +}; + +dataTypes['profile_type']={ + 'twitter': RegExp('^twitter$'), + 'facebook': RegExp('^facebook$'), + 'flickr': RegExp('^flickr$'), + 'linkedin': RegExp('^linkedin$'), + 'myspace': RegExp('^myspace$'), + 'sinaweibo': RegExp('^sinaweibo$') +}; + +dataTypes['profile_type_store_as']={}; diff --git a/radicale_web/web/infcloud/config.js b/radicale_web/web/infcloud/config.js new file mode 100644 index 0000000..ff4502d --- /dev/null +++ b/radicale_web/web/infcloud/config.js @@ -0,0 +1,1440 @@ +/* +InfCloud - the open source CalDAV/CardDAV Web Client +Copyright (C) 2011-2015 + Jan Mate + Andrej Lezo + Matej Mihalik + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as +published by the Free Software Foundation, either version 3 of the +License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . +*/ + + +// NOTE: see readme.txt before you start to configure this client! + + +// NOTE: do not forget to execute the cache_update.sh script every time you +// update this configuration file or any other files (otherwise your browser +// will use the previous version of files stored in HTML5 cache). Alternatively +// you can update the cache.manifest manually - edit the second line beginning +// with "#V 20" to anything else (this file simple needs "some" change) + + +// Supported setup types (use ONE of them): +// a.) globalAccountSettings => username and password is hardcoded +// in config.js, automatic login without the login screen +// - advantages: fast login process = no username/password is required +// - disadvantages: username/password is visible in your config.js, so +// this type of setup is recommended ONLY for intranet/home users +// b.) globalNetworkCheckSettings => standard setup with login screen +// - advantages: username/password is required (no visible +// username/password in config.js) +// - disadvantages: if a user enters wrong username/password then +// the browser will show authentication popup window (it is NOT +// possible to disable it in JavaScript; see the next option) +// c.) globalNetworkAccountSettings => advanced setup with login screen +// - advantages: no authentication popup if you enter wrong username/ +// password, dynamic XML configuration generator (you can generate +// different configurations for your users /by modifying the "auth" +// module configuration or the PHP code itself/) +// - disadvantages: requires PHP >= 5.3 and additional configuration, +// only basic http authentication is supported => always use https! +// +// +// What is a "principal URL"? => Check you server documentation! +// - "principal URL" is NOT "collection URL" +// - this client automatically detects collections for "principal URL" +// - PROPER "principal URL" looks like: +// https://server.com:8443/principals/users/USER/ +// https://server.com:8443/caldav.php/USER/ +// - INVALID principal URL looks like: +// https://server.com:8443/principals/users/USER/collection/ +// => this is a collection URL +// https://server.com:8443/caldav.php/USER/collection/ +// => this is a collection URL +// https://server.com:8443/principals/users/USER +// => missing trailing '/' +// https://server.com:8443/caldav.php/USER +// => missing trailing '/' +// /caldav.php/USER/ +// => relative URL instead of full URL +// +// +// List of properties used in globalAccountSettings, globalNetworkCheckSettings +// and globalNetworkAccountSettings variables (+ in the "auth" module): +// - href +// Depending on the setup type set the value to: +// a.) globalAccountSettings: full "principal URL" +// b.) globalNetworkCheckSettings: "principal URL" WITHOUT the "USER/" part +// c.) globalNetworkAccountSettings: "full URL" to the "auth" directory +// This property is supported in: +// globalAccountSettings +// globalNetworkCheckSettings +// globalNetworkAccountSettings +// - userAuth +// - userName +// Set the username you want to login. +// - userPassword +// Set the password for the given username. +// This property is supported in: +// globalAccountSettings +// - timeOut +// This option sets the timeout for jQuery .ajax call (in miliseconds). +// Example: +// timeOut: 90000 +// This property is supported in: +// globalAccountSettings +// globalNetworkCheckSettings +// globalNetworkAccountSettings +// - lockTimeOut +// NOTE: used only if server supports LOCK requests +// This option sets the LOCK timeout value if resource locking +// is used (in miliseconds). +// Example: +// lockTimeOut: 10000 +// This property is supported in: +// globalAccountSettings +// globalNetworkCheckSettings +// globalNetworkAccountSettings (available in auth module only) +// - checkContentType +// This option enables a content-type checking for server response. +// If enabled then only objects with proper content-type are inserted +// into the interface. +// If you cannot see data in the interface you may try to disable it (useful +// if your server returns wrong value in "propstat/prop/getcontenttype"). +// If undefined then content-type checking is enabled. +// Examples: +// checkContentType: true +// checkContentType: false +// This property is supported in: +// globalAccountSettings +// globalNetworkCheckSettings +// globalNetworkAccountSettings (available in auth module only) +// - settingsAccount +// NOTE: server support for custom DAV properties is REQUIRED! +// This option sets the account where the client properties such as: +// loaded collections, enabled collections, ... are saved during +// the logout and resource/collection synchronisation +// NOTE: set it to true ONLY for ONE account! +// Examples: +// settingsAccount: true +// settingsAccount: false +// This property is supported in: +// globalAccountSettings +// globalNetworkCheckSettings +// globalNetworkAccountSettings (available in auth module only) +// - delegation +// NOTE: server support for this functionality is REQUIRED! +// This option allows you to load delegated (shared) collections. +// If set to true (default) then delegation functionality is enabled, +// and the interface allows you to load delegated collections. +// If false then delegation functionality is completely disabled. +// Examples: +// delegation: true +// delegation: false +// This property is supported in: +// globalAccountSettings +// globalNetworkCheckSettings +// globalNetworkAccountSettings (available in auth module only) +// - additionalResources +// This options sets the list of additional resources (e.g. shared resources +// accessible by all users). If the server supports delegation (see +// the delegation option above) there is no reason to use this option! +// Supported values: +// - array of URL encoded resource names (not collections), such as: +// 'company' +// 'shared_resource' +// If empty (default) or undefined then shared resources are not loaded +// using this option, but may be loaded using the delegation option. +// Examples: +// additionalResources=[] +// additionalResources=['public', 'shared_resource'] +// This property is supported in: +// globalNetworkCheckSettings +// - hrefLabel +// This option sets the server name in the resource header (useful if +// you want to see custom resource header above the collections). +// You can use the following variables in the value: +// %H = full hostname (including the port number) +// %h = full hostname (without the port number) +// %D = full domain name +// %d = only the first and second level domain +// %P = principal name +// %p = principal name without the @domain.com part (if present) +// %U = logged user name +// %u = logged user name without the @domain.com part (if present) +// If undefined, empty or or null then '%d/%p [%u]' is used. +// Examples: +// hrefLabel: '%d/%p [%u]' +// hrefLabel: '%D/%u' +// This property is supported in: +// globalAccountSettings +// globalNetworkCheckSettings +// globalNetworkAccountSettings (available in auth module only) +// - forceReadOnly +// This option sets the list of collections as "read-only". +// Supported values: +// - true +// all collections will be "read-only" +// - array of URL encoded +// - collections, such as: +// '/caldav.php/user/calendar/' +// '/caldav.php/user%40domain.com/calendar/' +// - regexes, such as: +// new RegExp('^/caldav.php/user/calendar[0-9]/$', 'i') +// specifies the list of collections marked as "read-only" +// If null (default) or undefined then server detected privileges are used. +// Examples: +// forceReadOnly: null +// forceReadOnly: true +// forceReadOnly: ['/caldav.php/user/calendar/', +// '/caldav.php/user/calendar2/'] +// forceReadOnly: [new RegExp('^/.*/user/calendar[0-9]/$', 'i')] +// This property is supported in: +// globalAccountSettings +// globalNetworkCheckSettings +// globalNetworkAccountSettings (available in auth module only, with +// different syntax for regexes) +// - ignoreAlarms +// This option sets list of calendar collections with disabled +// alarm functionality. +// Supported values: +// - true +// alarm functionality is disabled for all collections +// - array of URL encoded +// - collections, such as: +// '/caldav.php/user/calendar/' +// '/caldav.php/user%40domain.com/calendar/' +// - regexes, such as: +// new RegExp('^/caldav.php/user/calendar[0-9]/$', 'i') +// specifies the list of collections with disabled alarm functionality. +// If false (default) or undefined then alarm functionality is enabled +// for all collections. +// Examples: +// ignoreAlarms: true +// ignoreAlarms: ['/caldav.php/user/calendar/', +// '/caldav.php/user/calendar2/'] +// ignoreAlarms: [new RegExp('^/.*/user/calendar[0-9]/$', 'i')] +// This property is supported in: +// globalAccountSettings +// globalNetworkCheckSettings +// globalNetworkAccountSettings (available in auth module only, with +// different syntax for regexes) +// - backgroundCalendars +// This options defines a list of background calendars. If there is +// at least one event defined for the given day in a background calendar, +// the background color for that day will be pink/light-red. +// Supported values: +// - array of URL encoded +// - collections, such as: +// '/caldav.php/user/calendar/' +// '/caldav.php/user%40domain.com/calendar/' +// - regexes, such as: +// new RegExp('^/caldav.php/user/calendar[0-9]/$', 'i') +// specifies the list of background calendar collections. +// Examples: +// backgroundCalendars: ['/caldav.php/user/calendar/', +// '/caldav.php/user/calendar2/'] +// backgroundCalendars: [new RegExp('^/.*/user/calendar[0-9]/$', 'i')] +// This property is supported in: +// globalAccountSettings +// globalNetworkCheckSettings +// globalNetworkAccountSettings (available in auth module only, with +// different syntax for regexes) +// Special options not present in configuration examples: +// NOTE: use ONLY if you know what are you doing! +// - crossDomain +// This option sets the crossDomain for jQuery .ajax call. If null (default) +// then the value is autodetected /and the result is shown in the console/ +// - withCredentials +// This option sets the withCredentials for jQuery .ajax call. The default +// value is false and there is NO REASON to change it to true! +// NOTE: if true, Access-Control-Allow-Origin "*" (CORS header) not works! + + +// globalAccountSettings +// Use this option if you want to use automatic login (without a login +// screen) with hardcoded username/password in config.js. Otherwise use +// globalNetworkCheckSettings or globalNetworkAccountSettings (see below). +// NOTE: if this option is used the value must be an array of object(s). +// List of properties used in globalAccountSettings variable: +// - href +// Set this option to the full "principal URL". +// NOTE: the last character in the value must be '/' +// - userAuth +// - userName +// Set the username you want to login. +// - userPassword +// Set the password for the given username. +// NOTE: for description of other properties see comments at the beginning +// of this file. +// NOTE: for minimal/fast setup you need to set only the href and userAuth +// options. It is safe/recommended to keep the remaining options unchanged! +// Example: +//var globalAccountSettings=[ +// { +// href: 'https://server1.com:8443/caldav.php/USERNAME1/', +// userAuth: +// { +// userName: 'USERNAME1', +// userPassword: 'PASSWORD1' +// }, +// timeOut: 90000, +// lockTimeOut: 10000, +// checkContentType: true, +// settingsAccount: true, +// delegation: true, +// hrefLabel: null, +// forceReadOnly: null, +// ignoreAlarms: false, +// backgroundCalendars: [] +// }, +// { +// href: 'https://server2.com:8443/caldav.php/USERNAME2/', +// ... +// ... +// } +//]; + + +// globalNetworkCheckSettings +// Use this option if you want to use standard login screen without +// hardcoded username/password in config.js (used by globalAccountSettings). +// NOTE: if this option is used the value must be an object. +// List of properties used in globalAccountSettings variable: +// - href +// Set this option to the "principal URL" WITHOUT the "USERNAME/" +// part (this options uses the username from the login screen). +// NOTE: the last character in the value must be '/' +// NOTE: for description of other properties see comments at the beginning +// of this file. +// NOTE: for minimal/fast setup you need to set only the href option. It is +// safe/recommended to keep the remaining options unchanged! +// Example href values: +// OS X server http example (see misc/readme_osx.txt for server setup): +// href: 'http://osx.server.com:8008/principals/users/' +// OS X server https example (see misc/readme_osx.txt for server setup): +// href: 'https://osx.server.com:8443/principals/users/' +// Cyrus server https example: +// href: 'https://cyrus.server.com/dav/principals/user/' +// Example: +// Davical example which automatically detects the protocol, server name, +// port, ... (client installed into Davical "htdocs" subdirectory; +// works "out of the box", no additional setup required): +var globalNetworkCheckSettings={ + href: location.protocol+'//'+location.hostname+ + (location.port ? ':'+location.port: '')+ + location.pathname.replace(RegExp('/+[^/]+/*(index\.html)?$'),'')+ + '/caldav.php/', + timeOut: 90000, + lockTimeOut: 10000, + checkContentType: true, + settingsAccount: true, + delegation: true, + additionalResources: [], + hrefLabel: null, + forceReadOnly: null, + ignoreAlarms: false, + backgroundCalendars: [] +} + + +// globalNetworkAccountSettings +// Try this option ONLY if you have working setup using +// globalNetworkCheckSettings and want to fix the authentication popup +// window problem (if invalid username/password is entered)! +// If you use this option then your browser sends username/password to the PHP +// "auth" module ("auth" directory) instead of the DAV server itself. +// The "auth" module then validates your username/password against your server, +// and if the authentication is successful, then it sends back a configuration +// XML (requires additional configuration). The resulting XML is handled +// IDENTICALLY as the globalAccountSettings configuration option. +// NOTE: for the "auth" module configuration see readme.txt! +// NOTE: this option invokes a login screen and disallows access until +// the client gets correct XML configuration file from the server! +// List of properties used in globalNetworkAccountSettings variable: +// - href +// Set this option to the "full URL" of the "auth" directory +// NOTE: the last character in the value must be '/' +// NOTE: for description of other properties see comments at the beginning +// of this file. +// Example href values: +// href: 'https://server.com/client/auth/' +// Example: +// Use this configuration if the "auth" module is located in the client +// installation subdirectory (default): +//var globalNetworkAccountSettings={ +// href: location.protocol+'//'+location.hostname+ +// (location.port ? ':'+location.port : '')+ +// location.pathname.replace(RegExp('index\.html$'),'')+ +// 'auth/', +// timeOut: 30000 +//}; + + +// globalUseJqueryAuth +// Use jQuery .ajax() auth or custom header for HTTP basic auth (default). +// Set this option to true if your server uses digest auth (note: you may +// experience auth popups on some browsers). +// If undefined (or empty), custom header for HTTP basic auth is used. +// Example: +//var globalUseJqueryAuth=false; + + +// globalBackgroundSync +// Enable background synchronization even if the browser window/tab has no +// focus. +// If false, synchronization is performed only if the browser window/tab +// is focused. If undefined or not false, then background sync is enabled. +// Example: +var globalBackgroundSync=true; + + +// globalSyncResourcesInterval +// This option defines how often (in miliseconds) are resources/collections +// asynchronously synchronized. +// Example: +var globalSyncResourcesInterval=120000; + + +// globalEnableRefresh +// This option enables or disables the manual synchronization button in +// the interface. If this option is enabled then users can perform server +// synchronization manually. Enabling this option may cause high server +// load (even DDOS) if users will try to manually synchronize data too +// often (instead of waiting for the automatic synchronization). +// If undefined or false, the synchronization button is disabled. +// NOTE: enable this option only if you really know what are you doing! +// Example: +var globalEnableRefresh=false; + + +// globalEnableKbNavigation +// Enable basic keyboard navigation using arrow keys? +// If undefined or not false, keyboard navigation is enabled. +// Example: +var globalEnableKbNavigation=true; + + +// globalSettingsType +// Where to store user settings such as: active view, enabled/selected +// collections, ... (the client store them into DAV property on the server). +// NOTE: not all servers support storing DAV properties (some servers support +// only subset /or none/ of these URLs). +// Supported values: +// - 'principal-URL', '', null or undefined (default) => settings are stored +// to principal-URL (recommended for most servers) +// - 'addressbook-home-set' => settings are are stored to addressbook-home-set +// - 'calendar-home-set' => settings are stored to calendar-home-set +// Example: +//var globalSettingsType=''; + + +// globalCrossServerSettingsURL +// Settings such as enabled/selected collections are stored on the server +// (see the previous option) in form of full URL +// (e.g.: https://user@server:port/principal/collection/), but even if this +// approach is "correct" (you can use the same principal URL with multiple +// different logins, ...) it causes a problem if your server is accessible +// from multiple URLs (e.g. http://server/ and https://server/). If you want +// to store only the "principal/collection/" part of the URL (instead of the +// full URL) then enable this option. +// Example: +//var globalCrossServerSettingsURL=false; + + +// globalInterfaceLanguage +// Default interface language (note: this option is case sensitive): +// cs_CZ (Čeština [Czech]) +// da_DK (Dansk [Danish]; thanks Niels Bo Andersen) +// de_DE (Deutsch [German]; thanks Marten Gajda and Thomas Scheel) +// en_US (English [English/US]) +// es_ES (Español [Spanish]; thanks Damián Vila) +// fr_FR (Français [French]; thanks John Fischer) +// it_IT (Italiano [Italian]; thanks Luca Ferrario) +// ja_JP (日本語 [Japan]; thanks Muimu Nakayama) +// hu_HU (Magyar [Hungarian]) +// nl_NL (Nederlands [Dutch]; thanks Johan Vromans) +// sk_SK (Slovenčina [Slovak]) +// tr_TR (Türkçe [Turkish]; thanks Selcuk Pultar) +// ru_RU (Русский [Russian]; thanks Александр Симонов) +// uk_UA (Українська [Ukrainian]; thanks Serge Yakimchuck) +// zh_CN (中国 [Chinese]; thanks Fandy) +// Example: +var globalInterfaceLanguage='en_US'; + + +// globalInterfaceCustomLanguages +// If defined and not empty then only languages listed here are shown +// at the login screen, otherwise (default) all languages are shown +// NOTE: values in the array must refer to an existing localization +// (see the option above) +// Example: +// globalInterfaceCustomLanguages=['en_US', 'sk_SK']; +var globalInterfaceCustomLanguages=[]; + + +// globalSortAlphabet +// Use JavaScript localeCompare() or custom alphabet for data sorting. +// Custom alphabet is used by default because JavaScript localeCompare() +// not supports collation and often returns "wrong" result. If set to null +// then localeCompare() is used. +// Example: +// var globalSortAlphabet=null; +var globalSortAlphabet=' 0123456789'+ + 'AÀÁÂÄÆÃÅĀBCÇĆČDĎEÈÉÊËĒĖĘĚFGĞHIÌÍÎİÏĪĮJKLŁĹĽMNŃÑŇOÒÓÔÖŐŒØÕŌ'+ + 'PQRŔŘSŚŠȘșŞşẞTŤȚțŢţUÙÚÛÜŰŮŪVWXYÝŸZŹŻŽ'+ + 'aàáâäæãåābcçćčdďeèéêëēėęěfgğhiìíîïīįıjklłĺľmnńñňoòóôöőœøõō'+ + 'pqrŕřsśšßtťuùúûüűůūvwxyýÿzźżžАБВГҐДЕЄЖЗИІЇЙКЛМНОПРСТУФХЦЧШЩЮЯ'+ + 'Ьабвгґдеєжзиіїйклмнопрстуфхцчшщюяь'; + + +// globalSearchTransformAlphabet +// To support search without diacritics (e.g. search for 'd' will find: 'Ď', 'ď') +// it is required to define something like "character equivalence". +// key = regex text, value = search character +// Example: +var globalSearchTransformAlphabet={ + '[ÀàÁáÂâÄäÆæÃãÅåĀā]': 'a', '[ÇçĆćČč]': 'c', '[Ďď]': 'd', + '[ÈèÉéÊêËëĒēĖėĘęĚě]': 'e', '[Ğğ]': 'g', '[ÌìÍíÎîİıÏïĪīĮį]': 'i', + '[ŁłĹ弾]': 'l', '[ŃńÑñŇň]': 'n', '[ÒòÓóÔôÖöŐőŒœØøÕõŌō]': 'o', + '[ŔŕŘř]': 'r', '[ŚśŠšȘșŞşẞß]': 's', '[ŤťȚțŢţ]': 't', + '[ÙùÚúÛûÜüŰűŮůŪū]': 'u', '[ÝýŸÿ]': 'y', '[ŹźŻżŽž]': 'z' +}; + +// globalResourceAlphabetSorting +// If more than one resource (server account) is configured, sort the +// resources alphabetically? +// Example: +var globalResourceAlphabetSorting=true; + + +// globalNewVersionNotifyUsers +// Update notification will be shown only to users with login names defined +// in this array. +// If undefined (or empty), update notifications will be shown to all users. +// Example: +// globalNewVersionNotifyUsers=['admin', 'peter']; +var globalNewVersionNotifyUsers=[]; + + +// globalDatepickerFormat +// Set the datepicker format (see +// http://docs.jquery.com/UI/Datepicker/formatDate for valid values). +// NOTE: date format is predefined for each localization - use this option +// ONLY if you want to use custom date format (instead of the localization +// predefined one). +// Example: +//var globalDatepickerFormat='dd.mm.yy'; + + +// globalDatepickerFirstDayOfWeek +// Set the datepicker first day of the week: Sunday is 0, Monday is 1, etc. +// Example: +var globalDatepickerFirstDayOfWeek=1; + + +// globalHideInfoMessageAfter +// How long are information messages (such as: success, error) displayed +// (in miliseconds). +// Example: +var globalHideInfoMessageAfter=1800; + + +// globalEditorFadeAnimation +// Set the editor fade in/out animation duration when editing or saving data +// (in miliseconds). +// Example: +var globalEditorFadeAnimation=666; + + + + +// ******* CalDAV (CalDavZAP) related settings ******* // + +// globalEventStartPastLimit, globalEventStartFutureLimit, globalTodoPastLimit +// Number of months pre-loaded from past/future in advance for calendars +// and todo lists (if null then date range synchronization is disabled). +// NOTE: interval synchronization is used only if your server supports +// sync-collection REPORT (e.g. DAViCal). +// NOTE: if you experience problems with data loading and your server has +// no time-range filtering support set these variables to null. +// Example: +var globalEventStartPastLimit=3; +var globalEventStartFutureLimit=3; +var globalTodoPastLimit=1; + + +// globalLoadedCalendarCollections +// This option sets the list of calendar collections (down)loaded after login. +// If empty then all calendar collections for the currently logged user are +// loaded. +// NOTE: settings stored on the server (see settingsAccount) overwrite this +// option. +// Example: +var globalLoadedCalendarCollections=[]; + + +// globalLoadedTodoCollections +// This option sets the list of todo collections (down)loaded after login. +// If empty then all todo collections for the currently logged user are loaded. +// NOTE: settings stored on the server (see settingsAccount) overwrite this +// option. +// Example: +var globalLoadedTodoCollections=[]; + + +// globalActiveCalendarCollections +// This options sets the list of calendar collections checked (enabled +// checkbox => data visible in the interface) by default after login. +// If empty then all loaded calendar collections for the currently logged +// user are checked. +// NOTE: only already (down)loaded collections can be checked (see +// the globalLoadedCalendarCollections option). +// NOTE: settings stored on the server (see settingsAccount) overwrite this +// option. +// Example: +var globalActiveCalendarCollections=[]; + + +// globalActiveTodoCollections +// This options sets the list of todo collections checked (enabled +// checkbox => data visible in the interface) by default after login. +// If empty then all loaded todo collections for the currently logged +// user are checked. +// NOTE: only already (down)loaded collections can be checked (see +// the globalLoadedTodoCollections option). +// NOTE: settings stored on the server (see settingsAccount) overwrite this +// option. +// Example: +var globalActiveTodoCollections=[]; + + +// globalCalendarSelected +// This option sets which calendar collection will be pre-selected +// (if you create a new event) by default after login. +// The value must be URL encoded path to a calendar collection, +// for example: 'USER/calendar/' +// If empty or undefined then the first available calendar collection +// is selected automatically. +// NOTE: only already (down)loaded collections can be pre-selected (see +// the globalLoadedCalendarCollections option). +// NOTE: settings stored on the server (see settingsAccount) overwrite this +// option. +// Example: +//var globalCalendarSelected=''; + + +// globalTodoCalendarSelected +// This option sets which todo collection will be pre-selected +// (if you create a new todo) by default after login. +// The value must be URL encoded path to a todo collection, +// for example: 'USER/todo_calendar/' +// If empty or undefined then the first available todo collection +// is selected automatically. +// NOTE: only already (down)loaded collections can be pre-selected (see +// the globalLoadedTodoCollections option). +// NOTE: settings stored on the server (see settingsAccount) overwrite this +// option. +// Example: +//var globalTodoCalendarSelected=''; + + +// globalActiveView +// This options sets the default fullcalendar view option (the default calendar +// view after the first login). +// Supported values: +// - 'month' +// - 'multiWeek' +// - 'agendaWeek' +// - 'agendaDay' +// NOTE: we use custom and enhanced version of fullcalendar! +// Example: +var globalActiveView='multiWeek'; + + +// globalOpenFormMode +// Open new event form on 'single' or 'double' click. +// If undefined or not 'double', then 'single' is used. +// Example: +var globalOpenFormMode='double'; + + +// globalTodoListFilterSelected +// This options sets the list of filters in todo list that are selected +// after login. +// Supported options: +// - 'filterAction' +// - 'filterProgress' (available only if globalAppleRemindersMode is disabled) +// - 'filterCompleted' +// - 'filterCanceled' (available only if globalAppleRemindersMode is disabled) +// NOTE: settings stored on the server (see settingsAccount) overwrite this +// option. +// Example: +var globalTodoListFilterSelected=['filterAction', 'filterProgress']; + + +// globalCalendarStartOfBusiness, globalCalendarEndOfBusiness +// These options set the start and end of business hours with 0.5 hour +// precision. Non-business hours are faded out in the calendar interface. +// If both variables are set to the same value then no fade out occurs. +// Example: +var globalCalendarStartOfBusiness=8; +var globalCalendarEndOfBusiness=17; + + +// globalDefaultEventDuration +// This option sets the default duration (in minutes) for newly created events. +// If undefined or null, globalCalendarEndOfBusiness value will be taken as +// a default end time instead. +// Example: +var globalDefaultEventDuration=120; + + +// globalAMPMFormat +// This option enables to use 12 hours format (AM/PM) for displaying time. +// NOTE: time format is predefined for each localization - use this option +// ONLY if you want to use custom time format (instead of the localization +// predefined one). +// Example: +//var globalAMPMFormat=false; + + +// globalTimeFormatBasic +// This option defines the time format information for events in month and +// multiweek views. If undefined or null then default value is used. +// If defined as empty string no time information is shown in these views. +// See http://arshaw.com/fullcalendar/docs/utilities/formatDate/ for exact +// formating rules. +// Example: +//var globalTimeFormatBasic=''; + + +// globalTimeFormatAgenda +// This option defines the time format information for events in day and +// week views. If undefined or null then default value is used. +// If defined as empty string no time information is shown in these views. +// See http://arshaw.com/fullcalendar/docs/utilities/formatDate/ for exact +// formating rules. +// Example: +//var globalTimeFormatAgenda=''; + + +// globalDisplayHiddenEvents +// This option defined whether events from unechecked calendars are displayed +// with certain transparency (true) or completely hidden (false). +// Example: +var globalDisplayHiddenEvents=false; + + +// globalTimeZoneSupport +// This option enables timezone support in the client. +// NOTE: timezone cannot be specified for all-day events because these don't +// have start and end time. +// If this option is disabled then local time is used. +// Example: +var globalTimeZoneSupport=true; + + +// globalTimeZone +// If timezone support is enabled, this option sets the default timezone. +// See timezones.js or use the following command to get the list of supported +// timezones (defined in timezones.js): +// grep "'[^']\+': {" timezones.js | sed -Ee "s#(\s*'|':\s*\{)##g" +// Example: +var globalTimeZone='Europe/Berlin'; + + +// globalTimeZonesEnabled +// This option sets the list of available timezones in the interface (for the +// list of supported timezones see the comment for the previous configuration +// option). +// NOTE: if there is at least one event/todo with a certain timezone defined, +// that timezone is enabled (even if it is not present in this list). +// Example: +// var globalTimeZonesEnabled=['America/New_York', 'Europe/Berlin']; +var globalTimeZonesEnabled=[]; + + +// globalRewriteTimezoneComponent +// This options sets whether the client will enhance/replace (if you edit an +// event or todo) the timezone information using the official IANA timezone +// database information (recommended). +// Example: +var globalRewriteTimezoneComponent=true; + + +// globalRemoveUnknownTimezone +// This options sets whether the client will remove all non-standard timezone +// names from events and todos (if you edit an event or todo) +// (e.g.: /freeassociation.sourceforge.net/Tzfile/Europe/Vienna) +// Example: +var globalRemoveUnknownTimezone=false; + + +// globalShowHiddenAlarms +// This option sets whether the client will show alarm notifications for +// unchecked calendars. If this option is enabled and you uncheck a calendar +// in the calendar list, alarm notifications will be temporary disabled for +// unchecked calendar(s). +// Example: +var globalShowHiddenAlarms=false; + + +// globalIgnoreCompletedOrCancelledAlarms +// This options sets whether the client will show alarm notifications for +// already completed or cancelled todos. If enabled then alarm notification +// for completed and cancelled todos are disabled. +// Example: +var globalIgnoreCompletedOrCancelledAlarms=true; + + +// globalMozillaSupport +// Mozilla automatically treats custom repeating event calculations as if +// the start day of the week is Monday, despite what day is chosen in settings. +// Set this variable to true to use the same approach, ensuring compatible +// event rendering in special cases. +// Example: +var globalMozillaSupport=false; + + +// globalCalendarColorPropertyXmlns +// This options sets the namespace used for storing the "calendar-color" +// property by the client. +// If true, undefined (or empty) "http://apple.com/ns/ical/" is used (Apple +// compatible). If false, then the calendar color modification functionality +// is completely disabled. +// Example: +//var globalCalendarColorPropertyXmlns=true; + + +// globalWeekendDays +// This option sets the list of days considered as weekend days (these +// are faded out in the calendar interface). Non-weekend days are automatically +// considered as business days. +// Sunday is 0, Monday is 1, etc. +// Example: +var globalWeekendDays=[0, 6]; + + +// globalAppleRemindersMode +// If this option is enabled then then client will use the same approach +// for handling repeating reminders (todos) as Apple. It is STRONGLY +// recommended to enabled this option if you use any Apple clients for +// reminders (todos). +// Supported options: +// - 'iOS6' +// - 'iOS7' +// - true (support of the latest iOS version - 'iOS8') +// - false +// If this option is enabled: +// - RFC todo support is SEVERELY limited and the client mimics the behaviour +// of Apple Reminders.app (to ensure maximum compatibility) +// - when a single instance of repeating todo is edited, it becomes an +// autonomous non-repeating todo with NO relation to the original repeating +// todo +// - capabilities of repeating todos are limited - only the first instance +// is ever visible in the interface +// - support for todo DTSTART attribute is disabled +// - support for todo STATUS attribute other than COMPLETED and NEEDS-ACTION +// is disabled +// - [iOS6 only] support for LOCATION and URL attributes is disabled +// Example: +var globalAppleRemindersMode=true; + + +// globalSubscribedCalendars +// This option specifies a list of remote URLs to ics files (e.g.: used +// for distributing holidays information). Subscribed calendars are +// ALWAYS read-only. Remote servers where ics files are hosted MUST +// return proper CORS headers (see readme.txt) otherwise this functionality +// will not work! +// NOTE: subsribed calendars are NOT "shared" calendars. For "shared" +// calendars see the delegation option in globalAccountSettings, +// globalNetworkCheckSettings and globalNetworkAccountSettings. +// List of properties used in globalSubscribedCalendars variable: +// - hrefLabel +// This options defines the header string above the subcsribed calendars. +// - calendars +// This option specifies an array of remote calendar objects with the +// following properties: +// - href +// Set this option to the "full URL" of the remote calendar +// - userAuth +// NOTE: keep empty if remote authentication is not required! +// - userName +// Set the username you want to login. +// - userPassword +// Set the password for the given username. +// - typeList +// Set the list of objects you want to process from remote calendars; +// two options are available: +// - 'vevent' (show remote events in the interface) +// - 'vtodo' (show remote todos in the interface) +// - ignoreAlarm +// Set this option to true if you want to disable alarm notifications +// from the remote calendar. +// - displayName +// Set this option to the name of the calendar you want to see +// in the interface. +// - color +// Set the calendar color you want to see in the interface. +// Example: +//var globalSubscribedCalendars={ +// hrefLabel: 'Subscribed', +// calendars: [ +// { +// href: 'http://something.com/calendar.ics', +// userAuth: { +// userName: '', +// userPassword: '' +// }, +// typeList: ['vevent', 'vtodo'], +// ignoreAlarm: true, +// displayName: 'Remote Calendar 1', +// color: '#ff0000' +// }, +// { +// href: 'http://calendar.com/calendar2.ics', +// ... +// ... +// } +// ] +//}; + + + +// ******* CardDAV (CardDavMATE) related settings ******* // + + +// globalLoadedAddressbookCollections +// This option sets the list of addressbook collections (down)loaded after +// login. If empty then all addressbook collections for the currently logged +// user are loaded. +// NOTE: settings stored on the server (see settingsAccount) overwrite this +// option. +// Example: +var globalLoadedAddressbookCollections=[]; + + +// globalActiveAddressbookCollections +// This options sets the list of addressbook collections checked (enabled +// checkbox => data visible in the interface) by default after login. +// If empty then all loaded addressbook collections for the currently logged +// user are checked. +// NOTE: only already (down)loaded collections can be checked (see +// the globalLoadedAddressbookCollections option). +// NOTE: settings stored on the server (see settingsAccount) overwrite this +// option. +// Example: +var globalActiveAddressbookCollections=[]; + + +// globalAddressbookSelected +// This option sets which addressbook collection will be pre-selected +// (if you create a new contact) by default after login. +// The value must be URL encoded path to an addressbook collection, +// for example: 'USER/addressbook/' +// If empty or undefined then the first available addressbook collection +// is selected automatically. +// NOTE: only already (down)loaded collections can be pre-selected (see +// the globalLoadedAddressbookCollections option). +// NOTE: settings stored on the server (see settingsAccount) overwrite this +// option. +// Example: +//var globalAddressbookSelected=''; + + +// globalCompatibility +// This options is reserved for various compatibility settings. +// NOTE: if this option is used the value must be an object. +// Currently there is only one supported option: +// - anniversaryOutputFormat +// Different clients use different (and incompatible) approach +// to store anniversary date in vCards. Apple stores this attribute as: +// itemX.X-ABDATE;TYPE=pref:2000-01-01\r\n +// itemX.X-ABLabel:_$!!$_\r\n' +// other clients store this attribute as: +// X-ANNIVERSARY:2000-01-01\r\n +// Choose 'apple' or 'other' (lower case) for your 3rd party client +// compatibility. You can chose both: ['apple', 'other'], but it may +// cause many problems in the future, for example: duplicate anniversary +// dates, invalid/old anniversary date in your clients, ...) +// Examples: +// anniversaryOutputFormat: ['other'] +// anniversaryOutputFormat: ['apple', 'other'] +// Example: +var globalCompatibility={anniversaryOutputFormat: ['apple']}; + + +// globalUriHandler{Tel,Email,Url,Profile} +// These options set the URI handlers for TEL, EMAIL, URL and X-SOCIALPROFILE +// vCard attributes. Set them to null (or comment out) to disable. +// NOTE: for globalUriHandlerTel is recommended to use 'tel:', 'callto:' +// or 'skype:'. The globalUriHandlerUrl value is used only if no URI handler +// is defined in the URL. +// NOTE: it is safe to keep these values unchanged! +// Example: +var globalUriHandlerTel='tel:'; +var globalUriHandlerEmail='mailto:'; +var globalUriHandlerUrl='http://'; +var globalUriHandlerProfile={ + 'twitter': 'http://twitter.com/%u', + 'facebook': 'http://www.facebook.com/%u', + 'flickr': 'http://www.flickr.com/photos/%u', + 'linkedin': 'http://www.linkedin.com/in/%u', + 'myspace': 'http://www.myspace.com/%u', + 'sinaweibo': 'http://weibo.com/n/%u' +}; + + +// globalDefaultAddressCountry +// This option sets the default country for new address fields. +// See common.js or use the following command to get the list of +// all supported country codes (defined in common.js): +// grep -E "'[a-z]{2}':\s+\[" common.js | sed -Ee 's#^\s+|\s+\[\s+# #g' +// Example: +var globalDefaultAddressCountry='us'; + + +// globalAddressCountryEquivalence +// This option sets the processing of the country field specified +// in the vCard ADR attribute. +// By default the address field in vCard looks like: +// ADR;TYPE=WORK:;;1 Waters Edge;Baytown;LA;30314;USA\r\n +// what cause a problem, because the country field is a plain +// text and can contain any value, e.g.: +// USA +// United States of America +// US +// and because the address format can be completely different for +// each country, e.g.: +// China address example: +// [China] +// [Province] [City] +// [Street] +// [Postal] +// Japan address example: +// [Postal] +// [Prefecture] [County/City] +// [Further Divisions] +// [Japan] +// the client needs to correctly detect the country from the ADR +// attribute. Apple solved this problem by using: +// item1.ADR;TYPE=WORK:;;1 Waters Edge;Baytown;LA;30314;USA\r\n +// item1.X-ABADR:us\r\n +// where the second "related" attribute defines the country code +// for the ADR attribute. This client uses the same approach, but +// if the vCard is created by 3rd party clients and the X-ABADR +// is missing, it is possible to define additional "rules" for +// country matching. These rules are specied by the country code +// (for full list of country codes see the comment for pre previous +// option) and a case insensitive regular expression (which matches +// the plain text value in the country field). +// NOTE: if X-ABADR is not present and the country not matches any +// country defined in this option, then globalDefaultAddressCountry +// is used by default. +// Example: +var globalAddressCountryEquivalence=[ + {country: 'de', regex: '^\\W*Deutschland\\W*$'}, + {country: 'sk', regex: '^\\W*Slovensko\\W*$'} +]; + + +// globalAddressCountryFavorites +// This option defines the list of countries which are shown at the top +// of the country list in the interface (for full list of country codes +// see the comment for pre globalDefaultAddressCountry option). +// Example: +// var globalAddressCountryFavorites=['de','sk']; +var globalAddressCountryFavorites=[]; + + +// globalAddrColorPropertyXmlns +// This options sets the namespace used for storing the "addressbook-color" +// property by the client. +// If true, undefined (or empty) "http://inf-it.com/ns/ab/" is used. +// If false, then the addressbook color modification functionality +// is completely disabled, and addressbook colors in the interface are +// generated automatically. +// Example: +//var globalAddrColorPropertyXmlns=true; + + +// globalContactStoreFN +// This option specifies how the FN (formatted name) is stored into vCard. +// The value for this options must be an array of strings, that can contain +// the following variables: +// prefix +// last +// middle +// first +// suffix +// The string element of the array can contain any other characters (usually +// space or colon). Elements are added into FN only if the there is +// a variable match, for example if: +// last='Lastname' +// first='Firstname' +// middle='' (empty) +// and this option is set to: +// ['last', ' middle', ' first'] (space in the second and third element) +// the resulting value for FN will be: 'Lastname Firstname' and not +// 'Lastname Firstname' (two spaces), because the middle name is empty (so +// the second element is completely ignored /not added into FN/). +// NOTE: this attribute is NOT used by this client, and it is also NOT +// possible to directly edit it in the interface. +// Examples: +// var globalContactStoreFN=[' last', ' middle', ' first']; +// var globalContactStoreFN=['last', ', middle', ' ,first']; +var globalContactStoreFN=['prefix',' last',' middle',' first',' suffix']; + + +// globalGroupContactsByCompanies +// This options specifies how contacts are grouped in the interface. +// By default the interface looks like (very simple example): +// A +// Adams Adam +// Anderson Peter +// B +// Brown John +// Baker Josh +// if grouped by company/deparment the result is: +// Company A [Department X] +// Adams Adam +// Brown John +// Company B [Department Y] +// Anderson Peter +// Baker Josh +// If this option is set to true contacts are grouped by company/department, +// otherwise (default) contacts are grouped by letters of the alphabet. +// If undefined or not true, grouping by alphabet letters is used. +// NOTE: see also the globalCollectionDisplay option below. +var globalGroupContactsByCompanies=false; + + +// globalCollectionDisplay +// This options specifies how data columns in the contact list are displayed. +// +// NOTE: columns are displayed ONLY if there is enought horizontal place in +// the browser window (e.g. if you define 5 columns here, but your browser +// window is not wide enough, you will see only first 3 columns instead of 5). +// +// NOTE: see the globalContactDataMinVisiblePercentage option which defines the +// width for columns. +// +// The value must be an array of columns, where each column is represented by +// an object with the following properties: +// label => the value of this option is a string used as column header +// You can use the following localized variables in the label string: +// - {Name} +// - {FirstName} +// - {LastName} +// - {MiddleName} +// - {NickName} +// - {Prefix} +// - {Suffix} +// - {BirthDay} +// - {PhoneticLastName} +// - {PhoneticFirstName} +// - {JobTitle} +// - {Company} +// - {Department} +// - {Categories} +// - {NoteText} +// - {Address}, {AddressWork}, {AddressHome}, {AddressOther} +// - {Phone}, {PhoneWork}, {PhoneHome}, {PhoneCell}, {PhoneMain}, +// {PhonePager}, {PhoneFax}, {PhoneIphone}, {PhoneOther} +// - {Email}, {EmailWork}, {EmailHome}, {EmailMobileme}, {EmailOther} +// - {URL}, {URLWork}, {URLHome}, {URLHomepage}, {URLOther} +// - {Dates}, {DatesAnniversary}, {DatesOther} +// - {Related}, {RelatedManager}, {RelatedAssistant}, {RelatedFather}, +// {RelatedMother}, {RelatedParent}, {RelatedBrother}, {RelatedSister}, +// {RelatedChild}, {RelatedFriend}, {RelatedSpouse}, {RelatedPartner}, +// {RelatedOther} +// - {Profile}, {ProfileTwitter}, {ProfileFacebook}, {ProfileFlickr}, +// {ProfileLinkedin}, {ProfileMyspace}, {ProfileSinaweibo} +// - {IM}, {IMWork}, {IMHome}, {IMMobileme}, {IMOther}, {IMAim}, {IMIcq}, +// {IMIrc}, {IMJabber}, {IMMsn}, {IMYahoo}, {IMFacebook}, {IMGadugadu}, +// {IMGoogletalk}, {IMQq}, {IMSkype} +// value => the value of this option is an array of format strings, or +// an object with the following properties: +// - company (used for company contacts) +// - personal (used for user contacts) +// where the value of these properties is an array of format strings used +// for company or user contacts (you can have different values in the same +// column for personal and company contacts). +// You can use the following simple variables in the format string: +// - {FirstName} +// - {LastName} +// - {MiddleName} +// - {NickName} +// - {Prefix} +// - {Suffix} +// - {BirthDay} +// - {PhoneticLastName} +// - {PhoneticFirstName} +// - {JobTitle} +// - {Company} +// - {Department} +// - {Categories} +// - {NoteText} +// You can also use parametrized variables, where the parameter is enclosed +// in square bracket. Paramatrized variables are useful to extract data +// such as home phone {Phone[type=home]}, extract the second phone number +// {Phone[:1]} (zero based indexing) or extract the third home phone number +// {Phone[type=home][:2]} from the vCard. +// NOTE: if the parametrized variable matches multiple items, e.g.: +// {Phone[type=work]} (if the contact has multiple work phones) then the +// first one is used! +// +// The following parametrized variables are supported (note: you can use +// all of them also without parameters /the first one will be used/): +// - {Address[type=XXX]} or {Address[:NUM]} or {Address[type=XXX][:NUM]} +// where supported values for XXX are: +// - work +// - home +// - other +// - any other custom value +// - {Phone[type=XXX]} or {Phone[:NUM]} or {Phone[type=XXX][:NUM]} +// where supported values for XXX are: +// - work +// - home +// - cell +// - main +// - pager +// - fax +// - iphone +// - other +// - any other custom value +// - {Email[type=XXX]} or {Email[:NUM]} or {Email[type=XXX][:NUM]} +// where supported values for XXX are: +// - work +// - home +// - mobileme +// - other +// - any other custom value +// - {URL[type=XXX]} or {URL[:NUM]} or {URL[type=XXX][:NUM]} +// where supported values for XXX are: +// - work +// - home +// - homepage +// - other +// - any other custom value +// - {Dates[type=XXX]} or {Dates[:NUM]} or {Dates[type=XXX][:NUM]} +// where supported values for XXX are: +// - anniversary +// - other +// - any other custom value +// - {Related[type=XXX]} or {Related[:NUM]} or {Related[type=XXX][:NUM]} +// where supported values for XXX are: +// - manager +// - assistant +// - father +// - mother +// - parent +// - brother +// - sister +// - child +// - friend +// - spouse +// - partner +// - other +// - any other custom value +// - {Profile[type=XXX]} or {Profile[:NUM]} or {Profile[type=XXX][:NUM]} +// where supported values for XXX are: +// - twitter +// - facebook +// - flickr +// - linkedin +// - myspace +// - sinaweibo +// - any other custom value +// - {IM[type=XXX]} or {IM[service-type=YYY]} or {IM[:NUM]} +// where supported values for XXX are: +// - work +// - home +// - mobileme +// - other +// - any other custom value +// and supported values for YYY are: +// - aim +// - icq +// - irc +// - jabber +// - msn +// - yahoo +// - facebook +// - gadugadu +// - googletalk +// - qq +// - skype +// - any other custom value +// +// NOTE: if you want to use the "any other custom value" option (for XXX +// or YYY above) you MUST double escape the following characters: +// =[]{}\ +// for example: +// - for profile type "=XXX=" use: '{Profile[type=\\=XXX\\=]}' +// - for profile type "\XXX\" use: '{Profile[type=\\\\XXX\\\\]}' +// +// NOTE: if you want to use curly brackets in the format string you must +// double escape it, e.g.: ['{Company}', '\\{{Department}\\}'] +// +// The format string (for the value option) is an array to allow full +// customization of the interface. For example if: +// value: ['{LastName} {MiddleName} {FirstName}'] +// and the person has no middle name, then the result in the column +// will be (without quotes): +// "Parker Peter" (note: two space characters) +// but if you use: +// value: ['{LastName}', ' {MiddleName}', ' {FirstName}'] +// then the result will be (without quotes): +// "Parker Peter" (note: only one space character) +// The reason is that only those elements of the array are appended +// into the result where non-empty substitution was performed (so the +// ' {MiddleName}' element in this case is ignored, because the person +// in the example above has no /more precisely has empty/ middle name). +// +// Examples: +// To specify two columns (named "Company" and "Department / LastName"), +// where the first will display the company name, and the second will display +// department for company contacts (with "Dep -" prefix), and lastname for +// personal contacts (with "Name -" prefix) use: +// var globalCollectionDisplay=[ +// { +// label: 'Company', +// value: ['{Company}'] +// }, +// { +// label: 'Department / LastName', +// value: { +// company: ['Dep - {Department}'], +// personal: ['Name - {LastName}'] +// } +// } +// ]; +// To specify 3 columns (named "Categories", "URL" and "IM"), where the first +// will display categories, second will display the third work URL, and third +// will display ICQ IM use: +// var globalCollectionDisplay=[ +// { +// label: 'Categories', +// value: ['{Categories}'] +// }, +// { +// label: 'URL', +// value: ['{URL[type=WORK][:2]}'] +// }, +// { +// label: 'IM', +// value: ['{IM[service-type=ICQ]}'] +// } +// ]; +// +// Recommended settings if globalGroupContactsByCompanies +// is set to false: +// var globalCollectionDisplay=[ +// { +// label: '{Name}', +// value: ['{LastName}', ' {MiddleName}', ' {FirstName}'] +// }, +// { +// label: '{Company} [{Department}]', +// value: ['{Company}', ' [{Department}]'] +// }, +// { +// label: '{JobTitle}', +// value: ['{JobTitle}'] +// }, +// { +// label: '{Email}', +// value: ['{Email[:0]}'] +// }, +// { +// label: '{Phone} 1', +// value: ['{Phone[:0]}'] +// }, +// { +// label: '{Phone} 2', +// value: ['{Phone[:1]}'] +// }, +// { +// label: '{NoteText}', +// value: ['{NoteText}'] +// } +// ]; +// +// Recommended settings if globalGroupContactsByCompanies +// is set to true: +// var globalCollectionDisplay=[ +// { +// label: '{Name}', +// value: { +// personal: ['{LastName}', ' {MiddleName}', ' {FirstName}'], +// company: ['{Company}', ' [{Department}]'] +// } +// }, +// { +// label: '{JobTitle}', +// value: ['{JobTitle}'] +// }, +// { +// label: '{Email}', +// value: ['{Email[:0]}'] +// }, +// { +// label: '{Phone} 1', +// value: ['{Phone[:0]}'] +// }, +// { +// label: '{Phone} 2', +// value: ['{Phone[:1]}'] +// }, +// { +// label: '{NoteText}', +// value: ['{NoteText}'] +// } +// ]; +// +// NOTE: if left undefined, the recommended settings will be used. + + +// globalCollectionSort +// This options sets the ordering of contacts in the interface. In general +// contacts are ordered alphabetically by an internal "sort string" which +// is created for each contact. Here you can specify how this internal string +// is created. The value is a simple array holding only the values from the +// value property defined in the globalCollectionDisplay option. +// If undefined, the definition from globalCollectionDisplay is used. +// Example: +// var globalCollectionSort = [ +// ['{LastName}'], +// ['{FirstName}'], +// ['{MiddleName}'], +// { +// company: ['{Categories}'], +// personal: ['{Company}'] +// } +// ]; + + +// globalContactDataMinVisiblePercentage +// This option defines how the width for columns are computed. If you set +// it to 1 then 100% of all data in the column will be visible (the column +// width is determined by the longest string in the column). If you set it +// to 0.95 then 95% of data will fit into the column width, and the remaining +// 5% will be truncated (" ..."). +// Example: +var globalContactDataMinVisiblePercentage=0.95; + + diff --git a/radicale_web/web/infcloud/css/default.css b/radicale_web/web/infcloud/css/default.css new file mode 100644 index 0000000..14e8156 --- /dev/null +++ b/radicale_web/web/infcloud/css/default.css @@ -0,0 +1,3632 @@ +/* +InfCloud - the open source CalDAV/CardDAV Web Client +Copyright (C) 2011-2015 + Jan Mate + Andrej Lezo + Matej Mihalik + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as +published by the Free Software Foundation, either version 3 of the +License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . +*/ + +@font-face +{ + font-family: "Roboto"; + src: url('../fonts/Roboto-Light-webfont.eot'); + src: url('../fonts/Roboto-Light-webfont.eot?#iefix') format('embedded-opentype'), + url('../fonts/Roboto-Light-webfont.woff') format('woff'), + url('../fonts/Roboto-Light-webfont.ttf') format('truetype'), + url('../fonts/Roboto-Light-webfont.svg#robotolight') format('svg'); + font-weight: 300; + font-style: normal; +} +@font-face +{ + font-family: "Roboto"; + src: url('../fonts/Roboto-Regular-webfont.eot'); + src: url('../fonts/Roboto-Regular-webfont.eot?#iefix') format('embedded-opentype'), + url('../fonts/Roboto-Regular-webfont.woff') format('woff'), + url('../fonts/Roboto-Regular-webfont.ttf') format('truetype'), + url('../fonts/Roboto-Regular-webfont.svg#robotoregular') format('svg'); + font-weight: 400; + font-style: normal; +} +@font-face +{ + font-family: "Roboto"; + src: url('../fonts/Roboto-Medium-webfont.eot'); + src: url('../fonts/Roboto-Medium-webfont.eot?#iefix') format('embedded-opentype'), + url('../fonts/Roboto-Medium-webfont.woff') format('woff'), + url('../fonts/Roboto-Medium-webfont.ttf') format('truetype'), + url('../fonts/Roboto-Medium-webfont.svg#robotomedium') format('svg'); + font-weight: 500; + font-style: normal; +} +@font-face +{ + font-family: "Roboto"; + src: url('../fonts/Roboto-Bold-webfont.eot'); + src: url('../fonts/Roboto-Bold-webfont.eot?#iefix') format('embedded-opentype'), + url('../fonts/Roboto-Bold-webfont.woff') format('woff'), + url('../fonts/Roboto-Bold-webfont.ttf') format('truetype'), + url('../fonts/Roboto-Bold-webfont.svg#robotobold') format('svg'); + font-weight: 700; + font-style: normal; +} +@font-face +{ + font-family: "Roboto"; + src: url('../fonts/Roboto-LightItalic-webfont.eot'); + src: url('../fonts/Roboto-LightItalic-webfont.eot?#iefix') format('embedded-opentype'), + url('../fonts/Roboto-LightItalic-webfont.woff') format('woff'), + url('../fonts/Roboto-LightItalic-webfont.ttf') format('truetype'), + url('../fonts/Roboto-LightItalic-webfont.svg#robotolight_italic') format('svg'); + font-weight: 300; + font-style: italic; +} +@font-face +{ + font-family: "Roboto"; + src: url('../fonts/Roboto-Italic-webfont.eot'); + src: url('../fonts/Roboto-Italic-webfont.eot?#iefix') format('embedded-opentype'), + url('../fonts/Roboto-Italic-webfont.woff') format('woff'), + url('../fonts/Roboto-Italic-webfont.ttf') format('truetype'), + url('../fonts/Roboto-Italic-webfont.svg#robotoitalic') format('svg'); + font-weight: 400; + font-style: italic; +} +@font-face +{ + font-family: "Roboto"; + src: url('../fonts/Roboto-MediumItalic-webfont.eot'); + src: url('../fonts/Roboto-MediumItalic-webfont.eot?#iefix') format('embedded-opentype'), + url('../fonts/Roboto-MediumItalic-webfont.woff') format('woff'), + url('../fonts/Roboto-MediumItalic-webfont.ttf') format('truetype'), + url('../fonts/Roboto-MediumItalic-webfont.svg#robotomedium_italic') format('svg'); + font-weight: 500; + font-style: italic; +} +@font-face +{ + font-family: "Roboto"; + src: url('../fonts/Roboto-BoldItalic-webfont.eot'); + src: url('../fonts/Roboto-BoldItalic-webfont.eot?#iefix') format('embedded-opentype'), + url('../fonts/Roboto-BoldItalic-webfont.woff') format('woff'), + url('../fonts/Roboto-BoldItalic-webfont.ttf') format('truetype'), + url('../fonts/Roboto-BoldItalic-webfont.svg#robotobold_italic') format('svg'); + font-weight: 700; + font-style: italic; +} + +body, input, select, textarea +{ + font-family: 'Roboto'; + font-size: 14px; + color: #404040; +} + +.System +{ + position: absolute; + top: 0px; + left: 0px; + right: 0px; + bottom: 0px; + width: 100%; + height: 100%; + overflow: hidden; + /* XXX - System display:none changes + display: none; + visibility: visible;*/ + display: block; + visibility: hidden; + opacity: 0; +} + +.update_d +{ + position: absolute; + display: block; + overflow: hidden; + top: 25px; + padding-top: 8px; + bottom: 0px; + right: 0px; + width: 24px; + background: #f0f0f0; + border-left: 1px solid #c0c0c0; + z-index: 30; +} + +.update_h +{ + width: 24px; + font-size: 1.1em; + font-weight: 500; + writing-mode: tb-rl; + white-space: nowrap; + -webkit-transform:rotate(90deg); + -moz-transform:rotate(90deg); + -o-transform: rotate(90deg); +} + +.update_h +{ + cursor: pointer; +} + +.collection_d +{ + position: absolute; + top: 0; + left: 225px; + right: 582px; + border-right: 1px solid; + border-right-color: #c0c0c0; + height: 24px; + background: #f0f0f0; + color: #404040; + cursor: default; + + user-select: none; + -webkit-user-select: none; + -moz-user-select: none; +} + +.collection_h +{ + position: absolute; + margin-left: 24px; + margin-top: 3px; + font-size: 1.1em; + font-weight: 500; +} + +.collection_a, .company_a +{ + position: absolute; + right: 0px; + padding-top: 4px; + padding-right: 6px; + width:17px; + height: 16px; +} + +.contact_d +{ + position: absolute; + top: 0; + right: 0; + width: 582px; + height: 24px; + background: #f0f0f0; + color: #404040; + cursor: default; + + user-select: none; + -webkit-user-select: none; + -moz-user-select: none; +} + +.contact_h +{ + position: absolute; + padding-left: 6px; + padding-top: 2px; + font-size: 1.1em; + font-weight: 400; +} + +.system_l +{ + position: absolute; + right: 32px; + padding-top: 4px; + height: 16px; +} + +#SearchBox +{ + position: absolute; + display: block; + top: 24px; + left: 225px; + right: 582px; + border-right: 1px solid; + border-right-color: #c0c0c0; + overflow: hidden; + background: #ffffff; + z-index: 2; /* for floating headers */ + + height: 24px; + border-top: 1px solid #c0c0c0; + border-bottom: 1px solid #c0c0c0; + cursor: default; + + user-select: none; + -webkit-user-select: none; + -moz-user-select: none; +} + +#SearchBox > .container +{ + position: absolute; + top: 3px; + left: 31px; + right: 27px; +} +#SearchBox *> input[data-type=search] +{ + width: 100%; + background-color: #ffffff; +} + +#ABList +{ + position: absolute; + display: block; + top: 50px; /* search support */ + left: 225px; + right: 582px; + bottom: 0; + border-right: 1px solid; + border-right-color: #c0c0c0; + overflow: hidden; + background: #ffffff; + cursor: default; + + user-select: none; + -webkit-user-select: none; + -moz-user-select: none; +} + +#ABListOverlay +{ + position: absolute; + top: 0; + left: 225px; + right: 583px; + bottom: 0; + overflow: hidden; + background: #ffffff; + display: none; + z-index: 10; + cursor: default; + + user-select: none; + -webkit-user-select: none; + -moz-user-select: none; +} + +.half +{ + position: relative; + height: 50% !important; +} + +#ABContact +{ + position: absolute; + top: 25px; + right: 0; + bottom: 0; + display: block; + width: 579px; + padding-bottom: 8px; + overflow: auto; + overflow-x: hidden; + background: #f0f0f0; + border-top: 1px solid #f0f0f0; + cursor: default; + + user-select: none; + -webkit-user-select: none; + -moz-user-select: none; +} + +#ABContactColor +{ + background: #f0f0f0; + position: absolute; + display: block; + top: 25px; + bottom: 0; + right: 579px; + width: 3px; + cursor: default; + + user-select: none; + -webkit-user-select: none; + -moz-user-select: none; +} + +#ABContactOverlay +{ + position: absolute; + top: 24px; + right: 0; + bottom: 0; + width: 582px; + overflow: hidden; + background: #ffffff; + display: none; + z-index: 10; + cursor: default; + + user-select: none; + -webkit-user-select: none; + -moz-user-select: none; +} + +#Login img[data-type=system_logo] +{ + padding-bottom: 5px; +} + +#Login table, .System table +{ + padding: 0px 0px 0px 0px; + border: none; + border-collapse: collapse; +} + +#Login td, .System td +{ + position: relative; /* required by placeholder plugin (used for IE) */ + padding: 1px 2px 0px 0px; + height: 20px; + line-height: 19px; + vertical-align: top; +} + +.System td.clean +{ + padding: 0px 0px 0px 0px !important; +} + +.System td.buttons +{ + padding-top: 10px; +} + +.System td.type +{ + width: 139px; +} + +.fc td +{ + position: static; /* required by fullcalendar */ +} + +*:focus +{ + outline: none; +} + +select +{ + font-size: 1em; + min-height: 19px; + max-height: 19px; + margin: 0px 0px 0px 0px; + padding: 0px 0px 0px 0px; + border: none; + + background: #ffffff url(../images/select.svg) no-repeat center right; + + padding-left: 3px; /* minor problem with chrome on windows */ + padding-right: 19px; /* original: 18 - minor problem with chrome on windows */ + + appearance: none; + -webkit-appearance: none; + + border-radius: 0px; + -webkit-border-radius: 0px; + -moz-border-radius: 0px; + + outline: none; + -moz-outline: none; + + color: #404040; + + left: 0px; + vertical-align: top; +} + +@-moz-document url-prefix() { + select + { + font-size: 1em; + line-height: 19px; + + padding-left: 0px; + padding-right: 0px !important; + + padding-bottom: 1px; + background: transparent url(../images/select_bg.svg) repeat-x; + + /* FF outline hack */ + color: rgba(64, 64, 64, 0); + text-shadow: 0 0 0 #404040; + } + + select option + { + color: #404040; + background-color: #ffffff !important; + } +} + +select[disabled] +{ + /* Safari problem with textfield (it is one pixel higher than the selectbox) */ + min-height: 19px; + max-height: 19px; + padding-right: 3px !important; + + + font-size: 1em; + + background: #fff none; + + appearance: textfield; + -webkit-appearance: textfield; +} +@-moz-document url-prefix() { + select[disabled] + { + font-size: 1em; + + padding-left: 0px; + + /* FF for windows fix */ + padding-right: 0px !important; + background: transparent url(../images/select_bg_dis.svg) repeat-x; + } +} + +select[disabled][data-type="xhalf_type"] +{ + /* Safari problem with textfield (it is one pixel higher than the selectbox) */ + min-height: 19px; + max-height: 19px; + + background: #fff; + + appearance: textfield; + -webkit-appearance: textfield; +} +@-moz-document url-prefix() { + select[disabled][data-type="xhalf_type"] + { + margin-left: 0px !important; + background: transparent url(../images/select_bg_dis.svg) repeat-x; + } +} + +select[disabled][data-type="country_type"] +{ + /* Safari problem with textfield (it is one pixel higher than the selectbox) */ + min-height: 19px; + max-height: 19px; + + background: #fff; + + appearance: textfield; + -webkit-appearance: textfield; +} +@-moz-document url-prefix() { + select[disabled][data-type="country_type"] + { + margin-left: 0px !important; + background: transparent url(../images/select_bg_dis.svg) repeat-x; + } +} + +select[disabled][data-type="im_service_type"] +{ + /* Safari problem with textfield (it is one pixel higher than the selectbox) */ + min-height: 19px; + max-height: 19px; + + background: #fff; + + appearance: textfield; + -webkit-appearance: textfield; +} +select[disabled][data-type="im_service_type"]:-moz-last-node +{ + margin-left: 0px !important; + background: transparent url(../images/select_bg_dis.svg) repeat-x; +} + + + +td[data-size="login"] > select[data-type="language"] +{ + min-width: 331px !important; + max-width: 331px !important; +} + + + +input +{ + font-size: 1em !important; + color: #404040; + margin: 0px 0px 0px 0px; + padding: 0px 0px 0px 0px; +} + +@-moz-document url-prefix() +{ + input + { + text-indent: 1px; + } +} + +input::-moz-focus-inner /* FF buttons */ +{ + border: none; + padding: 0.07em 0em 0em 0em !important; +} + +img[data-type=system_login] +{ + margin-top: 10px; + cursor: pointer; +} + +input[data-type="system_username"], input[data-type="system_password"] +{ + font-size: 20px !important; + height: 28px !important; + min-width: 329px !important; + max-width: 329px !important; +} + +select[data-type="language"] +{ + font-size: 20px !important; + min-height: 28px !important; + max-height: 28px !important; + background: none; +} + +td[data-size="login_logo"] +{ + padding-left: 60px !important; +} + +td[data-size="login"], td[data-size="login_input"] +{ + border-bottom: 2px solid #585858; +} + +input[type=button], input[type=submit], .ui-datepicker-buttonpane button +{ + cursor: pointer; + border: 1px solid; + border-color: #c0c0c0; + font-size : 0.9em !important; + padding-left: 0.5em; + padding-right: 0.5em; + + background: #ffffff; + color: #404040; + position : relative; + + border-radius: 3px; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + + -webkit-appearance: none; +} +input[data-type=cancel] +{ + margin-right: 1.5em; +} + +input[disabled] +{ + color: #404040; /* webkit bug - the black color not works */ + border-style: none; + background: #fff; + opacity: 1 !important; +} +input[disabled].safari_hack +{ + color: #000000; /* safari bug - the black color not works #000000 looks like #545454 :-( */ +} + +input[readonly] +{ + border-style: none; + background: #fff !important; +} + +input::-webkit-input-placeholder +{ + color: #e0e0e0; + text-shadow: none !important; + -webkit-font-smoothing: antialiased; +} +input[readonly]::-webkit-input-placeholder +{ + color: #e0e0e0; + text-shadow: none !important; + -webkit-font-smoothing: antialiased; +} +input[disabled]::-webkit-input-placeholder +{ + color: #e0e0e0; + text-shadow: none !important; + -webkit-font-smoothing: antialiased; +} +textarea::-webkit-input-placeholder +{ + color: #e0e0e0; + text-shadow: none !important; + -webkit-font-smoothing: antialiased; +} +textarea[readonly]::-webkit-input-placeholder +{ + color: #e0e0e0; + text-shadow: none !important; + -webkit-font-smoothing: antialiased; +} + +input:-moz-placeholder +{ + color: #e0e0e0 !important; +} +input[readonly]:-moz-placeholder +{ + color: #e0e0e0 !important; +} +input[disabled]:-moz-placeholder +{ + color: #e0e0e0 !important; +} +textarea:-moz-placeholder +{ + color: #e0e0e0; +} +textarea[readonly]:-moz-placeholder +{ + color: #e0e0e0; +} +input::-moz-placeholder +{ + color: #e0e0e0 !important; +} +input[readonly]::-moz-placeholder +{ + color: #e0e0e0 !important; +} +input[disabled]::-moz-placeholder +{ + color: #e0e0e0 !important; +} +textarea::-moz-placeholder +{ + color: #e0e0e0; +} +textarea[readonly]::-moz-placeholder +{ + color: #e0e0e0; +} +input:-ms-input-placeholder +{ + color: #e0e0e0 !important; +} +input[readonly]:-ms-input-placeholder +{ + color: #e0e0e0 !important; +} +input[disabled]:-ms-input-placeholder +{ + color: #e0e0e0 !important; +} +textarea:-ms-input-placeholder +{ + color: #e0e0e0; +} +textarea[readonly]:-ms-input-placeholder +{ + color: #e0e0e0; +} + +input[type=text]::-ms-clear { + display: none; +} +input[type=password]::-ms-clear { + display: none; +} + +.iex +{ + padding-top: 1px; + padding-left: 0px; + padding-right: 0px; +} + + +input[type=text], input[type=password] +{ + height: 19px; + margin-left: 0px; + outline: none; + border: 0px; + + padding-left: 2px; /* it resizes the input size :( */ + + /* mobile safari remove rounded corners */ + -webkit-appearance: none; + -webkit-border-radius: 0px; +} + +input[type=text].fs, input[type=password].fs +{ + width: 390px; +} + +input[type=text].ms, input[type=password].ms +{ + width: 254px; +} + +input[type=text].hs, input[type=password].hs +{ + width: 193px; +} + +input[type=text].ss, input[type=password].ss +{ + width: 112px; +} + +input[type=checkbox] +{ + vertical-align: middle; + margin-right: 5px; +} +input[type=checkbox], x:-moz-any-link, x:default /* FF checkbox hack */ +{ + margin-bottom: 3px !important; +} +input[disabled][type=checkbox] /* Opera checkbox hack */ +{ + background: #e0e0e0; +} +label /* checkbox + text */ +{ + font-size: 0.95em; +} + +textarea +{ + font-size: 1em; + width: 527px; + height: 64px; /* if <61 firefox not shows the scroll bar ?! - note: we use autoResize plugin here */ + margin: 0px 0px 0px 0px; + border-style: none; + resize: none; + padding-left: 3px; + + outline: none; + -moz-outline: none; + -moz-border-radius: 0px; + + /* mobile safari remove rounded corners */ + -webkit-appearance: none; + -webkit-border-radius: 0px; +} +@-moz-document url-prefix() { + textarea + { + width: 529px; + padding-left: 2px !important; + } +} +textarea[readonly] +{ + color: #404040; + background: #fff; +} +textarea[readonly].safari_hack +{ + color: #000000; /* safari bug - the black color not works #000000 looks like #545454 :-( */ +} +@-moz-document url-prefix() { + textarea[readonly] + { + color: #404040; + } +} + +#LoginPage +{ + position: absolute; + top: 0px; + left: 0px; + width: 100%; + height: 100%; + overflow: hidden; + z-index: 101; + background: #f8f8f8; + display: none; /* by default the login window is hidden */ + cursor:default; + + user-select: none; + -webkit-user-select:none; + -moz-user-select: -moz-none; +} + +.window +{ + position: relative; + display: inline-block; + width: 503px; + height: 311px; + top: 38.2%; + left: 61.8%; + + margin-top: -155px; + margin-left: -252px; + + background-image: url(../images/cloud.svg); + color: #000000; + text-align: center; +} + +#Login +{ + margin-top: 50px; + margin-left: 85px; +} + +#login_message +{ + padding-top: 20px; + font-size: 16px; + font-weight: 500; + color: #9E2F36; +} + +#LoginLoader +{ + position: absolute; + top: 0px; + left: 0px; + right: 0px; + bottom: 0px; + overflow: visible; + background-image: url(../images/cloud.svg); + display: none; + z-index: 1; +} + +.footer +{ + position: absolute; + left: 25px; + bottom: 25px; + font-size: 16px; + color: #2d2d2d; +} + +#cacheDialog +{ + position: absolute; + top: 0px; + left: 0px; + right: 0px; + bottom: 0px; + overflow: visible; + background: #ffffff; + display: none; + opacity: 0.95; + text-align: center; + z-index: 200; + cursor:default; + + user-select: none; + -webkit-user-select:none; + -moz-user-select: -moz-none; +} + +#cacheDialogText +{ + position: absolute; + width: 100%; + bottom: 50%; + vertical-align: middle; + font-size: 2em; +} + +#cacheDialogButtonWrapper +{ + position: absolute; + left: 40%; + right: 40%; + bottom: 40%; +} + +#cacheDialogButton +{ + font-size: 2em !important; + border: 2px solid #c0c0c0; +} + +#MainLoader +{ + position: absolute; + top: 0px; + left: 0px; + right: 0px; + bottom: 0px; + overflow: visible; + background: #ffffff; + display: none; + opacity: 0.9; + z-index: 101; + cursor:default; + + user-select: none; + -webkit-user-select:none; + -moz-user-select: -moz-none; +} + +.loader +{ + width: 100%; + height: 100%; + background: url(../images/loadinfo.gif) no-repeat center center; +} + +.loader_hidden .loader +{ + background: none; +} + +.loaderInfo +{ + position: absolute; + width: 100%; + bottom: 25%; + vertical-align: middle; + text-align: center; + font-size: 2em; +} + +#ABMessage +{ + position: absolute; + top: 24px; + right: 0; + display: block; + width: 582px; + height: 0; + z-index: 20; + + background: #ffffff; + border-bottom: 1px solid; + border-bottom-color: #c0c0c0; + border-top: 0px; + overflow: hidden; + cursor: default; + + user-select: none; + -webkit-user-select: none; + -moz-user-select: none; +} + +#ABInMessage +{ + position: relative; + top: -1px; + + background: #ffffff; + border-bottom: 1px solid; + border-bottom-color: #404040; + border-top: 0px; + display: block; + height: 0px; + overflow: hidden; +} + +#ABMessageText, #ABInMessageText +{ + position: absolute; + padding: 7px; + text-align: center; + vertical-align: bottom; + width: 100%; + font-weight: 500; + background: #ffffff; + bottom: 0px; +} + +#ABInMessageEditBox +{ + position: relative; + top: -1px; + display:none; + + background: #ffffff; + border-bottom: 1px solid; + border-bottom-color: #404040; + border-top: 0px; + height: 0px; + overflow: hidden; +} + +#ABInMessageTextEditBox +{ + position: absolute; + padding: 7px; + text-align: center; + vertical-align: bottom; + width: 100%; + font-weight: 500; + background: #ffffff; + bottom: 0px; +} + +.message_success +{ + color: #000000; +} + +.message_error +{ + color: #ff0000; +} + +.element_grayed +{ + color: #e0e0e0; +} + +.element_default_hidden +{ + visibility: hidden; +} + +.element_hide +{ + height: 0px !important; + max-height: 0px !important; + overflow: hidden; +} + +.element_no_display +{ + display: none; +} + +.element_no_display_af +{ + display: none !important; +} + +input.non_editable +{ + background-color: #f5f5f5 !important; +} + +.integration_d +{ + display: none; /* hide the integration banner if the div is present but only CardDavMATE is loaded */ +} + +.resourcesCardDAV_d +{ + position: absolute; + top: 0px; + left: 0px; + right: 0px; + border-right: 1px solid #c0c0c0; + width: 224px; + height: 49px; + background: #f0f0f0; + color: #404040; + cursor: default; + + user-select: none; + -webkit-user-select: none; + -moz-user-select: none; +} + +.resourcesCardDAV_h +{ + float: left; + margin-top: 2px; + margin-left: 6px; + width: 190px; + font-size: 1.1em; + font-weight: 400; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +#ResourceCardDAVToggle +{ + float: left; + padding-top: 4px; + padding-left: 7px; + cursor: pointer; +} + +#ResourceCardDAVList +{ + position: absolute; + display: block; + top: 24px; + bottom: 0px; + left: 0px; + border-right: 1px solid; + border-right-color: #c0c0c0; + width: 224px; + overflow: auto; + overflow-x: hidden; + background: #ffffff; + border-top: 1px solid #c0c0c0; + cursor: default; + + user-select: none; + -webkit-user-select: none; + -moz-user-select: none; +} + +#ResourceCardDAVListOverlay +{ + position: absolute; + top: 0px; + left: 0px; + bottom: 0px; + border-right: 1px solid; + border-right-color: #c0c0c0; + width: 224px; + background: #ffffff; + display: none; + z-index: 10; + cursor: default; + + user-select: none; + -webkit-user-select: none; + -moz-user-select: none; +} + +#AddressbookOverlay +{ + position: absolute; + top: 0px; + left: 225px; + right: 0px; + bottom: 0px; + overflow: hidden; + background: #ffffff; + opacity: 0.8; + display: none; + z-index: 22; + cursor: default; + + user-select: none; + -webkit-user-select: none; + -moz-user-select: none; +} + +.colorPicker +{ + display: none; +} + +.resourceCardDAVColor +{ + width: 12px; + height: 24px; + margin-top: 0px; + margin-right: 6px; + float: left; +} + +.resourceCardDAVGroupColor +{ + width: 12px; + height: 19px; + margin-top: 0px; + float: left; +} + +.resourceCardDAV_header +{ + position: relative !important; + display: block; + overflow: hidden; + left: 0px; + top: 0px; + box-sizing: border-box; + -moz-box-sizing: border-box; + text-overflow: ellipsis; + white-space: nowrap; + width: 100%; + bottom: auto; + height: 20px; + line-height: 17px; + background-color: #ffffff; + color: #404040; + cursor: default; + padding-left: 6px; + padding-right: 6px; + font-size: 0.9em; + font-weight: 500; + + border-top: 1px solid; + border-top-color: #ffffff; + border-bottom: 1px solid; + border-bottom-color: #ffffff; +} + +.resourceCardDAV_item, .contact_group +{ + position: relative; + display: block; + overflow: hidden; + + left: 0px; + top: 0px; + box-sizing: border-box; + -moz-box-sizing: border-box; + width: 100%; +} + +.resourceCardDAV_item input[type="checkbox"] +{ + margin-top: -2px; + margin-right: 5px; +} + +@-moz-document url-prefix() { + .resourceCardDAV_item input[type="checkbox"] + { + margin-top: 0px; + } +} + +.resourceCardDAV +{ + position: relative; + display: block; + overflow: hidden; + + left: 0px; + top: 0px; + box-sizing: border-box; + -moz-box-sizing: border-box; + text-overflow: ellipsis; + white-space: nowrap; + width: 100%; + height: 25px; + line-height: 23px; + border-top: 1px solid #ffffff; + color: #404040; + cursor: default; + font-size: 1em; + font-weight: 400; + + padding-left: 0px; + padding-right: 6px; +} + +.resourceCardDAV:hover +{ + cursor: pointer; + color: #404040 !important; + background-color: #e7e7e7 !important; + border-top: 1px solid !important; +/* + border-top-color: #b9b9b9 !important; + border-bottom: 1px solid !important; + border-bottom-color: #b9b9b9 !important; +*/ + border-top-color: #ffffff !important; +} + +.resourceCardDAV.resourceCardDAV_selected +{ + color: #ffffff !important; + background: #585858 !important; + border-top: 1px solid !important; +/* + border-top-color: #585858 !important; + border-bottom: 1px solid !important; + border-bottom-color: #585858 !important; +*/ + border-top-color: #ffffff !important; +} + +.resourceCardDAV.resourceCardDAV_dropped_to +{ + background-color: #b9b9b9; + border: 1px dashed #ffffff !important; + padding-right: 7px; +} + +.resourceCardDAV.resourceCardDAV_dropped_to > .resourceCardDAVColor +{ + width: 11px !important; /* reduce the addressbook color size during "drop" */ +} + +.resourceCardDAV.resourceCardDAV_ro +{ + background-image: url(../images/read_only_b.svg); + background-repeat: no-repeat !important; + background-position: 97% center !important; + padding-right: 32px !important; +} + +.resourceCardDAV.resourceCardDAV_ro:hover +{ + background-image: url(../images/read_only_b.svg) !important; +} + +.resourceCardDAV.resourceCardDAV_ro.resourceCardDAV_selected +{ + background-image: url(../images/read_only_w.svg) !important; +} + +#ABListTable, #ABListTableInner +{ + width: 100%; + table-layout: fixed; +} + +.ablist_table_header +{ + border-bottom: 1px solid #c0c0c0; +} + +.ablist_table_header th +{ + font-weight: 500; + font-size: 0.9em; + border-right: 1px solid #f0f0f0; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.ablist_table_container > td +{ + padding: 0 !important; +} + +.ablist_table_wrapper +{ + overflow-x: hidden; + overflow-y: auto; +} + +.ablist_column_color +{ + width: 6px; +} + +.ablist_header +{ + color: #404040; + background-color: #f0f0f0; + font-size: 0.9025em; +} + +.ablist_header td +{ + height: 18px; + padding: 0 10px; + line-height: 18px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.ablist_item +{ + color: #404040; + background-color: #fff; + font-size: 1.02885em; + border-top: 1px solid #ffffff !important; +} + +.ablist_item td +{ + height: 15px !important; + padding: 2px 4px; + line-height: 15px !important; + border-right: 1px solid #f0f0f0; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + background-color: inherit; +} + +.ablist_item td.ablist_item_color +{ + height: 100%; + width: 6px; + padding: 0; + border-color: #f0f0f0; + background-color: #f0f0f0; + border-right: none; +} + +.ablist_item, x:-moz-any-link, x:default +{ + line-height: 17px; +} + +.ablist_item_selected +{ + color: #eeeeee !important; + background-color: #585858 !important; +/* + border-top: 1px solid !important; + border-top-color: #585858 !important; + border-bottom: 1px solid !important; + border-bottom-color: #585858 !important; +*/ + border-top: 1px solid !important; + border-top-color: #ffffff !important; +} + +.ablist_item:hover +{ + cursor: pointer; + color: #000000; + background-color: #b9b9b9; +/* + border-top-color: #b9b9b9; + border-bottom-color: #b9b9b9; +*/ + border-top-color: #ffffff; +} + +@media only screen and (device-width: 1024px) +{ + /* Rule matched by 1024x768 tablets, like the iPad and iPad2 and ignored by other browsers */ + .ablist_item:hover + { + cursor: default; + color: #404040; + background-color: #ffffff; + border-top-color: #ffffff; +/* + border-bottom-color: #ffffff; +*/ + } +} + +@media only screen and (device-width: 768px) +{ + /* Rule matched by 1024x768 tablets, like the iPad and iPad2 and ignored by other browsers */ + .ablist_item:hover + { + cursor: default; + color: #404040; + background-color: #ffffff; + border-top-color: #ffffff; +/* + border-bottom-color: #ffffff; +*/ + } +} + +.ablist_item:hover td +{ + border-right-color: #eee; +} + +/*.company, .ablist_item_selected.company:hover +{ + padding-right: 30px; + background-image: url(../images/company_s_b.svg); + background-repeat: no-repeat; + background-position: right top; +} + +.ablist_item_selected.company +{ + background-image: url(../images/company_s_w.svg) !important; + background-repeat: no-repeat !important; + background-position: right top !important; +}*/ + +.ablist_item_dragged +{ + border: 1px dashed #ffffff !important; + background-color: #585858 !important; + color: #ffffff !important; +} + +.group +{ + position: relative; + display: block; + overflow: hidden; + + left: 0px; + top: 0px; + box-sizing: border-box; + -moz-box-sizing: border-box; + text-overflow: ellipsis; + white-space: nowrap; + width: 100%; + height: 20px; + line-height: 17px; + border-top: 1px solid #ffffff; + color: #404040; + cursor: default; + padding-left: 0px; + padding-right: 6px; + font-size: 0.9em; + background-image: none !important; +} + +.group input[type="checkbox"] +{ + margin-top: -2px; + margin-left: 18px; + margin-right: 5px; +} + +@-moz-document url-prefix() { + .group input[type="checkbox"] + { + margin-top: 0x; + } +} + +.group:hover +{ + cursor: pointer; + color: #404040 !important; + background-color: #e7e7e7 !important; + border-top: 1px solid !important; +/* + border-top-color: #b9b9b9 !important; + border-bottom: 1px solid !important; + border-bottom-color: #b9b9b9 !important; +*/ + border-top-color: #ffffff !important; +} + +.group.resourceCardDAV_selected +{ + color: #ffffff !important; + background: #585858 !important; + border-top: 1px solid !important; +/* + border-top-color: #585858 !important; + border-bottom: 1px solid !important; + border-bottom-color: #585858 !important; +*/ + border-top-color: #ffffff !important; +} + +.group_dropped_to +{ + background-color: #b9b9b9; + border: 1px dashed #ffffff !important; + padding-right: 7px; +} + +.group_dropped_to > .resourceCardDAVGroupColor +{ + width: 11px !important; +} + +.r_operate.resourceCardDAV, .r_operate.group +{ + background-image: url(../images/loadinfo_s1.gif) !important; + background-repeat: no-repeat !important; + background-position: 97% center !important; + padding-right: 32px; +} + +.r_operate.resourceCardDAV:hover, .r_operate.group:hover +{ + background-image: url(../images/loadinfo_s2.gif) !important; +} + +.r_operate.resourceCardDAV.resourceCardDAV_selected, .r_operate.group.resourceCardDAV_selected +{ + background-image: url(../images/loadinfo_s3.gif) !important; +} + +.r_success.resourceCardDAV, .r_success.group +{ + background-image: url(../images/success_b.svg) !important; + background-repeat: no-repeat !important; + background-position: 97% center !important; + padding-right: 32px; +} + +.r_success.resourceCardDAV:hover, .r_success.group:hover +{ + background-image: url(../images/success_b.svg) !important; +} + +.r_success.resourceCardDAV.resourceCardDAV_selected, .r_success.group.resourceCardDAV_selected +{ + background-image: url(../images/success_w.svg) !important; +} + +.r_error.resourceCardDAV, .er_error.resourceCardDAV, .r_error.group, .er_error.group +{ + background-image: url(../images/error_b.svg) !important; + background-repeat: no-repeat !important; + background-position: 97% center !important; + padding-right: 32px; +} + +.r_error.resourceCardDAV:hover, .er_error.resourceCardDAV:hover, .r_error.group:hover, .er_error.group:hover +{ + background-image: url(../images/error_b.svg) !important; +} + +.r_error.resourceCardDAV.resourceCardDAV_selected, .er_error.resourceCardDAV.resourceCardDAV_selected, .r_error.group.resourceCardDAV_selected, .er_error.group.resourceCardDAV_selected +{ + background-image: url(../images/error_w.svg) !important; +} + +.resourceCardDAV_header.load_mode, .resourceCardDAV.load_mode, .resourceCardDAV.load_mode:hover +{ + padding-right: 24px !important; + background-image: none !important; +} + +.contact_group.load_mode +{ + display: none; +} + +.resourceCardDAV_header.unloaded, .resourceCardDAV.unloaded +{ + color: rgba(64, 64, 64, 0.4) !important; +} + +.resourceCardDAV.unloaded .resourceCardDAVColor +{ + opacity: 0.4; +} + + + +td[data-size="full"] > span > select[data-type="country_type"] +{ + min-width: 392px !important; + max-width: 392px !important; +} +td[data-size="full"] > span > select[data-type="xfull_type"] +{ + min-width: 392px !important; + max-width: 392px !important; +} + +td[data-size="half"] > span > select[data-type="country_type"] +{ + min-width: 195px !important; + max-width: 195px !important; +} +td[data-size="half"] > span > select[data-type="xhalf_type"] +{ + min-width: 195px !important; + max-width: 195px !important; +} + +td[data-size="small"] > select +{ + min-width: 134px !important; + max-width: 134px !important; +} + +img[data-type="invalidCardDavTagsinput"] +{ + vertical-align: top; + margin-top: -22px; + margin-left: 512px; +} + +#showUnloadedAddressbooks +{ + float:right; + padding-top: 4px; + padding-right: 6px; + cursor: pointer; +} + +#EditorBox +{ + padding-left: 7px; + padding-top: 4px; + z-index: 1; +} + +#EditorBox *> .attr_desc +{ + font-size: 1em; + height: 1.3em !important; + vertical-align: middle !important; + text-align: baseline !important; +} + +#EditorBox *> .opw /* + and - image button IE bug with input type="image" and width */ +{ + width:14px; +} + +#EditorBox *> .op /* + and - image buttons (width is defined separately in .opw) */ +{ + padding-top: 2px; +} + +#EditorBox *> .zero_height +{ + height: 0px !important; +} + +#EditorBox *> .photo_box +{ + width: 171px !important; + height: 160px !important; +} + +#EditorBox *> .photo_div +{ + position: relative; + overflow:hidden; + width: 164px; + height: 183px; + + border: 1px solid; + border-color: #d0d0d0; +} + +#EditorBox *> .photo +{ + position: relative; + width: 164px; + height: 183px; + background-repeat: no-repeat; + background-position: center; +} + +#EditorBox *> .photo_blank.photo_user +{ + background-image: url(../images/user.svg); +} + +#EditorBox *> .photo_blank.photo_company +{ + background-image: url(../images/company.svg); +} + +#EditorBox *> .heightfix +{ + height: 19px !important; + min-height: 19px !important; + max-height: 19px !important; + line-height: 16px !important; +} + +select.inverse_select +{ + background: #ffffff url(../images/select_inv.svg) no-repeat center right; +} + +#ExtendedDest +{ + position: absolute; + top: 22px; + height: 0; + width: 392px; + background-color: #fff; + overflow-y: auto; + overflow-x: hidden; + z-index: 1; + cursor: default; + + user-select: none; + -webkit-user-select: none; + -moz-user-select: none; +} + +.extended_dest_header +{ + overflow: hidden; + box-sizing: border-box; + -moz-box-sizing: border-box; + text-overflow: ellipsis; + white-space: nowrap; + width: 100%; + height: 20px; + line-height: 17px; + color: #404040; + padding-left: 6px; + padding-right: 6px; + font-size: 0.9em; + font-weight: 500; + + border-top: 1px solid; + border-top-color: #ffffff; + border-bottom: 1px solid; + border-bottom-color: #ffffff; +} + +.extended_dest_item, .extended_dest_group_container +{ + overflow: hidden; + + box-sizing: border-box; + -moz-box-sizing: border-box; + width: 100%; +} + +.extended_dest_item input[type="checkbox"] +{ + margin-top: -2px; + margin-right: 5px; +} + +@-moz-document url-prefix() { + .extended_dest_item input[type="checkbox"] + { + margin-top: 0px; + } +} + +.extended_dest_resource +{ + overflow: hidden; + + box-sizing: border-box; + -moz-box-sizing: border-box; + text-overflow: ellipsis; + white-space: nowrap; + width: 100%; + height: 25px; + line-height: 23px; + border-top: 1px solid #ffffff; + color: #404040; + font-size: 1em; + font-weight: 400; + + padding-left: 0px; + padding-right: 6px; +} + +.extended_dest_group +{ + overflow: hidden; + + box-sizing: border-box; + -moz-box-sizing: border-box; + text-overflow: ellipsis; + white-space: nowrap; + width: 100%; + height: 20px; + line-height: 17px; + border-top: 1px solid #ffffff; + color: #404040; + padding-left: 0px; + padding-right: 6px; + font-size: 0.9em; +} + +.extended_dest_group input[type="checkbox"] +{ + margin-top: -2px; + margin-left: 18px; + margin-right: 5px; +} + +@-moz-document url-prefix() { + .extended_dest_group input[type="checkbox"] + { + margin-top: 0x; + } +} + +.extended_dest_resource_color +{ + width: 12px; + height: 24px; + margin-top: 0px; + margin-right: 6px; + float: left; +} + +.extended_dest_group_color +{ + width: 12px; + height: 19px; + margin-top: 0px; + float: left; +} + +#photoArrow +{ + position: absolute; + top: 184px; + left: 74px; + display: none; + height: 0px; + width: 0px; + padding: 0px; + height: 9px; + width: 16px; + background: url(../images/popupArrow.svg) no-repeat center; +/* border: 8px solid #585858; + border-top-color: transparent; + border-left-color: transparent; + border-right-color: transparent;*/ + z-index: 103; +} + +#photoBox +{ + position: absolute; + top: 192px; + left: 0; + display: none; + width: 300px; + background-color: #f0f0f0; + color: #404040; + border: 1px solid #c0c0c0; + z-index: 102; + cursor:default; + + user-select: none; + -webkit-user-select:none; + -moz-user-select: -moz-none; +} + +#photoBox h1 +{ + margin: 0; + font-size: 1em; + text-align: center; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +#photoBoxContent +{ + padding: 10px; +} + +#photoURL +{ + width: 218px; +} + +#photoURL.invalid +{ + padding-right: 22px; + width: 196px; +} + +#photoBoxButton +{ + top: -1px; + margin-left: 6px; + width: 50px; +} + +@-moz-document url-prefix() { + #photoBoxButton + { + top: 0px; + } +} + +/* XXX - For the next version +#SystemCalDavZAP, #SystemCalDavTODO +{ + display: block; + visibility: hidden; +}*/ + +#SystemCalDavZAP th, #SystemCalDavTODO th +{ + position: relative; /* required by placeholder plugin (used for IE) */ + font-weight: 400; +} + +.resourcesCalDAV_h +{ + position: absolute; + padding-left: 8px; + padding-top: 3px; + font-size: 1.1em; + font-weight: 500; +} + +.resourcesCalDAV_d +{ + position: absolute; + top: 0px; + left: 0px; + right: 0px; + border-right: 1px solid; + border-right-color: #c0c0c0; + width: 224px; + height: 24px; + background: #2d2d2d; + color: #eeeeee; + + user-select: none; + -webkit-user-select: none; + -moz-user-select: none; +} + +#ResourceCalDAVList, #ResourceCalDAVTODOList +{ + position: absolute; + display: block; + top: 24px; + bottom: 0px; + left: 0px; + width: 224px; + overflow: auto; + overflow-x: hidden; + background: #ffffff; + border-top: 1px solid #c0c0c0; + cursor:default; + + user-select: none; + -webkit-user-select: none; + -moz-user-select: none; +} + +#ResourceCalDAVListOverlay +{ + position: absolute; + top: 24px; + left: 0px; + bottom: 0px; + border-right: 1px solid; + border-right-color: #c0c0c0; + width: 224px; + background: #ffffff; + display: none; + z-index: 10; +} + +.resourceCalDAV_header, .resourceCalDAVTODO_header +{ + position: relative !important; + display: block; + overflow: hidden; + left: 0px; + top: 0px; + box-sizing: border-box; + -moz-box-sizing: border-box; + width: 100%; + bottom: auto; + height: 20px; + line-height: 17px; + background-color: #ffffff; + color: #404040; + cursor: default; + padding-left: 6px; + padding-right: 6px; + font-size: 0.9em; + font-weight: 500; + text-overflow: ellipsis; + white-space: nowrap; + border-top: 1px solid; + border-top-color: #ffffff; + border-bottom: 1px solid; + border-bottom-color: #ffffff; +} + +.resourceCalDAV_item, .resourceCalDAVTODO_item +{ + position: relative; + display: block; + overflow: hidden; + + left: 0px; + top: 0px; + box-sizing: border-box; + -moz-box-sizing: border-box; + width: 100%; +} + +body +{ + overflow: hidden; +} + +#timezoneSelectDiv, #timezoneTodoSelectDiv +{ + position: absolute; + top: 0px; + left: 69px; +} + +#timezoneWrapper select, #timezoneWrapperTODO select +{ + background: #f0f0f0 url(../images/select_black.svg) no-repeat center right; + color: #404040; +} + +@-moz-document url-prefix() { + #timezoneWrapper select, #timezoneWrapperTODO select + { + background: transparent url(../images/select_bg_black.svg) repeat-x; + + /* FF outline hack */ + color: rgba(64, 64, 64, 0); + text-shadow: 0 0 0 #404040; + } + + #timezoneWrapper select option + { + color: #404040; + background-color: #f0f0f0 !important; + } + +} + +#CalendarLoader, #CalendarLoaderTODO +{ + position: absolute; + top: 0px; + left: 225px; + right: 0px; + bottom: 0px; + overflow: visible; + background: #ffffff; + display: none; + opacity: 0.8; + z-index: 99; + cursor:default; + + user-select: none; + -webkit-user-select:none; + -moz-user-select: -moz-none; +} + +#CAEvent .saveLoader +{ + top:1px; + left:1px; + position: absolute; + height: 100%; + width: 100%; + background: #ffffff; + display: none; + opacity: 0.95; + z-index: 101; +} + +#todoLoader .saveLoader +{ + position: absolute; + width: 100%; + height: 50%; + background: #ffffff; + display: block; + opacity: 0.95; + z-index: 101; +} + +.saveLoaderInfo +{ + position: absolute; + width: 100%; + top: 60%; + vertical-align: bottom; + text-align: center; + padding: 0px; + font-weight: 500; + z-index: 102; +} + +#todoLoader .saveLoaderInfo +{ + top: 70%; +} + +h1 +{ + font-weight: 400; + background-color: #f0f0f0; + color: #404040; + font-size: 1.1em; + padding: 3px 0px 0px 6px; + height: 21px; + line-height: 19px; + border-bottom: 1px solid #c0c0c0; +} + +h3 +{ + color: #2d2d2d; + font-size: 1em; + padding: 15px; +} + +.headers +{ + top: 0px; + position: absolute; + font-weight: 400; + background-color: #f0f0f0; + color: #404040; + font-size: 1em; + height: 24px; + z-index: 25; + border-bottom: 1px solid #c0c0c0; + cursor:default; + + user-select: none; + -webkit-user-select:none; + -moz-user-select: -moz-none; +} + +/* +.headers span[data-type=calendars_txt], .resourceCalDAVTODO_text +{ + float: left; + margin-top: 3px; +} +*/ + +.headers span[data-type=resourcesCalDAV_txt], .headers span[data-type=todo_txt], .headers span[data-type=resourceCalDAV_subscribe_text] +{ + float: left; + margin-top: 2px; + margin-left: 6px; + width: 190px; + font-size: 1.1em; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +#ResourceCalDAVToggle, #ResourceCalDAVTODOToggle +{ + float: left; + padding-top: 4px; + padding-left: 7px; + cursor: pointer; +} + +#showUnloadedCalendars, #showUnloadedCalendarsTODO +{ + float:right; + padding-top: 4px; + padding-right: 6px; + cursor: pointer; +} + +#eventFormShower, #eventFormShowerTODO +{ + float: right; + height: 16px; + width: 17px; + padding: 4px 6px; + cursor: pointer; +} + +#searchFormShowerDiv +{ + cursor: pointer; + float: right; + height: 15px; + margin-right: 10px; +} + +#resourceCalDAV_h, #resourceCalDAVTODO_h +{ + left: 0px; + height: 49px; + width: 224px; + border-bottom: none; +} + +#todoForm_h +{ + right: 0; + width: 413px; +} + +#todoForm +{ + position: absolute; + top: 25px; + right: 0; + bottom: 0; + width: 410px; + overflow: auto; + overflow-x: hidden; + background-color: #f0f0f0; +} + +#todoLoader +{ + position: absolute; + display: none; + top: 25px; + right: 0; + bottom: 0; + width: 413px; + z-index: 101; + background-color: #fff; +} + +#main_h +{ + left: 224px; + right: 0px; + border-left: 1px solid #c0c0c0; +} + +#main_h_TODO +{ + left: 224px; + right: 413px; + border-left: 1px solid #c0c0c0; + border-right: 1px solid #c0c0c0; +/* border-bottom: 1px solid #FFFFFF;*/ +} + +#main_h_placeholder, #mainTODO_h_placeholder +{ + left: 95px; + right: 90px; + position: absolute; + overflow: hidden; + padding-right: 5px; +} + +#mainTODO_h_placeholder +{ + left: 95px; + right: 50px; +} + +#timezoneWrapper, #timezoneWrapperTODO +{ + position: absolute; + padding-left: 6px; + left: 0px; + bottom: 0px; + height: 19px; + width: 218px; + background: #f0f0f0; + border-top: 1px solid #c0c0c0; + color: #404040; + cursor:default; + + user-select: none; + -webkit-user-select:none; + -moz-user-select: -moz-none; +} + +#timezoneWrapper label, #timezoneWrapperTODO label +{ + position: relative; + display: inline-block; + top: 1px; + min-width: 60px; + max-width: 60px; + overflow: hidden; + +} + +#timezonePicker, #timezonePickerTODO +{ + width: 155px; + background-color: #2d2d2d; + color: #FFFFFF; +} + +#ResourceCalDAVList, #ResourceCalDAVTODOList +{ + z-index: 25; +} + +#searchForm +{ + position: absolute; + top: 24px; + left: 224px; + right: 0px; + height:100px; + background: #ffffff; + border-left: 1px solid; + border-right: 1px solid; + border-color: #c0c0c0; + overflow: hidden; + + z-index: 25; + height: 24px; + border-top: 1px solid; + border-top-color: #c0c0c0; + border-bottom: 1px solid; + border-bottom-color: #c0c0c0; + cursor:default; + + user-select: none; + -webkit-user-select:none; + -moz-user-select: -moz-none; +} + +#searchFormTODO +{ + position: absolute; + top: 24px; + left: 224px; + right: 413px; + height: 24px; + background: #ffffff; + border-left: 1px solid; + border-right: 1px solid; + border-color: #c0c0c0; + overflow: hidden; + + z-index: 25; + border-top: 1px solid; + border-top-color: #c0c0c0; + border-bottom: 1px solid; + border-bottom-color: #c0c0c0; + cursor:default; + + user-select: none; + -webkit-user-select:none; + -moz-user-select: -moz-none; +} + +.searchContainer +{ + position: absolute; + display: inline-block; + left: 29px; + right: 29px; +} + +.searchContainer input +{ + width: 100%; + background-color: #FFFFFF; + padding-left: 4px; +} + +#main, #mainTODO +{ + position: absolute; + top: 50px; + left: 224px; + bottom: 0; + padding: 0px 7px; + background: #ffffff; + border-left: 1px solid; + border-right: 1px solid; + border-color: #c0c0c0; + overflow-x: hidden; + overflow-y: auto; + z-index: 26; + cursor:default; + + user-select: none; + -webkit-user-select:none; + -moz-user-select: -moz-none; +} + +#main +{ + right: 0; +} +#mainTODO +{ + right: 413px; +} + +#calendar, #todoList +{ + display: inline-block; + width: 100%; + min-width: 1px; +} + +#calendar +{ + padding: 5px 0px; +} + +#todoList +{ + padding: 7px 0px; + /* Safari Scrollbar fix */ + margin-bottom: -4px; +} + +#alertBox +{ + position: fixed; + top: 20%; + left: 50%; + visibility: hidden; + width: 450px; + background: white; + border: 1px solid #c0c0c0; + z-index: 102; + cursor:default; + + user-select: none; + -webkit-user-select:none; + -moz-user-select: -moz-none; +} + +#repeatConfirmBox +{ + width: 100%; + position: absolute; + text-align: center; + visibility: hidden; + background: white; + border: 1px solid #c0c0c0; + z-index: 100; +} + +#repeatConfirmBoxTODO +{ + position: absolute; + width: 100%; + text-align: center; + visibility: hidden; + background-color: #f0f0f0; + z-index: 100; +} + +#EventDisabler +{ + position: fixed; + width: 100%; + height: 100%; + background-color: #f9f9f9; + opacity: 0.7; + filter: alpha(opacity=70); + z-index: 99; + top: 0px; + left: 0px; + display: none; + cursor:default; + + user-select: none; + -webkit-user-select:none; + -moz-user-select: -moz-none; +} + +#TodoDisabler +{ + position: fixed; + background-color: #f9f9f9; + opacity: 0.7; + filter: alpha(opacity=70); + z-index: 99; + top: 0; + bottom: 0; + left: 0; + right: 414px; + display: none; + cursor:default; + + user-select: none; + -webkit-user-select:none; + -moz-user-select: -moz-none; +} + +#AlertDisabler +{ + position: fixed; + width: 100%; + height: 100%; + background-color: #f9f9f9; + opacity: 0.7; + filter: alpha(opacity=70); + z-index: 101; + top: 0px; + left: 0px; + display: none; + cursor:default; + + user-select: none; + -webkit-user-select:none; + -moz-user-select: -moz-none; +} + +.resourceCalDAVColor +{ + width: 12px; + height: 24px; + margin-top: 0px; + margin-right: 6px; + float: left; +} + +.colorPicker +{ + display: none; +} + +.addRemoveAll +{ + cursor: pointer; + margin-top: 7px !important; + margin-left: 5px !important; + display: none; +} + +.resourceCalDAV_item, .resourceCalDAVTODO_item +{ + position: relative; + display: block; + overflow: hidden; + + left: 0px; + top: 0px; + box-sizing: border-box; + -moz-box-sizing: border-box; + text-overflow: ellipsis; + white-space: nowrap; + width: 100%; + height: 25px; + line-height: 23px; + border-top: 1px solid; + border-top-color: #ffffff; +/* + border-bottom: 1px solid; + border-bottom-color: #f0f0f0; +*/ + color: #404040; + cursor: default; + font-size: 1em; + font-weight: 400; + + padding-left: 0px; + padding-right: 6px; +} + +#ResourceCalDAVList .resourceCalDAV_item:hover, #ResourceCalDAVTODOList .resourceCalDAVTODO_item:hover +{ + cursor: pointer; + color: #404040 !important; + background-color: #e7e7e7 !important; + border-top: 1px solid !important; +/* + border-top-color: #c0c0c0 !important; + border-bottom: 1px solid !important; + border-bottom-color: #c0c0c0 !important; +*/ + border-top-color: #ffffff !important; +} + +#ResourceCalDAVList .resourceCalDAV_item.resourceCalDAV_item_selected, #ResourceCalDAVTODOList .resourceCalDAVTODO_item.resourceCalDAV_item_selected +{ + color: #ffffff !important; + background: #585858 !important; + border-top: 1px solid !important; +/* + border-top-color: #585858 !important; + border-bottom: 1px solid !important; + border-bottom-color: #585858 !important; +*/ + border-top-color: #ffffff !important; +} + +#ResourceCalDAVList .resourceCalDAV_item_ro.resourceCalDAV_item, #ResourceCalDAVTODOList .resourceCalDAV_item_ro.resourceCalDAVTODO_item +{ + background-image: url(../images/read_only_b.svg); + background-repeat: no-repeat !important; + background-position: 95% center !important; + padding-right: 32px !important; +} + +#ResourceCalDAVList .resourceCalDAV_item_ro.resourceCalDAV_item:hover, #ResourceCalDAVTODOList .resourceCalDAV_item_ro.resourceCalDAVTODO_item:hover +{ + background-image: url(../images/read_only_b.svg) !important; +} + +#ResourceCalDAVList .resourceCalDAV_item_ro.resourceCalDAV_item.resourceCalDAV_item_selected, #ResourceCalDAVTODOList .resourceCalDAV_item_ro.resourceCalDAVTODO_item.resourceCalDAV_item_selected +{ + background-image: url(../images/read_only_w.svg) !important; +} + +#ResourceCalDAVList .r_operate.resourceCalDAV_item, #ResourceCalDAVTODOList .r_operate.resourceCalDAVTODO_item +{ + background-image: url(../images/loadinfo_s1.gif); + background-repeat: no-repeat !important; + background-position: 97% center !important; + padding-right: 32px !important; +} + +#ResourceCalDAVList .r_operate.resourceCalDAV_item:hover, #ResourceCalDAVTODOList .r_operate.resourceCalDAVTODO_item:hover +{ + background-image: url(../images/loadinfo_s2.gif) !important; +} + +#ResourceCalDAVList .r_operate.resourceCalDAV_item.resourceCalDAV_item_selected, #ResourceCalDAVTODOList .r_operate.resourceCalDAVTODO_item.resourceCalDAV_item_selected +{ + background-image: url(../images/loadinfo_s3.gif) !important; +} + +#ResourceCalDAVList .r_error.resourceCalDAV_item, #ResourceCalDAVTODOList .r_error.resourceCalDAVTODO_item +{ + background-image: url(../images/error_b.svg); + background-repeat: no-repeat !important; + background-position: 97% center !important; + padding-right: 32px !important; +} + +#ResourceCalDAVList .r_error.resourceCalDAV_item:hover, #ResourceCalDAVTODOList .r_error.resourceCalDAVTODO_item:hover +{ + background-image: url(../images/error_b.svg) !important; +} + +#ResourceCalDAVList .r_error.resourceCalDAV_item.resourceCalDAV_item_selected, #ResourceCalDAVTODOList .r_error.resourceCalDAVTODO_item.resourceCalDAV_item_selected +{ + background-image: url(../images/error_w.svg) !important; +} + +#ResourceCalDAVList .resourceCalDAV_header.load_mode, #ResourceCalDAVTODOList .resourceCalDAVTODO_header.load_mode, +#ResourceCalDAVList .resourceCalDAV_item.load_mode, #ResourceCalDAVTODOList .resourceCalDAVTODO_item.load_mode, +#ResourceCalDAVList .resourceCalDAV_item.load_mode:hover, #ResourceCalDAVTODOList .resourceCalDAVTODO_item.load_mode:hover +{ + padding-right: 24px !important; + background-image: none !important; +} + +.resourceCalDAV_header.unloaded, .resourceCalDAV_item.unloaded, .resourceCalDAVTODO_header.unloaded, .resourceCalDAVTODO_item.unloaded +{ + color: rgba(64, 64, 64, 0.4) !important; +} + +.resourceCalDAV_item.unloaded .resourceCalDAVColor, .resourceCalDAVTODO_item.unloaded .resourceCalDAVColor +{ + opacity: 0.4; +} + +.resourceCalDAV_item input[type="checkbox"], .resourceCalDAVTODO_item input[type="checkbox"] +{ + margin-top: -2px; + margin-right: 5px; +} + +/* FF checkbox hack */ +@-moz-document url-prefix() +{ + .resourceCalDAV_item input[type="checkbox"], .resourceCalDAVTODO_item input[type="checkbox"] + { + margin-top: 0px; + } +} + +.todoTextFirst +{ + padding-left: 5px; +} + +.todoText +{ + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +#CATodo, #CAEvent +{ + position: absolute; + cursor:default; + + user-select: none; + -webkit-user-select:none; + -moz-user-select: -moz-none; +} + +#event_details_template, #todo_details_template +{ + width: 413px; + position: absolute; + display: none; + background-color: #f0f0f0; + overflow-x: hidden; + overflow-y: auto; + border: 1px solid #c0c0c0; + z-index: 100; +} + +#todo_details_template +{ + width: 410px; +} + +#todo_details_template +{ + z-index: 26; +} + +#eventColor +{ + width: 3px; + float: left; + background-color: #f0f0f0; + + user-select: none; + -webkit-user-select: none; + -moz-user-select: none; +} + +#eventDetailsContainer +{ + position: relative; + left: 3px; +} + +#todoColor +{ + position: absolute; + display: block; + top: 24px; + bottom: 0; + right: 410px; + width: 3px; + background-color: #f0f0f0; + border-top: 1px solid #f0f0f0; + border-bottom: 1px solid #f0f0f0; + + user-select: none; + -webkit-user-select: none; + -moz-user-select: none; +} + +#event_details_template h1, #todo_details_template h1 +{ + -webkit-border-top-left-radius: 4px; + -moz-border-top-left-radius: 4px; + border-top-left-radius: 4px; + -webkit-border-top-right-radius: 4px; + -moz-border-top-right-radius: 4px; + border-top-right-radius: 4px; + text-align: center; + display: none; + background-color: transparent; + margin: 4px 0px 0px 0px; +} + +#TodoInMessage, #EventInMessage +{ + position: relative; + display: block; + height: 0px; + overflow: hidden; + z-index: 102; + background: #f0f0f0; + border-bottom: 1px solid; + border-bottom-color: #c0c0c0; +} + +#TodoInMessageText, #EventInMessageText +{ + position: absolute; + padding: 7px; + text-align: center; + vertical-align: bottom; + width: 100%; + font-weight: 500; +} + +#eventDetailsTable, #todoDetailsTable +{ + margin: 6px 4px 6px 6px; + text-align: left; + /*-2px from margin-right to offset td 2px in padding-left*/ +} + +#event_details_template textarea.header, #todo_details_template textarea.header +{ + position: relative; + font-size: 1.1em; + font-weight: 500; + width: 393px; + margin-bottom: 10px; + height: 40px; +} + +@-moz-document url-prefix() +{ + #event_details_template textarea.header, #todo_details_template textarea.header + { + width: 395px; + } +} + +#event_details_template textarea.header.leftspace, #todo_details_template textarea.header.leftspace +{ + left: 20px; + width: 373px; +} + +#event_details_template textarea.header.rightspace, #todo_details_template textarea.header.rightspace +{ + width: 373px; +} + +@-moz-document url-prefix() +{ + #event_details_template textarea.header.leftspace, #todo_details_template textarea.header.leftspace, #event_details_template textarea.header.rightspace, #todo_details_template textarea.header.rightspace + { + width: 375px; + } +} + +#event_details_template textarea.header.leftspace.rightspace, #todo_details_template textarea.header.leftspace.rightspace +{ + width: 353px; +} + +@-moz-document url-prefix() +{ + #event_details_template textarea.header.leftspace.rightspace, #todo_details_template textarea.header.leftspace.rightspace + { + width: 355px; + } +} + +.formNav +{ + display: none; + position: absolute; + height: 42px; + width: 18px; + border: 1px solid #c0c0c0; + font-size: 1.1em; + font-weight: 400; + background-color: #ffffff; + cursor: pointer; +} + +@-moz-document url-prefix() +{ + .formNav + { + height: 38px; + } +} + +.formNav:hover +{ + background-color: #f0f0f0; +} + +.formNav.prev +{ + top: 0px; + left: 0px; + text-align: right; +} + +.formNav.prev img +{ + padding-top: 14px; + padding-right: 3px; +} + +@-moz-document url-prefix() +{ + .formNav.prev img + { + padding-top: 12px; + } +} + +.formNav.next +{ + top: 0px; + right: 2px; + text-align: left; +} + +.formNav.next img +{ + padding-top: 14px; + padding-left: 3px; +} + +@-moz-document url-prefix() +{ + .formNav.next img + { + padding-top: 12px; + } +} + +.formNav.top +{ + top: 0px; + height: 21px; + border-bottom: none; +} + +.formNav.top img +{ + padding-top: 3px; +} + +@-moz-document url-prefix() +{ + .formNav.top + { + height: 19px; + } + .formNav.top img + { + padding-top: 2px; + } +} + +.formNav.bottom +{ + top: 22px; + height: 21px; + border-top: none; +} + +.formNav.bottom img +{ + padding-top: 4px; +} + +@-moz-document url-prefix() +{ + .formNav.bottom + { + top: 20px; + height: 19px; + } + .formNav.bottom img + { + padding-top: 3px; + } +} + +#event_details_template .headerContainer, #todo_details_template .headerContainer +{ + padding: 0px 2px 0px 0px; + /*2px to offset td padding in the rest of the form*/ + /*maybe add 2px to th as well?*/ +} + +#eventDetailsTable .label, #todoDetailsTable .label +{ + width: 98px; + display: block; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +.label.repeat label +{ + padding-left: 15px; +} + +.long +{ + width: 298px; +} + +textarea.long +{ + width: 293px; +} + +@-moz-document url-prefix() +{ + textarea.long + { + width: 295px; + } +} + +input.long[type="text"] +{ + width: 296px; +} + +.small +{ + width: 148px; +} + +input.small[type="text"] +{ + width: 146px; +} + +input.verySmall +{ + width: 73px; +} + +input.verySmall[type="text"] +{ + width: 71px; +} + +#event_details_template input[type="checkbox"], #todo_details_template input[type="checkbox"] +{ + width: 15px; + margin-top: 1px; + margin-left: -1px; +} + +#event_details_template input[type="button"], #todo_details_template input[type="button"], #event_details_template input[type="submit"], #todo_details_template input[type="submit"] +{ + width: 23%; + margin: 5px 2px 0px 0px; + float: left; +} + +.customTable +{ + width: 100%; +} + +.customTable td +{ + position: static; + background-color: #FFFFFF; + border-right: 2px solid #F0F0F0; + border-bottom: 2px solid #F0F0F0; + vertical-align: middle; + text-align: center; + cursor: pointer; +} + +.customTable td.lastCol +{ + border-right: 0px; +} + +.customTableWeek td, .customTableMonth td +{ + width: 39px; +} + +.customTableWeek td.firstCol, .customTableMonth td.firstCol +{ + width: 38px; +} + +.customTableYear td +{ + width: 68px; + height: 30px; +} + +.customTable td.disabled +{ + cursor: default; + background-color: #ffffff; +} + +.customTable td.selected +{ + color: #FFFFFF; + background-color: #585858; +} + +button.ui-datepicker-current +{ + width: 40%; + margin: 5px 1px 5px 1px; + float: left; +} + +button.ui-datepicker-close +{ + width: 40%; + margin: 5px 1px 5px 1px; + float: right; +} + +.invalidWrapper +{ + width: 0px; + height: 0px; +} + +img[data-type="invalidSmall"] +{ + vertical-align: top; + margin-top: -18px; + margin-left: 128px; +} + +img[data-type="invalidVerySmall"] +{ + vertical-align: top; + margin-top: 1px; + margin-left: -30px; +} + +#alertBox h1, #repeatConfirmBox h1 +{ + margin: 0; + -webkit-border-top-left-radius: 2px; + -moz-border-top-left-radius: 2px; + border-top-left-radius: 2px; + -webkit-border-top-right-radius: 2px; + -moz-border-top-right-radius: 2px; + border-top-right-radius: 2px; +} + +#alertBoxContent +{ + width: 100%; +} + +#repeatConfirmBoxContent, #repeatConfirmBoxQuestion, #repeatConfirmBoxContentTODO, #repeatConfirmBoxQuestionTODO +{ + width: 100%; + height: 50px; +} + +#repeatConfirmBoxContent, #repeatConfirmBoxContentTODO +{ + width: 400px; + padding-top: 20px; + padding-left: 5px; + word-wrap: break-word; +} + +#alertBox input +{ + float: right; + margin: 7px; + padding: 1px 5px 1px 5px; +} +#repeatConfirmBox input, #repeatConfirmBoxTODO input +{ + margin: 2px; + padding: 1px 4px 1px 4px; + width: 250px; +} + +#repeatConfirmBox input[data-type="closeRepeat"], #repeatConfirmBoxTODO input[data-type="closeRepeat"] +{ + margin-top: 6px; + margin-bottom: 6px; +} + +.alert_item +{ + left: 0px; + top: 0px; + width: 446px; + cursor: default; + position: relative; + display: block; + padding: 2px 2px 0px 2px; + border-bottom: 1px solid #c0c0c0; + font-weight: 400; + font-size: 1em; +} + +.alert_item label +{ + vertical-align: top; +} + +.alert_item img +{ + margin-left: 5px; + margin-right: 5px; +} + +.fc-header td +{ + padding: 5px !important; + padding-top: 3px !important; +} + +.fc-header td span +{ + height: 16px !important; +} + +.fc-today.fc-widget-header, .fc-today.fc-list-header td +{ + background-color: #585858 !important; + color: #ffffff !important; +} + +.fc-day-text, .fc-week-number +{ + float: left; + position: relative; + display: inline-block; + text-align: right; + padding-left: 5px; + font-weight: 400; +} + +.fc-week-number +{ + width: 16px; + line-height: 17px; + padding: 0px 3px 0px 2px; + color: #ffffff; + background-color: #c0c0c0; + font-size: 1em; + /*-moz-border-radius-bottomright: 3px; + border-bottom-right-radius: 3px; */ +} + +/* +.fc-agenda-axis.fc-widget-header +{ + border-top: 1px solid #c0c0c0; +} +*/ + +.fc-agenda-axis .fc-week-number +{ + margin-left: -4px; + padding-top: 2px; + line-height: 15px; + font-size: 1em; +} + +.fc-today .fc-day-text +{ + text-transform: capitalize; +} + +.fc-day-number +{ + position: relative; + display: inline-block; + text-align: right; + padding-right: 3px !important; +} + +.fc-today .fc-day-header +{ + width: 100%; + float: left; + height: 17px; + line-height: 17px; + + background-color: #585858; + font-weight: 400; + color: #ffffff; +} + +.fc-today .fc-day-header .fc-week-number +{ + background-color: #c0c0c0; + color: #ffffff; +} + +.fc-today .fc-day-header div +{ + opacity: 1 !important; +} + +.fc-button-content +{ + height: 20px !important; + line-height: 16px !important; +} + +.fc-header-title h2 +{ + font-size: 1.3em; + font-weight: 300; + margin-top: 2px !important; + + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.fc-header-space +{ + display: inline-block; + width: 10px; +} + +.fc-header-center.r_operate_all +{ + background-image: url("../images/loadinfo_s4.gif") !important; + background-position: 97% 15% !important; + background-repeat: no-repeat !important; +} + +.fc-header-center.r_error_all +{ + background-image: url(../images/error_b.svg) !important; + background-position: 97% 15% !important; + background-repeat: no-repeat !important; +} + +#SystemCalDavZAP input[data-type="delete"], #SystemCalDavTODO input[data-type="delete"] +{ + margin: 5px 0px 0px 2px; + float: right !important; +} + +.fc-event +{ + opacity: 1; /* replaced by rgba() */ +} + +.fc-event-skin +{ + border-color: #FFFFFF; + background-color: #2d2d2d; + color: white; +} + +.searchCalDAV_hide, .checkCalDAV_hide +{ + opacity: 0.2; +} + +.fc-view.fc-view-table .searchCalDAV_hide, .fc-view.fc-view-table .checkCalDAV_hide, +.fc-view.fc-view-todo .searchCalDAV_hide, .fc-view.fc-view-todo .checkCalDAV_hide +{ + display: none; +} + +.fc-state-default .fc-button-effect span +{ + background: none !important; +} + +.fc-state-default .fc-button-effect +{ + top: 0px !important; +} + +.fc-state-default, .fc-state-default .fc-button-inner +{ + border-color: #c0c0c0 !important; +} + +.fc-state-default, .fc-state-default .fc-button-inner +{ + background: none repeat scroll 0 0 #ffffff !important; +} + +.fc-state-hover, .fc-state-hover .fc-button-inner +{ + background: none repeat scroll 0 0 #e7e7e7 !important; +} + +.fc-state-active, .fc-state-active .fc-button-inner +{ + background: none repeat scroll 0 0 #585858 !important; +} + +.ui-datepicker-simple +{ + z-index: 100 !important; +} + +.ui-datepicker-simple .ui-datepicker-title +{ + margin: -1px 24px !important; +} + +.ui-autocomplete-caldav +{ + z-index: 100; +} + +#CATodo, #todo_details_template +{ + display: block; + border: none; + width: 100%; + height: 100%; +} + +#CATodo +{ + display: none; +} + +.title_cancelled +{ + text-decoration: line-through; +} + +#CalDavZAPPopup +{ + display: none; + position: absolute; + max-width: 413px; + border: 1px solid #c0c0c0; + background: #f0f0f0; + z-index: 30; + + user-select: none; + -webkit-user-select: none; + -moz-user-select: none; +} + +#CalDavZAPPopupColor +{ + float: left; + width: 3px; +} + +#CalDavZAPPopupTable +{ + float: left; + margin: 6px 4px 6px 6px; + text-align: left; +} + +#CalDavZAPPopupTable .header +{ + max-width: 398px; + font-size: 1.1em; + font-weight: 500; +} + +#CalDavZAPPopupTable .label +{ + display: block; + width: 98px; + font-size: 0.95em; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +#CalDavZAPPopupTable .value +{ + max-width: 298px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +#CalDavZAPPopupTable .multiline +{ + white-space: normal; + word-wrap: break-word; +} diff --git a/radicale_web/web/infcloud/css/default_ie.css b/radicale_web/web/infcloud/css/default_ie.css new file mode 100644 index 0000000..41dbb3a --- /dev/null +++ b/radicale_web/web/infcloud/css/default_ie.css @@ -0,0 +1,81 @@ +/* +InfCloud - the open source CalDAV/CardDAV Web Client +Copyright (C) 2011-2015 + Jan Mate + Andrej Lezo + Matej Mihalik + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as +published by the Free Software Foundation, either version 3 of the +License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . +*/ + +select +{ + padding-top: 1px; + padding-left: 0px; + padding-right: 0px; +} + +select[disabled] +{ + padding-left: 0px; + padding-right: 0px !important; +} + +input[type=text], input[type=password] +{ + padding-left: 3px; /* it resizes the input size :( */ +} + +input[type=text].fs, input[type=password].fs +{ + width: 389px; +} + +input[type=text].ms, input[type=password].ms +{ + width: 253px; +} + +input[type=text].hs, input[type=password].hs +{ + width: 192px; +} + +input[type=button] +{ + padding-top: 2px; +} + +input[data-type="system_username"], input[data-type="system_password"] +{ + min-width: 328px !important; + max-width: 328px !important; +} + +textarea +{ + padding-top: 3px; +} + +/* IE placeholder */ +label.placeholder { + font-size: inherit; + cursor: text; + padding: 2px 0px 0px 3px; + color: #e0e0e0; +} + +#tags_addTag *> label.placeholder { + padding-left: 1px; +} diff --git a/radicale_web/web/infcloud/css/default_integration.css b/radicale_web/web/infcloud/css/default_integration.css new file mode 100644 index 0000000..35aa3c5 --- /dev/null +++ b/radicale_web/web/infcloud/css/default_integration.css @@ -0,0 +1,180 @@ +.integration_d +{ + position: absolute; + display: none; + overflow: hidden; + top: 0; + bottom: 0; + left: 0; + width: 49px; + background: #f0f0f0; + color: #FFFFFF; + border-right: 1px solid #c0c0c0; + z-index: 26; + padding-top: 3px; + cursor: default; + + user-select: none; + -webkit-user-select: none; + -moz-user-select: none; +} + +.integration_d div +{ + display: none; + height: 36px; + width: 36px; + padding: 7px 7px; + cursor: pointer; +} + +.integration_d .intBlank +{ + cursor: default; +} + +#intCaldav +{ + background: url(../images/banner_calendar.svg) no-repeat center; +} + +#intCaldavTodo +{ + background: url(../images/banner_todo.svg) no-repeat center; +} + +#intCarddav +{ + background: url(../images/banner_addressbook.svg) no-repeat center; +} + +#intProjects +{ + background: url(../images/banner_projects.svg) no-repeat center; +} + +#intReports +{ + background: url(../images/banner_reports.svg) no-repeat center; +} + +#intSettings +{ + background: url(../images/banner_settings.svg) no-repeat center; +} + +#intRefresh +{ + background: url(../images/banner_refresh.svg) no-repeat center; +} + +#intLogout +{ + background: url(../images/banner_logout.svg) no-repeat center; +} + +.int_error +{ + display: none; + margin: 28px 0px 0px 28px; +} + +#resourceCalDAV_h, #resourceCalDAVTODO_h, #ResourceCalDAVList, #ResourceCalDAVTODOList, #timezoneWrapper, #timezoneWrapperTODO +{ + left: 50px; +} + +#main, #main_h, #searchForm, #mainTODO, #main_h_TODO, #searchFormTODO +{ + left: 274px; +} + +#MainLoader, #EventDisabler, #TodoDisabler, #AlertDisabler, #ProjectsDisabler +{ + left: 50px; +} + +#CalendarLoader, #CalendarLoaderTODO +{ + left: 275px; +} + +.resourcesCardDAV_d, #ResourceCardDAVList, #ResourceCardDAVListOverlay +{ + left: 50px; +} + +.collection_d, #SearchBox, #ABList, #ABListOverlay, #AddressbookOverlay +{ + left: 275px; +} + +/*.contact_d, #ABContactColor, #ABContactOverlay, #ABMessage +{ + left: 526px; +} + +#ABContact +{ + left: 529px; +}*/ + +.filters_d, .statistics_d, #FilterList, #ProjectsData, #SystemProjectsLock, #SystemReportsLock, #ProjectListDisabler +{ + left: 50px; +} + +.projects_d, #ProjectList, #SearchBoxProject, #ProjectListOverlay +{ + left: 375px; +} + +.project_d, #ProjectForm, #ProjectFormLoader, #ProjectEventsContainer, #ActivityListDisabler, #ProjectFormMessage +{ + left: 626px; +} + +.resourcesReports_d, #ResourceReportsList +{ + left: 50px; +} + +.resourcesSettings_d, #ResourceSettingsList +{ + left: 50px; +} + +#ResourceReportsListOverlay +{ + left: 50px; +} + +.report_filters_d, #ReportFilterList +{ + left: 275px; +} + +.reports_d, #ReportsColor, #ReportsFormOverlay +{ + left: 600px; +} + +#ReportsForm +{ + left: 603px; +} + +#ResourceSettingsListOverlay +{ + left: 50px; +} + +.settings_d, #SettingsColor, #SettingsFormOverlay +{ + left: 275px; +} + +#SettingsForm +{ + left: 278px; +} diff --git a/radicale_web/web/infcloud/css/fullcalendar.css b/radicale_web/web/infcloud/css/fullcalendar.css new file mode 100644 index 0000000..de14fbd --- /dev/null +++ b/radicale_web/web/infcloud/css/fullcalendar.css @@ -0,0 +1,1464 @@ +/* + * FullCalendar v1.5.4 Stylesheet + * + * Copyright (c) 2011 Adam Shaw + * Dual licensed under the MIT and GPL licenses, located in + * MIT-LICENSE.txt and GPL-LICENSE.txt respectively. + * + * Date: Tue Sep 4 23:38:33 2012 -0700 + * + */ + + +.fc { + direction: ltr; + text-align: left; + } + +.fc table { + border-collapse: collapse; + border-spacing: 0; + } + +html .fc, +.fc table { + font-size: 0.95em; + } + +.fc td, +.fc th { + padding: 0; + vertical-align: top; + } + + + +/* Header +------------------------------------------------------------------------*/ + +.fc-header td { + white-space: nowrap; + } + +.fc-header-left { + text-align: left; + } + +.fc-header-center { + width: 100%; + text-align: center; + } + +.fc-header-right { + text-align: right; + } + +.fc-header-title { + display: inline-block; + vertical-align: top; + margin-top: -2px; + } + +.fc-header-title h2 { + margin-top: 0; + white-space: nowrap; + } + +.fc .fc-header-space { + padding-left: 10px; + } + +.fc-header .fc-button { + margin-bottom: 1em; + vertical-align: top; + } + +/* buttons edges butting together */ + +.fc-header .fc-button { + margin-right: -1px; + } + +.fc-header .fc-corner-right { + margin-right: 1px; /* back to normal */ + } + +.fc-header .ui-corner-right { + margin-right: 0; /* back to normal */ + } + +/* button layering (for border precedence) */ + +.fc-header .fc-state-hover, +.fc-header .ui-state-hover { + z-index: 2; + } + +.fc-header .fc-state-down { + z-index: 3; + } + +.fc-header .fc-state-active, +.fc-header .ui-state-active { + z-index: 4; + } + + + +/* Content +------------------------------------------------------------------------*/ + +.fc-content { + clear: both; + } + +.fc-view { + width: 100%; /* needed for view switching (when view is absolute) */ + overflow: hidden; + } + +.fc-week-table { + font-weight: 500; + text-align: center; + vertical-align: middle; +} + + + +/* Cell Styles +------------------------------------------------------------------------*/ + +.fc-widget-header { /* , usually */ + border-bottom: 1px solid #c0c0c0; +/* border-right: 1px solid transparent;*/ + } +.fc-widget-content { /* , usually */ + border-top: 1px solid #c0c0c0; + border-right: 1px solid transparent; + } +.fc-state-highlight { /* today cell */ /* TODO: add .fc-today to */ + background: #fafadd; + } +.fc-source-bg { + background-color: #fff4f4; +} +.fc-widget-content.fc-weekend-day, .fc-widget-content tr.fc-weekend-day { + background: #f7f7f7; +} +.fc-source-bg.fc-state-highlight { + background: #fdf7e9; +} +.fc-widget-content.fc-state-highlight.fc-weekend-day, .fc-widget-content tr.fc-state-highlight.fc-weekend-day { + background: #f9f9ea; +} +.fc-widget-content.fc-source-bg.fc-weekend-day, .fc-widget-content tr.fc-source-bg.fc-weekend-day { + background: #fbf6f6; +} +.fc-widget-content.fc-state-highlight.fc-source-bg.fc-weekend-day, .fc-widget-content tr.fc-state-highlight.fc-source-bg.fc-weekend-day { + background: #faf7f0; +} +.fc-cell-overlay { /* semi-transparent rectangle while dragging */ + background: #b2d9ff; + opacity: .2; + filter: alpha(opacity=20); /* for IE */ + } + + +/* Buttons +------------------------------------------------------------------------*/ + +.fc-button { + position: relative; + display: inline-block; + cursor: pointer; + } + +.fc-state-default { /* non-theme */ + border-style: solid; + border-width: 1px 0; + } + +.fc-button-inner { + position: relative; + float: left; + overflow: hidden; + } + +.fc-state-default .fc-button-inner { /* non-theme */ + border-style: solid; + border-width: 0 1px; + } + +.fc-button-content { + position: relative; + float: left; + height: 1.9em; + line-height: 1.9em; + padding: 0 12px; + min-width: 12px; + white-space: nowrap; + } + +.fc-button-content .fc-icon-wrap { + position: relative; + float: left; + top: 50%; + } + +.fc-button-content img { + padding-top: 1px; +} + +/* gloss effect */ + +.fc-state-default .fc-button-effect { + position: absolute; + top: 50%; + left: 0; + } + +.fc-state-default .fc-button-effect span { + position: absolute; + top: -100px; + left: 0; + width: 500px; + height: 100px; + border-width: 100px 0 0 1px; + border-style: solid; + border-color: #fff; + background: #444; + opacity: .09; + filter: alpha(opacity=9); + } + +/* button states (determines colors) */ + +.fc-state-default, +.fc-state-default .fc-button-inner { + border-style: solid; + border-color: #ccc #bbb #aaa; + background: #F3F3F3; + color: #404040; + } + +.fc-state-hover, +.fc-state-hover .fc-button-inner { + border-color: #999; + } + +.fc-state-down, +.fc-state-down .fc-button-inner { + border-color: #555; + background: #777; + } + +.fc-state-active, +.fc-state-active .fc-button-inner { + border-color: #555; + background: #777; + color: #fff; + } + +.fc-state-disabled, +.fc-state-disabled .fc-button-inner { + color: #999; + border-color: #ddd; + } + +.fc-state-disabled { + cursor: default; + } + +.fc-state-disabled .fc-button-effect { + display: none; + } + + + +/* Global Event Styles +------------------------------------------------------------------------*/ + +.fc-event { + border-style: solid; + border-width: 0; + font-size: .95em; + cursor: default; + } + +a.fc-event, +.fc-event-draggable { + cursor: pointer; + } + +a.fc-event { + text-decoration: none; + } + +.fc-rtl .fc-event { + text-align: right; + } + +.fc-event-skin { + border-color: #F0F0F0; /* default BORDER color */ + background-color: #F0F0F0; /* default BACKGROUND color */ + color: #404040; /* default TEXT color */ + } + +.fc-event-inner { + position: relative; + float: left; + width: 100%; + height: 100%; + border-style: solid; + border-width: 0; + overflow: hidden; + background-color: transparent !important; /* overit! ... priesvistnost all day veci */ + } + +.fc-event-time, +.fc-event-title { + padding: 0 1px; + } + +.fc-event-title-strict { + overflow:hidden; + white-space:nowrap; + text-overflow:ellipsis; + } + +.fc-event-tentative { + border-style: dashed; + border-color: #fff !important; + opacity: 0.9; + + background-image: -webkit-gradient(linear, 0 0, 100% 100%, color-stop(.25, rgba(255, 255, 255, .2)), color-stop(.25, transparent), color-stop(.5, transparent), color-stop(.5, rgba(255, 255, 255, .2)), color-stop(.75, rgba(255, 255, 255, .2)), color-stop(.75, transparent), to(transparent)); + 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: -moz-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: -o-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(-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); + + -webkit-background-size: 20px 20px; + -moz-background-size: 20px 20px; + background-size: 20px 20px; +} + +.fc-event-tentative .fc-event-inner { + border-style: dashed; +} + +.fc-event-skin.fc-event-cancelled +{ + border-style: dashed; + border-color: #fff !important; + opacity: 0.9; +} + +.fc-event-skin.fc-event-cancelled .fc-event-inner { + border-style: dashed; + text-decoration: line-through; +} + +.fc-event-row.fc-event-cancelled { + text-decoration: line-through; +} + +.fc .ui-resizable-handle { /*** TODO: don't use ui-resizable anymore, change class ***/ + display: block; + position: absolute; + z-index: 99999; + overflow: hidden; /* hacky spaces (IE6/7) */ + font-size: 300%; /* */ + line-height: 50%; /* */ + } + +/* Horizontal Events +------------------------------------------------------------------------*/ + +.fc-event-hori { + border-width: 1px 1px; /* overit! ... priesvistnost all day veci (bolo 1px 0) */ + margin-bottom: 1px; + } + +/* resizable */ + +.fc-event-hori .ui-resizable-e { + top: 0 !important; /* importants override pre jquery ui 1.7 styles */ + right: -3px !important; + width: 7px !important; + height: 100% !important; + cursor: e-resize; + } + +.fc-event-hori .ui-resizable-w { + top: 0 !important; + left: -3px !important; + width: 7px !important; + height: 100% !important; + cursor: w-resize; + } + +.fc-event-hori .ui-resizable-handle { + _padding-bottom: 14px; /* IE6 had 0 height */ + } + + + +/* Fake Rounded Corners (for buttons and events) +------------------------------------------------------------*/ + +.fc-corner-left { + /*margin-left: 1px;*/ + -webkit-border-top-left-radius: 3px; + -moz-border-radius-topleft: 3px; + border-top-left-radius: 3px; + -webkit-border-bottom-left-radius: 3px; + -moz-border-radius-bottomleft: 3px; + border-bottom-left-radius: 3px; +} + +.fc-corner-left .fc-event-inner { + margin-left: 2px; +} + +.fc-corner-left.fc-button { + border-left-width: 1px; +} + +.fc-corner-left .fc-button-inner { + margin-left: 1px; + border-left-width: 0px; +} + +.fc-corner-right { + /*margin-right: 1px;*/ + -webkit-border-top-right-radius: 3px; + -moz-border-radius-topright: 3px; + border-top-right-radius: 3px; + -webkit-border-bottom-right-radius: 3px; + -moz-border-radius-bottomright: 3px; + border-bottom-right-radius: 3px; +} + +.fc-corner-right .fc-event-inner { +} + +.fc-corner-right.fc-button { + border-right-width: 1px; +} + +.fc-corner-right .fc-button-inner { + margin-right: 1px; + border-right-width: 0px; +} + +.fc-corner-top { + margin-top: 1px; + } + +.fc-corner-top .fc-event-inner { + margin-top: -1px; + } + +.fc-corner-bottom { + margin-bottom: 1px; + } + +.fc-corner-bottom .fc-event-inner { + margin-bottom: -1px; + } + + + +/* Fake Rounded Corners SPECIFICALLY FOR EVENTS +-----------------------------------------------------------------*/ + +.fc-corner-left .fc-event-inner { + border-left-width: 0px; /* overit! ... priesvistnost all day veci (bolo 1) */ + } + +.fc-corner-right .fc-event-inner { + border-right-width: 0px; /* overit! ... priesvistnost all day veci (bolo 1) */ + } + +.fc-corner-top .fc-event-inner { + border-top-width: 1px; + } + +.fc-corner-bottom .fc-event-inner { + border-bottom-width: 1px; + } + + + +/* Reusable Separate-border Table +------------------------------------------------------------*/ + +table.fc-border-separate { + border-collapse: separate; + } + +#todoList table.fc-border-separate { + margin-top: -1px; +} + +.fc-border-separate th, +.fc-border-separate td { + border-width: 1px 0 0 1px; + } + +.fc-border-separate th.fc-last, +.fc-border-separate td.fc-last { + border-right-width: 1px; + } + +.fc-border-separate tr.fc-last th, +.fc-border-separate tr.fc-last td { + border-bottom-width: 1px; + } + +.fc-border-separate tbody tr.fc-first td, +.fc-border-separate tbody tr.fc-first th { + border-top-width: 0; + } + + + +/* Month View, Basic Week View, Basic Day View +------------------------------------------------------------------------*/ + +.fc-grid th { + text-align: center; + } + +.fc-grid .fc-day-number { + float: right; + padding: 0 2px; + line-height: 17px; + } + +.fc-grid .fc-other-month .fc-day-number, .fc-grid .fc-other-month .fc-day-text { + opacity: 0.33; + filter: alpha(opacity=33); /* for IE */ + /* opacity with small font can sometimes look too faded + might want to set the 'color' property instead + making day-numbers bold also fixes the problem */ + } + +.fc-grid .fc-day-content { + clear: both; + padding: 2px 2px 1px; /* distance between events and day edges */ + } + +/* event styles */ + +.fc-grid .fc-event-time { + font-weight: 500; + font-size: 0.94em; + line-height: 13px; /* event height problem if time is shown */ +} + +/* right-to-left */ + +.fc-rtl .fc-grid .fc-day-number { + float: left; + } + +.fc-rtl .fc-grid .fc-event-time { + float: right; + } + + + +/* Agenda Week View, Agenda Day View +------------------------------------------------------------------------*/ + +.fc-agenda table { + border-collapse: separate; + } + +.fc-agenda-days th { + text-align: center; + line-height: 17px; +} + +.fc-agenda .fc-agenda-axis { + width: 60px; + padding: 0 4px; + vertical-align: middle; + text-align: right; + white-space: nowrap; + font-weight: 400; + font-size: 1em; + } + +.fc-agenda-allday .fc-widget-header.fc-agenda-axis { + text-align: center; + } + +.fc-agenda .fc-day-content { + padding: 2px 2px 1px; + } + +/* make axis border take precedence */ + +.fc-agenda-days tbody .fc-agenda-axis.fc-widget-header.fc-first { + border-bottom-color: transparent; + } + +.fc-agenda-days .fc-agenda-axis { + border-right-width: 1px; + } + +.fc-agenda-days .fc-col0 { + border-left-width: 0; + } + +/* all-day area */ + +.fc-agenda-allday { + top: 0px; + position: absolute; +} + +.fc-agenda-allday th { + border-width: 0 1px; + } + +.fc-agenda-allday .fc-day-content { + min-height: 34px; /* TODO: doesnt work well in quirksmode */ + _height: 34px; + } + +/* divider (between all-day and slots) */ + +.fc-agenda-divider-inner { + height: 2px; + overflow: hidden; + } + +.fc-widget-header .fc-agenda-divider-inner { + background: #eee; + } + +/* slot rows */ + +.fc-agenda-slots th { + border-width: 1px 1px 0; + } + +.fc-agenda-slots td { + height: 20px !important; + border-width: 1px 0 0; + background: none; + } + +.fc-agenda-slots td div { + height: 20px !important; + } + +.fc-agenda-slots tr.fc-slot0 th, +.fc-agenda-slots tr.fc-slot0 td { + border-top-width: 0; + } + +.fc-agenda-slots .fc-widget-header +{ + border-top: 1px solid #c0c0c0; + padding-top: 1px; +} + +.fc-agenda-slots tr.fc-minor th, +.fc-agenda-slots tr.fc-minor td { + border-top-style: dotted; + } + +.fc-agenda-slots tr.fc-minor th.ui-widget-header { + *border-top-style: solid; /* doesn't work with background in IE6/7 */ + } + +.fc-non-business-hours { + /*background-color: #cccccc; + opacity:0.3;*/ + background-color: rgba(204,204,204,0.3); +} + +.fc-slot-jumper-top +{ + position: absolute; + height: 16px; + width: 16px; + background: url(../images/jumper_top_w.svg) no-repeat center; + z-index: 10; + cursor: pointer; + + -webkit-border--radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} + +.fc-slot-jumper-top:hover +{ + background: url(../images/jumper_top_b.svg) no-repeat center; +} + +.fc-slot-jumper-bottom +{ + position: absolute; + height: 16px; + width: 16px; + background: url(../images/jumper_bottom_w.svg) no-repeat center; + z-index: 10; + cursor: pointer; + + -webkit-border--radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} + +.fc-slot-jumper-bottom:hover +{ + background: url(../images/jumper_bottom_b.svg) no-repeat center; +} + +/* Vertical Events +------------------------------------------------------------------------*/ + +.fc-event-vert { + border-width: 0 1px; + } + +.fc-event-vert .fc-event-head, +.fc-event-vert .fc-event-content { + position: relative; + z-index: 2; + width: 100%; + overflow: hidden; + } + +.fc-event-vert .fc-event-time { + white-space: nowrap; + font-size: 10px; + } + +.fc-event-bg { /* makes the event lighter w/ a semi-transparent overlay */ + position: absolute; + z-index: 1; + top: 0; + left: 0; + width: 100%; + height: 100%; + background: #fff; + opacity: .4; + filter: alpha(opacity=40); + } + +.fc-event-hori .fc-event-bg { + opacity: .2; + filter: alpha(opacity=20); +} + + +.fc .ui-draggable-dragging .fc-event-bg, /* TODO: something nicer like .fc-opacity */ +.fc-select-helper .fc-event-bg { + display: none\9; /* for IE6/7/8. nested opacity filters while dragging don't work */ + } + +/* resizable */ + +.fc-event-vert .ui-resizable-s { + bottom: 0 !important; /* importants override pre jquery ui 1.7 styles */ + width: 100% !important; + height: 8px !important; + overflow: hidden !important; + line-height: 8px !important; + font-size: 11px !important; + font-family: monospace; + text-align: center; + cursor: s-resize; + } + +.fc-agenda .ui-resizable-resizing { /* TODO: better selector */ + _overflow: hidden; + } + +.fc-timeline { + position: absolute; + width: 100%; + left: 0; + margin: 0; + padding: 0; + border: none; + border-top: 2px solid #585858; + z-index: 2; +} + +.fc-timeline-arrow { + position: absolute; + left: 0; + width: 6px; + height: 12px; + background-image: url('../images/resource_arrow_right.svg'); + z-index: 2; +} + +/* List view (by bruederli@kolabsys.com) +------------------------------------------------------------------------*/ + +.fc-view-list, +.fc-view-table, +.fc-view-todo { + top: 0px; + width: auto; +} + +.fc-view-trans .fc-table-dateinfo, +.fc-view-trans .fc-table-datepicker { + opacity: 0.5; +} + +.fc-view-table { + padding-left: 8px; +} + +.fc-list-content { + float: left; + position: relative; + border: 1px solid #ccc; +} + +.fc-view-list .fc-list-header, +.fc-view-table td.fc-list-header, +.fc-view-todo td.fc-list-header { + background-color:#F0F0F0; + color: #404040; + font-size: 1em; + padding: 0px 10px; + height: 18px; + line-height: 18px; +} + +.fc-view-table .fc-first td.fc-list-header, +.fc-view-todo .fc-first td.fc-list-header { + border-top-width: 0; +} + +.fc-list-header td +{ + height: 16px; +} + +.fc-list-section td +{ + height: 14px; +} + +.fc-list-section { + padding: 4px 2px; + border-width: 0; + border-bottom-width: 1px; +} + +.fc-view-list .fc-last, +.fc-view-table .fc-last, +.fc-view-todo .fc-last { + border-bottom-width: 0; +} + +.fc-list-section .fc-event { + position: relative; + margin: 1px 2px 3px 2px; +} + +.fc-view-table tr.fc-event td, +.fc-view-todo tr.fc-event td { + font-size: 1.2em; + height: 15px !important; + line-height: 15px !important; + padding: 2px; + background-clip: padding-box; +} + +.fc-view-table tr.fc-event td { + border-top: 1px solid transparent !important; +} + +.fc-view-todo tr.fc-event td { + border-top: 1px solid #ffffff !important; +} + +.fc-view-table tr.fc-event.fc-last td/*, +.fc-view-todo tr.fc-event.fc-last td*/ { + border-bottom: 1px solid transparent !important; + background-clip: padding-box; +} + +.fc-view-table td.fc-list-header.fc-widget-header, +.fc-view-todo td.fc-list-header.fc-widget-header { + border: none; +/* border-top: 1px solid #fff; XXX*/ +} + +.fc-view-table .fc-list-section.fc-widget-content:last-child .fc-event-row.fc-last:last-child td, +.fc-view-todo .fc-list-section.fc-widget-content:last-child .fc-event-row.fc-last:last-child td { + border-bottom-width: 0; +} + +.fc-view-table tr.fc-event td.fc-event-handle, +.fc-view-todo tr.fc-event td.fc-event-handle { + height: 100%; + width: 6px; + padding: 0px; + border-color: #F0F0F0; /* default BORDER color */ + background-color: #F0F0F0; /* default BACKGROUND color */ +} + +.fc-view-table table, +.fc-view-todo table { + table-layout: fixed; + width: 100%; +} + +.fc-view-table col.fc-event-handle, +.fc-view-todo col.fc-event-handle { + width: 6px; +} + +.fc-event-handle .fc-event-inner { + border-color: inherit; + background-color: inherit; +} + +.fc-view-table col.fc-event-date, +.fc-view-todo col.fc-event-date { + width: 7em; +} + +.fc-view-table .fc-list-day col.fc-event-date, +.fc-view-todo .fc-list-day col.fc-event-date { + width: 1px; +} + +.fc-view-table col.fc-event-time { + width: 23em; +} + +.fc-view-table td.fc-event-date, +.fc-view-table td.fc-event-time, +.fc-view-todo td.fc-event-date, +.fc-view-todo td.fc-event-time { + white-space: nowrap; + padding-right: 1em; +} + +.fc-view-table td.fc-event-title, +.fc-view-todo td.fc-event-title, +.fc-view-todo td.fc-event-time, +.fc-view-todo td.fc-event-location { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.fc-view-todo col.fc-event-check { + width: 22px; +} + +.fc-event-check { + text-align: left; +} + +.fc-event-check input[type="checkbox"] +{ + margin-top: -4px; + margin-right: 0; + margin-bottom: -2px !important; + margin-left: 4px; +} + +.fc-view-todo col.fc-event-priority { + width: 18px; +} + +.fc-view-todo col.fc-event-time { + width: 142px; +} + +.fc-view-todo col.fc-event-location { + width: 150px; +} + +.fc-event-title { + padding: 2px 4px !important; +} + +.fc-view-todo col.fc-event-status { + width: 24px; +} + +.fc-view-todo col.fc-event-percent { + width: 40px; +} + +.fc-view-todo td.fc-event-percent { + text-align: right; + padding-right: 4px !important; +} + +.fc-view-todo col.fc-hidden-empty, +.fc-view-todo col.fc-hidden-width { + width: 0; +} + +.fc-view-table .fc-table-dateinfo, +.fc-view-todo .fc-table-dateinfo { + float: left; + text-align: left; + padding-left: 10px; + padding-bottom: 1px; /* check on FF */ + margin-top: -8px; /* check on FF */ +} + +.fc-view-table .fc-table-datepicker, +.fc-view-todo .fc-table-datepicker { + float: right; + text-align: right; + padding-right: 10px; + padding-bottom: 1px; /* check on FF */ + margin-top: -8px; /* check on FF */ +} + +.fc-table-datepicker .ui-widget-content { + display: inline-block !important; + border-width: 0px; +} + +.fc-view-table .fc-table-datepicker-no-default .ui-state-active, +.fc-view-todo .fc-table-datepicker-no-default .ui-state-active { + border: 1px solid #c0c0c0; + background: #ffffff; + font-weight: 400; + color: #404040; +} + +.fc-view-table .fc-table-dateinfo-number, +.fc-view-todo .fc-table-dateinfo-number { + position: relative; + display: inline-block; + color: #c0c0c0; + font-weight: 300; + margin-top: -5px; +} + +.fc-view-table .fc-table-dateinfo-number div, +.fc-view-todo .fc-table-dateinfo-number div { + position: absolute; + padding-bottom: 15px; + bottom: 0px; +} + +.fc-view-table .fc-table-dateinfo-text, +.fc-view-todo .fc-table-dateinfo-text { + color: #c0c0c0; + line-height: 0.9em; + font-size: 1.5em; + font-weight: 300; +} + +.fc-filter { + float: left; +} + +.fc-filter-table-header { + font-weight: 500 !important; + height: 20px !important; + border: 1px dashed #c0c0c0 !important; + vertical-align: middle !important; + text-align: center; + cursor: default; + user-select: none; + -webkit-user-select: none; + -moz-user-select: none; +} + +.fc-filter-table-footer { + font-size: 0.9em; + height: 20px !important; + border-top: 1px solid #c0c0c0 !important; + vertical-align: middle !important; + text-align: center; + cursor: default; + user-select: none; + -webkit-user-select: none; + -moz-user-select: none; +} + +.fc-filter-option { + height: 20px !important; + background-color: #ffffff; + border: 1px solid #c0c0c0 !important; + vertical-align: middle !important; + text-align: center; + cursor: pointer; +} + +.fc-filter-option:hover { + background-color: #e7e7e7; +} + +/* +.fc-filter-option.fc-filter-option-last { + border-right: 0px !important; +} +*/ + +.fc-filter-option.fc-filter-option-selected { + color: #ffffff; + background-color: #585858; +} + +.fc-filter-hide { + display: none; +} + +.fc-view-table .fc-month-nav, +.fc-view-todo .fc-month-nav { + color: #ffffff !important; + background: #585858 !important; + text-align: center; + cursor: pointer; +} + +/* +.fc-view-table .fc-month-nav.fc-month-prev, +.fc-view-todo .fc-month-nav.fc-month-prev { + border-bottom: 1px solid #c0c0c0 !important; +} + +.fc-view-table .fc-month-nav.fc-month-next, +.fc-view-todo .fc-month-nav.fc-month-next { + border-top: 1px solid #c0c0c0 !important; +} + +.fc-view-table .fc-month-nav:hover, +.fc-view-todo .fc-month-nav:hover { + background: #e7e7e7 !important; +} +*/ + +.fc-table-datepicker .ui-datepicker { + width: 225px; +} + +.fc-table-datepicker .ui-datepicker-title { + height: 20px; + margin: 0 0 0 24px; +} + +.fc-table-datepicker .ui-datepicker-title span { + margin-top: 0; + vertical-align: middle; +} + +.fc-view-table .fc-table-datepicker .ui-datepicker-header { + display: none; +} + +.fc-view-todo .fc-table-datepicker .ui-datepicker-header { + color: #404040; + background: none; + font-size: 0.95em; +} + +.fc-view-todo .fc-table-datepicker-current .ui-datepicker-title { + color: #ffffff; + background-color: #585858; +} + +.fc-view-todo .fc-table-datepicker .ui-datepicker-prev, +.fc-view-todo .fc-table-datepicker .ui-datepicker-next { + display: none; +} + +.fc-table-datepicker .ui-datepicker-week-col { + text-align: center; + vertical-align: middle; + font-size: 0.8em; +} + +.fc-table-datepicker .ui-datepicker th { + display: table-cell; + text-align: center; + border: 0; + padding: 1px; +} + +.fc-table-datepicker .ui-datepicker td span, +.fc-table-datepicker .ui-datepicker td a { + width: 20px; + line-height: 17px; +} + +.fc-table-datepicker tbody tr { + height: 23px; +} + +/* +.fc-table-datepicker .ui-datepicker-today a { + font-weight: 400; + color: #404040; + background: #c0c0c0; + border: 1px solid #c0c0c0; +} + +.fc-table-datepicker .ui-datepicker-today .ui-state-active { + border: 1px solid #585858; + background: #585858; + color: #ffffff; +} +*/ + +.fc-event-img { + float: left; + height: 15px; + width: 15px; + padding-right: 2px; +} + +.fc-event-urgent { + color: #9E2F36; +} + +.fc-event-pastdue { + color: #E30613; +} + +.fc-event.fc-event-row:hover +{ + color: #404040; + background-color: #e7e7e7; + cursor: pointer; +} + +.fc-event.fc-event-row.fc-event-urgent:hover +{ + color: #9E2F36; + background-color: #fedee0; + cursor: pointer; +} + +.fc-event.fc-event-row.fc-event-pastdue:hover +{ + color: #e30613; + background-color: #fedee0; + cursor: pointer; +} + +.fc-event.fc-event-row.fc-event-selected +{ + color: #eeeeee; + background-color: #585858 !important; +} + +.fc-event.fc-event-row.fc-event-selected.fc-event-urgent +{ + color: #ffffff; + background-color: #9E2F36 !important; +} + +.fc-event.fc-event-row.fc-event-selected.fc-event-pastdue +{ + color: #ffffff; + background-color: #e30613 !important; +} + +.fc-event-priority-3 { + background-image: url(../images/priority-1.svg); + background-repeat: no-repeat; + background-position: center; +} + +.fc-event-priority-2 { + background-image: url(../images/priority-2.svg); + background-repeat: no-repeat; + background-position: center; +} + +.fc-event-priority-1 { + background-image: url(../images/priority-3.svg); + background-repeat: no-repeat; + background-position: center; +} + +.fc-event-urgent .fc-event-priority-3 { + background-image: url(../images/priority-1-dr.svg); + background-repeat: no-repeat; + background-position: center; +} + +.fc-event-urgent .fc-event-priority-2 { + background-image: url(../images/priority-2-dr.svg); + background-repeat: no-repeat; + background-position: center; +} + +.fc-event-urgent .fc-event-priority-1 { + background-image: url(../images/priority-3-dr.svg); + background-repeat: no-repeat; + background-position: center; +} + +.fc-event-pastdue .fc-event-priority-3 { + background-image: url(../images/priority-1-r.svg); + background-repeat: no-repeat; + background-position: center; +} + +.fc-event-pastdue .fc-event-priority-2 { + background-image: url(../images/priority-2-r.svg); + background-repeat: no-repeat; + background-position: center; +} + +.fc-event-pastdue .fc-event-priority-1 { + background-image: url(../images/priority-3-r.svg); + background-repeat: no-repeat; + background-position: center; +} + +.fc-event-selected .fc-event-priority-3 { + background-image: url(../images/priority-1-w.svg); + background-repeat: no-repeat; + background-position: center; +} + +.fc-event-selected .fc-event-priority-2 { + background-image: url(../images/priority-2-w.svg); + background-repeat: no-repeat; + background-position: center; +} + +.fc-event-selected .fc-event-priority-1 { + background-image: url(../images/priority-3-w.svg); + background-repeat: no-repeat; + background-position: center; +} + +.fc-event-filterAction .fc-event-status { + background-image: url(../images/needs_action_b.svg); + background-repeat: no-repeat; + background-position: center; +} + +.fc-event-filterProgress .fc-event-status { + background-image: url(../images/in_progress_b.svg); + background-repeat: no-repeat; + background-position: center; +} + +.fc-event-filterCompleted .fc-event-status { + background-image: url(../images/success_b.svg); + background-repeat: no-repeat; + background-position: center; +} + +.fc-event-filterCanceled .fc-event-status { + background-image: url(../images/reset_b.svg); + background-repeat: no-repeat; + background-position: center; +} + +.fc-event-urgent.fc-event-filterAction .fc-event-status { + background-image: url(../images/needs_action_dr.svg); + background-repeat: no-repeat; + background-position: center; +} + +.fc-event-urgent.fc-event-filterProgress .fc-event-status { + background-image: url(../images/in_progress_dr.svg); + background-repeat: no-repeat; + background-position: center; +} + +.fc-event-urgent.fc-event-filterCompleted .fc-event-status { + background-image: url(../images/success_dr.svg); + background-repeat: no-repeat; + background-position: center; +} + +.fc-event-urgent.fc-event-filterCanceled .fc-event-status { + background-image: url(../images/reset_dr.svg); + background-repeat: no-repeat; + background-position: center; +} + +.fc-event-pastdue.fc-event-filterAction .fc-event-status { + background-image: url(../images/needs_action_r.svg); + background-repeat: no-repeat; + background-position: center; +} + +.fc-event-pastdue.fc-event-filterProgress .fc-event-status { + background-image: url(../images/in_progress_r.svg); + background-repeat: no-repeat; + background-position: center; +} + +.fc-event-pastdue.fc-event-filterCompleted .fc-event-status { + background-image: url(../images/success_r.svg); + background-repeat: no-repeat; + background-position: center; +} + +.fc-event-pastdue.fc-event-filterCanceled .fc-event-status { + background-image: url(../images/reset_r.svg); + background-repeat: no-repeat; + background-position: center; +} + +.fc-event-selected.fc-event-filterAction .fc-event-status { + background-image: url(../images/needs_action_w.svg); + background-repeat: no-repeat; + background-position: center; +} + +.fc-event-selected.fc-event-filterProgress .fc-event-status { + background-image: url(../images/in_progress_w.svg); + background-repeat: no-repeat; + background-position: center; +} + +.fc-event-selected.fc-event-filterCompleted .fc-event-status { + background-image: url(../images/success_w.svg); + background-repeat: no-repeat; + background-position: center; +} + +.fc-event-selected.fc-event-filterCanceled .fc-event-status { + background-image: url(../images/reset_w.svg); + background-repeat: no-repeat; + background-position: center; +} + +.fc-event-selected.fc-event-urgent.fc-event-filterCompleted .fc-event-status { + background-image: url(../images/success_drw.svg); + background-repeat: no-repeat; + background-position: center; +} + +.fc-event-selected.fc-event-urgent.fc-event-filterCanceled .fc-event-status { + background-image: url(../images/reset_drw.svg); + background-repeat: no-repeat; + background-position: center; +} + +.fc-event-selected.fc-event-pastdue.fc-event-filterCompleted .fc-event-status { + background-image: url(../images/success_rw.svg); + background-repeat: no-repeat; + background-position: center; +} + +.fc-event-selected.fc-event-pastdue.fc-event-filterCanceled .fc-event-status { + background-image: url(../images/reset_rw.svg); + background-repeat: no-repeat; + background-position: center; +} diff --git a/radicale_web/web/infcloud/css/jquery-ui.custom.css b/radicale_web/web/infcloud/css/jquery-ui.custom.css new file mode 100644 index 0000000..a0b2f47 --- /dev/null +++ b/radicale_web/web/infcloud/css/jquery-ui.custom.css @@ -0,0 +1,203 @@ +/* + * jQuery UI CSS Framework + * + * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Theming/API + */ + +/* Layout helpers +----------------------------------*/ +.ui-helper-clearfix:before, .ui-helper-clearfix:after { content: ""; display: table; } +.ui-helper-clearfix:after { clear: both; } +.ui-helper-clearfix { zoom: 1; } +.ui-helper-hidden-accessible { display: none; } + +/* Interaction Cues +----------------------------------*/ +.ui-state-disabled { cursor: default !important; } + +/* states and images */ +.ui-icon { display: block; text-indent: -99999px; overflow: hidden; background-repeat: no-repeat; } + +/* + * jQuery UI CSS Framework + * + * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Theming/API + * + * To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Trebuchet%20MS,%20Tahoma,%20Verdana,%20Arial,%20sans-serif&fwDefault=bold&fsDefault=1.1em&cornerRadius=4px&bgColorHeader=f6a828&bgTextureHeader=12_gloss_wave.png&bgImgOpacityHeader=35&borderColorHeader=e78f08&fcHeader=ffffff&iconColorHeader=ffffff&bgColorContent=eeeeee&bgTextureContent=03_highlight_soft.png&bgImgOpacityContent=100&borderColorContent=dddddd&fcContent=333333&iconColorContent=222222&bgColorDefault=f6f6f6&bgTextureDefault=02_glass.png&bgImgOpacityDefault=100&borderColorDefault=cccccc&fcDefault=1c94c4&iconColorDefault=ef8c08&bgColorHover=fdf5ce&bgTextureHover=02_glass.png&bgImgOpacityHover=100&borderColorHover=fbcb09&fcHover=c77405&iconColorHover=ef8c08&bgColorActive=ffffff&bgTextureActive=02_glass.png&bgImgOpacityActive=65&borderColorActive=fbd850&fcActive=eb8f00&iconColorActive=ef8c08&bgColorHighlight=ffe45c&bgTextureHighlight=03_highlight_soft.png&bgImgOpacityHighlight=75&borderColorHighlight=fed22f&fcHighlight=363636&iconColorHighlight=228ef1&bgColorError=b81900&bgTextureError=08_diagonals_thick.png&bgImgOpacityError=18&borderColorError=cd0a0a&fcError=ffffff&iconColorError=ffd27a&bgColorOverlay=666666&bgTextureOverlay=08_diagonals_thick.png&bgImgOpacityOverlay=20&opacityOverlay=50&bgColorShadow=000000&bgTextureShadow=01_flat.png&bgImgOpacityShadow=10&opacityShadow=20&thicknessShadow=5px&offsetTopShadow=-5px&offsetLeftShadow=-5px&cornerRadiusShadow=5px + */ + +/* Component containers +----------------------------------*/ +.ui-widget { font-family: inherit; font-size: 1em; } +.ui-widget-content { border: 1px solid #c0c0c0; background: #ffffff; color: #404040; } +.ui-widget-header { border: none; background: #f0f0f0; color: #404040; font-weight: 500; } + +/* Interaction states +----------------------------------*/ +.ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default { border: 1px solid #c0c0c0; background: #ffffff; font-weight: 400; color: #404040; } +.ui-widget-content .ui-datepicker-week-end .ui-state-default {background: #f7f7f7;} +.ui-state-default a, .ui-state-default a:link, .ui-state-default a:visited { color: #555555; text-decoration: none; } +.ui-state-hover, .ui-widget-content .ui-datepicker-week-end .ui-state-hover, .ui-widget-content .ui-state-hover, .ui-widget-header .ui-state-hover, .ui-state-focus, .ui-widget-content .ui-state-focus, .ui-widget-header .ui-state-focus { background: #e7e7e7; font-weight: 400; color: #404040; } +.ui-state-hover a, .ui-state-hover a:hover, .ui-widget-content .ui-datepicker-week-end .ui-state-hover a:hover { color: #212121; text-decoration: none;} +.ui-widget-content .ui-datepicker-today .ui-state-default {background: #c0c0c0; color: #404040;} +.ui-state-active, .ui-widget-content .ui-datepicker-week-end .ui-state-active, .ui-widget-content .ui-datepicker-today .ui-state-active, .ui-widget-content .ui-state-active, .ui-widget-header .ui-state-active { border: 1px solid #585858; background: #585858; font-weight: 400; color: #ffffff; } +.ui-state-active a, .ui-state-active a:link, .ui-state-active a:visited { color: #212121; text-decoration: none; } +.ui-widget :active { outline: none; } + +/* Interaction Cues +----------------------------------*/ +.ui-state-error, .ui-widget-content .ui-state-error, .ui-widget-header .ui-state-error {border: 1px solid #cd0a0a; background: #fef1ec; color: #cd0a0a; } +.ui-state-error a, .ui-widget-content .ui-state-error a, .ui-widget-header .ui-state-error a { color: #cd0a0a; } +.ui-state-error-text, .ui-widget-content .ui-state-error-text, .ui-widget-header .ui-state-error-text { color: #cd0a0a; } +.ui-priority-primary, .ui-widget-content .ui-priority-primary, .ui-widget-header .ui-priority-primary { font-weight: 500; } + +/* states and images */ +.ui-icon { width: 17px; height: 19px; } + +/* positioning */ +.ui-icon-circle-triangle-e { background-image: url(../images/dp_right.svg); } +.ui-icon-circle-triangle-w { background-image: url(../images/dp_left.svg); } + +/* + * jQuery UI Autocomplete + * + * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Autocomplete#theming + */ +.ui-autocomplete { position: absolute; cursor: default; max-height: 80px; overflow-y: auto; overflow-x: hidden; padding-right: 20px;} + +/* workarounds */ +* html .ui-autocomplete { width:1px; } /* without this, the menu expands to 100% in IE6 */ + +/* + * jQuery UI Menu + * + * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Menu#theming + */ +.ui-menu { + list-style: none; + padding: 0px; + margin: 0; + display: block; + float: left; + border-color: #e0e0e0; +} +.ui-menu .ui-menu { + margin-top: -3px; +} +.ui-menu .ui-menu-item { + margin: 0; + padding: 0; + zoom: 1; + float: left; + clear: left; + width: 100%; + white-space: pre; +} +.ui-menu .ui-menu-item a { + text-decoration: none; + display: block; + padding: 2px 2px; + zoom: 1; + white-space: pre; +} +.ui-menu .ui-menu-item a.ui-state-hover, +.ui-menu .ui-menu-item a.ui-state-active { + font-weight: 400; + background: #f0f0f0; +} + +button.ui-datepicker-current +{ + width:40%; + margin:5px 1px 5px 1px; + float:left; +} +button.ui-datepicker-close +{ + width:40%; + margin:5px 1px 5px 1px; + float:right; +} + +/* + * jQuery UI Slider + * + * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Slider#theming + */ +.ui-slider { position: relative; text-align: left; } +.ui-slider .ui-slider-handle { position: absolute; z-index: 2; width: 1.2em; height: 1.2em; cursor: default; } +.ui-slider .ui-slider-range { position: absolute; z-index: 1; font-size: .7em; display: block; border: 0; background-position: 0 0; } + +.ui-slider-horizontal { height: .8em; } +.ui-slider-horizontal .ui-slider-handle { top: -.3em; margin-left: -.6em; } +.ui-slider-horizontal .ui-slider-range { top: 0; height: 100%; } +.ui-slider-horizontal .ui-slider-range-min { left: 0; } +.ui-slider-horizontal .ui-slider-range-max { right: 0; } + +.ui-slider-vertical { width: .8em; height: 100px; } +.ui-slider-vertical .ui-slider-handle { left: -.3em; margin-left: 0; margin-bottom: -.6em; } +.ui-slider-vertical .ui-slider-range { left: 0; width: 100%; } +.ui-slider-vertical .ui-slider-range-min { bottom: 0; } +.ui-slider-vertical .ui-slider-range-max { top: 0; } + +/* + * jQuery UI Datepicker + * + * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Datepicker#theming + */ + +.ui-datepicker { width: 184px; padding: 4px; z-index: 21; display: none; cursor:default; user-select: none; -webkit-user-select:none; -moz-user-select: -moz-none;} +.ui-datepicker .ui-datepicker-header { position:relative; height: 19px; padding: 2px 0px; margin: 2px 2px 1px 2px; } +.ui-datepicker .ui-datepicker-prev, .ui-datepicker .ui-datepicker-next { position:absolute; top: 2px; width: 17px; height: 19px; } +.ui-datepicker .ui-datepicker-prev { left: 2px; } +.ui-datepicker .ui-datepicker-next { right: 2px; } +.ui-datepicker .ui-datepicker-title { margin: 0px 24px; text-align: center; white-space: nowrap;} +.ui-datepicker .ui-datepicker-title select { margin: 0px 0px; background-color: #ffffff; } +.ui-datepicker .ui-datepicker-title span { display: inline-block; margin-top: 3px; } +.ui-datepicker select.ui-datepicker-month-year {width: 100%;} +.ui-datepicker select.ui-datepicker-month { padding-bottom: 0px; width: 40px; max-height: 19px; line-height: 19px; margin-left: 2px; } +.ui-datepicker select.ui-datepicker-year { padding-bottom: 0px; width: 57px; max-height: 19px; line-height: 19px; } +.ui-datepicker table { font-size: 0.95em; border-collapse: collapse; margin: 3px 0px 1px 1px; } +.ui-datepicker th { display: none; } +.ui-datepicker td { border: 0; padding: 2px; } +.ui-datepicker td span, .ui-datepicker td a { display: block; width: 18px; padding: 1px 2px 1px 0px; text-align: right; text-decoration: none; overflow: hidden; } +.ui-datepicker .ui-datepicker-buttonpane { background-image: none; margin: .7em 0 0 0; padding:0 .2em; border: 0; } +.ui-datepicker .ui-datepicker-buttonpane button { border: 1px solid #c0c0c0; background: #ffffff; font-weight: 400; color: #000000; padding: 0px;} +.ui-datepicker-calendar th {font-weight: 400;} + +/* RTL support */ +.ui-datepicker-rtl { direction: rtl; } +.ui-datepicker-rtl .ui-datepicker-prev { right: 2px; left: auto; } +.ui-datepicker-rtl .ui-datepicker-next { left: 2px; right: auto; } +.ui-datepicker-rtl .ui-datepicker-prev:hover { right: 1px; left: auto; } +.ui-datepicker-rtl .ui-datepicker-next:hover { left: 1px; right: auto; } +.ui-datepicker-rtl .ui-datepicker-buttonpane { clear:right; } +.ui-datepicker-rtl .ui-datepicker-buttonpane button { float: left; } +.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current { float:right; } +.ui-datepicker-rtl .ui-datepicker-group { float:right; } +.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header { border-right-width: 0px; border-left-width:1px; } +.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header { border-right-width: 0px; border-left-width:1px; } diff --git a/radicale_web/web/infcloud/css/jquery.tagsinput.css b/radicale_web/web/infcloud/css/jquery.tagsinput.css new file mode 100644 index 0000000..daad03c --- /dev/null +++ b/radicale_web/web/infcloud/css/jquery.tagsinput.css @@ -0,0 +1,14 @@ +div.tagsinput { border: none; background: #ffffff; padding: 1px; min-height: 24px; max-height: 66px; overflow-y: auto; } +div.tagsinput.readonly { border: none; background: #ffffff; padding: 1px; overflow-y: auto; } +div.tagsinput span.tag { border: 1px solid #585858; display: block; float: left; height: 19px; padding: 1px 2px 0px 2px; min-height: 17px; text-decoration:none; background: #585858; color: #ffffff; margin: 1px; white-space: pre; } +div.tagsinput span.tag span { line-height: 19px; bottom: 0px; } +div.tagsinput span.tag span, x:-moz-any-link, x:default { line-height: 17px; } +div.tagsinput span.tag a { font-weight: 400; color: #d0d0d0; text-decoration:none; padding-left: 4px; } +div.tagsinput.readonly span.tag { border: 1px solid #e0e0e0; background: #ffffff; color: #2d2d2d; } +div.tagsinput.readonly span.tag a { display: none; } +div[id$="_addTag"] { padding: 2px 0px 2px 3px;} /*div#tags_addTag { padding: 2px 0px 2px 3px;}*/ +div.tagsinput input { width:130px; margin: 0px; border: none; padding: 0px; background: transparent; color: #000; outline:0px; } +div.tagsinput div.input_container { width:130px; position: relative; } +div.tagsinput div { display:block; float: left; } +.tags_clear { clear: both; width: 100%; height: 0px; } +.not_valid { color: #90111a !important; } diff --git a/radicale_web/web/infcloud/css/spectrum.custom.css b/radicale_web/web/infcloud/css/spectrum.custom.css new file mode 100644 index 0000000..97a3d22 --- /dev/null +++ b/radicale_web/web/infcloud/css/spectrum.custom.css @@ -0,0 +1,553 @@ +/*** +Spectrum Colorpicker v1.2.0 +https://github.com/bgrins/spectrum +Author: Brian Grinstead +License: MIT +***/ + +.sp-container { + position:absolute; + top:0; + left:0; + display:inline-block; + *display: inline; + *zoom: 1; + /* https://github.com/bgrins/spectrum/issues/40 */ + z-index: 9999994; + overflow: hidden; + border-bottom: 1px solid #c0c0c0; +} + +.sp-container.sp-flat { + position: relative; +} + +.sp-arrow +{ + position: absolute; + top: 0; + left: 106px; + width: 12px; + height: 6px; + background-image: url('../images/resource_arrow_down.svg'); +} + +/* http://ansciath.tumblr.com/post/7347495869/css-aspect-ratio */ +.sp-top { + position:relative; + width: 100%; + display:inline-block; +} +.sp-top-inner { + position:absolute; + top:0; + left:0; + bottom:0; + right:0; +} +.sp-color { + position: absolute; + top:0; + left:0; + bottom:0; + right:20%; +} +.sp-hue { + position: absolute; + top:0; + right:0; + bottom:0; + left:84%; + height: 100%; +} + +.sp-clear-enabled .sp-hue { + top:33px; + height: 77.5%; +} + +.sp-fill { + padding-top: 80%; +} +.sp-sat, .sp-val { + position: absolute; + top:0; + left:0; + right:0; + bottom:0; +} + +.sp-alpha-enabled .sp-top { + margin-bottom: 18px; +} +.sp-alpha-enabled .sp-alpha { + display: block; +} +.sp-alpha-handle { + position:absolute; + top:-4px; + bottom: -4px; + width: 6px; + left: 50%; + cursor: pointer; + border: 1px solid black; + background: white; + opacity: .8; +} +.sp-alpha { + display: none; + position: absolute; + bottom: -14px; + right: 0; + left: 0; + height: 8px; +} +.sp-alpha-inner { + border: solid 1px #333; +} + +.sp-clear { + display: none; +} + +.sp-clear.sp-clear-display { + background-position: center; +} + +.sp-clear-enabled .sp-clear { + display: block; + position:absolute; + top:0px; + right:0; + bottom:0; + left:84%; + height: 28px; +} + +/* Don't allow text selection */ +.sp-container, .sp-replacer, .sp-preview, .sp-dragger, .sp-slider, .sp-alpha, .sp-clear, .sp-alpha-handle, .sp-container.sp-dragging .sp-input, .sp-container button { + cursor:default; + -webkit-user-select:none; + -moz-user-select: -moz-none; + -o-user-select:none; + user-select: none; +} + +.sp-container.sp-input-disabled .sp-input-container { + display: none; +} +.sp-container.sp-buttons-disabled .sp-button-container { + display: none; +} +.sp-palette-only .sp-picker-container { + display: none; +} +.sp-palette-disabled .sp-palette-container { + display: none; +} + +.sp-initial-disabled .sp-initial { + display: none; +} + + +/* Gradients for hue, saturation and value instead of images. Not pretty... but it works */ +.sp-sat { + background-image: -webkit-gradient(linear, 0 0, 100% 0, from(#FFF), to(rgba(204, 154, 129, 0))); + background-image: -webkit-linear-gradient(left, #FFF, rgba(204, 154, 129, 0)); + background-image: -moz-linear-gradient(left, #fff, rgba(204, 154, 129, 0)); + background-image: -o-linear-gradient(left, #fff, rgba(204, 154, 129, 0)); + background-image: -ms-linear-gradient(left, #fff, rgba(204, 154, 129, 0)); + background-image: linear-gradient(to right, #fff, rgba(204, 154, 129, 0)); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(GradientType = 1, startColorstr=#FFFFFFFF, endColorstr=#00CC9A81)"; + filter : progid:DXImageTransform.Microsoft.gradient(GradientType = 1, startColorstr='#FFFFFFFF', endColorstr='#00CC9A81'); +} +.sp-val { + background-image: -webkit-gradient(linear, 0 100%, 0 0, from(#000000), to(rgba(204, 154, 129, 0))); + background-image: -webkit-linear-gradient(bottom, #000000, rgba(204, 154, 129, 0)); + background-image: -moz-linear-gradient(bottom, #000, rgba(204, 154, 129, 0)); + background-image: -o-linear-gradient(bottom, #000, rgba(204, 154, 129, 0)); + background-image: -ms-linear-gradient(bottom, #000, rgba(204, 154, 129, 0)); + background-image: linear-gradient(to top, #000, rgba(204, 154, 129, 0)); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr=#00CC9A81, endColorstr=#FF000000)"; + filter : progid:DXImageTransform.Microsoft.gradient(startColorstr='#00CC9A81', endColorstr='#FF000000'); +} + +.sp-hue { + background: -moz-linear-gradient(top, #ff0000 0%, #ffff00 17%, #00ff00 33%, #00ffff 50%, #0000ff 67%, #ff00ff 83%, #ff0000 100%); + background: -ms-linear-gradient(top, #ff0000 0%, #ffff00 17%, #00ff00 33%, #00ffff 50%, #0000ff 67%, #ff00ff 83%, #ff0000 100%); + background: -o-linear-gradient(top, #ff0000 0%, #ffff00 17%, #00ff00 33%, #00ffff 50%, #0000ff 67%, #ff00ff 83%, #ff0000 100%); + background: -webkit-gradient(linear, left top, left bottom, from(#ff0000), color-stop(0.17, #ffff00), color-stop(0.33, #00ff00), color-stop(0.5, #00ffff), color-stop(0.67, #0000ff), color-stop(0.83, #ff00ff), to(#ff0000)); + background: -webkit-linear-gradient(top, #ff0000 0%, #ffff00 17%, #00ff00 33%, #00ffff 50%, #0000ff 67%, #ff00ff 83%, #ff0000 100%); +} + +/* IE filters do not support multiple color stops. + Generate 6 divs, line them up, and do two color gradients for each. + Yes, really. + */ +.sp-1 { + height:17%; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0000', endColorstr='#ffff00'); +} +.sp-2 { + height:16%; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffff00', endColorstr='#00ff00'); +} +.sp-3 { + height:17%; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00ff00', endColorstr='#00ffff'); +} +.sp-4 { + height:17%; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00ffff', endColorstr='#0000ff'); +} +.sp-5 { + height:16%; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#0000ff', endColorstr='#ff00ff'); +} +.sp-6 { + height:17%; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff00ff', endColorstr='#ff0000'); +} + +.sp-hidden { + display: none !important; +} + +/* Clearfix hack */ +.sp-cf:before, .sp-cf:after { content: ""; display: table; } +.sp-cf:after { clear: both; } +.sp-cf { *zoom: 1; } + +/* Mobile devices, make hue slider bigger so it is easier to slide */ +@media (max-device-width: 480px) { + .sp-color { right: 40%; } + .sp-hue { left: 63%; } + .sp-fill { padding-top: 60%; } +} +.sp-dragger { + border-radius: 5px; + height: 5px; + width: 5px; + border: 1px solid #fff; + background: #000; + cursor: pointer; + position:absolute; + top:0; + left: 0; +} +.sp-slider { + position: absolute; + top:0; + cursor:pointer; + height: 3px; + left: -1px; + right: -1px; + border: 1px solid #000; + background: white; + opacity: .8; +} + +/* +Theme authors: +Here are the basic themeable display options (colors, fonts, global widths). +See http://bgrins.github.io/spectrum/themes/ for instructions. +*/ + +.sp-container { + border-radius: 0; + background-color: #f0f0f0; + padding: 0; +} +.sp-container, .sp-container button, .sp-container input, .sp-color, .sp-hue, .sp-clear +{ + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + -ms-box-sizing: border-box; + box-sizing: border-box; +} + +.sp-top +{ + margin-bottom: 3px; +} + +.sp-color, .sp-hue, .sp-clear +{ + border: solid 1px #666; +} + +/* Input */ +/*.sp-input-container { + float:right; + width: 100px; + margin-bottom: 4px; +} +.sp-initial-disabled .sp-input-container { + width: 100%; +} +.sp-input { + font-size: 12px !important; + border: 1px inset; + padding: 4px 5px; + margin: 0; + width: 100%; + background:transparent; + border-radius: 3px; + color: #222; +} +.sp-input:focus { + border: 1px solid orange; +}*/ +.sp-input-container { + width: 100%; + margin-bottom: 4px; +} +.sp-input { + padding: 4px 5px; + margin: 0; + width: 100%; +} +/*.sp-input.sp-validation-error +{ + border: 1px solid red; + background: #fdd; +}*/ +.sp-picker-container , .sp-palette-container +{ + float:left; + position: relative; + padding: 10px; +} +.sp-picker-container +{ + width: 204px; + /*width: 172px;*/ +} + +/* Palettes */ +.sp-palette-container +{ + border-right: solid 1px #ccc; +} + +.sp-palette .sp-thumb-el { + display: block; + position:relative; + float:left; + width: 24px; + height: 15px; + margin: 3px; + cursor: pointer; + border:solid 2px transparent; +} +.sp-palette .sp-thumb-el:hover, .sp-palette .sp-thumb-el.sp-thumb-active { + border-color: orange; +} +.sp-thumb-el +{ + position:relative; +} + +/* Initial */ +.sp-initial +{ + float: left; + border: solid 1px #333; +} +.sp-initial span { + width: 30px; + height: 25px; + border:none; + display:block; + float:left; + margin:0; +} + +.sp-initial .sp-clear-display { + background-position: center; +} + +/* Buttons */ +.sp-button-container { + width: 100%; +} + +/* Replacer (the little preview div that shows up instead of the ) */ +.sp-replacer { + margin:0; + overflow:hidden; + cursor:pointer; + padding: 4px; + /*display:inline-block;*/ + display: none; + *zoom: 1; + *display: inline; + border: solid 1px #91765d; + background: #eee; + color: #333; + vertical-align: middle; +} +.sp-replacer:hover, .sp-replacer.sp-active { + border-color: #F0C49B; + color: #111; +} +.sp-replacer.sp-disabled { + cursor:default; + border-color: silver; + color: silver; +} +.sp-dd { + padding: 2px 0; + height: 16px; + line-height: 16px; + float:left; + font-size:10px; +} +.sp-preview +{ + position:relative; + width:25px; + height: 20px; + border: solid 1px #222; + margin-right: 5px; + float:left; + z-index: 0; +} + +.sp-palette +{ + *width: 220px; + max-width: 220px; +} +.sp-palette .sp-thumb-el +{ + width:16px; + height: 16px; + margin:2px 1px; + border: solid 1px #d0d0d0; +} + +.sp-container +{ + padding-bottom:0; +} + + +/* Buttons: http://hellohappy.org/css3-buttons/ */ +/*.sp-container button { + background-color: #eeeeee; + background-image: -webkit-linear-gradient(top, #eeeeee, #cccccc); + background-image: -moz-linear-gradient(top, #eeeeee, #cccccc); + background-image: -ms-linear-gradient(top, #eeeeee, #cccccc); + background-image: -o-linear-gradient(top, #eeeeee, #cccccc); + background-image: linear-gradient(to bottom, #eeeeee, #cccccc); + border: 1px solid #ccc; + border-bottom: 1px solid #bbb; + border-radius: 3px; + color: #333; + font-size: 14px; + line-height: 1; + padding: 5px 4px; + text-align: center; + text-shadow: 0 1px 0 #eee; + vertical-align: middle; +} +.sp-container button:hover { + background-color: #dddddd; + background-image: -webkit-linear-gradient(top, #dddddd, #bbbbbb); + background-image: -moz-linear-gradient(top, #dddddd, #bbbbbb); + background-image: -ms-linear-gradient(top, #dddddd, #bbbbbb); + background-image: -o-linear-gradient(top, #dddddd, #bbbbbb); + background-image: linear-gradient(to bottom, #dddddd, #bbbbbb); + border: 1px solid #bbb; + border-bottom: 1px solid #999; + cursor: pointer; + text-shadow: 0 1px 0 #ddd; +} +.sp-container button:active { + border: 1px solid #aaa; + border-bottom: 1px solid #888; + -webkit-box-shadow: inset 0 0 5px 2px #aaaaaa, 0 1px 0 0 #eeeeee; + -moz-box-shadow: inset 0 0 5px 2px #aaaaaa, 0 1px 0 0 #eeeeee; + -ms-box-shadow: inset 0 0 5px 2px #aaaaaa, 0 1px 0 0 #eeeeee; + -o-box-shadow: inset 0 0 5px 2px #aaaaaa, 0 1px 0 0 #eeeeee; + box-shadow: inset 0 0 5px 2px #aaaaaa, 0 1px 0 0 #eeeeee; +} +.sp-cancel +{ + font-size: 11px; + color: #d93f3f !important; + margin:0; + padding:2px; + margin-right: 5px; + vertical-align: middle; + text-decoration:none; + +} +.sp-cancel:hover +{ + color: #d93f3f !important; + text-decoration: underline; +}*/ + +.sp-container input[type=button] +{ + width: 40%; +} + +.sp-cancel +{ + float: right; +} + +.sp-palette span:hover, .sp-palette span.sp-thumb-active +{ + border-color: #000; +} + +.sp-preview, .sp-alpha, .sp-thumb-el +{ + position:relative; + background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAGUlEQVQYV2M4gwH+YwCGIasIUwhT25BVBADtzYNYrHvv4gAAAABJRU5ErkJggg==); +} +.sp-preview-inner, .sp-alpha-inner, .sp-thumb-inner +{ + display:block; + position:absolute; + top:0;left:0;bottom:0;right:0; +} + +.sp-palette .sp-thumb-inner +{ + background-position: 50% 50%; + background-repeat: no-repeat; +} + +.sp-palette .sp-thumb-light.sp-thumb-active .sp-thumb-inner +{ + background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAIVJREFUeNpiYBhsgJFMffxAXABlN5JruT4Q3wfi/0DsT64h8UD8HmpIPCWG/KemIfOJCUB+Aoacx6EGBZyHBqI+WsDCwuQ9mhxeg2A210Ntfo8klk9sOMijaURm7yc1UP2RNCMbKE9ODK1HM6iegYLkfx8pligC9lCD7KmRof0ZhjQACDAAceovrtpVBRkAAAAASUVORK5CYII=); +} + +.sp-palette .sp-thumb-dark.sp-thumb-active .sp-thumb-inner +{ + background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjEwMPRyoQAAAMdJREFUOE+tkgsNwzAMRMugEAahEAahEAZhEAqlEAZhEAohEAYh81X2dIm8fKpEspLGvudPOsUYpxE2BIJCroJmEW9qJ+MKaBFhEMNabSy9oIcIPwrB+afvAUFoK4H0tMaQ3XtlrggDhOVVMuT4E5MMG0FBbCEYzjYT7OxLEvIHQLY2zWwQ3D+9luyOQTfKDiFD3iUIfPk8VqrKjgAiSfGFPecrg6HN6m/iBcwiDAo7WiBeawa+Kwh7tZoSCGLMqwlSAzVDhoK+6vH4G0P5wdkAAAAASUVORK5CYII=); +} + +.sp-clear-display { + background-repeat:no-repeat; + background-position: center; + background-image: url(data:image/gif;base64,R0lGODlhFAAUAPcAAAAAAJmZmZ2dnZ6enqKioqOjo6SkpKWlpaampqenp6ioqKmpqaqqqqurq/Hx8fLy8vT09PX19ff39/j4+Pn5+fr6+vv7+wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAP8ALAAAAAAUABQAAAihAP9FoPCvoMGDBy08+EdhQAIJCCMybCDAAYUEARBAlFiQQoMABQhKUJBxY0SPICEYHBnggEmDKAuoPMjS5cGYMxHW3IiT478JJA8M/CjTZ0GgLRekNGpwAsYABHIypcAgQMsITDtWJYBR6NSqMico9cqR6tKfY7GeBCuVwlipDNmefAtTrkSzB1RaIAoXodsABiZAEFB06gIBWC1mLVgBa0AAOw==); +} + +.sp-inverse.sp-container { + border-top: 1px solid #c0c0c0; + border-bottom: none; +} + +.sp-inverse .sp-arrow +{ + top: auto; + bottom: 0; + background-image: url('../images/resource_arrow_up.svg'); +} diff --git a/radicale_web/web/infcloud/data_process.js b/radicale_web/web/infcloud/data_process.js new file mode 100644 index 0000000..d52f7dc --- /dev/null +++ b/radicale_web/web/infcloud/data_process.js @@ -0,0 +1,7792 @@ +/* +InfCloud - the open source CalDAV/CardDAV Web Client +Copyright (C) 2011-2015 + Jan Mate + Andrej Lezo + Matej Mihalik + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as +published by the Free Software Foundation, either version 3 of the +License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . +*/ + +String.prototype.parseComnpactISO8601=function(uid) +{ + if(this.length>=15) + var formattedString=this.substring(0, 4)+'/'+this.substring(4, 6)+'/'+this.substring(6, 8)+' '+this.substring(9, 11)+':'+this.substring(11, 13)+':'+this.substring(13, 15); + else + var formattedString=this.substring(0, 4)+'/'+this.substring(4, 6)+'/'+this.substring(6, 8)+' '+'00:00:00'; + + var value=Date.parse(formattedString); + if(isNaN(value)) + return false + else + return new Date(value); +} + +function repeatStartCompare(objA,objB) +{ + var startA='',startB=''; + if(objA.rec_id!='') + startA=objA.rec_id.parseComnpactISO8601(); + else if(objA.start) + startA=new Date(objA.start.getTime()); + else if(objA.end) + startA=new Date(objA.end.getTime()); + else + startA=Infinity; + + if(objB.rec_id!='') + startB=objB.rec_id.parseComnpactISO8601(); + else if(objB.start) + startB=new Date(objB.start.getTime()); + else if(objB.end) + startB=new Date(objB.end.getTime()); + else + startB=Infinity; + + if(startAstartB) + return 1; + + return 0; +} + +function findWeek(weekNo,inDate,day) +{ + var distance = (day + 7 - inDate.getDay()) % 7; + var date = new Date(inDate.getTime()); + date.setDate(date.getDate() + distance); + if(date.getWeekNo() <= weekNo) + date.setDate(date.getDate() + 7*(weekNo-date.getWeekNo())); + else + { + var actualYearWeeks = new Date(date.getFullYear(),11,31,1,1,1).getWeekNo(); + date.setDate(date.getDate() + 7*(actualYearWeeks-date.getWeekNo())); + } + +} +String.prototype.getSecondsFromOffset=function() +{ + if(this.length>=5) + { + var hours=this.substring(1,3); + var minutes=this.substring(3,5); + var seconds='00'; + if(this.length>=7) + seconds=this.substring(5,7); + + var value=parseInt(hours,10)*60*60+parseInt(minutes,10)*60+parseInt(seconds,10); + if(this.charAt(0)=='-') + value=value*-1; + + if(!isNaN(value)) + return value + else + return 0; + } + else + return 0; +} +Array.prototype.indexElementOf=function(value) +{ + for(var i=0;i0) + { + for(var v=0;vnow) + { + var delay=aTime-now; + if(maxAlarmValue0) + { + for(var ir=0;ir0 && eventsArray[collections[i].uid][j].id!=eventsArray[collections[i].uid][j-1].id) + if(calEvent.alertTime.length>0) + { + for(var k=0; know) + { + var delay=aTime-now; + if(maxAlarmValue0 && todosArray[todoCollections[i].uid][j].id!=todosArray[todoCollections[i].uid][j-1].id) + if(todoEvent.alertTime.length>0) + { + if(todoEvent.end) + var showDate= new Date(todoEvent.end.getTime()); + else if(todoEvent.start) + var showDate= new Date(todoEvent.start.getTime()); + else + var showDate=new Date(); + for(var k=0; know) + { + var delay=aTime-now; + if(maxAlarmValuedate) + continue; + + if(checkRule && daylightComponents[i].startMonth) // is RRULE SET + { + objDayLight=daylightComponents[i]; + actualDaylightComponent=getDateFromDay(objDayLight, date,false,uid); + break; + } + else + { + for(var j=0;jdate) + continue; + + if(checkRule && standardComponents[i].startMonth) // is RRULE SET + { + objDayLight=standardComponents[i]; + actualStandardComponent=getDateFromDay(objDayLight, date); + break; + } + else + { + for(var j=0;jactualStandardComponent.startDate) + offset=actualDaylightComponent.offsetTo; + else + offset=actualStandardComponent.offsetTo; + } + else if(actualDaylightComponent) + offset=actualDaylightComponent.offsetTo; + else if(actualStandardComponent) + offset=actualStandardComponent.offsetTo; + } + else if(tZone == 'local') + offset = getStringLocalOffset(date); + return offset; +} + +function getStringLocalOffset(date) +{ + var offset = '+0000'; + var localOffset = date.getTimezoneOffset(); + if(localOffset>0) + { + var hours = Math.floor(localOffset/60); + var minutes = localOffset - hours*60; + offset = '-' + (hours<10 ? '0'+hours : hours); + offset += (minutes<10 ? '0'+minutes : minutes); + } + else if(localOffset<0) + { + localOffset = localOffset*-1; + var hours = Math.floor(localOffset/60); + var minutes = localOffset - hours*60; + offset = '+' + (hours<10 ? '0'+hours : hours); + offset += (minutes<10 ? '0'+minutes : minutes); + } + + return offset; +} + +function getDayLightObject(tzObject,t) +{ + var dayLightStartDate, dayLightEndDate, myDate=t; + dayLightStartDate=getDateFromDay(tzObject, t); + dayLightEndDate=getDateFromDay(tzObject, t); + + for(var i=0;idayLightEndDate) + { + if(myDate>dayLightStartDate) + dayLightEndDate.setFullYear(dayLightEndDate.getFullYear()+1); + else + dayLightStartDate.setFullYear(dayLightStartDate.getFullYear()-1); + } + + return {dayLightStartDate : dayLightStartDate, dayLightEndDate: dayLightEndDate}; +} + +function deleteEventFromArray(uid) +{ + var rid=uid.substring(0, uid.lastIndexOf('/')+1); + var count=0; + if(globalEventList.displayEventsArray[rid]!=null && typeof globalEventList.displayEventsArray[rid] != 'undefined') + for(var i=globalEventList.displayEventsArray[rid].length-1;i>=0;i--) + if(globalEventList.displayEventsArray[rid][i].id==uid) + { + count++; + for(var o=0;o=0;i--) + if(globalEventList.displayTodosArray[rid][i].id==uid) + { + for(var o=0;o0) + { + var rid=$('#uid').val().substring(0, $('#uid').val().lastIndexOf('/')+1); + if(rid) + if(globalEventList.events[rid][$('#uid').val()].uid!=undefined) + origVcalendarString=globalEventList.events[rid][$('#uid').val()].vcalendar; + while(origVcalendarString.match(vCalendar.pre['vevent'])!=null) + { + if(origVcalendarString.substring(origVcalendarString.indexOf('BEGIN:VEVENT')-2, origVcalendarString.indexOf('BEGIN:VEVENT'))=='\r\n') + { + var partEvent=origVcalendarString.substring(origVcalendarString.indexOf('BEGIN:VEVENT')-2,origVcalendarString.indexOf('END:VEVENT')+'END:VEVENT'.length); + origVcalendarString=origVcalendarString.replace(partEvent, ''); + } + else + { + var partEvent=origVcalendarString.substring(origVcalendarString.indexOf('BEGIN:VEVENT'),origVcalendarString.indexOf('END:VEVENT')+'END:VEVENT'.length); + origVcalendarString=origVcalendarString.replace(partEvent, ''); + partEvent+='\r\n'; + } + eventStringArray[eventStringArray.length]=partEvent; + } + } + var origTimezone = ''; + for(var iE=0;iE1 && $('#vcalendarHash').val()==hex_sha256(inputEvents[j].vcalendar)) + inputEvents[j].vcalendar=changeRuleForFuture(inputEvents[j], $('#futureStart').val().split(';')[0]); + + if(inputEvents[j].vcalendar.indexOf('\r\n')==0 && vCalendarText.lastIndexOf('\r\n')==(vCalendarText.length-2)) + vCalendarText+=inputEvents[j].vcalendar.substring(2,inputEvents[j].vcalendar.length); + else if((inputEvents[j].vcalendar.indexOf('\r\n')==0 && vCalendarText.lastIndexOf('\r\n')!=(vCalendarText.length-2)) || (inputEvents[j].vcalendar.indexOf('\r\n')!=0 && vCalendarText.lastIndexOf('\r\n')==(vCalendarText.length-2)) ) + vCalendarText+=inputEvents[j].vcalendar; + else + vCalendarText+='\r\n'+inputEvents[j].vcalendar; + futureMode=true; + } + else if(deleteMode && $('#futureStart').val().split(';')[0]!='' && $('#futureStart').val().split(';')[1]==inputEvents[j].start) + { + if($('#vcalendarHash').val()==hex_sha256(inputEvents[j].vcalendar)) + { + inputEvents[j].vcalendar=changeRuleForFuture(inputEvents[j], 2); + } + + if(inputEvents[j].vcalendar.indexOf('\r\n')==0 && vCalendarText.lastIndexOf('\r\n')==(vCalendarText.length-2)) + vCalendarText+=inputEvents[j].vcalendar.substring(2,inputEvents[j].vcalendar.length); + else if((inputEvents[j].vcalendar.indexOf('\r\n')==0 && vCalendarText.lastIndexOf('\r\n')!=(vCalendarText.length-2)) || (inputEvents[j].vcalendar.indexOf('\r\n')!=0 && vCalendarText.lastIndexOf('\r\n')==(vCalendarText.length-2)) ) + vCalendarText+=inputEvents[j].vcalendar; + else + vCalendarText+='\r\n'+inputEvents[j].vcalendar; + } + else + { + realEvent=inputEvents[j]; + } + } + vCalendarText=vCalendarText.replace(realEvent.vcalendar,''); + for(var ip=0; ip0) + // sel_option=inputEvents[0].timeZone; + //} + + if(sel_option=='UTC') + { + isUTC=true; + timeZoneAttr=''; + } + else if(sel_option=='local') + timeZoneAttr=''; + else if(sel_option=='custom') + timeZoneAttr=';'+vcalendarEscapeValue('TZID='+realEvent.timeZone); + else + timeZoneAttr=';'+vcalendarEscapeValue('TZID='+sel_option); + + var timezoneComponent=''; + if(globalSettings.rewritetimezonecomponent.value || !vCalendar.tplM['unprocessedVTIMEZONE']) + { + if(tzArray.indexOf(sel_option)==-1) + timezoneComponent=buildTimezoneComponent(sel_option); + } + else + timezoneComponent=vCalendar.tplM['unprocessedVTIMEZONE']; + + if(vCalendarText.lastIndexOf('\r\n')!=(vCalendarText.length-2)) + vCalendarText+='\r\n'; + + vCalendarText+=timezoneComponent; + } + // ---------------------------------- EVENT ---------------------------------- // + if(vCalendar.tplM['beginVEVENT']!=null && (process_elem=vCalendar.tplM['beginVEVENT'][0])!=undefined) + { + if(vCalendarText.lastIndexOf('\r\n')==(vCalendarText.length-2)) + vCalendarText+=vCalendar.tplM['beginVEVENT'][0]; + else + vCalendarText+='\r\n'+vCalendar.tplM['beginVEVENT'][0]; + vevent=true; + } + else + { + process_elem=vCalendar.tplC['beginVEVENT']; + process_elem=process_elem.replace('##:::##group_wd##:::##', ''); + + if(vCalendarText.lastIndexOf('\r\n')==(vCalendarText.length-2)) + vCalendarText+=process_elem; + else + vCalendarText+='\r\n'+process_elem; + vevent=true; + } + + var d, + utc, + d=new Date(); + + utc=d.getUTCFullYear()+(d.getUTCMonth()+1<10 ? '0' : '')+(d.getUTCMonth()+1)+(d.getUTCDate()<10 ? '0' : '')+d.getUTCDate()+'T'+(d.getUTCHours()<10 ? '0' : '')+d.getUTCHours()+(d.getUTCMinutes()<10 ? '0' : '')+d.getUTCMinutes()+(d.getUTCSeconds()<10 ? '0' : '')+d.getUTCSeconds()+'Z'; + var create=true; + + if($('#recurrenceID').val()=='') + var checkVal='orig'; + else + var checkVal=$('#recurrenceID').val(); + + var created=''; + for(vev in vCalendar.tplM['contentline_CREATED']) + { + if(vev==checkVal) + created=vCalendar.tplM['contentline_CREATED'][vev]; + } + if(created!='') + { + process_elem=created; + // replace the object and related objects' group names (+ append the related objects after the processed) + parsed=('\r\n'+process_elem).match(RegExp('\r\n((?:'+vCalendar.re['group']+'\\.)?)', 'm')); + if(parsed[1]!='') // if group is present, replace the object and related objects' group names + process_elem=('\r\n'+process_elem).replace(RegExp('\r\n'+parsed[1].replace('.', '\\.'), 'mg'), '\r\nitem'+(groupCounter++)+'.').substring(2); + } + else + { + process_elem=vCalendar.tplC['contentline_CREATED']; + process_elem=process_elem.replace('##:::##group_wd##:::##', ''); + process_elem=process_elem.replace('##:::##params_wsc##:::##', ''); + process_elem=process_elem.replace('##:::##value##:::##', vcalendarEscapeValue(utc)); + } + vCalendarText+=process_elem; + + if(vCalendar.tplM['contentline_LM']!=null && (process_elem=vCalendar.tplM['contentline_LM'][0])!=undefined) + { + // replace the object and related objects' group names (+ append the related objects after the processed) + parsed=('\r\n'+process_elem).match(RegExp('\r\n((?:'+vCalendar.re['group']+'\\.)?)', 'm')); + if(parsed[1]!='') // if group is present, replace the object and related objects' group names + process_elem=('\r\n'+process_elem).replace(RegExp('\r\n'+parsed[1].replace('.', '\\.'), 'mg'), '\r\nitem'+(groupCounter++)+'.').substring(2); + } + else + { + process_elem=vCalendar.tplC['contentline_LM']; + process_elem=process_elem.replace('##:::##group_wd##:::##', ''); + process_elem=process_elem.replace('##:::##params_wsc##:::##', ''); + } + process_elem=process_elem.replace('##:::##value##:::##', vcalendarEscapeValue(utc)); + vCalendarText+=process_elem; + + if(vCalendar.tplM['contentline_DTSTAMP']!=null && (process_elem=vCalendar.tplM['contentline_DTSTAMP'][0])!=undefined) + { + // replace the object and related objects' group names (+ append the related objects after the processed) + parsed=('\r\n'+process_elem).match(RegExp('\r\n((?:'+vCalendar.re['group']+'\\.)?)', 'm')); + if(parsed[1]!='') // if group is present, replace the object and related objects' group names + process_elem=('\r\n'+process_elem).replace(RegExp('\r\n'+parsed[1].replace('.', '\\.'), 'mg'), '\r\nitem'+(groupCounter++)+'.').substring(2); + } + else + { + process_elem=vCalendar.tplC['contentline_DTSTAMP']; + process_elem=process_elem.replace('##:::##group_wd##:::##', ''); + process_elem=process_elem.replace('##:::##params_wsc##:::##', ''); + } + process_elem=process_elem.replace('##:::##value##:::##', vcalendarEscapeValue(utc)); + vCalendarText+=process_elem; + + // UID (required by RFC) + if($('#futureStart').val()=='' && (operation!='MOVE_IN'&& operation!='MOVE_OTHER') && (vCalendar.tplM['contentline_UID']!=null && (process_elem=vCalendar.tplM['contentline_UID'][0])!=undefined)) + { + // replace the object and related objects' group names (+ append the related objects after the processed) + parsed=('\r\n'+process_elem).match(RegExp('\r\n((?:'+vCalendar.re['group']+'\\.)?)', 'm')); + if(parsed[1]!='') // if group is present, replace the object and related objects' group names + process_elem=('\r\n'+process_elem).replace(RegExp('\r\n'+parsed[1].replace('.', '\\.'), 'mg'), '\r\nitem'+(groupCounter++)+'.').substring(2); + } + else + { + process_elem=vCalendar.tplC['contentline_UID']; + process_elem=process_elem.replace('##:::##group_wd##:::##', ''); + process_elem=process_elem.replace('##:::##params_wsc##:::##', ''); + // it is VERY small probability, that for 2 newly created vevents/vtodos the same UID is generated (but not impossible :( ...) + var newUID=globalEventList.getNewUID(); + process_elem=process_elem.replace('##:::##uid##:::##', newUID); + } + vCalendarText+=process_elem; + + if(vCalendar.tplM['contentline_SUMMARY']!=null && (process_elem=vCalendar.tplM['contentline_SUMMARY'][0])!=undefined) + { + // replace the object and related objects' group names (+ append the related objects after the processed) + parsed=('\r\n'+process_elem).match(RegExp('\r\n((?:'+vCalendar.re['group']+'\\.)?)', 'm')); + if(parsed[1]!='') // if group is present, replace the object and related objects' group names + process_elem=('\r\n'+process_elem).replace(RegExp('\r\n'+parsed[1].replace('.', '\\.'), 'mg'), '\r\nitem'+(groupCounter++)+'.').substring(2); + } + else + { + process_elem=vCalendar.tplC['contentline_SUMMARY']; + process_elem=process_elem.replace('##:::##group_wd##:::##', ''); + process_elem=process_elem.replace('##:::##params_wsc##:::##', ''); + } + process_elem=process_elem.replace('##:::##value##:::##', vcalendarEscapeValue($('#name').val())); + //process_elem=process_elem.replace('##:::##value##:::##',vcalendarEscapeValue('zmena')); + vCalendarText+=process_elem; + + if($('#priority').val()!='0') + { + if(vCalendar.tplM['contentline_PRIORITY']!=null && (process_elem=vCalendar.tplM['contentline_PRIORITY'][0])!=undefined) + { + // replace the object and related objects' group names (+ append the related objects after the processed) + parsed=('\r\n'+process_elem).match(RegExp('\r\n((?:'+vCalendar.re['group']+'\\.)?)', 'm')); + if(parsed[1]!='') // if group is present, replace the object and related objects' group names + process_elem=('\r\n'+process_elem).replace(RegExp('\r\n'+parsed[1].replace('.', '\\.'), 'mg'), '\r\nitem'+(groupCounter++)+'.').substring(2); + } + else + { + process_elem=vCalendar.tplC['contentline_PRIORITY']; + process_elem=process_elem.replace('##:::##group_wd##:::##', ''); + process_elem=process_elem.replace('##:::##params_wsc##:::##', ''); + } + process_elem=process_elem.replace('##:::##value##:::##', vcalendarEscapeValue($('#priority').val())); + vCalendarText+=process_elem; + } + + if(vevent) + { + if($('#repeat').val()!='no-repeat') + { + var interval=$("#repeat_interval_detail").val(); + var byDay=''; + var monthDay=''; + var bymonth=''; + var wkst=''; + var isCustom=false; + if(interval==1 || interval=='') + interval=''; + else interval=";INTERVAL="+$("#repeat_interval_detail").val(); + + var frequency=$('#repeat').val(); + if(frequency=='TWO_WEEKLY') + { + frequency='WEEKLY'; + interval=";INTERVAL="+2; + } + else if(frequency=='BUSINESS') + { + frequency='WEEKLY'; + byDay=';BYDAY='; + if(globalSettings.weekenddays.value.length>0) + { + for(var i=0;i<7;i++) + if(globalSettings.weekenddays.value.indexOf(i)==-1) + byDay+=i+','; + byDay=byDay.substring(0,byDay.length-1); + byDay=byDay.replace(1,'MO').replace(2,'TU').replace(3,'WE').replace(4,'TH').replace(5,'FR').replace(6,'SA').replace(0,'SU'); + } + else + { + byDay='SA,SU'; + } + interval=''; + } + else if(frequency=='WEEKEND') + { + frequency='WEEKLY'; + byDay=';BYDAY='; + if(globalSettings.weekenddays.value.length>0) + { + for(var i=0;i0) + { + byDay=';BYDAY='; + for(var ri=0;ri0) + { + monthDay=';BYMONTHDAY='; + for(var ri=0;ri0) + { + bymonth=';BYMONTH='; + for(var ri=0;ri0) + { + monthDay=';BYMONTHDAY='; + for(var ri=0;ri0) + { + var alarmText = ''; + if($(".alert[data-id="+(t+1)+"]").val()!='none') + { + if(vCalendar.tplM['beginVALARM']!=null && (process_elem=vCalendar.tplM['beginVALARM'][0])!=undefined) + alarmText+=vCalendar.tplM['beginVALARM'][0]; + else + { + process_elem=vCalendar.tplC['beginVALARM']; + process_elem=process_elem.replace('##:::##group_wd##:::##', ''); + alarmText+=process_elem; + vevent=true; + } + + if($(".alert[data-id="+(t+1)+"]").val()=='message') + { + if($(".alert_message_details[data-id="+(t+1)+"]").val()=='on_date') + { + if(vCalendar.tplM['contentline_TRIGGER']!=null && (process_elem=vCalendar.tplM['contentline_TRIGGER'][0])!=undefined) + { + parsed=('\r\n'+process_elem).match(RegExp('\r\n((?:'+vCalendar.re['group']+'\\.)?)', 'm')); + if(parsed[1]!='') // if group is present, replace the object and related objects' group names + process_elem=('\r\n'+process_elem).replace(RegExp('\r\n'+parsed[1].replace('.', '\\.'), 'mg'), '\r\nitem'+(groupCounter++)+'.').substring(2); + } + else + { + process_elem=vCalendar.tplC['contentline_TRIGGER']; + process_elem=process_elem.replace('##:::##group_wd##:::##', ''); + process_elem=process_elem.replace('##:::##params_wsc##:::##', ''); + } + + var dateTo=$.datepicker.parseDate(globalSettings.datepickerformat.value, $(".message_date_input[data-id="+(t+1)+"]").val()); + var datetime_to=$.fullCalendar.formatDate(dateTo, 'yyyy-MM-dd'); + var aDate=new Date(Date.parse("01/02/1990, "+$(".message_time_input[data-id="+(t+1)+"]").val() )); + var time_to=$.fullCalendar.formatDate(aDate, 'HH:mm:ss'); + + var alarmDT=$.fullCalendar.parseDate(datetime_to+'T'+time_to); + + if(globalSettings.timezonesupport.value) + sel_option=$('#timezone').val(); + + if($('.timezone_row').css('display')=='none') + sel_option='local'; + + if(sel_option!='local') + { + var origValOffset=getOffsetByTZ(sel_option, alarmDT); + var origIntOffset = origValOffset.getSecondsFromOffset()*-1; + alarmDT = new Date(alarmDT.setSeconds(origIntOffset)); + } + + var newValue=$.fullCalendar.formatDate(alarmDT, "yyyyMMdd'T'HHmmss")+(sel_option!='local' ? 'Z' : ''); + + process_elem=process_elem.replace('##:::##VALUE=DATE-TIME##:::##', ';VALUE=DATE-TIME'); + process_elem=process_elem.replace('##:::##VALUE=DURATION##:::##', ''); + process_elem=process_elem.replace('##:::##value##:::##', vcalendarEscapeValue(newValue)); + alarmText+=process_elem; + } + else + { + var duration=''; + var before_after=$(".before_after_input[data-id="+(t+1)+"]").val(); + if($(".alert_message_details[data-id="+(t+1)+"]").val()=='minutes_before') + duration="-PT"+before_after+"M"; + if($(".alert_message_details[data-id="+(t+1)+"]").val()=='hours_before') + duration="-PT"+before_after+"H"; + if($(".alert_message_details[data-id="+(t+1)+"]").val()=='days_before') + duration="-P"+before_after+"D"; + if($(".alert_message_details[data-id="+(t+1)+"]").val()=='weeks_before') + duration="-P"+before_after+"W"; + if($(".alert_message_details[data-id="+(t+1)+"]").val()=='seconds_before') + duration="-PT"+before_after+"S"; + if($(".alert_message_details[data-id="+(t+1)+"]").val()=='minutes_after') + duration="PT"+before_after+"M"; + if($(".alert_message_details[data-id="+(t+1)+"]").val()=='hours_after') + duration="PT"+before_after+"H"; + if($(".alert_message_details[data-id="+(t+1)+"]").val()=='days_after') + duration="P"+before_after+"D"; + if($(".alert_message_details[data-id="+(t+1)+"]").val()=='weeks_after') + duration="P"+before_after+"W"; + if($(".alert_message_details[data-id="+(t+1)+"]").val()=='seconds_after') + duration="PT"+before_after+"S"; + if(vCalendar.tplM['contentline_TRIGGER']!=null && (process_elem=vCalendar.tplM['contentline_TRIGGER'][0])!=undefined) + { + parsed=('\r\n'+process_elem).match(RegExp('\r\n((?:'+vCalendar.re['group']+'\\.)?)', 'm')); + if(parsed[1]!='') // if group is present, replace the object and related objects' group names + process_elem=('\r\n'+process_elem).replace(RegExp('\r\n'+parsed[1].replace('.', '\\.'), 'mg'), '\r\nitem'+(groupCounter++)+'.').substring(2); + } + else + { + process_elem=vCalendar.tplC['contentline_TRIGGER']; + process_elem=process_elem.replace('##:::##group_wd##:::##', ''); + process_elem=process_elem.replace('##:::##params_wsc##:::##', ''); + } + process_elem=process_elem.replace('##:::##VALUE=DATE-TIME##:::##', ''); + process_elem=process_elem.replace('##:::##VALUE=DURATION##:::##', ';VALUE=DURATION'); + process_elem=process_elem.replace('##:::##value##:::##', duration); + alarmText+=process_elem; + } + + if(vCalendar.tplM['contentline_ACTION']!=null && (process_elem=vCalendar.tplM['contentline_ACTION'][0])!=undefined) + { + parsed=('\r\n'+process_elem).match(RegExp('\r\n((?:'+vCalendar.re['group']+'\\.)?)', 'm')); + if(parsed[1]!='') // if group is present, replace the object and related objects' group names + process_elem=('\r\n'+process_elem).replace(RegExp('\r\n'+parsed[1].replace('.', '\\.'), 'mg'), '\r\nitem'+(groupCounter++)+'.').substring(2); + } + else + { + process_elem=vCalendar.tplC['contentline_ACTION']; + process_elem=process_elem.replace('##:::##group_wd##:::##', ''); + process_elem=process_elem.replace('##:::##params_wsc##:::##', ''); + } + process_elem=process_elem.replace('##:::##value##:::##', vcalendarEscapeValue('DISPLAY')); + alarmText+=process_elem; + var a=new Date(); + + if(vCalendar.tplM['contentline_DESCRIPTION']!=null && (process_elem=vCalendar.tplM['contentline_DESCRIPTION'][0])!=undefined) + { + parsed=('\r\n'+process_elem).match(RegExp('\r\n((?:'+vCalendar.re['group']+'\\.)?)', 'm')); + if(parsed[1]!='') // if group is present, replace the object and related objects' group names + process_elem=('\r\n'+process_elem).replace(RegExp('\r\n'+parsed[1].replace('.', '\\.'), 'mg'), '\r\nitem'+(groupCounter++)+'.').substring(2); + } + else + { + process_elem=vCalendar.tplC['contentline_DESCRIPTION']; + process_elem=process_elem.replace('##:::##group_wd##:::##', ''); + process_elem=process_elem.replace('##:::##params_wsc##:::##', ''); + } + process_elem=process_elem.replace('##:::##value##:::##', vcalendarEscapeValue('Reminder')); + alarmText+=process_elem; + + } + if((typeof vCalendar.tplM['unprocessedVALARM']!='undefined' && typeof vCalendar.tplM['unprocessedVALARM'][t]!='undefined') && (vCalendar.tplM['unprocessedVALARM'][t]!='') && (vCalendar.tplM['unprocessedVALARM'][t]!=null)) + { + tmp=vCalendar.tplM['unprocessedVALARM'][t].replace(RegExp('^\r\n'), '').replace(RegExp('\r\n$'), ''); + if(tmp.indexOf('\r\n')==0) + tmp=tmp.substring(2, tmp.length); + if(tmp.lastIndexOf('\r\n')!=(tmp.length-2)) + tmp+='\r\n'; + alarmText+=tmp; + } + if(vCalendar.tplM['endVALARM']!=null && (process_elem=vCalendar.tplM['endVALARM'][0])!=undefined) + alarmText+=vCalendar.tplM['endVALARM'][0]; + else + { + process_elem=vCalendar.tplC['endVALARM']; + process_elem=process_elem.replace('##:::##group_wd##:::##', ''); + alarmText+=process_elem; + } + if(alarmUniqueArray.indexOf(alarmText)==-1) + { + alarmUniqueArray.push(alarmText); + vCalendarText+=alarmText; + } + } + } + } + vCalendar.tplM['unprocessedVALARM']=new Array(); + + if($('#avail').val()!='none') + { + if(vCalendar.tplM['contentline_TRANSP']!=null && (process_elem=vCalendar.tplM['contentline_TRANSP'][0])!=undefined) + { + // replace the object and related objects' group names (+ append the related objects after the processed) + parsed=('\r\n'+process_elem).match(RegExp('\r\n((?:'+vCalendar.re['group']+'\\.)?)', 'm')); + if(parsed[1]!='') // if group is present, replace the object and related objects' group names + process_elem=('\r\n'+process_elem).replace(RegExp('\r\n'+parsed[1].replace('.', '\\.'), 'mg'), '\r\nitem'+(groupCounter++)+'.').substring(2); + } + else + { + process_elem=vCalendar.tplC['contentline_TRANSP']; + process_elem=process_elem.replace('##:::##group_wd##:::##', ''); + process_elem=process_elem.replace('##:::##params_wsc##:::##', ''); + } + if($('#avail').val()=='busy') + process_elem=process_elem.replace('##:::##value##:::##', vcalendarEscapeValue('OPAQUE')); + else + process_elem=process_elem.replace('##:::##value##:::##', vcalendarEscapeValue('TRANSPARENT')); + vCalendarText+=process_elem; + } + + if($('#url_EVENT').val()!='') + { + if(vCalendar.tplM['contentline_URL']!=null && (process_elem=vCalendar.tplM['contentline_URL'][0])!=undefined) + { + // replace the object and related objects' group names (+ append the related objects after the processed) + parsed=('\r\n'+process_elem).match(RegExp('\r\n((?:'+vCalendar.re['group']+'\\.)?)', 'm')); + if(parsed[1]!='') // if group is present, replace the object and related objects' group names + process_elem=('\r\n'+process_elem).replace(RegExp('\r\n'+parsed[1].replace('.', '\\.'), 'mg'), '\r\nitem'+(groupCounter++)+'.').substring(2); + } + else + { + process_elem=vCalendar.tplC['contentline_URL']; + process_elem=process_elem.replace('##:::##group_wd##:::##', ''); + process_elem=process_elem.replace('##:::##params_wsc##:::##', ''); + } + process_elem=process_elem.replace('##:::##value##:::##', vcalendarEscapeValue($('#url_EVENT').val())); + vCalendarText+=process_elem; + } + + + + } + //DESCRIPTION + if($('#note').val()!='') + { + // NOTE + if(vCalendar.tplM['contentline_NOTE']!=null && (process_elem=vCalendar.tplM['contentline_NOTE'][0])!=undefined) + { + // replace the object and related objects' group names (+ append the related objects after the processed) + parsed=('\r\n'+process_elem).match(RegExp('\r\n((?:'+vCalendar.re['group']+'\\.)?)', 'm')); + if(parsed[1]!='') // if group is present, replace the object and related objects' group names + process_elem=('\r\n'+process_elem).replace(RegExp('\r\n'+parsed[1].replace('.', '\\.'), 'mg'), '\r\nitem'+(groupCounter++)+'.').substring(2); + } + else + { + process_elem=vCalendar.tplC['contentline_NOTE']; + process_elem=process_elem.replace('##:::##group_wd##:::##', ''); + process_elem=process_elem.replace('##:::##params_wsc##:::##', ''); + } + process_elem=process_elem.replace('##:::##value##:::##', vcalendarEscapeValue($('#note').val())); + vCalendarText+=process_elem; + } + + if($('#status').val()!='NONE') + { + + //if((value=$('[id="vcalendar_editor"] [data-type="\\%note"]').find('textarea').val())!='') + //{ + if(vCalendar.tplM['contentline_STATUS']!=null && (process_elem=vCalendar.tplM['contentline_STATUS'][0])!=undefined) + { + // replace the object and related objects' group names (+ append the related objects after the processed) + parsed=('\r\n'+process_elem).match(RegExp('\r\n((?:'+vCalendar.re['group']+'\\.)?)', 'm')); + if(parsed[1]!='') // if group is present, replace the object and related objects' group names + process_elem=('\r\n'+process_elem).replace(RegExp('\r\n'+parsed[1].replace('.', '\\.'), 'mg'), '\r\nitem'+(groupCounter++)+'.').substring(2); + } + else + { + process_elem=vCalendar.tplC['contentline_STATUS']; + process_elem=process_elem.replace('##:::##group_wd##:::##', ''); + process_elem=process_elem.replace('##:::##params_wsc##:::##', ''); + } + process_elem=process_elem.replace('##:::##value##:::##', vcalendarEscapeValue($('#status').val())); + vCalendarText+=process_elem; + } + + //CLASS + if($('#type').val()!='') + { + // CLASS + if(vCalendar.tplM['contentline_CLASS']!=null && (process_elem=vCalendar.tplM['contentline_CLASS'][0])!=undefined) + { + // replace the object and related objects' group names (+ append the related objects after the processed) + parsed=('\r\n'+process_elem).match(RegExp('\r\n((?:'+vCalendar.re['group']+'\\.)?)', 'm')); + if(parsed[1]!='') // if group is present, replace the object and related objects' group names + process_elem=('\r\n'+process_elem).replace(RegExp('\r\n'+parsed[1].replace('.', '\\.'), 'mg'), '\r\nitem'+(groupCounter++)+'.').substring(2); + } + else + { + process_elem=vCalendar.tplC['contentline_CLASS']; + process_elem=process_elem.replace('##:::##group_wd##:::##', ''); + process_elem=process_elem.replace('##:::##params_wsc##:::##', ''); + if(typeof vCalendar.tplM['contentline_CLASS'] =='undefined' || vCalendar.tplM['contentline_CLASS']==null || vCalendar.tplM['contentline_CLASS'].length==0) + process_elem=''; + } + + if($('.row_type').css('display')!='none') + { + process_elem=vCalendar.tplC['contentline_CLASS']; + process_elem=process_elem.replace('##:::##group_wd##:::##', ''); + process_elem=process_elem.replace('##:::##params_wsc##:::##', ''); + process_elem=process_elem.replace('##:::##value##:::##', vcalendarEscapeValue($('#type').val().toUpperCase())); + } + vCalendarText+=process_elem; + } + + //RECURRENCE-ID + if($('#recurrenceID').val()) + { + if(vCalendar.tplM['contentline_REC_ID']!=null && (process_elem=vCalendar.tplM['contentline_REC_ID'][0])!=undefined) + { + // replace the object and related objects' group names (+ append the related objects after the processed) + parsed=('\r\n'+process_elem).match(RegExp('\r\n((?:'+vCalendar.re['group']+'\\.)?)', 'm')); + if(parsed[1]!='') // if group is present, replace the object and related objects' group names + process_elem=('\r\n'+process_elem).replace(RegExp('\r\n'+parsed[1].replace('.', '\\.'), 'mg'), '\r\nitem'+(groupCounter++)+'.').substring(2); + } + else + { + process_elem=vCalendar.tplC['contentline_REC_ID']; + process_elem=process_elem.replace('##:::##group_wd##:::##', ''); + process_elem=process_elem.replace('##:::##params_wsc##:::##', ''); + } + + var rec_id=$('#recurrenceID').val() + if(rec_id.indexOf('T')==-1) + { + process_elem=process_elem.replace('##:::##AllDay##:::##', ';'+vcalendarEscapeValue('VALUE=DATE')); + process_elem=process_elem.replace('##:::##TZID##:::##', vcalendarEscapeValue('')); + process_elem=process_elem.replace('##:::##value##:::##', vcalendarEscapeValue(rec_id)); + } + else + { + process_elem=process_elem.replace('##:::##AllDay##:::##', vcalendarEscapeValue('')); + + /*if((typeof vCalendar.tplM['unprocessed']!='undefined') && (vCalendar.tplM['unprocessed']!='') && (vCalendar.tplM['unprocessed']!=null)) + { + var checkTZID=vCalendar.tplM['unprocessed'].match(vCalendar.pre['contentline_TZID']); + if(checkTZID!=null) + { + parsed=checkTZID[0].match(vCalendar.pre['contentline_parse']); + process_elem=process_elem.replace('##:::##TZID##:::##', ';'+vcalendarEscapeValue("TZID="+parsed[4])); + } + else + process_elem=process_elem.replace('##:::##TZID##:::##', ';'+vcalendarEscapeValue("TZID="+ sel_option)); + } + else*/ + + process_elem=process_elem.replace('##:::##TZID##:::##',timeZoneAttr); + if(isUTC && rec_id.charAt(rec_id.length-1)!='Z') + rec_id+='Z'; + process_elem=process_elem.replace('##:::##value##:::##', vcalendarEscapeValue(rec_id)); + } + vCalendarText+=process_elem; + } + + if(vCalendar.tplM['contentline_E_DTSTART']!=null && (process_elem=vCalendar.tplM['contentline_E_DTSTART'][0])!=undefined) + { + // replace the object and related objects' group names (+ append the related objects after the processed) + parsed=('\r\n'+process_elem).match(RegExp('\r\n((?:'+vCalendar.re['group']+'\\.)?)', 'm')); + if(parsed[1]!='') // if group is present, replace the object and related objects' group names + process_elem=('\r\n'+process_elem).replace(RegExp('\r\n'+parsed[1].replace('.', '\\.'), 'mg'), '\r\nitem'+(groupCounter++)+'.').substring(2); + } + else + { + process_elem=vCalendar.tplC['contentline_E_DTSTART']; + process_elem=process_elem.replace('##:::##group_wd##:::##', ''); + process_elem=process_elem.replace('##:::##params_wsc##:::##', ''); + } + + var datetime_from='', datetime_to=''; + var a=$.datepicker.parseDate(globalSettings.datepickerformat.value, $('#date_from').val()); + var a2=$.datepicker.parseDate(globalSettings.datepickerformat.value, $('#date_to').val()); + var b=new Date(1970, 1, 1, 0, 0, 0); + if(datetime_from=='') + datetime_from=$.fullCalendar.formatDate(a, 'yyyyMMdd'); + + if(datetime_to=='') + datetime_to=$.fullCalendar.formatDate(a2, 'yyyyMMdd'); + + var dateTo=$.datepicker.parseDate('yymmdd',datetime_to); + + if($('#allday').prop('checked')) + { + process_elem=process_elem.replace('##:::##AllDay##:::##', ';'+vcalendarEscapeValue('VALUE=DATE')); + process_elem=process_elem.replace('##:::##TZID##:::##', vcalendarEscapeValue('')); + process_elem=process_elem.replace('##:::##value##:::##', vcalendarEscapeValue(datetime_from)); + } + else + { + b=new Date(Date.parse("01/02/1990, "+$('#time_from').val() )); + var time_from=$.fullCalendar.formatDate(b, 'HHmmss'); + process_elem=process_elem.replace('##:::##AllDay##:::##', vcalendarEscapeValue('')); + + /*if((typeof vCalendar.tplM['unprocessed']!='undefined') && (vCalendar.tplM['unprocessed']!='') && (vCalendar.tplM['unprocessed']!=null)) + { + var checkTZID=vCalendar.tplM['unprocessed'].match(vCalendar.pre['contentline_TZID']); + if(checkTZID!=null) + { + parsed=checkTZID[0].match(vCalendar.pre['contentline_parse']); + process_elem=process_elem.replace('##:::##TZID##:::##', ';'+vcalendarEscapeValue("TZID="+parsed[4])); + } + else + process_elem=process_elem.replace('##:::##TZID##:::##', ';'+vcalendarEscapeValue("TZID="+ sel_option)); + } + else*/ + process_elem=process_elem.replace('##:::##TZID##:::##', timeZoneAttr); + process_elem=process_elem.replace('##:::##value##:::##', vcalendarEscapeValue(datetime_from+'T'+time_from+(isUTC ? 'Z' : ''))); + } + + vCalendarText+=process_elem; + + if(realEvent!='') + { + if(realEvent.type!='') + { + var repeatStart=realEvent.repeatStart; + a.setHours(b.getHours()); + a.setMinutes(b.getMinutes()); + a.setSeconds(b.getSeconds()); + var changeDate=a; + var offsetDate=changeDate-repeatStart; + var realEventUID=realEvent.vcalendar.match(vCalendar.pre['contentline_UID']); + + if(realEventUID!=null) + realEventUID=realEventUID[0].match(vCalendar.pre['contentline_parse'])[4]; + + if(offsetDate!=0) + { + var vcalendarOrig=vCalendarText; + var eventArray=new Array(),backupEventArray= new Array(); + while(vcalendarOrig.match(vCalendar.pre['vevent'])!=null) + { + if(vcalendarOrig.substring(vcalendarOrig.indexOf('BEGIN:VEVENT')-2, vcalendarOrig.indexOf('BEGIN:VEVENT'))=='\r\n') + { + var partEvent=vcalendarOrig.substring(vcalendarOrig.indexOf('BEGIN:VEVENT')-2,vcalendarOrig.indexOf('END:VEVENT')+'END:VEVENT'.length); + vcalendarOrig=vcalendarOrig.replace(partEvent, ''); + } + else + { + var partEvent=vcalendarOrig.substring(vcalendarOrig.indexOf('BEGIN:VEVENT'),vcalendarOrig.indexOf('END:VEVENT')+'END:VEVENT'.length); + vcalendarOrig=vcalendarOrig.replace(partEvent, ''); + partEvent+='\r\n'; + } + eventArray[eventArray.length]=partEvent; + backupEventArray[backupEventArray.length]=partEvent; + } + if(eventArray.length==0) + console.log("Error: '"+inputUID+"': unable to parse vEvent"); + + for(var it=0;it"name", [3]->";param;param", [4]->"value" + if((parsed=('\r\n'+vcalendar_full[vcalendar_full.length-2]+'\r\n').match(vCalendar.pre['contentline_parse']))==null) + return false; + // values not directly supported by the editor (old values are kept intact) + vCalendar.tplM['end'][0]=vCalendar.tplC['end'].replace(/##:::##group_wd##:::##/g, vcalendar_end_group=parsed[1]); + + if(vcalendar_begin_group!=vcalendar_end_group) + return false;// the vCalendar BEGIN and END "group" are different + // remove the vCalendar BEGIN and END + + vcalendar='\r\n'+vcalendar_full.slice(1, vcalendar_full.length-2).join('\r\n')+'\r\n'; + + /* + vcalendar_element=vcalendar.match(vCalendar.pre['tzone']); + if(vcalendar_element!=null) + vcalendar=vcalendar.replace(vcalendar_element[0],''); + */ + + //FIX TIMEZONE + var beginTimeZone=vcalendar.indexOf('BEGIN:VTIMEZONE'); + var startEndTimeZone=vcalendar.lastIndexOf('END:VTIMEZONE'); + var endTimeZone=0; + var vTimeZone=''; + + if(beginTimeZone!=-1 && startEndTimeZone!=-1) + { + for(i=(startEndTimeZone+2);i"group.", [2]->"name", [3]->";param;param", [4]->"value" + if((parsed=('\r\n'+vcalendar_full[vevent_full.length-2]+'\r\n').match(vCalendar.pre['contentline_parse']))==null) + return false; + // values not directly supported by the editor (old values are kept intact) + vCalendar.tplM['endVEVENT'][0]=vCalendar.tplC['endVEVENT'].replace(/##:::##group_wd##:::##/g, vcalendar_end_group=parsed[1]); + + if(vcalendar_begin_group!=vcalendar_end_group) + return false;// the vCalendar BEGIN and END "group" are different + + // remove the vCalendar BEGIN and END + + vevent='\r\n'+vevent_full.slice(2, vevent_full.length-1).join('\r\n')+'\r\n'; + //SUMMARY + vcalendar_element=vevent.match(RegExp('\r\n'+vCalendar.re['contentline_SUMMARY'], 'mi')); + if(vcalendar_element!=null) + { + parsed=vcalendar_element[0].match(vCalendar.pre['contentline_parse']); + //note=String(vcalendar_element).split(':')[1]; + title=vcalendarUnescapeValue(parsed[4]); + vCalendar.tplM['contentline_SUMMARY'][0]=vCalendar.tplC['contentline_SUMMARY']; + vCalendar.tplM['contentline_SUMMARY'][0]=vCalendar.tplM['contentline_SUMMARY'][0].replace(/##:::##group_wd##:::##/g, parsed[1]); + vCalendar.tplM['contentline_SUMMARY'][0]=vCalendar.tplM['contentline_SUMMARY'][0].replace(/##:::##params_wsc##:::##/g, parsed[3]); + vevent=vevent.replace(vcalendar_element[0], '\r\n'); + + if(parsed[1]!='') + { + var re=RegExp('\r\n'+parsed[1].replace('.','\\..*')+'\r\n', 'im'); + while ((vcalendar_element_related=vevent.match(re))!=null) + { + // append the parameter to its parent + vCalendar.tplM['contentline_SUMMARY'][0]+=vcalendar_element_related[0].substr(2); + // remove the processed parameter + vevent=vevent.replace(vcalendar_element_related[0], '\r\n'); + } + } + } + + vcalendar_element=vevent.match(RegExp('\r\n'+vCalendar.re['contentline_TRANSP'], 'mi')); + if(vcalendar_element!=null) + { + parsed=vcalendar_element[0].match(vCalendar.pre['contentline_parse']); + //note=String(vcalendar_element).split(':')[1]; + title=vcalendarUnescapeValue(parsed[4]); + vCalendar.tplM['contentline_TRANSP'][0]=vCalendar.tplC['contentline_TRANSP']; + vCalendar.tplM['contentline_TRANSP'][0]=vCalendar.tplM['contentline_TRANSP'][0].replace(/##:::##group_wd##:::##/g, parsed[1]); + vCalendar.tplM['contentline_TRANSP'][0]=vCalendar.tplM['contentline_TRANSP'][0].replace(/##:::##params_wsc##:::##/g, parsed[3]); + vevent=vevent.replace(vcalendar_element[0], '\r\n'); + + if(parsed[1]!='') + { + var re=RegExp('\r\n'+parsed[1].replace('.','\\..*')+'\r\n', 'im'); + while ((vcalendar_element_related=vevent.match(re))!=null) + { + // append the parameter to its parent + vCalendar.tplM['contentline_TRANSP'][0]+=vcalendar_element_related[0].substr(2); + // remove the processed parameter + vevent=vevent.replace(vcalendar_element_related[0], '\r\n'); + } + } + } + + vcalendar_element=vevent.match(RegExp('\r\n'+vCalendar.re['contentline_PRIORITY'], 'mi')); + if(vcalendar_element!=null) + { + parsed=vcalendar_element[0].match(vCalendar.pre['contentline_parse']); + + //note=String(vcalendar_element).split(':')[1]; + title=vcalendarUnescapeValue(parsed[4]); + + vCalendar.tplM['contentline_PRIORITY'][0]=vCalendar.tplC['contentline_PRIORITY']; + vCalendar.tplM['contentline_PRIORITY'][0]=vCalendar.tplM['contentline_PRIORITY'][0].replace(/##:::##group_wd##:::##/g, parsed[1]); + vCalendar.tplM['contentline_PRIORITY'][0]=vCalendar.tplM['contentline_PRIORITY'][0].replace(/##:::##params_wsc##:::##/g, parsed[3]); + + vevent=vevent.replace(vcalendar_element[0], '\r\n'); + + if(parsed[1]!='') + { + var re=RegExp('\r\n'+parsed[1].replace('.','\\..*')+'\r\n', 'im'); + while ((vcalendar_element_related=vevent.match(re))!=null) + { + // append the parameter to its parent + vCalendar.tplM['contentline_PRIORITY'][0]+=vcalendar_element_related[0].substr(2); + // remove the processed parameter + vevent=vevent.replace(vcalendar_element_related[0], '\r\n'); + } + } + } + + //LOCATION + vcalendar_element=vevent.match(RegExp('\r\n'+vCalendar.re['contentline_LOCATION'], 'mi')); + if(vcalendar_element!=null) + { + parsed=vcalendar_element[0].match(vCalendar.pre['contentline_parse']); + //note=String(vcalendar_element).split(':')[1]; + title=vcalendarUnescapeValue(parsed[4]); + vCalendar.tplM['contentline_LOCATION'][0]=vCalendar.tplC['contentline_LOCATION']; + vCalendar.tplM['contentline_LOCATION'][0]=vCalendar.tplM['contentline_LOCATION'][0].replace(/##:::##group_wd##:::##/g, parsed[1]); + vCalendar.tplM['contentline_LOCATION'][0]=vCalendar.tplM['contentline_LOCATION'][0].replace(/##:::##params_wsc##:::##/g, parsed[3]); + vevent=vevent.replace(vcalendar_element[0], '\r\n'); + + if(parsed[1]!='') + { + var re=RegExp('\r\n'+parsed[1].replace('.','\\..*')+'\r\n', 'im'); + while ((vcalendar_element_related=vevent.match(re))!=null) + { + // append the parameter to its parent + vCalendar.tplM['contentline_LOCATION'][0]+=vcalendar_element_related[0].substr(2); + // remove the processed parameter + vevent=vevent.replace(vcalendar_element_related[0], '\r\n'); + } + } + } + + //URL + vcalendar_element=vevent.match(RegExp('\r\n'+vCalendar.re['contentline_URL'], 'mi')); + if(vcalendar_element!=null) + { + parsed=vcalendar_element[0].match(vCalendar.pre['contentline_parse']); + //note=String(vcalendar_element).split(':')[1]; + title=vcalendarUnescapeValue(parsed[4]); + vCalendar.tplM['contentline_URL'][0]=vCalendar.tplC['contentline_URL']; + vCalendar.tplM['contentline_URL'][0]=vCalendar.tplM['contentline_URL'][0].replace(/##:::##group_wd##:::##/g, parsed[1]); + vCalendar.tplM['contentline_URL'][0]=vCalendar.tplM['contentline_URL'][0].replace(/##:::##params_wsc##:::##/g, parsed[3]); + vevent=vevent.replace(vcalendar_element[0], '\r\n'); + + if(parsed[1]!='') + { + var re=RegExp('\r\n'+parsed[1].replace('.','\\..*')+'\r\n', 'im'); + while ((vcalendar_element_related=vevent.match(re))!=null) + { + // append the parameter to its parent + vCalendar.tplM['contentline_URL'][0]+=vcalendar_element_related[0].substr(2); + // remove the processed parameter + vevent=vevent.replace(vcalendar_element_related[0], '\r\n'); + } + } + } + + // ------------------------------ VALARM ------------------------------ // + var valarm=vevent.match(vCalendar.pre['valarm']); + if(valarm!=null) + { + vevent=vevent.replace(valarm[0], ''); + var alarmString=''; + var alarmArray=new Array(); + + for(var i=0;i"group.", [2]->"name", [3]->";param;param", [4]->"value" + if((parsed=('\r\n'+valarm_full[valarm_full.length-2]+'\r\n').match(vCalendar.pre['contentline_parse']))==null) + return false; + + // values not directly supported by the editor (old values are kept intact) + vCalendar.tplM['endVALARM'][j]=vCalendar.tplC['endVALARM'].replace(/##:::##group_wd##:::##/g, vcalendar_end_group=parsed[1]); + + if(vcalendar_begin_group!=vcalendar_end_group) + return false;// the vCalendar BEGIN and END "group" are different + + // remove the vCalendar BEGIN and END + alarmArray[j]='\r\n'+valarm_full.slice(1, valarm_full.length-2).join('\r\n')+'\r\n'; + + trigger=alarmArray[j].match(vCalendar.pre['contentline_TRIGGER']); + + if(trigger!=null) + { + parsed=(trigger[0]+'\r\n').match(vCalendar.pre['contentline_parse']); + + vCalendar.tplM['contentline_TRIGGER'][j]=vCalendar.tplC['contentline_TRIGGER']; + vCalendar.tplM['contentline_TRIGGER'][j]=vCalendar.tplM['contentline_TRIGGER'][j].replace(/##:::##group_wd##:::##/g, parsed[1]); + var pars=vcalendarSplitParam(parsed[3]); + var parString=''; + for(var i=0;i0) + { + var daysUntilDaylight=(parseInt(daylightStartCount)-1)*7; + var dayLightStartDate=new Date(checkDate.getFullYear(), checkDate.getMonth(), checkDate.getDate()+daysUntilDaylight, daylightStartsHours, daylightStartsMinutes); + } + else + { + var tmpLastDay=21+checkDate.getDate(); + var checkTmpDay=new Date(t.getFullYear(),daylightStartsMonth,tmpLastDay+7,23,59,0); + + if(checkTmpDay.getMonth()!=daylightStartsMonth) + var lastDay=tmpLastDay; + else + var lastDay=tmpLastDay+7; + + var daysUntilDaylight=(daylightStartCount+1)*7; + var dayLightStartDate=new Date(checkDate.getFullYear(), checkDate.getMonth(), lastDay+daysUntilDaylight, daylightStartsHours, daylightStartsMinutes); + } + + if(dayLightStartDate>t && !disableRecursion) + dayLightStartDate=getDateFromDay(objComponent, t, true).startDate; + + return {offsetFrom:objComponent.tzOffsetFROM, offsetTo: objComponent.tzOffsetTO, startDate: dayLightStartDate}; +} + + function vcalendarToData(inputCollection, inputEvent, isNew) +{ + var vcalendarOrig=inputEvent.vcalendar; + var eventArray=new Array(); + + //CHECK CALSCALE + var elem=vcalendarOrig.match(vCalendar.pre['contentline_CALSCALE']); + if(elem!=null) + { + calscale=elem[0].match(vCalendar.pre['contentline_parse'])[4]; + if(calscale!='GREGORIAN') + { + console.log("Error:'"+inputEvent.uid+"': Unsupported calscale in:"+vcalendarOrig); + return false; + } + } + //CHECK VERSION + var elemV=vcalendarOrig.match(vCalendar.pre['contentline_VERSION']); + if(elemV!=null) + { + var ver=elemV[0].match(vCalendar.pre['contentline_parse'])[4]; + if(ver!='2.0') + { + console.log("Error:'"+inputEvent.uid+"': Unsupported version ("+ver+") in:"+vcalendarOrig); + return false; + } + } + + //FIX TIMEZONE + var beginTimeZone=vcalendarOrig.indexOf('BEGIN:VTIMEZONE'); + var startEndTimeZone=vcalendarOrig.lastIndexOf('END:VTIMEZONE'); + var endTimeZone=0; + + var rid=inputEvent.uid.substring(0, inputEvent.uid.lastIndexOf('/')+1); + var evid=inputEvent.uid.substring(inputEvent.uid.lastIndexOf('/')+1, inputEvent.uid.length); + + var isChange=false, + needReload=false; + + if(!isNew) + { + var events=findEventInArray(inputEvent.uid, true); + if(events!='') + { + if(events.etag!=inputEvent.etag) + { + for(var i=0; i'+name+" "+localization[globalInterfaceLanguage].repeatChangeTxt); + $('#repeatConfirmBoxQuestion').html(localization[globalInterfaceLanguage].repeatChangeTxtClose); + } + else + needReload=true; + } + } + isChange=true; + } + } + } + + if((beginTimeZone!=-1) && (startEndTimeZone!=-1)) + { + for(i=(startEndTimeZone+2);i0) + isRepeat=true; + for(var i=0;i1 &&(frequency=='MONTHLY'||frequency=='YEARLY')) + { + console.log("Error:'"+inputEvent.uid+"': Unsupported recurrence rule in event:"+vcalendar); + return false; + } + } + } + if(!returnForValue) + { + + continue; + } + if(!interval) + interval=1; + } + + var dayLightStartDate, dayLightEndDate, tzObject; + vcalendar_element=vcalendar.match(vCalendar.pre['contentline_DTSTART']); + if(vcalendar_element!=null) + { + parsed=vcalendar_element[0].match(vCalendar.pre['contentline_parse']); + + start=parsed[4]; + var help1=start; + + if(help1.indexOf("T")==-1) + { + help1=help1.substring(0, 4)+'-'+help1.substring(4, 6)+'-'+help1.substring(6, 8); + all=true; + } + else + { + help1=help1.substring(0, 4)+'-'+help1.substring(4, 6)+'-'+help1.substring(6, 8)+'T'+help1.substring(9, 11)+':'+help1.substring(11, 13)+':'+help1.substring(13, 15); + all=false; + } + + var t=$.fullCalendar.parseDate(help1); + if(t==null) + return false; + if(t.toString()=='Invalid Date') + return false; + + if(!all) + { + parsed_value=vcalendarSplitParam(parsed[3]); + for(h=1;h1 || tzName=='UTC') + { + if(tzName!='UTC') + tzName=$.trim(dtStartTimezone[1]); + var finTZ = checkTimezone(tzName); + if(finTZ!=null) + tzName = finTZ; + if(globalSettings.timezonesupport.value && tzName in timezones) + { + valOffsetFrom=getOffsetByTZ(tzName, t); + intOffset=(getLocalOffset(t)*-1*1000)-valOffsetFrom.getSecondsFromOffset()*1000; + } + } + else if(processedTimezones.indexOf(tzName)==-1) + { + if(timeZonesEnabled.indexOf(tzName)==-1) + timeZonesEnabled.push('local'); + processedTimezones.push('local'); + } + if(tzName!='' && tzName != 'local') + if(processedTimezones.indexOf(tzName)==-1) + { + if(timeZonesEnabled.indexOf(tzName)==-1) + timeZonesEnabled.push(tzName); + processedTimezones.push(tzName); + } + } + else + tzName = globalSessionTimeZone; + realStart=$.fullCalendar.parseDate(help1); + inputEvent.start=$.fullCalendar.parseDate(help1); + start=$.fullCalendar.parseDate(help1); + if(intOffset) + { + inputEvent.start.setTime(inputEvent.start.getTime()+intOffset); + start.setTime(start.getTime()+intOffset); + } + if(exDate_array!=null) + for(var j=0;j1 || tzNameA=='UTC') + { + if(tzNameA!='UTC' && dtStartTimezoneA[0]==';TZID') + tzNameA=$.trim(dtStartTimezoneA[1]); + var finTZ = checkTimezone(tzNameA); + if(finTZ!=null) + tzNameA = finTZ; + if(globalSettings.timezonesupport.value && tzNameA in timezones) + { + var valOffsetFromA=getOffsetByTZ(tzNameA, alarmTimeA); + intOffsetA=getOffsetByTZ(tzName, alarmTimeA).getSecondsFromOffset()*1000-valOffsetFromA.getSecondsFromOffset()*1000; + } + } + else if(processedTimezones.indexOf(tzName)==-1) + { + if(timeZonesEnabled.indexOf(tzName)==-1) + timeZonesEnabled.push('local'); + processedTimezones.push('local'); + } + if(tzNameA!='' && tzNameA != 'local') + if(processedTimezones.indexOf(tzNameA)==-1) + { + if(timeZonesEnabled.indexOf(tzNameA)==-1) + timeZonesEnabled.push(tzNameA); + processedTimezones.push(tzNameA); + } + if(intOffsetA!='') + alarmTimeA.setTime(alarmTimeA.getTime()+intOffsetA); + alertTime[j]=$.fullCalendar.formatDate(alarmTimeA,"yyyy-MM-dd'T'HH:mm:ss"); + } + else + { + alertTime[j]=0; + if(value.indexOf('W')!=-1) + alertTime[j]=parseAlarmWeek(value); + else if(value.indexOf('D')!=-1) + alertTime[j]=parseAlarmDay(value); + else if(value.indexOf('T')!=-1) + alertTime[j]=parseAlarmTime(value); + if(parsed[4].charAt(0)=="-") + alertTime[j]="-"+alertTime[j]; + else + alertTime[j]="+"+alertTime[j]; + } + } + } + else + break; + + noteA=alarmArray[j].match(vCalendar.pre['contentline_NOTE']); + if(noteA!=null) + { + parsed=noteA[0].match(vCalendar.pre['contentline_parse']); + alertNote[j]=parsed[4]; + } + else + alertNote[j]='Default note'; + } + } + } + + vcalendar_element=vcalendar.match(vCalendar.pre['contentline_LOCATION']); + if(vcalendar_element!=null) + { + parsed=vcalendar_element[0].match(vCalendar.pre['contentline_parse']); + location=vcalendarUnescapeValue(parsed[4]); + } + + vcalendar_element=vcalendar.match(vCalendar.pre['contentline_NOTE']); + if(vcalendar_element!=null) + { + parsed=vcalendar_element[0].match(vCalendar.pre['contentline_parse']); + note=vcalendarUnescapeValue(parsed[4]); + } + + vcalendar_element=vcalendar.match(vCalendar.pre['contentline_SUMMARY']); + if(vcalendar_element!=null) + { + parsed=vcalendar_element[0].match(vCalendar.pre['contentline_parse']); + title=vcalendarUnescapeValue(parsed[4]); + } + + vcalendar_element=vcalendar.match(vCalendar.pre['contentline_PRIORITY']); + if(vcalendar_element!=null) + { + parsed=vcalendar_element[0].match(vCalendar.pre['contentline_parse']); + priority=vcalendarUnescapeValue(parsed[4]); + } + + var index=0; + for(var p=0;p1 || tzName=='UTC') + { + if(tzName!='UTC') + tzName=$.trim(dtStartTimezone[1]); + var finTZ = checkTimezone(tzName); + if(finTZ!=null) + tzName = finTZ; + if(globalSettings.timezonesupport.value && tzName in timezones) + { + valOffsetFrom=getOffsetByTZ(tzName, t1); + intOffset=(getLocalOffset(t1)*-1*1000)-valOffsetFrom.getSecondsFromOffset()*1000; + } + } + else if(processedTimezones.indexOf(tzName)==-1) + { + if(timeZonesEnabled.indexOf(tzName)==-1) + timeZonesEnabled.push('local'); + processedTimezones.push('local'); + } + //realEnd=$.fullCalendar.parseDate(help); + //help1+=valOffsetFrom; + + if(tzName!='' && tzName != 'local') + if(processedTimezones.indexOf(tzName)==-1) + { + if(timeZonesEnabled.indexOf(tzName)==-1) + timeZonesEnabled.push(tzName); + processedTimezones.push(tzName); + } + } + else + tzName = globalSessionTimeZone; + + realEnd=$.fullCalendar.parseDate(help); + inputEvent.end=$.fullCalendar.parseDate(help); + end=$.fullCalendar.parseDate(help); + if(intOffset) + { + inputEvent.end.setTime(inputEvent.end.getTime()+intOffset); + end.setTime(end.getTime()+intOffset); + } + } + else + return false; + + if(globalVisibleCalDAVCollections.indexOf(rid)!=-1 || isChange || isNew) + { + if(isRepeat) + { + var futureRLimit = new Date(globalToLoadedLimit.getTime()) + futureRLimit.setDate(futureRLimit.getDate()+14); + var ruleString=vcalendar.match(vCalendar.pre['contentline_RRULE2'])[0].match(vCalendar.pre['contentline_parse'])[4]; + inputEvent.isRepeat=true; + if(realStart) + var varDate=new Date(realStart.getTime()); + else + var varDate=new Date(start.getTime()); + + if(realEnd) + var varEndDate=new Date(realEnd.getTime()); + else + var varEndDate=new Date(end.getTime()); + + var lastGenDate=''; + var repeatStart=new Date(varDate.getTime()); + var repeatEnd=new Date(varEndDate.getTime()); + var untilDate='',realUntilDate='',realUntil=''; + + if(until!=='') + { + if(isUntilDate) + { + if(until.indexOf('T')!=-1) + { + var uString = until.substring(0, 4)+'-'+until.substring(4, 6)+'-'+until.substring(6, 8)+'T'+until.substring(9, 11)+':'+until.substring(11, 13)+':'+until.substring(13, 15); + var ut=$.fullCalendar.parseDate(uString); + if(ut==null) + return false; + if(ut.toString()=='Invalid Date') + return false; + if(!all) + { + if(globalSettings.timezonesupport.value && tzName in timezones) + valOffsetFrom=getOffsetByTZ(tzName, ut); + if(valOffsetFrom) + { + var intOffset=valOffsetFrom.getSecondsFromOffset()*1000; + ut.setTime(ut.getTime()+intOffset); + } + } + untilDate = new Date(ut.getTime()); + } + else + { + untilDate=$.fullCalendar.parseDate(until.substring(0, 4)+'-'+until.substring(4, 6)+'-'+until.substring(6, 8)); + untilDate.setHours(realStart.getHours()); + untilDate.setMinutes(realStart.getMinutes()); + untilDate.setSeconds(realStart.getSeconds()); + } + + realUntil=''; + } + else + { + untilDate=''; + realUntil=until; + + } + realUntilDate=untilDate; + inputEvent.untilDate=untilDate; + } + else + { + untilDate=new Date(futureRLimit.getTime()); + realUntilDate=''; + inputEvent.untilDate='never'; + } + var repeatCount=0, realRepeatCount=0; + + if(!inputEvent.isDrawn) + { + if(alertTime.length>0) + { + var aTime=''; + var now=new Date(); + if(!inputCollection.ignoreAlarms) + alertTimeOut=setAlertTimeouts(false,alertTime, start, end, {allDay:all, title:title}, true, inputEvent.uid); + } + realRepeatCount++; + var checkRec=isInRecurrenceArray(varDate,stringUID,recurrence_id_array, tzName); + + if(exDates.length>0) + if(exDates.indexOf(varDate.toString())!=-1) + checkRec=true; + if(!checkRec) + { + repeatCount++; + var tmpObj=new items(inputEvent.etag, start, end, title, all, inputEvent.uid, rid, evid, note, inputEvent.displayValue, alertTime, alertNote, realUntilDate, frequency, interval, realUntil, repeatStart, repeatEnd, byMonthDay,repeatCount, realRepeatCount, vcalendar, location, alertTimeOut,tzName, realStart, realEnd, byDay, rec_id,wkst,classType, avail,hrefUrl, compareString,priority,status,ruleString); + globalEventList.displayEventsArray[rid].splice(globalEventList.displayEventsArray[rid].length, 0, tmpObj); + } + } + + var lastGenDate=generateRepeatInstances({ + untilDate:realUntilDate, + repeatStart:varDate, + futureRLimit:futureRLimit, + stringUID:stringUID, + recurrence_id_array:recurrence_id_array, + exDates:exDates, + alertTime:alertTime, + ignoreAlarms:inputCollection.ignoreAlarms, + items:new items(inputEvent.etag, varDate, varEndDate, title, all, inputEvent.uid, rid, evid, note, inputEvent.displayValue, alertTime, alertNote, realUntilDate, frequency, interval, realUntil, repeatStart, repeatEnd, byMonthDay, repeatCount, realRepeatCount, vcalendar, location, alertTimeOut, tzName, realStart, realEnd, byDay, rec_id,wkst,classType, avail,hrefUrl,compareString,priority,status,ruleString) + }); + } + else + { + if(!inputCollection.ignoreAlarms) + alertTimeOut=setAlertTimeouts(false,alertTime, start, end, {allDay:all, title:title},true,inputEvent.uid); + + var tmpObj=new items(inputEvent.etag, start, end, title, all, inputEvent.uid, rid, evid, note, inputEvent.displayValue, alertTime, alertNote, '', '', '', '', '', '', '', '', '', vcalendar, location, alertTimeOut, tzName, realStart, realEnd, byDay, rec_id,wkst,classType, avail,hrefUrl,compareString,priority,status,ruleString); + if(isChange) + { + if(needReload) + showEventForm(null, null, tmpObj, globalJsEvent, 'show', ''); + } + globalEventList.displayEventsArray[rid].splice(globalEventList.displayEventsArray[rid].length, 0, tmpObj); + } + } + } + inputEvent.isDrawn=true; +} + +function notRFCDataToRFCData(vcalendarString) +{ + // If vCalendar contains only '\n' instead of '\r\n' we correct this + if(vcalendarString.match(RegExp('\r', 'm'))==null) + vcalendarString=vcalendarString.replace(RegExp('\n', 'gm'), '\r\n'); + + // remove multiple empty lines + vcalendarString=vcalendarString.replace(RegExp('(\r\n)+','gm'),'\r\n'); + + // remove line folding + vcalendarString=vcalendarString.replace(RegExp('\r\n'+vCalendar.re['WSP'], 'gm'), ''); + + // append '\r\n' to the end of the vCalendar if missing + if(vcalendarString[vcalendarString.length-1]!='\n') + vcalendarString+='\r\n'; + + return vcalendarString; +} + +function vCalendarCleanup(vcalendarString) +{ + vcalendarString=notRFCDataToRFCData(vcalendarString); + return vcalendarString; +} +function dataToVcard(accountUID, inputUID, inputFilterUID, inputEtag) +{ + var vCardText=''; + var groupCounter=0; + var tmpvCardEditorRef=$('#vCardEditor'); + if(typeof globalDisabledContactAttributes=='undefined' || !(globalDisabledContactAttributes instanceof Array)) + globalDisabledContactAttributes=[]; + + // vCard BEGIN (required by RFC) + if(vCard.tplM['begin']!=null && (process_elem=vCard.tplM['begin'][0])!=undefined) + vCardText+=vCard.tplM['begin'][0]; + else + { + process_elem=vCard.tplC['begin']; + process_elem=process_elem.replace('##:::##group_wd##:::##',''); + vCardText+=process_elem; + } + +// VERSION (required by RFC) + if(vCard.tplM['contentline_VERSION']!=null && (process_elem=vCard.tplM['contentline_VERSION'][0])!=undefined) + { + // replace the object and related objects' group names (+ append the related objects after the processed) + parsed=('\r\n'+process_elem).match(RegExp('\r\n((?:'+vCard.re['group']+'\\.)?)','m')); + if(parsed[1]!='') // if group is present, replace the object and related objects' group names + process_elem=('\r\n'+process_elem).replace(RegExp('\r\n'+parsed[1].replace('.','\\.'),'mg'),'\r\nitem'+(groupCounter++)+'.').substring(2); + } + else + { + process_elem=vCard.tplC['contentline_VERSION']; + process_elem=process_elem.replace('##:::##group_wd##:::##', ''); + process_elem=process_elem.replace('##:::##version##:::##', '3.0'); + } + vCardText+=process_elem; + +// UID (required by RFC) + var newUID=''; + if(vCard.tplM['contentline_UID']!=null && (process_elem=vCard.tplM['contentline_UID'][0])!=undefined) + { + // replace the object and related objects' group names (+ append the related objects after the processed) + parsed=('\r\n'+process_elem).match(RegExp('\r\n((?:'+vCard.re['group']+'\\.)?)','m')); + if(parsed[1]!='') // if group is present, replace the object and related objects' group names + process_elem=('\r\n'+process_elem).replace(RegExp('\r\n'+parsed[1].replace('.','\\.'),'mg'),'\r\nitem'+(groupCounter++)+'.').substring(2); + } + else + { + process_elem=vCard.tplC['contentline_UID']; + process_elem=process_elem.replace('##:::##group_wd##:::##', ''); + process_elem=process_elem.replace('##:::##params_wsc##:::##', ''); + + newUID=globalAddressbookList.getNewUID(); + + // it is VERY small probability, that for 2 newly created contacts the same UID is generated (but not impossible :( ...) + process_elem=process_elem.replace('##:::##uid##:::##',newUID); + } + vCardText+=process_elem; + +// N (required by RFC) + if(vCard.tplM['contentline_N']!=null && (process_elem=vCard.tplM['contentline_N'][0])!=undefined) + { + // replace the object and related objects' group names (+ append the related objects after the processed) + parsed=('\r\n'+process_elem).match(RegExp('\r\n((?:'+vCard.re['group']+'\\.)?)','m')); + if(parsed[1]!='') // if group is present, replace the object and related objects' group names + process_elem=('\r\n'+process_elem).replace(RegExp('\r\n'+parsed[1].replace('.','\\.'),'mg'),'\r\nitem'+(groupCounter++)+'.').substring(2); + } + else + { + process_elem=vCard.tplC['contentline_N']; + process_elem=process_elem.replace('##:::##group_wd##:::##', ''); + process_elem=process_elem.replace('##:::##params_wsc##:::##', ''); + } + process_elem=process_elem.replace('##:::##family##:::##',vcardEscapeValue(tmpvCardEditorRef.find('[data-type="family"]').val())); + process_elem=process_elem.replace('##:::##given##:::##',vcardEscapeValue(tmpvCardEditorRef.find('[data-type="given"]').val())); + process_elem=process_elem.replace('##:::##middle##:::##',vcardEscapeValue(tmpvCardEditorRef.find('[data-type="middle"]').val())); + process_elem=process_elem.replace('##:::##prefix##:::##',vcardEscapeValue(tmpvCardEditorRef.find('[data-type="prefix"]').val())); + process_elem=process_elem.replace('##:::##suffix##:::##',vcardEscapeValue(tmpvCardEditorRef.find('[data-type="suffix"]').val())); + vCardText+=process_elem; + +// FN (extracted from newly created N [previous "process_elem"], required by RFC) + // parsed (contentline_parse) = [1]->"group.", [2]->"name", [3]->";param;param", [4]->"value" + parsed=('\r\n'+process_elem).match(vCard.pre['contentline_parse']); + // parsed_value = [0]->Family, [1]->Given, [2]->Middle, [3]->Prefix, [4]->Suffix + parsed_value=vcardSplitValue(parsed[4],';'); + +// XXX toto je blbost, v settingsoch predsa musi byt jednoznacne ci sa uklada format A alebo B + /* backward compatibility for stupid users (remove it in future) */ + if(typeof globalSettings.contactstorefn.value=='string') + var tmp=globalSettings.contactstorefn.value.replace(RegExp(',', 'g'),', ').split(','); + else /* new configuration options (arrays) */ + var tmp=globalSettings.contactstorefn.value.slice(); // copy the configuration array + + var first_found=false; + for(var i=0;i we use the company name as FN + fn_value=vcardEscapeValue(tmpvCardEditorRef.find('[data-type="org"]').val()); + + if(vCard.tplM['contentline_FN']!=null && (process_elem=vCard.tplM['contentline_FN'][0])!=undefined) + { + // replace the object and related objects' group names (+ append the related objects after the processed) + parsed=('\r\n'+process_elem).match(RegExp('\r\n((?:'+vCard.re['group']+'\\.)?)','m')); + if(parsed[1]!='') // if group is present, replace the object and related objects' group names + process_elem=('\r\n'+process_elem).replace(RegExp('\r\n'+parsed[1].replace('.','\\.'),'mg'),'\r\nitem'+(groupCounter++)+'.').substring(2); + } + else + { + process_elem=vCard.tplC['contentline_FN']; + process_elem=process_elem.replace('##:::##group_wd##:::##', ''); + process_elem=process_elem.replace('##:::##params_wsc##:::##', ''); + } + process_elem=process_elem.replace('##:::##fn##:::##',fn_value); + vCardText+=process_elem; + +// CATEGORIES + if(globalDisabledContactAttributes.indexOf('CATEGORIES')==-1 && (value=tmpvCardEditorRef.find('[data-type="\\%categories"]').find('input[data-type="value"]').val())!='') + { + if(vCard.tplM['contentline_CATEGORIES']!=null && (process_elem=vCard.tplM['contentline_CATEGORIES'][0])!=undefined) + { + // replace the object and related objects' group names (+ append the related objects after the processed) + parsed=('\r\n'+process_elem).match(RegExp('\r\n((?:'+vCard.re['group']+'\\.)?)','m')); + if(parsed[1]!='') // if group is present, replace the object and related objects' group names + process_elem=('\r\n'+process_elem).replace(RegExp('\r\n'+parsed[1].replace('.','\\.'),'mg'),'\r\nitem'+(groupCounter++)+'.').substring(2); + } + else + { + process_elem=vCard.tplC['contentline_CATEGORIES']; + process_elem=process_elem.replace('##:::##group_wd##:::##', ''); + process_elem=process_elem.replace('##:::##params_wsc##:::##', ''); + } + process_elem=process_elem.replace('##:::##value##:::##', value); // we do not need to escape the value here! + vCardText+=process_elem; + } + +// NOTE + if(globalDisabledContactAttributes.indexOf('NOTE')==-1 && (value=tmpvCardEditorRef.find('[data-type="\\%note"]').find('textarea').val())!='') + { + if(vCard.tplM['contentline_NOTE']!=null && (process_elem=vCard.tplM['contentline_NOTE'][0])!=undefined) + { + // replace the object and related objects' group names (+ append the related objects after the processed) + parsed=('\r\n'+process_elem).match(RegExp('\r\n((?:'+vCard.re['group']+'\\.)?)','m')); + if(parsed[1]!='') // if group is present, replace the object and related objects' group names + process_elem=('\r\n'+process_elem).replace(RegExp('\r\n'+parsed[1].replace('.','\\.'),'mg'),'\r\nitem'+(groupCounter++)+'.').substring(2); + } + else + { + process_elem=vCard.tplC['contentline_NOTE']; + process_elem=process_elem.replace('##:::##group_wd##:::##', ''); + process_elem=process_elem.replace('##:::##params_wsc##:::##', ''); + } + process_elem=process_elem.replace('##:::##value##:::##',vcardEscapeValue(value)); + vCardText+=process_elem; + } + +// REV + if(vCard.tplM['contentline_REV']!=null && (process_elem=vCard.tplM['contentline_REV'][0])!=undefined) + { + // replace the object and related objects' group names (+ append the related objects after the processed) + parsed=('\r\n'+process_elem).match(RegExp('\r\n((?:'+vCard.re['group']+'\\.)?)','m')); + if(parsed[1]!='') // if group is present, replace the object and related objects' group names + process_elem=('\r\n'+process_elem).replace(RegExp('\r\n'+parsed[1].replace('.','\\.'),'mg'),'\r\nitem'+(groupCounter++)+'.').substring(2); + } + else + { + process_elem=vCard.tplC['contentline_REV']; + process_elem=process_elem.replace('##:::##group_wd##:::##', ''); + } + process_elem=process_elem.replace('##:::##params_wsc##:::##', ''); + var d = new Date(); + var utc=d.getUTCFullYear()+(d.getUTCMonth()+1<10 ? '0':'')+(d.getUTCMonth()+1)+(d.getUTCDate()<10 ? '0':'')+d.getUTCDate()+'T'+(d.getUTCHours()<10 ? '0':'')+d.getUTCHours()+(d.getUTCMinutes()<10 ? '0':'')+d.getUTCMinutes()+(d.getUTCSeconds()<10 ? '0':'')+d.getUTCSeconds()+'Z'; + process_elem=process_elem.replace('##:::##value##:::##', utc); + vCardText+=process_elem; + +// NICKNAME + if(globalDisabledContactAttributes.indexOf('NICKNAME')==-1 && (value=tmpvCardEditorRef.find('[data-type="nickname"]').val())!='') + { + if(vCard.tplM['contentline_NICKNAME']!=null && (process_elem=vCard.tplM['contentline_NICKNAME'][0])!=undefined) + { + // replace the object and related objects' group names (+ append the related objects after the processed) + parsed=('\r\n'+process_elem).match(RegExp('\r\n((?:'+vCard.re['group']+'\\.)?)','m')); + if(parsed[1]!='') // if group is present, replace the object and related objects' group names + process_elem=('\r\n'+process_elem).replace(RegExp('\r\n'+parsed[1].replace('.','\\.'),'mg'),'\r\nitem'+(groupCounter++)+'.').substring(2); + } + else + { + process_elem=vCard.tplC['contentline_NICKNAME']; + process_elem=process_elem.replace('##:::##group_wd##:::##', ''); + process_elem=process_elem.replace('##:::##params_wsc##:::##', ''); + } + process_elem=process_elem.replace('##:::##value##:::##', vcardEscapeValue(value)); + vCardText+=process_elem; + } + +// X-PHONETIC-FIRST-NAME + if(globalDisabledContactAttributes.indexOf('X-PHONETIC-FIRST-NAME')==-1 && (value=tmpvCardEditorRef.find('[data-type="ph_firstname"]').val())!='') + { + if(vCard.tplM['contentline_X-PHONETIC-FIRST-NAME']!=null && (process_elem=vCard.tplM['contentline_X-PHONETIC-FIRST-NAME'][0])!=undefined) + { + // replace the object and related objects' group names (+ append the related objects after the processed) + parsed=('\r\n'+process_elem).match(RegExp('\r\n((?:'+vCard.re['group']+'\\.)?)','m')); + if(parsed[1]!='') // if group is present, replace the object and related objects' group names + process_elem=('\r\n'+process_elem).replace(RegExp('\r\n'+parsed[1].replace('.','\\.'),'mg'),'\r\nitem'+(groupCounter++)+'.').substring(2); + } + else + { + process_elem=vCard.tplC['contentline_X-PHONETIC-FIRST-NAME']; + process_elem=process_elem.replace('##:::##group_wd##:::##', ''); + process_elem=process_elem.replace('##:::##params_wsc##:::##', ''); + } + process_elem=process_elem.replace('##:::##value##:::##',vcardEscapeValue(value)); + vCardText+=process_elem; + } + +// X-PHONETIC-LAST-NAME + if(globalDisabledContactAttributes.indexOf('X-PHONETIC-LAST-NAME')==-1 && (value=tmpvCardEditorRef.find('[data-type="ph_lastname"]').val())!='') + { + if(vCard.tplM['contentline_X-PHONETIC-LAST-NAME']!=null && (process_elem=vCard.tplM['contentline_X-PHONETIC-LAST-NAME'][0])!=undefined) + { + // replace the object and related objects' group names (+ append the related objects after the processed) + parsed=('\r\n'+process_elem).match(RegExp('\r\n((?:'+vCard.re['group']+'\\.)?)','m')); + if(parsed[1]!='') // if group is present, replace the object and related objects' group names + process_elem=('\r\n'+process_elem).replace(RegExp('\r\n'+parsed[1].replace('.','\\.'),'mg'),'\r\nitem'+(groupCounter++)+'.').substring(2); + } + else + { + process_elem=vCard.tplC['contentline_X-PHONETIC-LAST-NAME']; + process_elem=process_elem.replace('##:::##group_wd##:::##', ''); + process_elem=process_elem.replace('##:::##params_wsc##:::##', ''); + } + process_elem=process_elem.replace('##:::##value##:::##',vcardEscapeValue(value)); + vCardText+=process_elem; + } + +// BDAY + if(globalDisabledContactAttributes.indexOf('BDAY')==-1 && (value=tmpvCardEditorRef.find('[data-type="date_bday"]').val())!='') + { + var valid=true; + try {var date=$.datepicker.parseDate(globalSettings.datepickerformat.value, value)} + catch (e) {valid=false} + + if(valid==true) + { + if(vCard.tplM['contentline_BDAY']!=null && (process_elem=vCard.tplM['contentline_BDAY'][0])!=undefined) + { + // replace the object and related objects' group names (+ append the related objects after the processed) + parsed=('\r\n'+process_elem).match(RegExp('\r\n((?:'+vCard.re['group']+'\\.)?)','m')); + if(parsed[1]!='') // if group is present, replace the object and related objects' group names + process_elem=('\r\n'+process_elem).replace(RegExp('\r\n'+parsed[1].replace('.','\\.'),'mg'),'\r\nitem'+(groupCounter++)+'.').substring(2); + } + else + { + process_elem=vCard.tplC['contentline_BDAY']; + process_elem=process_elem.replace('##:::##group_wd##:::##', ''); + process_elem=process_elem.replace('##:::##params_wsc##:::##', ';VALUE=date'); + } + + process_elem=process_elem.replace('##:::##value##:::##',vcardEscapeValue($.datepicker.formatDate('yy-mm-dd', date))); + vCardText+=process_elem; + } + } + +// X-ABDATE + if(globalDisabledContactAttributes.indexOf('X-ABDATE')==-1) + { + tmpvCardEditorRef.find('[data-type="\\%date"]').each( + function (index,element) + { + if((value=$(element).find('[data-type="date_value"]').val())!='') + { + var valid=true; + try {var date=$.datepicker.parseDate(globalSettings.datepickerformat.value, value)} + catch (e) {valid=false} + + if(valid==true) + { + incGroupCounter=false; + if(vCard.tplM['contentline_X-ABDATE']!=null && (process_elem=vCard.tplM['contentline_X-ABDATE'][$(element).attr('data-id')])!=undefined) + { + // replace the object and related objects' group names (+ append the related objects after the processed) + parsed=('\r\n'+process_elem).match(RegExp('\r\n((?:'+vCard.re['group']+'\\.)?)','m')); + if(parsed[1]!='') // if group is present, replace the object and related objects' group names + { + process_elem=('\r\n'+process_elem).replace(RegExp('\r\n'+parsed[1].replace('.','\\.'),'mg'),'\r\nitem'+(groupCounter)+'.').substring(2); + incGroupCounter=true; + } + } + else + { + process_elem=vCard.tplC['contentline_X-ABDATE']; + process_elem=process_elem.replace('##:::##group_wd##:::##', ''); + } + var date_value=$.datepicker.formatDate('yy-mm-dd', date); + + var tmp_type=$(element).find('[data-type="date_type"] option').filter(':selected').attr('data-type'); + /* construct the "custom" type */ + if(tmp_type==':custom') + { + var tmp_cust_value=$(element).find('[data-type="custom_value"]').val(); + var tmp_cust_value_processed=tmp_cust_value.replace(RegExp('^\\s*|\\s*$','g'),'').replaceAll(' ',' '); + // if a custom type is already defined as standard type, use the standard definition + if((tmp_cust_already_exists=$(element).find('[data-type="date_type"] option').filter(function(){return $(this).html()==tmp_cust_value_processed;}).attr('data-type'))!=undefined) + tmp_type=tmp_cust_already_exists; + else // use custom type + tmp_type=':'+tmp_cust_value+':'; + } + + params_wsc=''; + tmp_normal_types=tmp_type.replace(RegExp(':.*:','g'),',').replaceAll(',,',',').replace(RegExp('^,|,$','g'),''); + if(tmp_normal_types!='') + params_wsc=';TYPE='+vcardEscapeValue(tmp_normal_types).toUpperCase().replace(RegExp('\\\\,','g'),';TYPE='); + + process_elem=process_elem.replace('##:::##params_wsc##:::##',params_wsc); + process_elem=process_elem.replace('##:::##value##:::##',vcardEscapeValue(date_value)); + + my_related=''; + tmp_related_type=tmp_type.match(RegExp(':(.*):')); // only one element of related (X-ABLabel) is supported + + if(tmp_related_type!=null && tmp_related_type[1]!='') + my_related='X-ABLabel:'+vcardEscapeValue((dataTypes['date_store_as'][tmp_related_type[1]]!=undefined ? dataTypes['date_store_as'][tmp_related_type[1]] : tmp_related_type[1]))+'\r\n'; + + if(my_related!='') + { + incGroupCounter=true; + parsed=('\r\n'+process_elem).match(vCard.pre['contentline_parse']); + if(parsed[1]!='') // if group is present, we use it, otherwise we create a new group + process_elem+=parsed[1]+my_related; + else + process_elem='item'+groupCounter+'.'+process_elem+'item'+groupCounter+'.'+my_related; + } + + if(incGroupCounter) groupCounter++; + + if(globalSettings.compatibility.value.anniversaryOutputFormat.indexOf('other')!=-1) + { + // X-ANNIVERSARY + if(tmp_type==':_$!!$_:') + { + if(globalSettings.compatibility.value.anniversaryOutputFormat.indexOf('apple')!=-1) + vCardText+=process_elem; + process_elem='X-ANNIVERSARY;VALUE=date:'+vcardEscapeValue(date_value)+'\r\n'; + } + + } + vCardText+=process_elem; + } + } + }); + } + +// TITLE + if(globalDisabledContactAttributes.indexOf('TITLE')==-1 && (value=tmpvCardEditorRef.find('[data-type="title"]').val())!='') + { + if(vCard.tplM['contentline_TITLE']!=null && (process_elem=vCard.tplM['contentline_TITLE'][0])!=undefined) + { + // replace the object and related objects' group names (+ append the related objects after the processed) + parsed=('\r\n'+process_elem).match(RegExp('\r\n((?:'+vCard.re['group']+'\\.)?)','m')); + if(parsed[1]!='') // if group is present, replace the object and related objects' group names + process_elem=('\r\n'+process_elem).replace(RegExp('\r\n'+parsed[1].replace('.','\\.'),'mg'),'\r\nitem'+(groupCounter++)+'.').substring(2); + } + else + { + process_elem=vCard.tplC['contentline_TITLE']; + process_elem=process_elem.replace('##:::##group_wd##:::##', ''); + process_elem=process_elem.replace('##:::##params_wsc##:::##', ''); + } + process_elem=process_elem.replace('##:::##value##:::##',vcardEscapeValue(value)); + vCardText+=process_elem; + } + +// ORG + if(globalDisabledContactAttributes.indexOf('ORG')==-1) + { + value=tmpvCardEditorRef.find('[data-type="org"]:visible:not([readonly])').val(); + value2=tmpvCardEditorRef.find('[data-type="department"]:visible:not([readonly])').val(); + if((value!=undefined && value!='') || (value2!=undefined && value2!='')) + { + if(vCard.tplM['contentline_ORG']!=null && (process_elem=vCard.tplM['contentline_ORG'][0])!=undefined) + { + // replace the object and related objects' group names (+ append the related objects after the processed) + parsed=('\r\n'+process_elem).match(RegExp('\r\n((?:'+vCard.re['group']+'\\.)?)','m')); + if(parsed[1]!='') // if group is present, replace the object and related objects' group names + process_elem=('\r\n'+process_elem).replace(RegExp('\r\n'+parsed[1].replace('.','\\.'),'mg'),'\r\nitem'+(groupCounter++)+'.').substring(2); + } + else + { + process_elem=vCard.tplC['contentline_ORG']; + process_elem=process_elem.replace('##:::##group_wd##:::##', ''); + process_elem=process_elem.replace('##:::##params_wsc##:::##', ''); + process_elem=process_elem.replace('##:::##units_wsc##:::##', ''); + } + process_elem=process_elem.replace('##:::##org##:::##',vcardEscapeValue(value)+(value2!=undefined && value2!='' ? ';'+vcardEscapeValue(value2) : '')); + vCardText+=process_elem; + } + } + +// X-ABShowAs + if(globalDisabledContactAttributes.indexOf('X-ABShowAs')==-1 && tmpvCardEditorRef.find('[data-type="isorg"]').prop('checked')) + { + if(vCard.tplM['contentline_X-ABShowAs']!=null && (process_elem=vCard.tplM['contentline_X-ABShowAs'][0])!=undefined) + { + // replace the object and related objects' group names (+ append the related objects after the processed) + parsed=('\r\n'+process_elem).match(RegExp('\r\n((?:'+vCard.re['group']+'\\.)?)','m')); + if(parsed[1]!='') // if group is present, replace the object and related objects' group names + process_elem=('\r\n'+process_elem).replace(RegExp('\r\n'+parsed[1].replace('.','\\.'),'mg'),'\r\nitem'+(groupCounter++)+'.').substring(2); + } + else + { + process_elem=vCard.tplC['contentline_X-ABShowAs']; + process_elem=process_elem.replace('##:::##group_wd##:::##', ''); + process_elem=process_elem.replace('##:::##params_wsc##:::##', ''); + process_elem=process_elem.replace('##:::##value##:::##', 'COMPANY'); + } + vCardText+=process_elem; + } + +// PHOTO + if(globalDisabledContactAttributes.indexOf('PHOTO')==-1 && !tmpvCardEditorRef.find('#photo').hasClass('photo_blank')) + { + var value = $('#photoURLHidden').val() || tmpvCardEditorRef.find('#photo').get(0).toDataURL('image/png'); + if(vCard.tplM['contentline_PHOTO']!=null && (process_elem=vCard.tplM['contentline_PHOTO'][0])!=undefined) + { + // replace the object and related objects' group names (+ append the related objects after the processed) + parsed=('\r\n'+process_elem).match(RegExp('\r\n((?:'+vCard.re['group']+'\\.)?)','m')); + if(parsed[1]!='') // if group is present, replace the object and related objects' group names + process_elem=('\r\n'+process_elem).replace(RegExp('\r\n'+parsed[1].replace('.','\\.'),'mg'),'\r\nitem'+(groupCounter++)+'.').substring(2); + + process_elem=process_elem.replace('##:::##value##:::##',value); + } + else + { + process_elem=vCard.tplC['contentline_PHOTO']; + process_elem=process_elem.replace('##:::##group_wd##:::##', ''); + process_elem=process_elem.replace('##:::##value##:::##', value); + } + + // Data URL (non-remote) will always be a binary encoded png image + if($('#photoURLHidden').val()==='') { + process_elem=process_elem.replace('##:::##params_wsc##:::##', ';ENCODING=b;TYPE=png'); + } + // For remote URL, we can't reliably determine its type, so we just append the VALUE=URI param + else { + process_elem=process_elem.replace('##:::##params_wsc##:::##', ';VALUE=URI'); + } + + vCardText+=process_elem; + } + +// ADR + if(globalDisabledContactAttributes.indexOf('ADR')==-1) + { + tmpvCardEditorRef.find('[data-type="\\%address"]').each( + function (index,element) + { + // if data is present for the selected country's address fields + var found=0; + $(element).find('[data-addr-field]').each( + function(index,element) + { + if($(element).attr('data-addr-field')!='' && $(element).attr('data-addr-field')!='country' && $(element).val()!='') + { + found=1; + return false; + } + } + ); + if(found) + { + var incGroupCounter=false; + if(vCard.tplM['contentline_ADR']!=null && (process_elem=vCard.tplM['contentline_ADR'][$(element).attr('data-id')])!=undefined) + { + // replace the object and related objects' group names (+ append the related objects after the processed) + parsed=('\r\n'+process_elem).match(RegExp('\r\n((?:'+vCard.re['group']+'\\.)?)','m')); + if(parsed[1]!='') // if group is present, replace the object and related objects' group names + { + process_elem=('\r\n'+process_elem).replace(RegExp('\r\n'+parsed[1].replace('.','\\.'),'mg'),'\r\nitem'+groupCounter+'.').substring(2); + incGroupCounter=true; + } + } + else + { + process_elem=vCard.tplC['contentline_ADR']; + process_elem=process_elem.replace('##:::##group_wd##:::##', ''); + } + + tmp_type=$(element).find('[data-type="address_type"] option').filter(':selected').attr('data-type'); + + /* construct the "custom" type */ + if(tmp_type==':custom') + { + var tmp_cust_value=$(element).find('[data-type="custom_value"]').val(); + var tmp_cust_value_processed=tmp_cust_value.replace(RegExp('^\\s*|\\s*$','g'),'').replaceAll(' ',' '); + // if a custom type is already defined as standard type, use the standard definition + if((tmp_cust_already_exists=$(element).find('[data-type="address_type"] option').filter(function(){return $(this).html()==tmp_cust_value_processed;}).attr('data-type'))!=undefined) + tmp_type=tmp_cust_already_exists; + else // use custom type + tmp_type=':'+tmp_cust_value+':'; + } + + params_wsc=''; + tmp_normal_types=tmp_type.replace(RegExp(':.*:','g'),',').replaceAll(',,',',').replace(RegExp('^,|,$','g'),''); + if(tmp_normal_types!='') + params_wsc=';TYPE='+vcardEscapeValue(tmp_normal_types).toUpperCase().replace(RegExp('\\\\,','g'),';TYPE='); + + var streetVal = $(element).find('[data-addr-field="street"]').map(function() { + var val = $(this).val(); + + if(val) { + return val; + } + }).get().join('\n'); + + process_elem=process_elem.replace('##:::##params_wsc##:::##',params_wsc); + process_elem=process_elem.replace('##:::##pobox##:::##',vcardEscapeValue($(element).find('[data-addr-field="pobox"]').val())); + process_elem=process_elem.replace('##:::##extaddr##:::##',vcardEscapeValue($(element).find('[data-addr-field="extaddr"]').val())); + process_elem=process_elem.replace('##:::##street##:::##',vcardEscapeValue(streetVal)); + process_elem=process_elem.replace('##:::##locality##:::##',vcardEscapeValue($(element).find('[data-addr-field="locality"]').val())); + process_elem=process_elem.replace('##:::##region##:::##',vcardEscapeValue($(element).find('[data-addr-field="region"]').val())); + process_elem=process_elem.replace('##:::##code##:::##',vcardEscapeValue($(element).find('[data-addr-field="code"]').val())); + process_elem=process_elem.replace('##:::##country##:::##',vcardEscapeValue($(element).find('[data-type="country_type"] option').filter(':selected').attr('data-full-name'))); + + my_related='X-ABADR:'+vcardEscapeValue($(element).find('[data-type="country_type"] option').filter(':selected').attr('data-type'))+'\r\n'; + parsed=('\r\n'+process_elem).match(vCard.pre['contentline_parse']); + if(parsed[1]!='') // if group is present, we use it, otherwise we create a new group + process_elem+=parsed[1]+my_related; + else + process_elem='item'+groupCounter+'.'+process_elem+'item'+groupCounter+'.'+my_related; + incGroupCounter=true; // we always increate the group number, because the X-ABADR is always stored + + my_related=''; + tmp_related_type=tmp_type.match(RegExp(':(.*):')); // only one element of related (X-ABLabel) is supported + + if(tmp_related_type!=null && tmp_related_type[1]!='') + my_related='X-ABLabel:'+vcardEscapeValue((dataTypes['address_type_store_as'][tmp_related_type[1]]!=undefined ? dataTypes['address_type_store_as'][tmp_related_type[1]] : tmp_related_type[1]))+'\r\n'; + + if(my_related!='') + { + incGroupCounter=true; + parsed=('\r\n'+process_elem).match(vCard.pre['contentline_parse']); + if(parsed[1]!='') // if group is present, we use it, otherwise we create a new group + process_elem+=parsed[1]+my_related; + else + process_elem='item'+groupCounter+'.'+process_elem+'item'+groupCounter+'.'+my_related; + } + + if(incGroupCounter) groupCounter++; + vCardText+=process_elem; + } + } + ); + } + +// TEL + if(globalDisabledContactAttributes.indexOf('TEL')==-1) + { + tmpvCardEditorRef.find('[data-type="\\%phone"]').each( + function (index,element) + { + if((value=$(element).find('[data-type="value"]').val())!='') + { + var incGroupCounter=false; + if(vCard.tplM['contentline_TEL']!=null && (process_elem=vCard.tplM['contentline_TEL'][$(element).attr('data-id')])!=undefined) + { + // replace the object and related objects' group names (+ append the related objects after the processed) + parsed=('\r\n'+process_elem).match(RegExp('\r\n((?:'+vCard.re['group']+'\\.)?)','m')); + if(parsed[1]!='') // if group is present, replace the object and related objects' group names + { + process_elem=('\r\n'+process_elem).replace(RegExp('\r\n'+parsed[1].replace('.','\\.'),'mg'),'\r\nitem'+groupCounter+'.').substring(2); + incGroupCounter=true; + } + } + else + { + process_elem=vCard.tplC['contentline_TEL']; + process_elem=process_elem.replace('##:::##group_wd##:::##', ''); + } + tmp_type=$(element).find('[data-type="phone_type"] option').filter(':selected').attr('data-type'); + + /* construct the "custom" type */ + if(tmp_type==':custom') + { + var tmp_cust_value=$(element).find('[data-type="custom_value"]').val(); + var tmp_cust_value_processed=tmp_cust_value.replace(RegExp('^\\s*|\\s*$','g'),'').replaceAll(' ',' '); + // if a custom type is already defined as standard type, use the standard definition + if((tmp_cust_already_exists=$(element).find('[data-type="phone_type"] option').filter(function(){return $(this).html()==tmp_cust_value_processed;}).attr('data-type'))!=undefined) + tmp_type=tmp_cust_already_exists; + else // use custom type + tmp_type=':'+tmp_cust_value+':'; + } + + params_wsc=''; + tmp_normal_types=tmp_type.replace(RegExp(':.*:','g'),',').replaceAll(',,',',').replace(RegExp('^,|,$','g'),''); + + if(tmp_normal_types!='') + params_wsc=';TYPE='+vcardEscapeValue(tmp_normal_types).toUpperCase().replace(RegExp('\\\\,','g'),';TYPE='); + + process_elem=process_elem.replace('##:::##params_wsc##:::##',params_wsc); + process_elem=process_elem.replace('##:::##value##:::##',vcardEscapeValue(value)); + + my_related=''; + tmp_related_type=tmp_type.match(RegExp(':(.*):')); // only one element of related (X-ABLabel) is supported + + if(tmp_related_type!=null && tmp_related_type[1]!='') + my_related='X-ABLabel:'+vcardEscapeValue((dataTypes['phone_type_store_as'][tmp_related_type[1]]!=undefined ? dataTypes['phone_type_store_as'][tmp_related_type[1]] : tmp_related_type[1]))+'\r\n'; + + if(my_related!='') + { + incGroupCounter=true; + parsed=('\r\n'+process_elem).match(vCard.pre['contentline_parse']); + if(parsed[1]!='') // if group is present, we use it, otherwise we create a new group + process_elem+=parsed[1]+my_related; + else + process_elem='item'+groupCounter+'.'+process_elem+'item'+groupCounter+'.'+my_related; + } + + if(incGroupCounter) groupCounter++; + vCardText+=process_elem; + } + } + ); + } + +// EMAIL + if(globalDisabledContactAttributes.indexOf('EMAIL')==-1) + { + tmpvCardEditorRef.find('[data-type="\\%email"]').each( + function (index,element) + { + if((value=$(element).find('[data-type="value"]').val())!='') + { + incGroupCounter=false; + if(vCard.tplM['contentline_EMAIL']!=null && (process_elem=vCard.tplM['contentline_EMAIL'][$(element).attr('data-id')])!=undefined) + { + // replace the object and related objects' group names (+ append the related objects after the processed) + parsed=('\r\n'+process_elem).match(RegExp('\r\n((?:'+vCard.re['group']+'\\.)?)','m')); + if(parsed[1]!='') // if group is present, replace the object and related objects' group names + { + process_elem=('\r\n'+process_elem).replace(RegExp('\r\n'+parsed[1].replace('.','\\.'),'mg'),'\r\nitem'+groupCounter+'.').substring(2); + incGroupCounter=true; + } + } + else + { + process_elem=vCard.tplC['contentline_EMAIL']; + process_elem=process_elem.replace('##:::##group_wd##:::##', ''); + } + + tmp_type=$(element).find('[data-type="email_type"] option').filter(':selected').attr('data-type'); + + /* construct the "custom" type */ + if(tmp_type==':custom') + { + var tmp_cust_value=$(element).find('[data-type="custom_value"]').val(); + var tmp_cust_value_processed=tmp_cust_value.replace(RegExp('^\\s*|\\s*$','g'),'').replaceAll(' ',' '); + // if a custom type is already defined as standard type, use the standard definition + if((tmp_cust_already_exists=$(element).find('[data-type="email_type"] option').filter(function(){return $(this).html()==tmp_cust_value_processed;}).attr('data-type'))!=undefined) + tmp_type=tmp_cust_already_exists; + else // use custom type + tmp_type=':'+tmp_cust_value+':'; + } + + params_wsc=''; + tmp_normal_types=tmp_type.replace(RegExp(':.*:','g'),',').replaceAll(',,',',').replace(RegExp('^,|,$','g'),''); + if(tmp_normal_types!='') + params_wsc=';TYPE='+vcardEscapeValue(tmp_normal_types).toUpperCase().replace(RegExp('\\\\,','g'),';TYPE='); + + process_elem=process_elem.replace('##:::##params_wsc##:::##',params_wsc); + process_elem=process_elem.replace('##:::##value##:::##',vcardEscapeValue(value)); + + my_related=''; + tmp_related_type=tmp_type.match(RegExp(':(.*):')); // only one element of related (X-ABLabel) is supported + + if(tmp_related_type!=null && tmp_related_type[1]!='') + my_related='X-ABLabel:'+vcardEscapeValue((dataTypes['email_type_store_as'][tmp_related_type[1]]!=undefined ? dataTypes['email_type_store_as'][tmp_related_type[1]] : tmp_related_type[1]))+'\r\n'; + + if(my_related!='') + { + incGroupCounter=true; + parsed=('\r\n'+process_elem).match(vCard.pre['contentline_parse']); + if(parsed[1]!='') // if group is present, we use it, otherwise we create a new group + process_elem+=parsed[1]+my_related; + else + process_elem='item'+groupCounter+'.'+process_elem+'item'+groupCounter+'.'+my_related; + } + + if(incGroupCounter) groupCounter++; + vCardText+=process_elem; + } + } + ); + } + +// URL + if(globalDisabledContactAttributes.indexOf('URL')==-1) + { + tmpvCardEditorRef.find('[data-type="\\%url"]').each( + function (index,element) + { + if((value=$(element).find('[data-type="value"]').val())!='') + { + incGroupCounter=false; + if(vCard.tplM['contentline_URL']!=null && (process_elem=vCard.tplM['contentline_URL'][$(element).attr('data-id')])!=undefined) + { + // replace the object and related objects' group names (+ append the related objects after the processed) + parsed=('\r\n'+process_elem).match(RegExp('\r\n((?:'+vCard.re['group']+'\\.)?)','m')); + if(parsed[1]!='') // if group is present, replace the object and related objects' group names + { + process_elem=('\r\n'+process_elem).replace(RegExp('\r\n'+parsed[1].replace('.','\\.'),'mg'),'\r\nitem'+groupCounter+'.').substring(2); + incGroupCounter=true; + } + } + else + { + process_elem=vCard.tplC['contentline_URL']; + process_elem=process_elem.replace('##:::##group_wd##:::##', ''); + } + + tmp_type=$(element).find('[data-type="url_type"] option').filter(':selected').attr('data-type'); + + /* construct the "custom" type */ + if(tmp_type==':custom') + { + var tmp_cust_value=$(element).find('[data-type="custom_value"]').val(); + var tmp_cust_value_processed=tmp_cust_value.replace(RegExp('^\\s*|\\s*$','g'),'').replaceAll(' ',' '); + // if a custom type is already defined as standard type, use the standard definition + if((tmp_cust_already_exists=$(element).find('[data-type="url_type"] option').filter(function(){return $(this).html()==tmp_cust_value_processed;}).attr('data-type'))!=undefined) + tmp_type=tmp_cust_already_exists; + else // use custom type + tmp_type=':'+tmp_cust_value+':'; + } + + params_wsc=''; + tmp_normal_types=tmp_type.replace(RegExp(':.*:','g'),',').replaceAll(',,',',').replace(RegExp('^,|,$','g'),''); + if(tmp_normal_types!='') + params_wsc=';TYPE='+vcardEscapeValue(tmp_normal_types).toUpperCase().replace(RegExp('\\\\,','g'),';TYPE='); + + process_elem=process_elem.replace('##:::##params_wsc##:::##',params_wsc); + process_elem=process_elem.replace('##:::##value##:::##',vcardEscapeValue(value)); + + my_related=''; + tmp_related_type=tmp_type.match(RegExp(':(.*):')); // only one element of related (X-ABLabel) is supported + + if(tmp_related_type!=null && tmp_related_type[1]!='') + my_related='X-ABLabel:'+vcardEscapeValue((dataTypes['url_type_store_as'][tmp_related_type[1]]!=undefined ? dataTypes['url_type_store_as'][tmp_related_type[1]] : tmp_related_type[1]))+'\r\n'; + + if(my_related!='') + { + incGroupCounter=true; + parsed=('\r\n'+process_elem).match(vCard.pre['contentline_parse']); + if(parsed[1]!='') // if group is present, we use it, otherwise we create a new group + process_elem+=parsed[1]+my_related; + else + process_elem='item'+groupCounter+'.'+process_elem+'item'+groupCounter+'.'+my_related; + } + + if(incGroupCounter) groupCounter++; + vCardText+=process_elem; + } + } + ); + } + +// X-ABRELATEDNAMES + if(globalDisabledContactAttributes.indexOf('X-ABRELATEDNAMES')==-1) + { + tmpvCardEditorRef.find('[data-type="\\%person"]').each( + function (index,element) + { + if((value=$(element).find('[data-type="value"]').val())!='') + { + incGroupCounter=false; + if(vCard.tplM['contentline_X-ABRELATEDNAMES']!=null && (process_elem=vCard.tplM['contentline_X-ABRELATEDNAMES'][$(element).attr('data-id')])!=undefined) + { + // replace the object and related objects' group names (+ append the related objects after the processed) + parsed=('\r\n'+process_elem).match(RegExp('\r\n((?:'+vCard.re['group']+'\\.)?)','m')); + if(parsed[1]!='') // if group is present, replace the object and related objects' group names + { + process_elem=('\r\n'+process_elem).replace(RegExp('\r\n'+parsed[1].replace('.','\\.'),'mg'),'\r\nitem'+groupCounter+'.').substring(2); + incGroupCounter=true; + } + } + else + { + process_elem=vCard.tplC['contentline_X-ABRELATEDNAMES']; + process_elem=process_elem.replace('##:::##group_wd##:::##', ''); + } + + tmp_type=$(element).find('[data-type="person_type"] option').filter(':selected').attr('data-type'); + + /* construct the "custom" type */ + if(tmp_type==':custom') + { + var tmp_cust_value=$(element).find('[data-type="custom_value"]').val(); + var tmp_cust_value_processed=tmp_cust_value.replace(RegExp('^\\s*|\\s*$','g'),'').replaceAll(' ',' '); + // if a custom type is already defined as standard type, use the standard definition + if((tmp_cust_already_exists=$(element).find('[data-type="person_type"] option').filter(function(){return $(this).html()==tmp_cust_value_processed;}).attr('data-type'))!=undefined) + tmp_type=tmp_cust_already_exists; + else // use custom type + tmp_type=':'+tmp_cust_value+':'; + } + + params_wsc=''; + tmp_normal_types=tmp_type.replace(RegExp(':.*:','g'),',').replaceAll(',,',',').replace(RegExp('^,|,$','g'),''); + if(tmp_normal_types!='') + params_wsc=';TYPE='+vcardEscapeValue(tmp_normal_types).toUpperCase().replace(RegExp('\\\\,','g'),';TYPE='); + + process_elem=process_elem.replace('##:::##params_wsc##:::##',params_wsc); + process_elem=process_elem.replace('##:::##value##:::##',vcardEscapeValue(value)); + + my_related=''; + tmp_related_type=tmp_type.match(RegExp(':(.*):')); // only one element of related (X-ABLabel) is supported + + if(tmp_related_type!=null && tmp_related_type[1]!='') + my_related='X-ABLabel:'+vcardEscapeValue((dataTypes['person_type_store_as'][tmp_related_type[1]]!=undefined ? dataTypes['person_type_store_as'][tmp_related_type[1]] : tmp_related_type[1]))+'\r\n'; + + if(my_related!='') + { + incGroupCounter=true; + parsed=('\r\n'+process_elem).match(vCard.pre['contentline_parse']); + if(parsed[1]!='') // if group is present, we use it, otherwise we create a new group + process_elem+=parsed[1]+my_related; + else + process_elem='item'+groupCounter+'.'+process_elem+'item'+groupCounter+'.'+my_related; + } + + if(incGroupCounter) groupCounter++; + + if(tmp_related_type!=null && tmp_related_type[1]!='') + { + // In addition of the X-ABRELATEDNAMES attributes add also the old style X-* attributes + switch(tmp_related_type[1]) + { + case '_$!!$_': + process_elem+='X-ASSISTANT:'+vcardEscapeValue(value)+'\r\n'; + // process_elem+='X-EVOLUTION-ASSISTANT:'+vcardEscapeValue(value)+'\r\n'; + break; + case '_$!!$_': + process_elem+='X-MANAGER:'+vcardEscapeValue(value)+'\r\n'; + // process_elem+='X-EVOLUTION-MANAGER:'+vcardEscapeValue(value)+'\r\n'; + break; + case '_$!!$_': + process_elem+='X-SPOUSE:'+vcardEscapeValue(value)+'\r\n'; + // process_elem+='X-EVOLUTION-SPOUSE:'+vcardEscapeValue(value)+'\r\n'; + break; + default: + break; + } + } + + vCardText+=process_elem; + } + } + ); + } + +// IMPP + if(globalDisabledContactAttributes.indexOf('IMPP')==-1) + { + tmpvCardEditorRef.find('[data-type="\\%im"]').each( + function (index,element) + { + if((value=$(element).find('[data-type="value"]').val())!='') + { + incGroupCounter=false; + if(vCard.tplM['contentline_IMPP']!=null && (process_elem=vCard.tplM['contentline_IMPP'][$(element).attr('data-id')])!=undefined) + { + // replace the object and related objects' group names (+ append the related objects after the processed) + parsed=('\r\n'+process_elem).match(RegExp('\r\n((?:'+vCard.re['group']+'\\.)?)','m')); + if(parsed[1]!='') // if group is present, replace the object and related objects' group names + { + process_elem=('\r\n'+process_elem).replace(RegExp('\r\n'+parsed[1].replace('.','\\.'),'mg'),'\r\nitem'+groupCounter+'.').substring(2); + incGroupCounter=true; + } + } + else + { + process_elem=vCard.tplC['contentline_IMPP']; + process_elem=process_elem.replace('##:::##group_wd##:::##', ''); + } + + tmp_type=$(element).find('[data-type="im_type"] option').filter(':selected').attr('data-type'); + + /* construct the "custom" type */ + if(tmp_type==':custom') + { + var tmp_cust_value=$(element).find('[data-type="custom_value"]:first').val(); + var tmp_cust_value_processed=tmp_cust_value.replace(RegExp('^\\s*|\\s*$','g'),'').replaceAll(' ',' '); + // if a custom type is already defined as standard type, use the standard definition + if((tmp_cust_already_exists=$(element).find('[data-type="im_type"] option').filter(function(){return $(this).html()==tmp_cust_value_processed;}).attr('data-type'))!=undefined) + tmp_type=tmp_cust_already_exists; + else // use custom type + tmp_type=':'+tmp_cust_value+':'; + } + + params_wsc=params_wsc_old_repr=''; + tmp_normal_types=tmp_type.replace(RegExp(':.*:','g'),',').replaceAll(',,',',').replace(RegExp('^,|,$','g'),''); + if(tmp_normal_types!='') + params_wsc=params_wsc_old_repr=';TYPE='+vcardEscapeValue(tmp_normal_types).toUpperCase().replace(RegExp('\\\\,','g'),';TYPE='); + + tmp_service_type=$(element).find('[data-type="im_service_type"] option').filter(':selected').attr('data-type'); + + /* construct the "custom" type */ + if(tmp_service_type==':custom') + { + var tmp_cust_value=$(element).find('[data-type="custom_value"]:last').val(); + var tmp_cust_value_processed=tmp_cust_value.replace(RegExp('^\\s*|\\s*$','g'),'').replaceAll(' ',' '); + // if a custom type is already defined as standard type, use the standard definition + if((tmp_cust_already_exists=$(element).find('[data-type="im_service_type"] option').filter(function(){return $(this).html()==tmp_cust_value_processed;}).attr('data-type'))!=undefined) + tmp_service_type=tmp_cust_already_exists; + else // use custom type + tmp_service_type=':'+tmp_cust_value+':'; + } + + if(dataTypes['im_service_type_store_as'][tmp_service_type]!=undefined) + tmp_service_type=dataTypes['im_service_type_store_as'][tmp_service_type]; + params_wsc=';X-SERVICE-TYPE='+vcardEscapeValue(tmp_service_type)+params_wsc; + + process_elem=process_elem.replace('##:::##params_wsc##:::##',params_wsc); + switch(tmp_service_type.toLowerCase()) // RFC4770 + { + case 'aim': + im_value='aim:'+vcardEscapeValue(value); + break; + case 'facebook': + im_value='xmpp:'+vcardEscapeValue(value); + break; + case 'googletalk': + im_value='xmpp:'+vcardEscapeValue(value); + break; + case 'icq': + im_value='aim:'+vcardEscapeValue(value); + break; + case 'irc': + im_value='irc:'+vcardEscapeValue(value); + break; + case 'jabber': + im_value='xmpp:'+vcardEscapeValue(value); + break; + case 'msn': + im_value='msnim:'+vcardEscapeValue(value); + break; + case 'skype': + im_value='skype:'+vcardEscapeValue(value); + break; + case 'yahoo': + im_value='ymsgr:'+vcardEscapeValue(value); + break; + default: // 'gadugadu', 'qq', ... + im_value='x-apple:'+vcardEscapeValue(value); + break; + } + process_elem=process_elem.replace('##:::##value##:::##',im_value); + + my_related=''; + tmp_related_type=tmp_type.match(RegExp(':(.*):')); // only one element of related (X-ABLabel) is supported + + if(tmp_related_type!=null && tmp_related_type[1]!='') + my_related='X-ABLabel:'+vcardEscapeValue((dataTypes['im_type_store_as'][tmp_related_type[1]]!=undefined ? dataTypes['im_type_store_as'][tmp_related_type[1]] : tmp_related_type[1]))+'\r\n'; + + if(my_related!='') + { + incGroupCounter=true; + parsed=('\r\n'+process_elem).match(vCard.pre['contentline_parse']); + if(parsed[1]!='') // if group is present, we use it, otherwise we create a new group + process_elem+=parsed[1]+my_related; + else + process_elem='item'+groupCounter+'.'+process_elem+'item'+groupCounter+'.'+my_related; + } + if(incGroupCounter) groupCounter++; + + // In addition of the IMPP attributes add also the old style X-* attributes + process_elem_old_repr=''; + switch(tmp_service_type.toLowerCase()) + { + case 'aim': + new_group_wd=''; + if(incGroupCounter) + { + new_group_wd='item'+groupCounter+'.'; + process_elem_old_repr=('\r\n'+process_elem).replace(RegExp('\r\nitem'+(groupCounter-1)+'\\.','mg'),'\r\n'+new_group_wd); + groupCounter++; + } + else + process_elem_old_repr='\r\n'+process_elem; + process_elem+=process_elem_old_repr.replace('\r\n'+new_group_wd+'IMPP;X-SERVICE-TYPE='+ vcardEscapeValue(tmp_service_type),new_group_wd+'X-AIM').replace(im_value+'\r\n',vcardEscapeValue(value)+'\r\n'); + break; + case 'jabber': + new_group_wd=''; + if(incGroupCounter) + { + new_group_wd='item'+groupCounter+'.'; + process_elem_old_repr=('\r\n'+process_elem).replace(RegExp('\r\nitem'+(groupCounter-1)+'\\.','mg'),'\r\n'+new_group_wd); + groupCounter++; + } + else + process_elem_old_repr='\r\n'+process_elem; + process_elem+=process_elem_old_repr.replace('\r\n'+new_group_wd+'IMPP;X-SERVICE-TYPE='+ vcardEscapeValue(tmp_service_type),new_group_wd+'X-JABBER').replace(im_value+'\r\n',vcardEscapeValue(value)+'\r\n'); + break; + case 'msn': + new_group_wd=''; + if(incGroupCounter) + { + new_group_wd='item'+groupCounter+'.'; + process_elem_old_repr=('\r\n'+process_elem).replace(RegExp('\r\nitem'+(groupCounter-1)+'\\.','mg'),'\r\n'+new_group_wd); + groupCounter++; + } + else + process_elem_old_repr='\r\n'+process_elem; + process_elem+=process_elem_old_repr.replace('\r\n'+new_group_wd+'IMPP;X-SERVICE-TYPE='+ vcardEscapeValue(tmp_service_type),new_group_wd+'X-MSN').replace(im_value+'\r\n',vcardEscapeValue(value)+'\r\n'); + break; + case 'yahoo': + new_group_wd=''; + process_elem_tmp=process_elem; + if(incGroupCounter) + { + new_group_wd='item'+groupCounter+'.'; + process_elem_old_repr=('\r\n'+process_elem_tmp).replace(RegExp('\r\nitem'+(groupCounter-1)+'\\.','mg'),'\r\n'+new_group_wd); + groupCounter++; + } + else + process_elem_old_repr='\r\n'+process_elem; + process_elem+=process_elem_old_repr.replace('\r\n'+new_group_wd+'IMPP;X-SERVICE-TYPE='+ vcardEscapeValue(tmp_service_type),new_group_wd+'X-YAHOO').replace(im_value+'\r\n',vcardEscapeValue(value)+'\r\n'); + + new_group_wd=''; + if(incGroupCounter) + { + new_group_wd='item'+groupCounter+'.'; + process_elem_old_repr=('\r\n'+process_elem_tmp).replace(RegExp('\r\nitem'+(groupCounter-2)+'\\.','mg'),'\r\n'+new_group_wd); + groupCounter++; + } + else + process_elem_old_repr='\r\n'+process_elem; + process_elem+=process_elem_old_repr.replace('\r\n'+new_group_wd+'IMPP;X-SERVICE-TYPE='+ vcardEscapeValue(tmp_service_type),new_group_wd+'X-YAHOO-ID').replace(im_value+'\r\n',vcardEscapeValue(value)+'\r\n'); + break; + case 'icq': + new_group_wd=''; + if(incGroupCounter) + { + new_group_wd='item'+groupCounter+'.'; + process_elem_old_repr=('\r\n'+process_elem).replace(RegExp('\r\nitem'+(groupCounter-1)+'\\.','mg'),'\r\n'+new_group_wd); + groupCounter++; + } + else + process_elem_old_repr='\r\n'+process_elem; + process_elem+=process_elem_old_repr.replace('\r\n'+new_group_wd+'IMPP;X-SERVICE-TYPE='+ vcardEscapeValue(tmp_service_type),new_group_wd+'X-ICQ').replace(im_value+'\r\n',vcardEscapeValue(value)+'\r\n'); + break; + default: + break; + } + vCardText+=process_elem; + } + } + ); + } + +// X-SOCIALPROFILE + if(globalDisabledContactAttributes.indexOf('X-SOCIALPROFILE')==-1) + { + tmpvCardEditorRef.find('[data-type="\\%profile"]').each( + function (index,element) + { + if((value=$(element).find('[data-type="value"]').val())!='') + { + incGroupCounter=false; + if(vCard.tplM['contentline_X-SOCIALPROFILE']!=null && (process_elem=vCard.tplM['contentline_X-SOCIALPROFILE'][$(element).attr('data-id')])!=undefined) + { + // replace the object and related objects' group names (+ append the related objects after the processed) + parsed=('\r\n'+process_elem).match(RegExp('\r\n((?:'+vCard.re['group']+'\\.)?)','m')); + if(parsed[1]!='') // if group is present, replace the object and related objects' group names + { + process_elem=('\r\n'+process_elem).replace(RegExp('\r\n'+parsed[1].replace('.','\\.'),'mg'),'\r\nitem'+groupCounter+'.').substring(2); + incGroupCounter=true; + } + } + else + { + process_elem=vCard.tplC['contentline_X-SOCIALPROFILE']; + process_elem=process_elem.replace('##:::##group_wd##:::##', ''); + } + + tmp_type=$(element).find('[data-type="profile_type"] option').filter(':selected').attr('data-type'); + + /* construct the "custom" type */ + if(tmp_type==':custom') + { + var tmp_cust_value=$(element).find('[data-type="custom_value"]').val(); + var tmp_cust_value_processed=tmp_cust_value.replace(RegExp('^\\s*|\\s*$','g'),'').replaceAll(' ',' '); + // if a custom type is already defined as standard type, use the standard definition + if((tmp_cust_already_exists=$(element).find('[data-type="profile_type"] option').filter(function(){return $(this).html()==tmp_cust_value_processed;}).attr('data-type'))!=undefined) + tmp_type=tmp_cust_already_exists; + else // use custom type + tmp_type=':'+tmp_cust_value+':'; + } + + params_wsc=''; + tmp_normal_types=tmp_type.replace(RegExp(':.*:','g'),',').replaceAll(',,',',').replace(RegExp('^,|,$','g'),''); + if(tmp_normal_types!='') + params_wsc=';TYPE='+vcardEscapeValue(tmp_normal_types).toUpperCase().replace(RegExp('\\\\,','g'),';TYPE=')+';x-user='+vcardEscapeValue(tmp_type=='twitter' ? value.replace(/^@+/, '') : value); + + process_elem=process_elem.replace('##:::##params_wsc##:::##',params_wsc); + process_elem=process_elem.replace('##:::##value##:::##', vcardEscapeValue((globalSettings.urihandlerprofile.value[tmp_type]!=undefined ? globalSettings.urihandlerprofile.value[tmp_type] : 'x-apple:%u').replace('%u', (tmp_type=='twitter' ? value.replace(/^@+/, '') : value)))); + + if(incGroupCounter) groupCounter++; + vCardText+=process_elem; + } + } + ); + } + + // extension hook + if(typeof(globalContactsExtDataToVcard)=='function') + vCardText=globalContactsExtDataToVcard(tmpvCardEditorRef, vCardText); + + // PRODID + vCardText+='PRODID:-//Inf-IT//'+globalAppName+' '+globalVersion+'//EN\r\n'; + + if(typeof vCard.tplM['unprocessed_unrelated']!='undefined') + vCardText+=vCard.tplM['unprocessed_unrelated'].replace(RegExp('^\r\n'),''); + + // vCard END (required by RFC) + if(vCard.tplM['end']!=null && (process_elem=vCard.tplM['end'][0])!=undefined) + vCardText+=vCard.tplM['end'][0]; + else + { + process_elem=vCard.tplC['end']; + process_elem=process_elem.replace('##:::##group_wd##:::##', ''); + vCardText+=process_elem; + } + + // replace unsupported XML characters + vCardText=vCardText.replace(/[^\u0009\u000A\u000D\u0020-\uD7FF\uE000-\uFFFD]/g, ' '); + + // line folding (RFC2426 - section 2.6) - maximum of 75 octects (and cannot break + // multi-octet UTF8-characters) allowed on one line, excluding a line break (CRLF) + vCardText=vObjectLineFolding(vCardText); + + if(typeof(globalContactsExtPutVcardToCollectionOverload)=='function') + globalContactsExtPutVcardToCollectionOverload(accountUID, inputEtag, newUID, vCardText); + else + { + var selAddr = tmpvCardEditorRef.find('[data-attr-name="_DEST_"]').find('option:selected').attr('data-type') + //addressbook selectbox was changed + var orgAddr = $('#vCardEditor').attr('data-url').replace(RegExp('[^/]*$'),''); + if($('#ExtendedDest').length>0) + { + var putGroups=new Array(); + var removeGroups=new Array(); + var myGroups = new Array() + if(inputEtag!='') + { + myGroups=globalAddressbookList.getMyContactGroups($('#vCardEditor').attr('data-url')); + for(var gi=0; gi0) + { + tmp2.uiObjects={resource:globalRefAddContact.attr('data-filter-url')}; + if(putGroups.length>0) + tmp2.addToContactGroupUID=putGroups.slice(); + if(removeGroups.length>0) + tmp2.removeToContactGroupUID=removeGroups.slice(); + } + tmp2.formSave=true; + lockAndPerformToCollection(tmp2, globalRefAddContact.attr('data-filter-url'), 'IRM_DELETE'); + } + else + { + if(inputEtag=='') + inputUID=selAddr; + if($('#ExtendedDest').length>0 && (putGroups.length>0 || removeGroups.length>0)) + { + if(inputEtag!='') + var tmp2=globalAddressbookList.getContactByUID($('#vCardEditor').attr('data-url')); + else + var tmp2={accountUID: accountUID, uid: inputUID, etag: inputEtag}; + var vUID = $('#vCardEditor').attr('data-url').match(RegExp('[^/]*$')); + // here we generate the destination for MOVE (we don't use the old vCard file name to minimalize the possible conflict situations) + tmp2.vcard=vCardText; + tmp2.uiObjects={resource:globalRefAddContact.attr('data-filter-url')}; + tmp2.addToContactGroupUID=new Array(); + tmp2.removeToContactGroupUID=new Array(); + if(putGroups.length>0) + tmp2.addToContactGroupUID=putGroups.slice(); + if(removeGroups.length>0) + tmp2.removeToContactGroupUID=removeGroups.slice(); + tmp2.formSave=true; + lockAndPerformToCollection(tmp2, globalRefAddContact.attr('data-filter-url'), 'PUT'); + } + else + putVcardToCollectionMain({accountUID: accountUID, uid: inputUID, etag: inputEtag, vcard: vCardText}, inputFilterUID); + } + } +} + +function vcardToData(inputContact, inputIsReadonly, inputIsCompany, inputEditorMode) +{ + if(typeof globalDebug!='undefined' && globalDebug instanceof Array && globalDebug.indexOf('vcard')!=-1) + console.time('vcardToData timer'); + + if(inputContact.vcard==undefined) + { + console.log("Error: '"+inputContact.uid+"': unable to parse vCard"); + return false; + } + + var tmpvCardEditorRef=CardDAVeditor_cleanup(false, inputIsCompany); // editor initialization + + $('#ABContactColor').css('background-color', inputContact.color); + + if(typeof globalDisabledContactAttributes=='undefined' || !(globalDisabledContactAttributes instanceof Array)) + globalDisabledContactAttributes=[]; + + if(inputContact.vcard.match(vCard.pre['vcard'])) + { + // ------------------------------------------------------------------------------------- // + // BEGIN and END + vcard_full=inputContact.vcard.split('\r\n'); // vCard data to array + + // parsed (contentline_parse) = [1]->"group.", [2]->"name", [3]->";param;param", [4]->"value" + if((parsed=('\r\n'+vcard_full[0]+'\r\n').match(vCard.pre['contentline_parse']))==null) + { + console.log("Error: '"+inputContact.uid+"': unable to parse vCard"); + return false; + } + // values not directly supported by the editor (old values are kept intact) + vCard.tplM['begin'][0]=vCard.tplC['begin'].replace('##:::##group_wd##:::##', vcard_begin_group=parsed[1]); + // parsed (contentline_parse) = [1]->"group.", [2]->"name", [3]->";param;param", [4]->"value" + if((parsed=('\r\n'+vcard_full[vcard_full.length-2]+'\r\n').match(vCard.pre['contentline_parse']))==null) + { + console.log("Error: '"+inputContact.uid+"': unable to parse vCard"); + return false; + } + // values not directly supported by the editor (old values are kept intact) + vCard.tplM['end'][0]=vCard.tplC['end'].replace('##:::##group_wd##:::##', vcard_end_group=parsed[1]); + + if(vcard_begin_group!=vcard_end_group) + { + console.log("Error: '"+inputContact.uid+"': unable to parse vCard"); + return false; // the vCard BEGIN and END "group" are different + } + + // remove the vCard BEGIN and END + vcard='\r\n'+vcard_full.slice(1, vcard_full.length-2).join('\r\n')+'\r\n'; + +//console.time('VERSION timer'); + // ------------------------------------------------------------------------------------- // + // VERSION -> what to do if present more than once? + vcard_element=vcard.match(vCard.pre['contentline_VERSION']); + if(vcard_element!=null && vcard_element.length==1) // if the VERSION attribute is not present exactly once, vCard is considered invalid + { + // parsed (contentline_parse) = [1]->"group.", [2]->"name", [3]->";param;param", [4]->"value" + parsed=vcard_element[0].match(vCard.pre['contentline_parse']); + if(parsed[3]=='' && parsed[4]=='3.0') // RFC requirement + { + // values not directly supported by the editor (old values are kept intact) + vCard.tplM['contentline_VERSION'][0]=vCard.tplC['contentline_VERSION']; + vCard.tplM['contentline_VERSION'][0]=vCard.tplM['contentline_VERSION'][0].replace('##:::##group_wd##:::##', parsed[1]); + vCard.tplM['contentline_VERSION'][0]=vCard.tplM['contentline_VERSION'][0].replace('##:::##version##:::##', parsed[4]); + + // remove the processed parameter + vcard=vcard.replace(vcard_element[0], '\r\n'); + + // find the corresponding group data (if exists) + if(parsed[1]!='') + { + var re=RegExp('\r\n'+parsed[1].replace('.','\\..*')+'\r\n', 'im'); + while((vcard_element_related=vcard.match(re))!=null) + { + // append the parameter to its parent + vCard.tplM['contentline_VERSION'][0]+=vcard_element_related[0].substr(2); + // remove the processed parameter + vcard=vcard.replace(vcard_element_related[0],'\r\n'); + } + } + } + else + { + console.log("Error: '"+inputContact.uid+"': unable to parse vCard"); + return false; // invalid input for "VERSION" (we support only vCard 3.0) + } + } + else + { + console.log("Error: '"+inputContact.uid+"': unable to parse vCard"); + return false; // vcard "VERSION" not present or present more than once + } +//console.timeEnd('VERSION timer'); + +//console.time('UID timer'); + // ------------------------------------------------------------------------------------- // + // UID -> TODO: what to do if present more than once? + vcard_element=vcard.match(vCard.pre['contentline_UID']); + if(vcard_element!=null && vcard_element.length==1) // if the UID attribute is not present exactly once, vCard is considered invalid + { + // parsed (contentline_parse) = [1]->"group.", [2]->"name", [3]->";param;param", [4]->"value" + parsed=vcard_element[0].match(vCard.pre['contentline_parse']); + + // values not directly supported by the editor (old values are kept intact) + vCard.tplM['contentline_UID'][0]=vCard.tplC['contentline_UID']; + vCard.tplM['contentline_UID'][0]=vCard.tplM['contentline_UID'][0].replace('##:::##group_wd##:::##', parsed[1]); + vCard.tplM['contentline_UID'][0]=vCard.tplM['contentline_UID'][0].replace('##:::##params_wsc##:::##', parsed[3]); + vCard.tplM['contentline_UID'][0]=vCard.tplM['contentline_UID'][0].replace('##:::##uid##:::##', parsed[4]); + + tmpvCardEditorRef.find('#vCardEditor').attr('data-vcard-uid', parsed[4]); // special hack; usually used by extension hooks + + // remove the processed parameter + vcard=vcard.replace(vcard_element[0], '\r\n'); + + // find the corresponding group data (if exists) + if(parsed[1]!='') + { + var re=RegExp('\r\n'+parsed[1].replace('.','\\..*')+'\r\n', 'im'); + while((vcard_element_related=vcard.match(re))!=null) + { + // append the parameter to its parent + vCard.tplM['contentline_UID'][0]+=vcard_element_related[0].substr(2); + // remove the processed parameter + vcard=vcard.replace(vcard_element_related[0],'\r\n'); + } + } + } +// Old not RFC vCards not contain UID - we ignore this error (UID is generated if vCard is changed) +// else +// { +// console.log("Error: '"+inputContact.uid+"': unable to parse vCard"); +// return false; // vcard UID not present or present more than once +// } +//console.timeEnd('UID timer'); + +//console.time('FN timer'); + // ------------------------------------------------------------------------------------- // + // FN -> TODO: what to do if present more than once? + vcard_element=vcard.match(vCard.pre['contentline_FN']); + if(vcard_element!=null && vcard_element.length==1) // if the FN attribute is not present exactly once, vCard is considered invalid + { + // parsed (contentline_parse) = [1]->"group.", [2]->"name", [3]->";param;param", [4]->"value" + parsed=vcard_element[0].match(vCard.pre['contentline_parse']); + + // values not directly supported by the editor (old values are kept intact) + vCard.tplM['contentline_FN'][0]=vCard.tplC['contentline_FN']; + vCard.tplM['contentline_FN'][0]=vCard.tplM['contentline_FN'][0].replace('##:::##group_wd##:::##', parsed[1]); + vCard.tplM['contentline_FN'][0]=vCard.tplM['contentline_FN'][0].replace('##:::##params_wsc##:::##', parsed[3]); + + // remove the processed parameter + vcard=vcard.replace(vcard_element[0],'\r\n'); + + // find the corresponding group data (if exists) + if(parsed[1]!='') + { + var re=RegExp('\r\n'+parsed[1].replace('.','\\..*')+'\r\n', 'im'); + while((vcard_element_related=vcard.match(re))!=null) + { + // append the parameter to its parent + vCard.tplM['contentline_FN'][0]+=vcard_element_related[0].substr(2); + // remove the processed parameter + vcard=vcard.replace(vcard_element_related[0],'\r\n'); + } + } + } + else + { + console.log("Error: '"+inputContact.uid+"': unable to parse vCard"); + return false; // vcard FN not present or present more than once + } +//console.timeEnd('FN timer'); + +//console.time('N timer'); + // ------------------------------------------------------------------------------------- // + // N -> TODO: what to do if present more than once? + vcard_element=vcard.match(vCard.pre['contentline_N']); + if(vcard_element!=null && vcard_element.length==1) // if the N attribute is not present exactly once, vCard is considered invalid + { + // parsed (contentline_parse) = [1]->"group.", [2]->"name", [3]->";param;param", [4]->"value" + parsed=vcard_element[0].match(vCard.pre['contentline_parse']); + // parsed_value = [0]->Family, [1]->Given, [2]->Middle, [3]->Prefix, [4]->Suffix + parsed_value=vcardSplitValue(parsed[4],';'); + + if(parsed_value[0]!=undefined && parsed_value[0]!='') + tmpvCardEditorRef.find('[data-type="family"]').val(vcardUnescapeValue(parsed_value[0])); + if(parsed_value[1]!=undefined && parsed_value[1]!='') + tmpvCardEditorRef.find('[data-type="given"]').val(vcardUnescapeValue(parsed_value[1])); + if(parsed_value[2]!=undefined && parsed_value[2]!='') + tmpvCardEditorRef.find('[data-type="middle"]').val(vcardUnescapeValue(parsed_value[2])); + if(parsed_value[3]!=undefined && parsed_value[3]!='') + tmpvCardEditorRef.find('[data-type="prefix"]').val(vcardUnescapeValue(parsed_value[3])); + if(parsed_value[4]!=undefined && parsed_value[4]!='') + tmpvCardEditorRef.find('[data-type="suffix"]').val(vcardUnescapeValue(parsed_value[4])); + + // values not directly supported by the editor (old values are kept intact) + vCard.tplM['contentline_N'][0]=vCard.tplC['contentline_N']; + vCard.tplM['contentline_N'][0]=vCard.tplM['contentline_N'][0].replace('##:::##group_wd##:::##', parsed[1]); + vCard.tplM['contentline_N'][0]=vCard.tplM['contentline_N'][0].replace('##:::##params_wsc##:::##', parsed[3]); + + // remove the processed parameter + vcard=vcard.replace(vcard_element[0],'\r\n'); + + // find the corresponding group data (if exists) + if(parsed[1]!='') + { + var re=RegExp('\r\n'+parsed[1].replace('.','\\..*')+'\r\n', 'im'); + while((vcard_element_related=vcard.match(re))!=null) + { + // append the parameter to its parent + vCard.tplM['contentline_N'][0]+=vcard_element_related[0].substr(2); + // remove the processed parameter + vcard=vcard.replace(vcard_element_related[0],'\r\n'); + } + } + } + else + { + console.log("Error: '"+inputContact.uid+"': unable to parse vCard"); + return false; // vcard N not present or present more than once + } +//console.timeEnd('N timer'); + +//console.time('CATEGORIES timer'); + // ------------------------------------------------------------------------------------- // + // CATEGORIES -> present max. once because of the CardDavMATE vCard transformations + if(globalDisabledContactAttributes.indexOf('CATEGORIES')==-1) + { + vcard_element=vcard.match(vCard.pre['contentline_CATEGORIES']); + if(vcard_element!=null && vcard_element.length==1) + { + // parsed (contentline_parse) = [1]->"group.", [2]->"name", [3]->";param;param", [4]->"value" + parsed=vcard_element[0].match(vCard.pre['contentline_parse']); + + tmpvCardEditorRef.find('#tags').importTags(parsed[4]); // we do not need to unescape the value here! + + // values not directly supported by the editor (old values are kept intact) + vCard.tplM['contentline_CATEGORIES'][0]=vCard.tplC['contentline_CATEGORIES']; + vCard.tplM['contentline_CATEGORIES'][0]=vCard.tplM['contentline_CATEGORIES'][0].replace('##:::##group_wd##:::##', parsed[1]); + vCard.tplM['contentline_CATEGORIES'][0]=vCard.tplM['contentline_CATEGORIES'][0].replace('##:::##params_wsc##:::##', parsed[3]); + + // remove the processed parameter + vcard=vcard.replace(vcard_element[0],'\r\n'); + + // find the corresponding group data (if exists) + if(parsed[1]!='') + { + var re=RegExp('\r\n'+parsed[1].replace('.','\\..*')+'\r\n', 'im'); + while((vcard_element_related=vcard.match(re))!=null) + { + // append the parameter to its parent + vCard.tplM['contentline_CATEGORIES'][0]+=vcard_element_related[0].substr(2); + // remove the processed parameter + vcard=vcard.replace(vcard_element_related[0],'\r\n'); + } + } + } + } +//console.timeEnd('CATEGORIES timer'); + +//console.time('NOTE timer'); + // ------------------------------------------------------------------------------------- // + // NOTE -> TODO: what to do if present more than once? + if(globalDisabledContactAttributes.indexOf('NOTE')==-1) + { + vcard_element=vcard.match(vCard.pre['contentline_NOTE']); + if(vcard_element!=null) + { + if(vcard_element.length==1) // if the NOTE attribute is present exactly once + { + // parsed (contentline_parse) = [1]->"group.", [2]->"name", [3]->";param;param", [4]->"value" + parsed=vcard_element[0].match(vCard.pre['contentline_parse']); + + tmpvCardEditorRef.find('[data-type="\\%note"]').find('textarea').text(vcardUnescapeValue(parsed[4])).trigger('autosize.resize'); + + // values not directly supported by the editor (old values are kept intact) + vCard.tplM['contentline_NOTE'][0]=vCard.tplC['contentline_NOTE']; + vCard.tplM['contentline_NOTE'][0]=vCard.tplM['contentline_NOTE'][0].replace('##:::##group_wd##:::##', parsed[1]); + vCard.tplM['contentline_NOTE'][0]=vCard.tplM['contentline_NOTE'][0].replace('##:::##params_wsc##:::##', parsed[3]); + + // remove the processed parameter + vcard=vcard.replace(vcard_element[0],'\r\n'); + + // find the corresponding group data (if exists) + if(parsed[1]!='') + { + var re=RegExp('\r\n'+parsed[1].replace('.','\\..*')+'\r\n', 'im'); + while((vcard_element_related=vcard.match(re))!=null) + { + // append the parameter to its parent + vCard.tplM['contentline_NOTE'][0]+=vcard_element_related[0].substr(2); + // remove the processed parameter + vcard=vcard.replace(vcard_element_related[0],'\r\n'); + } + } + } + else + { + console.log("Error: '"+inputContact.uid+"': unable to parse vCard"); + return false; // vcard NOTE present more than once + } + } + } +//console.timeEnd('NOTE timer'); + +//console.time('REV timer'); + // ------------------------------------------------------------------------------------- // + // REV -> what to do if present more than once? + vcard_element=vcard.match(vCard.pre['contentline_REV']); + if(vcard_element!=null) // if the REV attribute is exists + { + if(vcard_element.length==1) // and is present exactly once + { + // parsed (contentline_parse) = [1]->"group.", [2]->"name", [3]->";param;param", [4]->"value" + parsed=vcard_element[0].match(vCard.pre['contentline_parse']); + + // values not directly supported by the editor (old values are kept intact) + vCard.tplM['contentline_REV'][0]=vCard.tplC['contentline_REV']; + vCard.tplM['contentline_REV'][0]=vCard.tplM['contentline_REV'][0].replace('##:::##group_wd##:::##', parsed[1]); + + // remove the processed parameter + vcard=vcard.replace(vcard_element[0],'\r\n'); + + // find the corresponding group data (if exists) + if(parsed[1]!='') + { + var re=RegExp('\r\n'+parsed[1].replace('.','\\..*')+'\r\n', 'im'); + while((vcard_element_related=vcard.match(re))!=null) + { + // append the parameter to its parent + vCard.tplM['contentline_REV'][0]+=vcard_element_related[0].substr(2); + // remove the processed parameter + vcard=vcard.replace(vcard_element_related[0],'\r\n'); + } + } + } + else + { + console.log("Error: '"+inputContact.uid+"': unable to parse vCard"); + return false; // vcard REV present more than once + } + } +//console.timeEnd('REV timer'); + +//console.time('NICKNAME timer'); + // ------------------------------------------------------------------------------------- // + // NICKNAME -> TODO: what to do if present more than once? + if(globalDisabledContactAttributes.indexOf('NICKNAME')==-1) + { + vcard_element=vcard.match(vCard.pre['contentline_NICKNAME']); + if(vcard_element!=null) + { + if(vcard_element.length!=1) // if the NICKNAME attribute is present more than once, vCard is considered invalid + { + console.log("Error: '"+inputContact.uid+"': unable to parse vCard"); + return false; + } + + // parsed (contentline_parse) = [1]->"group.", [2]->"name", [3]->";param;param", [4]->"value" + parsed=vcard_element[0].match(vCard.pre['contentline_parse']); + + tmpvCardEditorRef.find('[data-type="nickname"]').val(vcardUnescapeValue(parsed[4])); + + // values not directly supported by the editor (old values are kept intact) + vCard.tplM['contentline_NICKNAME'][0]=vCard.tplC['contentline_NICKNAME']; + vCard.tplM['contentline_NICKNAME'][0]=vCard.tplM['contentline_NICKNAME'][0].replace('##:::##group_wd##:::##', parsed[1]); + vCard.tplM['contentline_NICKNAME'][0]=vCard.tplM['contentline_NICKNAME'][0].replace('##:::##params_wsc##:::##', parsed[3]); + + // remove the processed parameter + vcard=vcard.replace(vcard_element[0],'\r\n'); + + // find the corresponding group data (if exists) + if(parsed[1]!='') + { + var re=RegExp('\r\n'+parsed[1].replace('.','\\..*')+'\r\n', 'im'); + while((vcard_element_related=vcard.match(re))!=null) + { + // append the parameter to its parent + vCard.tplM['contentline_NICKNAME'][0]+=vcard_element_related[0].substr(2); + // remove the processed parameter + vcard=vcard.replace(vcard_element_related[0],'\r\n'); + } + } + } + } +//console.timeEnd('NICKNAME timer'); + +//console.time('X-PHONETIC-FIST-NAME timer'); + // ------------------------------------------------------------------------------------- // + // X-PHONETIC-FIRST-NAME -> TODO: what to do if present more than once? + if(globalDisabledContactAttributes.indexOf('X-PHONETIC-FIRST-NAME')==-1) + { + vcard_element=vcard.match(vCard.pre['contentline_X-PHONETIC-FIRST-NAME']); + if(vcard_element!=null) + { + if(vcard_element.length!=1) // if the X-PHONETIC-FIRST-NAME attribute is present more than once, vCard is considered invalid + { + console.log("Error: '"+inputContact.uid+"': unable to parse vCard"); + return false; + } + + // parsed (contentline_parse) = [1]->"group.", [2]->"name", [3]->";param;param", [4]->"value" + parsed=vcard_element[0].match(vCard.pre['contentline_parse']); + + tmpvCardEditorRef.find('[data-type="ph_firstname"]').val(vcardUnescapeValue(parsed[4])); + + // values not directly supported by the editor (old values are kept intact) + vCard.tplM['contentline_X-PHONETIC-FIRST-NAME'][0]=vCard.tplC['contentline_X-PHONETIC-FIRST-NAME']; + vCard.tplM['contentline_X-PHONETIC-FIRST-NAME'][0]=vCard.tplM['contentline_X-PHONETIC-FIRST-NAME'][0].replace('##:::##group_wd##:::##', parsed[1]); + vCard.tplM['contentline_X-PHONETIC-FIRST-NAME'][0]=vCard.tplM['contentline_X-PHONETIC-FIRST-NAME'][0].replace('##:::##params_wsc##:::##', parsed[3]); + + // remove the processed parameter + vcard=vcard.replace(vcard_element[0],'\r\n'); + + // find the corresponding group data (if exists) + if(parsed[1]!='') + { + var re=RegExp('\r\n'+parsed[1].replace('.','\\..*')+'\r\n', 'im'); + while((vcard_element_related=vcard.match(re))!=null) + { + // append the parameter to its parent + vCard.tplM['contentline_X-PHONETIC-FIRST-NAME'][0]+=vcard_element_related[0].substr(2); + // remove the processed parameter + vcard=vcard.replace(vcard_element_related[0],'\r\n'); + } + } + } + } +//console.timeEnd('X-PHONETIC-FIST-NAME timer'); + +//console.time('X-PHONETIC-LAST-NAME timer'); + // ------------------------------------------------------------------------------------- // + // X-PHONETIC-LAST-NAME -> TODO: what to do if present more than once? + if(globalDisabledContactAttributes.indexOf('X-PHONETIC-LAST-NAME')==-1) + { + vcard_element=vcard.match(vCard.pre['contentline_X-PHONETIC-LAST-NAME']); + if(vcard_element!=null) + { + if(vcard_element.length!=1) // if the X-PHONETIC-LAST-NAME attribute is present more than once, vCard is considered invalid + { + console.log("Error: '"+inputContact.uid+"': unable to parse vCard"); + return false; + } + + // parsed (contentline_parse) = [1]->"group.", [2]->"name", [3]->";param;param", [4]->"value" + parsed=vcard_element[0].match(vCard.pre['contentline_parse']); + + tmpvCardEditorRef.find('[data-type="ph_lastname"]').val(vcardUnescapeValue(parsed[4])); + + // values not directly supported by the editor (old values are kept intact) + vCard.tplM['contentline_X-PHONETIC-LAST-NAME'][0]=vCard.tplC['contentline_X-PHONETIC-LAST-NAME']; + vCard.tplM['contentline_X-PHONETIC-LAST-NAME'][0]=vCard.tplM['contentline_X-PHONETIC-LAST-NAME'][0].replace('##:::##group_wd##:::##', parsed[1]); + vCard.tplM['contentline_X-PHONETIC-LAST-NAME'][0]=vCard.tplM['contentline_X-PHONETIC-LAST-NAME'][0].replace('##:::##params_wsc##:::##', parsed[3]); + + // remove the processed parameter + vcard=vcard.replace(vcard_element[0],'\r\n'); + + // find the corresponding group data (if exists) + if(parsed[1]!='') + { + var re=RegExp('\r\n'+parsed[1].replace('.','\\..*')+'\r\n', 'im'); + while((vcard_element_related=vcard.match(re))!=null) + { + // append the parameter to its parent + vCard.tplM['contentline_X-PHONETIC-LAST-NAME'][0]+=vcard_element_related[0].substr(2); + // remove the processed parameter + vcard=vcard.replace(vcard_element_related[0],'\r\n'); + } + } + } + } +//console.timeEnd('X-PHONETIC-LAST-NAME timer'); + +//console.time('BDAY timer'); + // ------------------------------------------------------------------------------------- // + // BDAY + if(globalDisabledContactAttributes.indexOf('BDAY')==-1) + { + vcard_element=vcard.match(vCard.pre['contentline_BDAY']); + if(vcard_element!=null) + { + if(vcard_element.length!=1) // if the BDAY attribute is present more than once, vCard is considered invalid + { + console.log("Error: '"+inputContact.uid+"': unable to parse vCard"); + return false; + } + + // parsed (contentline_parse) = [1]->"group.", [2]->"name", [3]->";param;param", [4]->"value" + parsed=vcard_element[0].match(vCard.pre['contentline_parse']); + + var valid=true; + try {var date=$.datepicker.parseDate('yy-mm-dd', parsed[4])} + catch (e) {valid=false} + + if(valid==true) + { + tmpvCardEditorRef.find('[data-type="date_bday"]').val(vcardUnescapeValue($.datepicker.formatDate(globalSettings.datepickerformat.value, date))).change(); + + // values not directly supported by the editor (old values are kept intact) + vCard.tplM['contentline_BDAY'][0]=vCard.tplC['contentline_BDAY']; + vCard.tplM['contentline_BDAY'][0]=vCard.tplM['contentline_BDAY'][0].replace('##:::##group_wd##:::##', parsed[1]); + vCard.tplM['contentline_BDAY'][0]=vCard.tplM['contentline_BDAY'][0].replace('##:::##params_wsc##:::##', parsed[3]); + + // remove the processed parameter + vcard=vcard.replace(vcard_element[0],'\r\n'); + + // find the corresponding group data (if exists) + if(parsed[1]!='') + { + var re=RegExp('\r\n'+parsed[1].replace('.','\\..*')+'\r\n', 'im'); + while((vcard_element_related=vcard.match(re))!=null) + { + // append the parameter to its parent + vCard.tplM['contentline_BDAY'][0]+=vcard_element_related[0].substr(2); + // remove the processed parameter + vcard=vcard.replace(vcard_element_related[0],'\r\n'); + } + } + } + else + { + console.log("Error: '"+inputContact.uid+"': unable to parse vCard"); + return false; // if the date value is invalid, vCard is considered invalid + } + } + } +//console.timeEnd('BDAY timer'); + +//console.time('X-ABDATE timer'); + // ------------------------------------------------------------------------------------- // + // X-ABDATE + if(globalDisabledContactAttributes.indexOf('X-ABDATE')==-1) + { + var element_i=0; + while((vcard_element=vcard.match(vCard.pre['contentline_X-ABDATE']))!=null) + { + // parsed (contentline_parse) = [1]->"group.", [2]->"name", [3]->";param;param", [4]->"value" + var parsed=vcard_element[0].match(vCard.pre['contentline_parse']); + + var valid=true; + try {var date=$.datepicker.parseDate('yy-mm-dd', parsed[4])} + catch (e) {valid=false} + + if(valid==true) + { + // parsed_value = [1..]->X-ABDATE-params + var parsed_value=vcardSplitParam(parsed[3]); + + // click to "add" button if not enought data rows present + var tmp_sel=tmpvCardEditorRef.find('[data-type="\\%date"]').last(); + if(tmp_sel.find('[data-type="date_value"]').val()!='') + tmp_sel.find('[data-type="\\%add"]').find('input[type="image"]').click(); + + // get the "TYPE=" values array + var pref=0; //by default there is no preferred date + var type_values=Array(); + var j=0; + for(var i=1; i array('HOME','INTERNET') -> 'home,internet' + var type_values_txt_label=type_values_us.join(' ').replace(vCard.pre['vcardToData_colon_begin_or_end'], ''); // TYPE=INTERNET;TYPE=INTERNET;TYPE=HOME; -> array('HOME','INTERNET') -> 'home internet' + if(type_values_txt=='') // if no person type defined, we use the 'other' type as default + type_values_txt=type_values_txt_label='other'; + + // get the default available types + var type_list=new Array(); + tmpvCardEditorRef.find('[data-type="\\%date"]:eq('+element_i+')').find('[data-type="date_type"]').children().each(function(index, element){type_list[type_list.length]=$(element).attr('data-type');}); + + // if an existing type regex matches the new type, use the old type + // and replace the old type definition with new type definition to comforn the server vCard type format + for(var i=0; i TODO: what to do if present more than once? + if(globalDisabledContactAttributes.indexOf('TITLE')==-1) + { + vcard_element=vcard.match(vCard.pre['contentline_TITLE']); + if(vcard_element!=null) + { + if(vcard_element.length!=1) // if the TITLE attribute is present more than once, vCard is considered invalid + { + console.log("Error: '"+inputContact.uid+"': unable to parse vCard"); + return false; + } + + // parsed (contentline_parse) = [1]->"group.", [2]->"name", [3]->";param;param", [4]->"value" + parsed=vcard_element[0].match(vCard.pre['contentline_parse']); + + tmpvCardEditorRef.find('[data-type="title"]').val(vcardUnescapeValue(parsed[4])); + + // values not directly supported by the editor (old values are kept intact) + vCard.tplM['contentline_TITLE'][0]=vCard.tplC['contentline_TITLE']; + vCard.tplM['contentline_TITLE'][0]=vCard.tplM['contentline_TITLE'][0].replace('##:::##group_wd##:::##', parsed[1]); + vCard.tplM['contentline_TITLE'][0]=vCard.tplM['contentline_TITLE'][0].replace('##:::##params_wsc##:::##', parsed[3]); + + // remove the processed parameter + vcard=vcard.replace(vcard_element[0],'\r\n'); + + // find the corresponding group data (if exists) + if(parsed[1]!='') + { + var re=RegExp('\r\n'+parsed[1].replace('.','\\..*')+'\r\n', 'im'); + while((vcard_element_related=vcard.match(re))!=null) + { + // append the parameter to its parent + vCard.tplM['contentline_TITLE'][0]+=vcard_element_related[0].substr(2); + // remove the processed parameter + vcard=vcard.replace(vcard_element_related[0],'\r\n'); + } + } + } + } +//console.timeEnd('TITLE timer'); + +//console.time('ORG timer'); + // ------------------------------------------------------------------------------------- // + // ORG -> TODO: what to do if present more than once? + if(globalDisabledContactAttributes.indexOf('ORG')==-1) + { + vcard_element=vcard.match(vCard.pre['contentline_ORG']); + if(vcard_element!=null) + { + if(vcard_element.length!=1) // if the ORG attribute is present more than once, vCard is considered invalid + { + console.log("Error: '"+inputContact.uid+"': unable to parse vCard"); + return false; + } + + // parsed (contentline_parse) = [1]->"group.", [2]->"name", [3]->";param;param", [4]->"value" + parsed=vcard_element[0].match(vCard.pre['contentline_parse']); + // parsed_value = [0]->Org, [1..]->Org Units + parsed_value=vcardSplitValue(parsed[4], ';'); + + if(parsed_value[0]!=undefined && parsed_value[0]!='') + tmpvCardEditorRef.find('[data-type="org"]').val(vcardUnescapeValue(parsed_value[0])); + if(parsed_value[1]!=undefined && parsed_value[1]!='') + tmpvCardEditorRef.find('[data-type="department"]').val(vcardUnescapeValue(parsed_value[1])); + + // values not directly supported by the editor (old values are kept intact) + vCard.tplM['contentline_ORG'][0]=vCard.tplC['contentline_ORG']; + vCard.tplM['contentline_ORG'][0]=vCard.tplM['contentline_ORG'][0].replace('##:::##group_wd##:::##', parsed[1]); + vCard.tplM['contentline_ORG'][0]=vCard.tplM['contentline_ORG'][0].replace('##:::##params_wsc##:::##', parsed[3]); + vCard.tplM['contentline_ORG'][0]=vCard.tplM['contentline_ORG'][0].replace('##:::##units_wsc##:::##', (parsed_value[2]==undefined ? '' : ';'+parsed_value.slice(2).join(';'))); + + // remove the processed parameter + vcard=vcard.replace(vcard_element[0],'\r\n'); + + // find the corresponding group data (if exists) + if(parsed[1]!='') + { + var re=RegExp('\r\n'+parsed[1].replace('.','\\..*')+'\r\n', 'im'); + while((vcard_element_related=vcard.match(re))!=null) + { + // append the parameter to its parent + vCard.tplM['contentline_ORG'][0]+=vcard_element_related[0].substr(2); + // remove the processed parameter + vcard=vcard.replace(vcard_element_related[0],'\r\n'); + } + } + } + } +//console.timeEnd('ORG timer'); + +//console.time('X-ABShowAs timer'); + // ------------------------------------------------------------------------------------- // + // X-ABShowAs -> TODO: what to do if present more than once? + var photo_show_org=false; + if(globalDisabledContactAttributes.indexOf('X-ABShowAs')==-1) + { + vcard_element=vcard.match(vCard.pre['X-ABShowAs']); + if(vcard_element!=null) + { + if(vcard_element.length>1) // if the X-ABShowAs attribute is present more than once, vCard is considered invalid + { + console.log("Error: '"+inputContact.uid+"': unable to parse vCard"); + return false; + } + + // parsed (contentline_parse) = [1]->"group.", [2]->"name", [3]->";param;param", [4]->"value" + parsed=vcard_element[0].match(vCard.pre['contentline_parse']); + + if(vcardUnescapeValue(parsed[4]).match(RegExp('^company$','i'))) + { + tmpvCardEditorRef.find('[data-type="isorg"]').prop('checked', true); + photo_show_org=true; + } + + // values not directly supported by the editor (old values are kept intact) + vCard.tplM['contentline_X-ABShowAs'][0]=vCard.tplC['contentline_X-ABShowAs']; + vCard.tplM['contentline_X-ABShowAs'][0]=vCard.tplM['contentline_X-ABShowAs'][0].replace('##:::##group_wd##:::##', parsed[1]); + vCard.tplM['contentline_X-ABShowAs'][0]=vCard.tplM['contentline_X-ABShowAs'][0].replace('##:::##params_wsc##:::##', parsed[3]); + vCard.tplM['contentline_X-ABShowAs'][0]=vCard.tplM['contentline_X-ABShowAs'][0].replace('##:::##value##:::##', parsed[4]); + + // remove the processed parameter + vcard=vcard.replace(vcard_element[0],'\r\n'); + + // find the corresponding group data (if exists) + if(parsed[1]!='') + { + var re=RegExp('\r\n'+parsed[1].replace('.','\\..*')+'\r\n', 'im'); + while((vcard_element_related=vcard.match(re))!=null) + { + // append the parameter to its parent + vCard.tplM['contentline_X-ABShowAs'][0]+=vcard_element_related[0].substr(2); + // remove the processed parameter + vcard=vcard.replace(vcard_element_related[0],'\r\n'); + } + } + } + } +//console.timeEnd('X-ABShowAs timer'); + +//console.time('PHOTO timer'); + // ------------------------------------------------------------------------------------- // + // PHOTO -> TODO: what to do if present more than once? + if(photo_show_org) + tmpvCardEditorRef.find('#photo').toggleClass('photo_user photo_company'); + + if(globalDisabledContactAttributes.indexOf('PHOTO')==-1) + { + vcard_element=vcard.match(vCard.pre['contentline_PHOTO']); + if(vcard_element!=null) // if the PHOTO attribute is present more than once, we use the first value + { + // parsed (contentline_parse) = [1]->"group.", [2]->"name", [3]->";param;param", [4]->"value" + parsed=vcard_element[0].match(vCard.pre['contentline_parse']); + + var img_type = ''; + var custom_params = ''; + var typeRe = RegExp('TYPE=(.*)', 'i'); + var othersRe = RegExp('(?:ENCODING|VALUE)=.*', 'i'); + + parsed_value = vcardSplitParam(parsed[3]); + + for(i=1; i"group.", [2]->"name", [3]->";param;param", [4]->"value" + var parsed=vcard_element[0].match(vCard.pre['contentline_parse']); + // parsed_param = [1..]->ADR-params + var parsed_param=vcardSplitParam(parsed[3]); + // parsed_value = [1..]->ADR elements + var parsed_value=vcardSplitValue(parsed[4],';'); + + // click to "add" button if not enought data rows present + var found=0; + tmpvCardEditorRef.find('[data-type="\\%address"]').last().find('[data-type="value"]').each( + function(index,element) + { + if($(element).val()!='') + { + found=1; + return false; + } + } + ); + if(found) + tmpvCardEditorRef.find('[data-type="\\%address"]').last().find('[data-type="\\%add"]').find('input[type="image"]').click(); + + // get the "TYPE=" values array + var pref=0; //by default there is no preferred address + var type_values=Array(); + var j=0; + for(var i=1; i array('FAX','HOME') -> 'fax,home' + var type_values_txt_label=type_values_us.join(' ').replace(vCard.pre['vcardToData_colon_begin_or_end'], ''); // TYPE=HOME;TYPE=HOME;TYPE=FAX; -> array('FAX','HOME') -> 'fax home' + if(type_values_txt=='') // if no address type defined, we use the 'work' type as default + type_values_txt=type_values_txt_label='work'; + + // get the default available types + var type_list=new Array(); + tmpvCardEditorRef.find('[data-type="\\%address"]:eq('+element_i+')').find('[data-type="address_type"]').children().each(function(index, element){type_list[type_list.length]=$(element).attr('data-type');}); + + // if an existing type regex matches the new type, use the old type + // and replace the old type definition with new type definition to comforn the server vCard type format + for(var i=0;i0 || (found=tmp.find('[data-type="country_type"]').children('[data-full-name="'+jqueryEscapeSelector(parsed_value[6])+'"]')).length>0) + found.prop('selected', true); + else if(globalSettings.addresscountryequivalence.value.length>0 && parsed_value[6]!=undefined) // unknown ADR format (country not detected) + { +// TODO: move regex object directly into config.js + for(var i=0; i"group.", [2]->"name", [3]->";param;param", [4]->"value" + var parsed=vcard_element[0].match(vCard.pre['contentline_parse']); + // parsed_value = [1..]->TEL-params + var parsed_value=vcardSplitParam(parsed[3]); + + // click to "add" button if not enought data rows present + var tmp_sel=tmpvCardEditorRef.find('[data-type="\\%phone"]').last(); + if(tmp_sel.find('[data-type="value"]').val()!='') + tmp_sel.find('[data-type="\\%add"]').find('input[type="image"]').click(); + + // get the "TYPE=" values array + var pref=0; //by default there is no preferred phone number + var type_values=Array(); + var j=0; + for(var i=1; i array('FAX','HOME') -> 'fax,home' + var type_values_txt_label=type_values_us.join(' ').replace(vCard.pre['vcardToData_colon_begin_or_end'], ''); // TYPE=HOME;TYPE=HOME;TYPE=FAX; -> array('FAX','HOME') -> 'fax home' + if(type_values_txt=='') // if no phone type defined, we use the 'cell' type as default + type_values_txt=type_values_txt_label='cell'; + + // get the default available types (optimize in future) + var type_list=new Array(); + tmpvCardEditorRef.find('[data-type="\\%phone"]:eq('+element_i+')').find('[data-type="phone_type"]').children().each(function(index, element){type_list[type_list.length]=$(element).attr('data-type');}); + + // if an existing type regex matches the new type, use the old type + // and replace the old type definition with new type definition to comforn the current vCard type format + for(var i=0; i"group.", [2]->"name", [3]->";param;param", [4]->"value" + var parsed=vcard_element[0].match(vCard.pre['contentline_parse']); + // parsed_value = [1..]->EMAIL-params + var parsed_value=vcardSplitParam(parsed[3]); + + // click to "add" button if not enought data rows present + var tmp_sel=tmpvCardEditorRef.find('[data-type="\\%email"]').last(); + if(tmp_sel.find('[data-type="value"]').val()!='') + tmp_sel.find('[data-type="\\%add"]').find('input[type="image"]').click(); + + // get the "TYPE=" values array + var pref=0; //by default there is no preferred email address + var type_values=Array(); + var j=0; + for(var i=1; i array('HOME','INTERNET') -> 'home,internet' + var type_values_txt_label=type_values_us.join(' ').replace(vCard.pre['vcardToData_colon_begin_or_end'], ''); // TYPE=INTERNET;TYPE=INTERNET;TYPE=HOME; -> array('HOME','INTERNET') -> 'home internet' + if(type_values_txt=='') // if no email type defined, we use the 'home' type as default + type_values_txt=type_values_txt_label='home,internet'; + + // get the default available types + var type_list=new Array(); + tmpvCardEditorRef.find('[data-type="\\%email"]:eq('+element_i+')').find('[data-type="email_type"]').children().each(function(index, element){type_list[type_list.length]=$(element).attr('data-type');}); + + // if an existing type regex matches the new type, use the old type + // and replace the old type definition with new type definition to comforn the server vCard type format + for(var i=0; i"group.", [2]->"name", [3]->";param;param", [4]->"value" + var parsed=vcard_element[0].match(vCard.pre['contentline_parse']); + // parsed_value = [1..]->X-SOCIALPROFILE-params + var parsed_value=vcardSplitParam(parsed[3]); + + // click to "add" button if not enought data rows present + var tmp_sel=tmpvCardEditorRef.find('[data-type="\\%profile"]').last(); + if(tmp_sel.find('[data-type="value"]').val()!='') + tmp_sel.find('[data-type="\\%add"]').find('input[type="image"]').click(); + + // get the "TYPE=" values array + var pref=0; //by default there is no preferred X-SOCIALPROFILE + var type_values=Array(); + var j=0; + var social_user=''; + for(i=1;i array('B','A','C') -> 'a,b,c' + var type_values_txt_label=type_values_us.join(' ').replace(vCard.pre['vcardToData_colon_begin_or_end'], ''); // TYPE=B;TYPE=A;TYPE=C; -> array('B','A','C') -> 'a b c' + if(type_values_txt=='') // if no X-SOCIALPROFILE type defined, we use the 'twitter' type as default + type_values_txt=type_values_txt_label='twitter'; + + // get the default available types + var type_list=new Array(); + tmpvCardEditorRef.find('[data-type="\\%profile"]:eq('+element_i+')').find('[data-type="profile_type"]').children().each(function(index, element){type_list[type_list.length]=$(element).attr('data-type');}); + + // if an existing type regex matches the new type, use the old type + // and replace the old type definition with new type definition to comforn the server vCard type format + for(var i=0; i"group.", [2]->"name", [3]->";param;param", [4]->"value" + var parsed=vcard_element[0].match(vCard.pre['contentline_parse']); + // parsed_value = [1..]->URL-params + var parsed_value=vcardSplitParam(parsed[3]); + + // click to "add" button if not enought data rows present + var tmp_sel=tmpvCardEditorRef.find('[data-type="\\%url"]').last(); + if(tmp_sel.find('[data-type="value"]').val()!='') + tmp_sel.find('[data-type="\\%add"]').find('input[type="image"]').click(); + + // get the "TYPE=" values array + var pref=0; //by default there is no preferred url address + var type_values=Array(); + var j=0; + for(var i=1; i array('HOME','WORK') -> 'home,work' + var type_values_txt_label=type_values_us.join(' ').replace(vCard.pre['vcardToData_colon_begin_or_end'], ''); // TYPE=WORK;TYPE=WORK;TYPE=HOME; -> array('HOME','WORK') -> 'home work' + if(type_values_txt=='') // if no url type defined, we use the 'homepage' type as default + type_values_txt=type_values_txt_label='homepage'; + + // get the default available types (optimize in future) + var type_list=new Array(); + tmpvCardEditorRef.find('[data-type="\\%url"]:eq('+element_i+')').find('[data-type="url_type"]').children().each(function(index, element){type_list[type_list.length]=$(element).attr('data-type');}); + + // if an existing type regex matches the new type, use the old type + // and replace the old type definition with new type definition to comforn the server vCard type format + for(var i=0; i"group.", [2]->"name", [3]->";param;param", [4]->"value" + var parsed=vcard_element[0].match(vCard.pre['contentline_parse']); + // parsed_value = [1..]->X-ABRELATEDNAMES-params + var parsed_value=vcardSplitParam(parsed[3]); + + // click to "add" button if not enought data rows present + var tmp_sel=tmpvCardEditorRef.find('[data-type="\\%person"]').last(); + if(tmp_sel.find('[data-type="value"]').val()!='') + tmp_sel.find('[data-type="\\%add"]').find('input[type="image"]').click(); + + // get the "TYPE=" values array + var pref=0; //by default there is no preferred person + var type_values=Array(); + var j=0; + for(var i=1; i array('HOME','INTERNET') -> 'home,internet' + var type_values_txt_label=type_values_us.join(' ').replace(vCard.pre['vcardToData_colon_begin_or_end'], ''); // TYPE=INTERNET;TYPE=INTERNET;TYPE=HOME; -> array('HOME','INTERNET') -> 'home internet' + if(type_values_txt=='') // if no person type defined, we use the 'other' type as default + type_values_txt=type_values_txt_label='other'; + + // get the default available types + var type_list=new Array(); + tmpvCardEditorRef.find('[data-type="\\%person"]:eq('+element_i+')').find('[data-type="person_type"]').children().each(function(index, element){type_list[type_list.length]=$(element).attr('data-type');}); + + // if an existing type regex matches the new type, use the old type + // and replace the old type definition with new type definition to comforn the server vCard type format + for(var i=0; i"group.", [2]->"name", [3]->";param;param", [4]->"value" + var parsed=vcard_element[0].match(vCard.pre['contentline_parse']); + // parsed_value = [1..]->IMPP-params + var parsed_value=vcardSplitParam(parsed[3]); + + // click to "add" button if not enought data rows present + var tmp_sel=tmpvCardEditorRef.find('[data-type="\\%im"]').last(); + if(tmp_sel.find('[data-type="value"]').val()!='') + tmp_sel.find('[data-type="\\%add"]').find('input[type="image"]').click(); + + // get the "TYPE=" & "X-SERVICE-TYPE" values array + var pref=0; //by default there is no preferred IM + var type_values=Array(); + var j=0; + var service_type_value=''; + for(var i=1; i array('HOME','INTERNET') -> 'home,internet' + type_values_txt_label=type_values_us.join(' ').replace(vCard.pre['vcardToData_colon_begin_or_end'], ''); // TYPE=INTERNET;TYPE=INTERNET;TYPE=HOME; -> array('HOME','INTERNET') -> 'home internet' + if(type_values_txt=='') // if no IMPP type defined, we use the 'other' type as default + type_values_txt=type_values_txt_label='other'; + + // get the default available types + var type_list=new Array(); + tmpvCardEditorRef.find('[data-type="\\%im"]:eq('+element_i+')').find('[data-type="im_type"]').children().each(function(index, element){type_list[type_list.length]=$(element).attr('data-type');}); + + // if an existing type regex matches the new type, use the old type + // and replace the old type definition with new type definition to comforn the server vCard type format + for(var i=0; i Cancel support /loading the previous active contact/) + if(inputContact.uid!=undefined) // occurs if loadContactByVcard is used (it also appends the UID of previous contact into 'data-id') + tmpvCardEditorRef.find('#vCardEditor').find('[data-type="cancel"]').attr('data-id', inputContact.uid); + + processEditorElements(tmpvCardEditorRef, inputEditorMode, inputIsReadonly, inputContact.isCompany); + + var tmp_optionslist=[]; + // create the list of available collections to the interface + for(var i=0; i').attr({'data-type': globalResourceCardDAVList.collections[i].uid, 'data-color': globalResourceCardDAVList.collections[i].color}).text(globalResourceCardDAVList.collections[i].displayvalue); + // add the list of available collections to the interface + tmpvCardEditorRef.find('[data-attr-name="_DEST_"]').append(tmp_optionslist); + // bind the change event (color change in the editor) + tmpvCardEditorRef.find('[data-attr-name="_DEST_"]').change(function(){ + var selColl=globalResourceCardDAVList.getCollectionByUID($(this).find('option:selected').attr('data-type')); + globalRefAddContact.attr('data-url', selColl.uid.replace(RegExp('[^/]+$'),'')); + globalRefAddContact.attr('data-filter-url',selColl.uid); // Set the current addressbook filter uid + globalRefAddContact.attr('data-account-uid',selColl.accountUID); + $('#ABContactColor').css('background-color', $(this).find('option:selected').attr('data-color')); + }); + + var collUID=''; + if(typeof inputContact.uid!='undefined') + collUID= inputContact.uid.replace(RegExp('[^/]*$'),''); + else + collUID = globalRefAddContact.attr('data-url'); + var select_elem=tmpvCardEditorRef.find('[data-attr-name="_DEST_"]').find('[data-type="'+jqueryEscapeSelector(collUID)+'"]'); + if(select_elem.length==1) + select_elem.prop('selected', true); + + if(typeof globalContactsExtVcardToData!='undefined' && !inputIsCompany) + tmpvCardEditorRef.find('[data-type="DEST"]').addClass('element_no_display'); + + // Unprocessed unrelated vCard elements + vCard.tplM['unprocessed_unrelated']=vcard; + + if(typeof globalDebug!='undefined' && globalDebug instanceof Array && globalDebug.indexOf('vcard')!=-1) + { + console.timeEnd('vcardToData timer'); + + if(vcard!='\r\n') + console.log('Warning: [vCard unprocessed unrelated]: '+vcard); + } + + //clean error message + $('#ABMessage').height('0'); + + $('#ABContact').empty().append(tmpvCardEditorRef); + + var foundGroup=0; + for(var adr in globalAddressbookList.vcard_groups) + { + if(globalAddressbookList.vcard_groups[adr].length>0) + { + foundGroup=1; + break; + } + } + + if(foundGroup) + { + if(typeof inputContact.uid!='undefined') + extendDestSelect(); + else + { + var selGroup = $('#ResourceCardDAVList').find('.contact_group').find(':input.resourceCardDAV_selected').attr('data-id'); + extendDestSelect(selGroup); + if(typeof selGroup!= 'undefined') + select_elem.text(localization[globalInterfaceLanguage].txtVcardGroupsTextSingle.replace('%coll%',globalResourceCardDAVList.getCollectionByUID(collUID).displayvalue)); + } + } + if(typeof inputContact.uid !='undefined') + checkForVcardGroups(inputContact.uid); + if(typeof(globalContactsSelectProcess)=='function') + globalContactsSelectProcess(tmpvCardEditorRef, inputContact); + + return true; + } + else + { + console.log("Error: '"+inputContact.uid+"': unable to parse vCard"); + return false; + } +} + +function basicRFCFixesAndCleanup(vcardString) +{ + // If vCard contains only '\n' instead of '\r\n' we fix it + if(vcardString.match(vCard.pre['basicRFCFixesAndCleanup_r-m'])==null) + vcardString=vcardString.replace(vCard.pre['basicRFCFixesAndCleanup_n-gm'], '\r\n'); + + // remove multiple empty lines + vcardString=vcardString.replace(vCard.pre['basicRFCFixesAndCleanup_rnp-gm'], '\r\n'); + + // append '\r\n' to the end of the vCard if missing + if(vcardString[vcardString.length-1]!='\n') + vcardString+='\r\n'; + + // remove line folding + vcardString=vcardString.replace(vCard.pre['basicRFCFixesAndCleanup_rnwsp-gm'], ''); + + // RFC-obsolete PHOTO fix + vcardString=vcardString.replace(vCard.pre['basicRFCFixesAndCleanup_photo-gim'], '\r\nPHOTO:'); + + // ------------------------------------------------------------------------------------- // + // begin CATEGORIES merge to one CATEGORIES attribute (sorry for related attributes) + // note: we cannot do this in additionalRFCFixes or normalizeVcard + var categoriesArr=[]; + var vcard_element=null; + var vcard_element_related=null; + while((vcard_element=vcardString.match(vCard.pre['contentline_CATEGORIES']))!=null) + { + // parsed (contentline_parse) = [1]->"group.", [2]->"name", [3]->";param;param", [4]->"value" + var parsed=vcard_element[0].match(vCard.pre['contentline_parse']); + + categoriesArr[categoriesArr.length]=parsed[4]; + + // remove the processed parameter + vcardString=vcardString.replace(vcard_element[0],'\r\n'); + + // find the corresponding group data (if exists) + if(parsed[1]!='') + { + var re=RegExp('\r\n'+parsed[1].replace('.','\\..*')+'\r\n', 'm'); + while((vcard_element_related=vcardString.match(re))!=null) + // remove the processed parameter + vcardString=vcardString.replace(vcard_element_related[0],'\r\n'); + } + } + var categoriesTxt=categoriesArr.join(','); + + var tmp=vcardString.split('\r\n'); + tmp.splice(tmp.length-2,0,'CATEGORIES:'+categoriesTxt); + // end CATEGORIES cleanup + // ------------------------------------------------------------------------------------- // + + // ------------------------------------------------------------------------------------- // + // begin SoGo fixes (company vCards without N and FN attributes) + // we must perform vCard fixes here because the N and FN attributes are used in the collection list + + // if N attribute is missing we add it + if(vcardString.match(vCard.pre['contentline_N'])==null) + tmp.splice(1,0,'N:;;;;'); + + // if FN attribute is missing we add it + if(vcardString.match(vCard.pre['contentline_FN'])==null) + { + var fn_value=''; + var tmp2=null; + // if there is an ORG attribute defined, we use the company name as fn_value (instead of empty string) + if((tmp2=vcardString.match(vCard.pre['contentline_ORG']))!=null) + { + // parsed (contentline_parse) = [1]->"group.", [2]->"name", [3]->";param;param", [4]->"value" + var parsed=tmp2[0].match(vCard.pre['contentline_parse']); + // parsed_value = [0]->Org, [1..]->Org Units + var parsed_value=vcardSplitValue(parsed[4],';'); + fn_value=parsed_value[0]; + } + tmp.splice(1,0,'FN:'+fn_value); + } + vcardString=tmp.join('\r\n'); + // end SoGo fixes + // ------------------------------------------------------------------------------------- // + + return {vcard: vcardString, categories: categoriesTxt}; +} + +function additionalRFCFixes(vcardString) +{ + // ------------------------------------------------------------------------------------- // + var tmp=vcardString.split('\r\n'); + + // update non-RFC attributes (special transformations) + for(var i=1;i"group.", [2]->"name", [3]->";param;param", [4]->"value" + var parsed=('\r\n'+tmp[i]+'\r\n').match(vCard.pre['contentline_parse']); + + if(parsed!=null) + { + switch(parsed[2]) + { + case 'TEL': + // remove the non-RFC params (Evolution bug) + var parsed_value=vcardSplitParam(parsed[3]); + for(var j=parsed_value.length-1;j>0;j--) + if(parsed_value[j].match(vCard.pre['additionalRFCFixes_tel-param'])==null) + parsed_value.splice(j,1); + + parsed[3]=parsed_value.join(';'); + tmp[i]=parsed[1]+parsed[2]+parsed[3]+':'+parsed[4]; + break; + case 'EMAIL': + // transform the params separated by ',' to 'TYPE=' params and remove the non-RFC params (Evolution bug) + var parsed_value=vcardSplitParam(parsed[3]); + for(var j=parsed_value.length-1;j>0;j--) + if(parsed_value[j].match(vCard.pre['additionalRFCFixes_email-param'])==null) + { + if((transformed=parsed_value[j].replace(vCard.pre['additionalRFCFixes_comma-g'], ';TYPE=')).match(vCard.pre['additionalRFCFixes_email-params'])!=null) + parsed_value[j]=transformed; + else + parsed_value.splice(j,1); + } + + parsed[3]=parsed_value.join(';'); + // add missing and required "internet" type (Sogo bug) + if(parsed[3].match(vCard.pre['additionalRFCFixes_type-internet'])==null) + parsed[3]+=';TYPE=INTERNET'; + + tmp[i]=parsed[1]+parsed[2]+parsed[3]+':'+parsed[4]; + break; +// the upcoming vCard 4.0 allows params for URL and many clients use it also in vCard 3.0 +// case 'URL': // no params allowed for URL (Evolution bug) +// tmp[i]=parsed[1]+parsed[2]+':'+parsed[4]; +// break; + default: + break; + } + } + } + vcardString=tmp.join('\r\n'); + // ------------------------------------------------------------------------------------- // + + return vcardString; +} + +// transform the vCard to the editor expected format +function normalizeVcard(vcardString) +{ + var parsed=null; + // remove the PRODID element (unusable for the editor) + while((parsed=vcardString.match(vCard.pre['contentline_PRODID']))!=null) + vcardString=vcardString.replace(parsed[0],'\r\n'); + + var tmp=vcardString.split('\r\n'); + var vcard_begin=tmp[0].replace(vCard.pre['normalizeVcard_group_w_dot'], 'item.')+'\r\n'; + var vcard_end=tmp[tmp.length-2].replace(vCard.pre['normalizeVcard_group_w_dot'], 'item.')+'\r\n'; + // remove the vCard BEGIN and END and all duplicate entries (usually created by other buggy clients) + vcardString='\r\n'+tmp.slice(1, tmp.length-2).join('\r\n')+'\r\n'; + + var vcard_out_grouped=new Array(); + while((parsed=vcardString.match(vCard.pre['contentline_parse']))!=null) + { + var additional_related=''; + var vcard_element_related=''; + var attr_name=''; + var params_swc=''; + var attr_value=''; + + // parsed = [1]->"group.", [2]->"name", [3]->";param;param", [4]->"value" + var params_array=vcardSplitParam(parsed[3]); + // we transform the old X-* IM attributes to new IMPP (internally used by editor) + switch(parsed[2]) + { + case 'X-ABDATE': + attr_name=parsed[2]; + params_swc=params_array.sort().join(';').toUpperCase(); // we need upper case here to remove duplicate values later + tmp=parsed[4].match(vCard.pre['normalizeVcard_date']); + attr_value=tmp[1]+'-'+tmp[2]+'-'+tmp[3]; // sorry, we support only date (no date-time support) + break; + case 'X-EVOLUTION-ANNIVERSARY': + case 'X-ANNIVERSARY': + attr_name='X-ABDATE'; + params_swc=''; + tmp=parsed[4].match(vCard.pre['normalizeVcard_date']); + attr_value=tmp[1]+'-'+tmp[2]+'-'+tmp[3]; // sorry, we support only date (no date-time support) + additional_related='X-ABLabel:_$!!$_\r\n'; + + // check for X-ABDATE attribute with the same value + var found=false; + var tmpVcardString=vcardString; + var tmp_vcard_element=null; + while((tmp_vcard_element=tmpVcardString.match(vCard.pre['contentline_X-ABDATE']))!=null) + { + // parsed (contentline_parse) = [1]->"group.", [2]->"name", [3]->";param;param", [4]->"value" + var tmp_parsed=tmp_vcard_element[0].match(vCard.pre['contentline_parse']); + + if(tmp_parsed[4]==parsed[4] || tmp_parsed[4]==attr_value) + { + found=true; + break; + } + tmpVcardString=tmpVcardString.replace(tmp_vcard_element[0], '\r\n'); + } + + if(found==true) + { + // remove the processed element + vcardString=vcardString.replace(parsed[0], '\r\n'); + // find the corresponding group data (if exists) + if(parsed[1]!='') + { + var re=RegExp('\r\n'+parsed[1].replace('.', '\\..*')+'\r\n', 'm'); + while((vcard_element_related=vcardString.match(re))!=null) + vcardString=vcardString.replace(vcard_element_related[0], '\r\n'); // remove the processed parameter + } + continue; + } + break; + case 'BDAY': + attr_name=parsed[2]; + params_swc=';VALUE=date'; + tmp=parsed[4].match(vCard.pre['normalizeVcard_date']); + attr_value=tmp[1]+'-'+tmp[2]+'-'+tmp[3]; // sorry, we support only date (no date-time support) + break; + case 'X-AIM': + case 'X-JABBER': + case 'X-MSN': + case 'X-YAHOO': + case 'X-YAHOO-ID': + case 'X-ICQ': + case 'X-SKYPE': + attr_name='IMPP'; + if(params_array.length==0) + params_array[0]=''; // after the join it generates ';' after the attribute name + params_array[params_array.length]='X-SERVICE-TYPE='+parsed[2].replace(vCard.pre['normalizeVcard_xb_or_ide'], ''); // extract the IM type + params_swc=params_array.sort().join(';'); + attr_value=parsed[4]; + + // check for IMPP attribute with the same value + var found=false; + var tmpVcardString=vcardString; + var tmp_vcard_element=null; + while((tmp_vcard_element=tmpVcardString.match(vCard.pre['contentline_IMPP']))!=null) + { + // parsed (contentline_parse) = [1]->"group.", [2]->"name", [3]->";param;param", [4]->"value" + var tmp_parsed=tmp_vcard_element[0].match(vCard.pre['contentline_parse']); + + if(tmp_parsed[4].replace(vCard.pre['normalizeVcard_before_val'], '')==parsed[4]) + { + found=true; + break; + } + tmpVcardString=tmpVcardString.replace(tmp_vcard_element[0], '\r\n'); + } + + if(found==true) + { + // remove the processed element + vcardString=vcardString.replace(parsed[0], '\r\n'); + // find the corresponding group data (if exists) + if(parsed[1]!='') + { + var re=RegExp('\r\n'+parsed[1].replace('.', '\\..*')+'\r\n', 'm'); + while((vcard_element_related=vcardString.match(re))!=null) + vcardString=vcardString.replace(vcard_element_related[0], '\r\n'); // remove the processed parameter + } + continue; + } + break; + case 'IMPP': + attr_name=parsed[2]; + params_swc=params_array.sort().join(';').toUpperCase(); // we need upper case here to remove duplicate values later + + // remove the '*:' from the '*:value' + // but we add them back during the vcard generation from the interface + attr_value=vcardSplitValue(parsed[4], ':').splice(1, 1).join('') + break; + case 'X-ASSISTANT': + case 'X-EVOLUTION-ASSISTANT': + attr_name='X-ABRELATEDNAMES'; + params_swc=''; + attr_value=parsed[4]; + additional_related='X-ABLabel:_$!!$_\r\n'; + + // check for X-ABRELATEDNAMES attribute with the same value + var found=false; + var tmpVcardString=vcardString; + var tmp_vcard_element=null; + while((tmp_vcard_element=tmpVcardString.match(vCard.pre['contentline_X-ABRELATEDNAMES']))!=null) + { + // parsed (contentline_parse) = [1]->"group.", [2]->"name", [3]->";param;param", [4]->"value" + var tmp_parsed=tmp_vcard_element[0].match(vCard.pre['contentline_parse']); + + if(tmp_parsed[4]==parsed[4]) + { + found=true; + break; + } + tmpVcardString=tmpVcardString.replace(tmp_vcard_element[0], '\r\n'); + } + + if(found==true) + { + // remove the processed element + vcardString=vcardString.replace(parsed[0], '\r\n'); + // find the corresponding group data (if exists) + if(parsed[1]!='') + { + var re=RegExp('\r\n'+parsed[1].replace('.', '\\..*')+'\r\n', 'm'); + while((vcard_element_related=vcardString.match(re))!=null) + vcardString=vcardString.replace(vcard_element_related[0], '\r\n'); // remove the processed parameter + } + continue; + } + break; + case 'X-MANAGER': + case 'X-EVOLUTION-MANAGER': + attr_name='X-ABRELATEDNAMES'; + params_swc=''; + attr_value=parsed[4]; + additional_related='X-ABLabel:_$!!$_\r\n'; + + // check for X-ABRELATEDNAMES attribute with the same value + var found=false; + var tmpVcardString=vcardString; + var tmp_vcard_element=null; + while((tmp_vcard_element=tmpVcardString.match(vCard.pre['contentline_X-ABRELATEDNAMES']))!=null) + { + // parsed (contentline_parse) = [1]->"group.", [2]->"name", [3]->";param;param", [4]->"value" + var tmp_parsed=tmp_vcard_element[0].match(vCard.pre['contentline_parse']); + + if(tmp_parsed[4]==parsed[4]) + { + found=true; + break; + } + tmpVcardString=tmpVcardString.replace(tmp_vcard_element[0], '\r\n'); + } + + if(found==true) + { + // remove the processed element + vcardString=vcardString.replace(parsed[0], '\r\n'); + // find the corresponding group data (if exists) + if(parsed[1]!='') + { + var re=RegExp('\r\n'+parsed[1].replace('.', '\\..*')+'\r\n', 'm'); + while((vcard_element_related=vcardString.match(re))!=null) + vcardString=vcardString.replace(vcard_element_related[0], '\r\n'); // remove the processed parameter + } + continue; + } + break; + case 'X-SPOUSE': + case 'X-EVOLUTION-SPOUSE': + attr_name='X-ABRELATEDNAMES'; + params_swc=''; + attr_value=parsed[4]; + additional_related='X-ABLabel:_$!!$_\r\n'; + + // check for X-ABRELATEDNAMES attribute with the same value + var found=false; + var tmpVcardString=vcardString; + var tmp_vcard_element=null; + while((tmp_vcard_element=tmpVcardString.match(vCard.pre['contentline_X-ABRELATEDNAMES']))!=null) + { + // parsed (contentline_parse) = [1]->"group.", [2]->"name", [3]->";param;param", [4]->"value" + var tmp_parsed=tmp_vcard_element[0].match(vCard.pre['contentline_parse']); + + if(tmp_parsed[4]==parsed[4]) + { + found=true; + break; + } + tmpVcardString=tmpVcardString.replace(tmp_vcard_element[0], '\r\n'); + } + + if(found==true) + { + // remove the processed element + vcardString=vcardString.replace(parsed[0], '\r\n'); + // find the corresponding group data (if exists) + if(parsed[1]!='') + { + var re=RegExp('\r\n'+parsed[1].replace('.', '\\..*')+'\r\n', 'm'); + while((vcard_element_related=vcardString.match(re))!=null) + vcardString=vcardString.replace(vcard_element_related[0], '\r\n'); // remove the processed parameter + } + continue; + } + break; + default: + attr_name=parsed[2]; + params_swc=params_array.sort().join(';'); + attr_value=parsed[4]; + break; + } + // remove the processed element + vcardString=vcardString.replace(parsed[0],'\r\n'); + + if(attr_name!='FN' && attr_name!='N' && attr_value=='') // attributes with empty values are not supported and are removed here + { + // find the corresponding group data (if exists) + if(parsed[1]!='') + { + var re=RegExp('\r\n'+parsed[1].replace('.','\\..*')+'\r\n', 'm'); + while((vcard_element_related=vcardString.match(re))!=null) + // remove the processed parameter + vcardString=vcardString.replace(vcard_element_related[0], '\r\n'); + } + continue; + } + + // add the new element to output array (without group) + grouped_elem=new Array(); + grouped_elem[grouped_elem.length]=attr_name+params_swc+':'+attr_value+'\r\n'; + if(additional_related!='') // used if we manually add related items as a part of transformation + grouped_elem[grouped_elem.length]=additional_related; + // find the corresponding group data (if exists) + if(parsed[1]!='') + { + var re=RegExp('\r\n'+parsed[1].replace('.','\\.(.*)')+'\r\n', 'm'); + while((vcard_element_related=vcardString.match(re))!=null) + { + // add the related element to array + grouped_elem[grouped_elem.length]=vcard_element_related[1]+'\r\n'; + // remove the processed parameter + vcardString=vcardString.replace(vcard_element_related[0], '\r\n'); + } + } + // add the new grouped element to output + vcard_out_grouped[vcard_out_grouped.length]=grouped_elem.sort().join(''); + } +// +// after the transformation and grouping we remove all identical elements and preserve sorting + // (for example X-AIM and IMPP;X-SERVICE-TYPE=AIM, ...) + for(var i=vcard_out_grouped.length-1;i>=0;i--) + if(vcard_out_grouped.slice(0,i).indexOf(vcard_out_grouped[i])!=-1) + vcard_out_grouped.splice(i,1); + + // add new group names ... + elemCounter=0; + for(i=0;i1) + vcard_out_grouped[i]=(('\r\n'+vcard_out_grouped[i].substring(0, vcard_out_grouped[i].length-2)).replace(vCard.pre['normalizeVcard_rn-gm'], '\r\nitem'+(elemCounter++)+'.')+'\r\n').substring(2); + + vcard_out_grouped.unshift(vcard_begin); + vcard_out_grouped.push(vcard_end); + + return vcard_out_grouped.join(''); +} diff --git a/radicale_web/web/infcloud/fonts/Roboto-Bold-webfont.eot b/radicale_web/web/infcloud/fonts/Roboto-Bold-webfont.eot new file mode 100644 index 0000000..d9c8988 Binary files /dev/null and b/radicale_web/web/infcloud/fonts/Roboto-Bold-webfont.eot differ diff --git a/radicale_web/web/infcloud/fonts/Roboto-Bold-webfont.svg b/radicale_web/web/infcloud/fonts/Roboto-Bold-webfont.svg new file mode 100644 index 0000000..2cf6d93 --- /dev/null +++ b/radicale_web/web/infcloud/fonts/Roboto-Bold-webfont.svg @@ -0,0 +1,7496 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/radicale_web/web/infcloud/fonts/Roboto-Bold-webfont.ttf b/radicale_web/web/infcloud/fonts/Roboto-Bold-webfont.ttf new file mode 100644 index 0000000..569c7e5 Binary files /dev/null and b/radicale_web/web/infcloud/fonts/Roboto-Bold-webfont.ttf differ diff --git a/radicale_web/web/infcloud/fonts/Roboto-Bold-webfont.woff b/radicale_web/web/infcloud/fonts/Roboto-Bold-webfont.woff new file mode 100644 index 0000000..a560848 Binary files /dev/null and b/radicale_web/web/infcloud/fonts/Roboto-Bold-webfont.woff differ diff --git a/radicale_web/web/infcloud/fonts/Roboto-BoldItalic-webfont.eot b/radicale_web/web/infcloud/fonts/Roboto-BoldItalic-webfont.eot new file mode 100644 index 0000000..716e9b7 Binary files /dev/null and b/radicale_web/web/infcloud/fonts/Roboto-BoldItalic-webfont.eot differ diff --git a/radicale_web/web/infcloud/fonts/Roboto-BoldItalic-webfont.svg b/radicale_web/web/infcloud/fonts/Roboto-BoldItalic-webfont.svg new file mode 100644 index 0000000..804f27b --- /dev/null +++ b/radicale_web/web/infcloud/fonts/Roboto-BoldItalic-webfont.svg @@ -0,0 +1,8652 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/radicale_web/web/infcloud/fonts/Roboto-BoldItalic-webfont.ttf b/radicale_web/web/infcloud/fonts/Roboto-BoldItalic-webfont.ttf new file mode 100644 index 0000000..0f59564 Binary files /dev/null and b/radicale_web/web/infcloud/fonts/Roboto-BoldItalic-webfont.ttf differ diff --git a/radicale_web/web/infcloud/fonts/Roboto-BoldItalic-webfont.woff b/radicale_web/web/infcloud/fonts/Roboto-BoldItalic-webfont.woff new file mode 100644 index 0000000..12c5ee8 Binary files /dev/null and b/radicale_web/web/infcloud/fonts/Roboto-BoldItalic-webfont.woff differ diff --git a/radicale_web/web/infcloud/fonts/Roboto-Italic-webfont.eot b/radicale_web/web/infcloud/fonts/Roboto-Italic-webfont.eot new file mode 100644 index 0000000..6505304 Binary files /dev/null and b/radicale_web/web/infcloud/fonts/Roboto-Italic-webfont.eot differ diff --git a/radicale_web/web/infcloud/fonts/Roboto-Italic-webfont.svg b/radicale_web/web/infcloud/fonts/Roboto-Italic-webfont.svg new file mode 100644 index 0000000..935e561 --- /dev/null +++ b/radicale_web/web/infcloud/fonts/Roboto-Italic-webfont.svg @@ -0,0 +1,8164 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/radicale_web/web/infcloud/fonts/Roboto-Italic-webfont.ttf b/radicale_web/web/infcloud/fonts/Roboto-Italic-webfont.ttf new file mode 100644 index 0000000..34e7f54 Binary files /dev/null and b/radicale_web/web/infcloud/fonts/Roboto-Italic-webfont.ttf differ diff --git a/radicale_web/web/infcloud/fonts/Roboto-Italic-webfont.woff b/radicale_web/web/infcloud/fonts/Roboto-Italic-webfont.woff new file mode 100644 index 0000000..d132ceb Binary files /dev/null and b/radicale_web/web/infcloud/fonts/Roboto-Italic-webfont.woff differ diff --git a/radicale_web/web/infcloud/fonts/Roboto-Light-webfont.eot b/radicale_web/web/infcloud/fonts/Roboto-Light-webfont.eot new file mode 100644 index 0000000..4d4bdac Binary files /dev/null and b/radicale_web/web/infcloud/fonts/Roboto-Light-webfont.eot differ diff --git a/radicale_web/web/infcloud/fonts/Roboto-Light-webfont.svg b/radicale_web/web/infcloud/fonts/Roboto-Light-webfont.svg new file mode 100644 index 0000000..242047e --- /dev/null +++ b/radicale_web/web/infcloud/fonts/Roboto-Light-webfont.svg @@ -0,0 +1,8162 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/radicale_web/web/infcloud/fonts/Roboto-Light-webfont.ttf b/radicale_web/web/infcloud/fonts/Roboto-Light-webfont.ttf new file mode 100644 index 0000000..ce541fb Binary files /dev/null and b/radicale_web/web/infcloud/fonts/Roboto-Light-webfont.ttf differ diff --git a/radicale_web/web/infcloud/fonts/Roboto-Light-webfont.woff b/radicale_web/web/infcloud/fonts/Roboto-Light-webfont.woff new file mode 100644 index 0000000..eb0fe29 Binary files /dev/null and b/radicale_web/web/infcloud/fonts/Roboto-Light-webfont.woff differ diff --git a/radicale_web/web/infcloud/fonts/Roboto-LightItalic-webfont.eot b/radicale_web/web/infcloud/fonts/Roboto-LightItalic-webfont.eot new file mode 100644 index 0000000..b66d0bb Binary files /dev/null and b/radicale_web/web/infcloud/fonts/Roboto-LightItalic-webfont.eot differ diff --git a/radicale_web/web/infcloud/fonts/Roboto-LightItalic-webfont.svg b/radicale_web/web/infcloud/fonts/Roboto-LightItalic-webfont.svg new file mode 100644 index 0000000..5e9b613 --- /dev/null +++ b/radicale_web/web/infcloud/fonts/Roboto-LightItalic-webfont.svg @@ -0,0 +1,8162 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/radicale_web/web/infcloud/fonts/Roboto-LightItalic-webfont.ttf b/radicale_web/web/infcloud/fonts/Roboto-LightItalic-webfont.ttf new file mode 100644 index 0000000..36c2be5 Binary files /dev/null and b/radicale_web/web/infcloud/fonts/Roboto-LightItalic-webfont.ttf differ diff --git a/radicale_web/web/infcloud/fonts/Roboto-LightItalic-webfont.woff b/radicale_web/web/infcloud/fonts/Roboto-LightItalic-webfont.woff new file mode 100644 index 0000000..dc66ac4 Binary files /dev/null and b/radicale_web/web/infcloud/fonts/Roboto-LightItalic-webfont.woff differ diff --git a/radicale_web/web/infcloud/fonts/Roboto-Medium-webfont.eot b/radicale_web/web/infcloud/fonts/Roboto-Medium-webfont.eot new file mode 100644 index 0000000..e988d25 Binary files /dev/null and b/radicale_web/web/infcloud/fonts/Roboto-Medium-webfont.eot differ diff --git a/radicale_web/web/infcloud/fonts/Roboto-Medium-webfont.svg b/radicale_web/web/infcloud/fonts/Roboto-Medium-webfont.svg new file mode 100644 index 0000000..c4f6127 --- /dev/null +++ b/radicale_web/web/infcloud/fonts/Roboto-Medium-webfont.svg @@ -0,0 +1,7496 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/radicale_web/web/infcloud/fonts/Roboto-Medium-webfont.ttf b/radicale_web/web/infcloud/fonts/Roboto-Medium-webfont.ttf new file mode 100644 index 0000000..8420f79 Binary files /dev/null and b/radicale_web/web/infcloud/fonts/Roboto-Medium-webfont.ttf differ diff --git a/radicale_web/web/infcloud/fonts/Roboto-Medium-webfont.woff b/radicale_web/web/infcloud/fonts/Roboto-Medium-webfont.woff new file mode 100644 index 0000000..2122867 Binary files /dev/null and b/radicale_web/web/infcloud/fonts/Roboto-Medium-webfont.woff differ diff --git a/radicale_web/web/infcloud/fonts/Roboto-MediumItalic-webfont.eot b/radicale_web/web/infcloud/fonts/Roboto-MediumItalic-webfont.eot new file mode 100644 index 0000000..25f9be2 Binary files /dev/null and b/radicale_web/web/infcloud/fonts/Roboto-MediumItalic-webfont.eot differ diff --git a/radicale_web/web/infcloud/fonts/Roboto-MediumItalic-webfont.svg b/radicale_web/web/infcloud/fonts/Roboto-MediumItalic-webfont.svg new file mode 100644 index 0000000..583da89 --- /dev/null +++ b/radicale_web/web/infcloud/fonts/Roboto-MediumItalic-webfont.svg @@ -0,0 +1,8652 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/radicale_web/web/infcloud/fonts/Roboto-MediumItalic-webfont.ttf b/radicale_web/web/infcloud/fonts/Roboto-MediumItalic-webfont.ttf new file mode 100644 index 0000000..00ffb28 Binary files /dev/null and b/radicale_web/web/infcloud/fonts/Roboto-MediumItalic-webfont.ttf differ diff --git a/radicale_web/web/infcloud/fonts/Roboto-MediumItalic-webfont.woff b/radicale_web/web/infcloud/fonts/Roboto-MediumItalic-webfont.woff new file mode 100644 index 0000000..d615d62 Binary files /dev/null and b/radicale_web/web/infcloud/fonts/Roboto-MediumItalic-webfont.woff differ diff --git a/radicale_web/web/infcloud/fonts/Roboto-Regular-webfont.eot b/radicale_web/web/infcloud/fonts/Roboto-Regular-webfont.eot new file mode 100644 index 0000000..d4e185d Binary files /dev/null and b/radicale_web/web/infcloud/fonts/Roboto-Regular-webfont.eot differ diff --git a/radicale_web/web/infcloud/fonts/Roboto-Regular-webfont.svg b/radicale_web/web/infcloud/fonts/Roboto-Regular-webfont.svg new file mode 100644 index 0000000..06824bf --- /dev/null +++ b/radicale_web/web/infcloud/fonts/Roboto-Regular-webfont.svg @@ -0,0 +1,7606 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/radicale_web/web/infcloud/fonts/Roboto-Regular-webfont.ttf b/radicale_web/web/infcloud/fonts/Roboto-Regular-webfont.ttf new file mode 100644 index 0000000..305f0d5 Binary files /dev/null and b/radicale_web/web/infcloud/fonts/Roboto-Regular-webfont.ttf differ diff --git a/radicale_web/web/infcloud/fonts/Roboto-Regular-webfont.woff b/radicale_web/web/infcloud/fonts/Roboto-Regular-webfont.woff new file mode 100644 index 0000000..ac7452a Binary files /dev/null and b/radicale_web/web/infcloud/fonts/Roboto-Regular-webfont.woff differ diff --git a/radicale_web/web/infcloud/fonts/license.txt b/radicale_web/web/infcloud/fonts/license.txt new file mode 100644 index 0000000..d645695 --- /dev/null +++ b/radicale_web/web/infcloud/fonts/license.txt @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/radicale_web/web/infcloud/forms.js b/radicale_web/web/infcloud/forms.js new file mode 100644 index 0000000..b169df3 --- /dev/null +++ b/radicale_web/web/infcloud/forms.js @@ -0,0 +1,3307 @@ +/* +InfCloud - the open source CalDAV/CardDAV Web Client +Copyright (C) 2011-2015 + Jan Mate + Andrej Lezo + Matej Mihalik + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as +published by the Free Software Foundation, either version 3 of the +License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . +*/ + +function updateTodoFormDimensions(setHeight) +{ + $('#CATodo').css('width',''); + $('#CATodo').css('width',$('#todo_details_template').css('width')); + + if(setHeight) + { + $('#CATodo').css('height',''); + $('#CATodo').css('height',$('#todo_details_template').css('height')); + } +} + +function updateEventFormDimensions(setHeight) +{ + $('#CAEvent').css('width',''); + $('#CAEvent').css('width',$('#event_details_template').css('width')); + + if(setHeight) + { + $('#CAEvent').css('height',''); + $('#CAEvent').css('height',$('#event_details_template').css('height')); + } +} + +function setFormPosition(jsEvent, confirmRepeat) +{ + var position_x, + position_y, + dist_x, + dist_y; + + $('#event_details_template').css('max-height',''); + + if(jsEvent) + { + if(jsEvent.pageX<=($('#main').width()/2)) + { + position_v='left'; + dist_x=jsEvent.pageX; + } + else + { + position_v='right'; + dist_x=$('body').width()-jsEvent.pageX; + } + + /*if(jsEvent.pageY<=($('#main').height()/2)) + { + position_h='top'; + dist_y=jsEvent.pageY; + } + else + { + position_h='top'; + dist_y=jsEvent.pageY-$('#event_details_template').height(); + }*/ + position_h='top'; + dist_y=Math.max(29, jsEvent.pageY-(confirmRepeat ? $('#CAEvent').height() : $('#event_details_template').height())); + } + else + { + position_v='right'; + position_h='top'; + dist_x=25; + dist_y=29; + } + + $('#CAEvent').css('left',''); + $('#CAEvent').css('right',''); + $('#CAEvent').css('top',''); + $('#CAEvent').css('bottom',''); + $('#CAEvent').css(position_v, dist_x); + $('#CAEvent').css(position_h, dist_y); + $('#event_details_template').css('max-height', $('#main').height()-dist_y+20+'px'); + $('#CAEvent').css('max-height', $('#main').height()-dist_y+20+'px'); +} + +function setTodoPosition(jsEvent) +{ + var dist, + pointY=0; + $('#todo_details_template').css('max-height',''); + $('#CATodo').css('max-height',''); + + if(jsEvent!=undefined) + { + if(jsEvent.pageY!=undefined) + pointY=jsEvent.pageY; + else + pointY=jsEvent.clientY; + } + + if(jsEvent) + { + /*if((pointY)+$('#todo_details_template').height()<$(window).height()) + dist=jsEvent.pageY; + else + dist=pointY-$('#todo_details_template').height();*/ + dist=Math.max(25, jsEvent.pageY-$('#todo_details_template').height()); + } + else + dist=25; + + $('#CATodo').css('left',''); + $('#CATodo').css('right',''); + $('#CATodo').css('top',''); + $('#CATodo').css('bottom',''); + $('#CATodo').css('top', dist); + $('#todo_details_template').css('right', 0); + $('#CATodo').css('right', 25); + $('#todo_details_template').css('max-height', $('#main').height()-dist+20+'px'); + $('#CATodo').css('max-height', $('#main').height()-dist+20+'px'); +} + +function showTimezones(selTimezone, todoSelector) +{ + if(!globalSettings.timezonesupport.value) + return false; + + var select=$('#timezone'+todoSelector); + select.empty(); + var isFirst=false; + for(var izone in timezoneKeys) + { + if(timeZonesEnabled.indexOf(timezoneKeys[izone])==-1) + continue; + if(!isNaN(izone)) + { + var tmp=null; + if(!isFirst) + { + tmp=$('