ctucx.git: ansible-configs

My personal ansible roles and playbooks [deprecated in favor of nixos]

commit 1f3be3d8dcf5de48fb8d06da3cd8261abcb15b7d
parent 10692241c6c498013d67cb1cd4c886be58ed3dcc
Author: Leah (ctucx) <leah@ctu.cx>
Date: Fri, 5 Feb 2021 15:32:05 +0100

radicale: add infcloud
3 files changed, 1459 insertions(+), 0 deletions(-)
A
roles/radicale/files/infcloud-config.js
|
1435
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
M
roles/radicale/tasks/configure.yml
|
14
++++++++++++++
M
roles/radicale/templates/nginx-vhost.conf.j2
|
10
++++++++++
diff --git a/roles/radicale/files/infcloud-config.js b/roles/radicale/files/infcloud-config.js
@@ -0,0 +1,1435 @@
+/*
+InfCloud - the open source CalDAV/CardDAV Web Client
+Copyright (C) 2011-2015
+    Jan Mate <jan.mate@inf-it.com>
+    Andrej Lezo <andrej.lezo@inf-it.com>
+    Matej Mihalik <matej.mihalik@inf-it.com>
+
+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 <http://www.gnu.org/licenses/>.
+*/
+
+
+// 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: 'https://dav.ctu.cx/',
+	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=[ 'Europe/Berlin' ];
+
+
+// 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=true;
+
+
+// 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:_$!<Anniversary>!$_\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/roles/radicale/tasks/configure.yml b/roles/radicale/tasks/configure.yml
@@ -15,3 +15,17 @@
     mode: 0640
     owner: root
     group: radicale
+
+- name: "Download InfCloud 0.13 to webapps-directory"
+  ansible.builtin.unarchive:
+    src: https://www.inf-it.com/InfCloud_0.13.1.zip
+    dest: /usr/share/webapps
+    remote_src: yes
+    mode: 0755
+    owner: root
+    group: root
+
+- name: "Copy InfCloud to remote"
+  copy:
+    src: infcloud-config.js
+    dest: /usr/share/webapps/infcloud/config.js
diff --git a/roles/radicale/templates/nginx-vhost.conf.j2 b/roles/radicale/templates/nginx-vhost.conf.j2
@@ -15,6 +15,11 @@ server {
 		proxy_set_header X-Real-IP $remote_addr;
 		proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
 	}
+
+	location /infcloud {
+		alias /usr/share/webapps/infcloud;
+		index index.html;
+	}
 }
 
 {% endif %}

@@ -35,5 +40,10 @@ server {
 		proxy_set_header X-Real-IP $remote_addr;
 		proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
 	}
+
+	location /infcloud {
+		alias /usr/share/webapps/infcloud;
+		index index.html;
+	}
 }
 {% endif %}