aboutsummaryrefslogtreecommitdiff
path: root/nixops/modules
diff options
context:
space:
mode:
Diffstat (limited to 'nixops/modules')
-rw-r--r--nixops/modules/websites/tools/dav/davical.nix272
-rw-r--r--nixops/modules/websites/tools/dav/davical_19eb79ebf9250e5f339675319902458c40ed1755.patch26
-rw-r--r--nixops/modules/websites/tools/dav/default.nix21
-rw-r--r--nixops/modules/websites/tools/dav/infcloud.nix40
-rw-r--r--nixops/modules/websites/tools/dav/infcloud_config.js1446
5 files changed, 136 insertions, 1669 deletions
diff --git a/nixops/modules/websites/tools/dav/davical.nix b/nixops/modules/websites/tools/dav/davical.nix
index 1e3893f..6b37f11 100644
--- a/nixops/modules/websites/tools/dav/davical.nix
+++ b/nixops/modules/websites/tools/dav/davical.nix
@@ -1,169 +1,133 @@
1{ stdenv, fetchurl, gettext, writeText, env }: 1{ stdenv, fetchurl, gettext, writeText, env, awl, davical }:
2let 2rec {
3 awl = stdenv.mkDerivation rec { 3 keys = [{
4 version = "0.59"; 4 dest = "webapps/dav-davical";
5 name = "awl-${version}"; 5 user = apache.user;
6 src = fetchurl { 6 group = apache.group;
7 url = "https://www.davical.org/downloads/awl_${version}.orig.tar.xz"; 7 permissions = "0400";
8 sha256 = "01b7km7ga3ggbpp8axkc55nizgk5c35fl2z93iydb3hwbxmsvnjp"; 8 text = ''
9 }; 9 <?php
10 unpackCmd = '' 10 $c->pg_connect[] = "dbname=${env.postgresql.database} user=${env.postgresql.user} host=${env.postgresql.socket} password=${env.postgresql.password}";
11 tar --one-top-level -xf $curSrc
12 '';
13 installPhase = ''
14 mkdir -p $out
15 cp -ra dba docs inc scripts tests $out
16 '';
17 };
18 davical = rec {
19 keys = [{
20 dest = "webapps/dav-davical";
21 user = apache.user;
22 group = apache.group;
23 permissions = "0400";
24 text = ''
25 <?php
26 $c->pg_connect[] = "dbname=${env.postgresql.database} user=${env.postgresql.user} host=${env.postgresql.socket} password=${env.postgresql.password}";
27 11
28 $c->readonly_webdav_collections = false; 12 $c->readonly_webdav_collections = false;
29 13
30 $c->admin_email ='davical@tools.immae.eu'; 14 $c->admin_email ='davical@tools.immae.eu';
31 15
32 $c->restrict_setup_to_admin = true; 16 $c->restrict_setup_to_admin = true;
33 17
34 $c->collections_always_exist = false; 18 $c->collections_always_exist = false;
35 19
36 $c->external_refresh = 60; 20 $c->external_refresh = 60;
37 21
38 $c->enable_scheduling = true; 22 $c->enable_scheduling = true;
39 23
40 $c->iMIP = (object) array("send_email" => true); 24 $c->iMIP = (object) array("send_email" => true);
41 25
42 $c->authenticate_hook['optional'] = false; 26 $c->authenticate_hook['optional'] = false;
43 $c->authenticate_hook['call'] = 'LDAP_check'; 27 $c->authenticate_hook['call'] = 'LDAP_check';
44 $c->authenticate_hook['config'] = array( 28 $c->authenticate_hook['config'] = array(
45 'host' => 'ldap.immae.eu', 29 'host' => 'ldap.immae.eu',
46 'port' => '389', 30 'port' => '389',
47 'startTLS' => 'yes', 31 'startTLS' => 'yes',
48 'bindDN'=> 'cn=davical,ou=services,dc=immae,dc=eu', 32 'bindDN'=> 'cn=davical,ou=services,dc=immae,dc=eu',
49 'passDN'=> '${env.ldap.password}', 33 'passDN'=> '${env.ldap.password}',
50 'protocolVersion' => '3', 34 'protocolVersion' => '3',
51 'baseDNUsers'=> array('ou=users,dc=immae,dc=eu', 'ou=group_users,dc=immae,dc=eu'), 35 'baseDNUsers'=> array('ou=users,dc=immae,dc=eu', 'ou=group_users,dc=immae,dc=eu'),
52 'filterUsers' => 'memberOf=cn=users,cn=davical,ou=services,dc=immae,dc=eu', 36 'filterUsers' => 'memberOf=cn=users,cn=davical,ou=services,dc=immae,dc=eu',
53 'baseDNGroups' => 'ou=groups,dc=immae,dc=eu', 37 'baseDNGroups' => 'ou=groups,dc=immae,dc=eu',
54 'filterGroups' => 'memberOf=cn=groups,cn=davical,ou=services,dc=immae,dc=eu', 38 'filterGroups' => 'memberOf=cn=groups,cn=davical,ou=services,dc=immae,dc=eu',
55 'mapping_field' => array( 39 'mapping_field' => array(
56 "username" => "uid", 40 "username" => "uid",
57 "fullname" => "cn", 41 "fullname" => "cn",
58 "email" => "mail", 42 "email" => "mail",
59 "modified" => "modifyTimestamp", 43 "modified" => "modifyTimestamp",
60 ), 44 ),
61 'format_updated'=> array('Y' => array(0,4),'m' => array(4,2),'d'=> array(6,2),'H' => array(8,2),'M'=>array(10,2),'S' => array(12,2)), 45 'format_updated'=> array('Y' => array(0,4),'m' => array(4,2),'d'=> array(6,2),'H' => array(8,2),'M'=>array(10,2),'S' => array(12,2)),
62 /** used to set default value for all users, will be overcharged by ldap if defined also in mapping_field **/ 46 /** used to set default value for all users, will be overcharged by ldap if defined also in mapping_field **/
63 // 'default_value' => array("date_format_type" => "E","locale" => "fr_FR"), 47 // 'default_value' => array("date_format_type" => "E","locale" => "fr_FR"),
64 'group_mapping_field' => array( 48 'group_mapping_field' => array(
65 "username" => "cn", 49 "username" => "cn",
66 "updated" => "modifyTimestamp", 50 "updated" => "modifyTimestamp",
67 "fullname" => "givenName", 51 "fullname" => "givenName",
68 "displayname" => "givenName", 52 "displayname" => "givenName",
69 "members" => "memberUid", 53 "members" => "memberUid",
70 "email" => "mail", 54 "email" => "mail",
71 ), 55 ),
72 ); 56 );
73 57
74 $c->do_not_sync_from_ldap = array('admin' => true); 58 $c->do_not_sync_from_ldap = array('admin' => true);
75 include('drivers_ldap.php'); 59 include('drivers_ldap.php');
76 ''; 60 '';
77 }]; 61 }];
78 webapp = stdenv.mkDerivation rec { 62 webapp = davical.override { config = "/var/secrets/webapps/dav-davical"; };
79 version = "1.1.7"; 63 webRoot = "${webapp}/htdocs";
80 name = "davical-${version}"; 64 apache = rec {
81 src = fetchurl { 65 user = "wwwrun";
82 url = "https://www.davical.org/downloads/davical_${version}.orig.tar.xz"; 66 group = "wwwrun";
83 sha256 = "1ar5m2dxr92b204wkdi8z33ir9vz2jbh5k1p74icpv9ywifvjjp9"; 67 modules = [ "proxy_fcgi" ];
84 }; 68 webappName = "tools_davical";
85 unpackCmd = '' 69 root = "/run/current-system/webapps/${webappName}";
86 tar --one-top-level -xf $curSrc 70 vhostConf = ''
87 ''; 71 Alias /davical "${root}"
88 makeFlags = "all"; 72 Alias /caldav.php "${root}/caldav.php"
89 patches = [ ./davical_19eb79ebf9250e5f339675319902458c40ed1755.patch ]; 73 <Directory "${root}">
90 installPhase = '' 74 DirectoryIndex index.php index.html
91 mkdir -p $out 75 AcceptPathInfo On
92 cp -ra config dba docs htdocs inc locale po scripts testing zonedb $out 76 AllowOverride None
93 ln -s /var/secrets/webapps/dav-davical $out/config/config.php 77 Require all granted
94 '';
95 buildInputs = [ gettext ];
96 };
97 webRoot = "${webapp}/htdocs";
98 apache = rec {
99 user = "wwwrun";
100 group = "wwwrun";
101 modules = [ "proxy_fcgi" ];
102 webappName = "tools_davical";
103 root = "/run/current-system/webapps/${webappName}";
104 vhostConf = ''
105 Alias /davical "${root}"
106 Alias /caldav.php "${root}/caldav.php"
107 <Directory "${root}">
108 DirectoryIndex index.php index.html
109 AcceptPathInfo On
110 AllowOverride None
111 Require all granted
112 78
113 <FilesMatch "\.php$"> 79 <FilesMatch "\.php$">
114 CGIPassAuth on 80 CGIPassAuth on
115 SetHandler "proxy:unix:${phpFpm.socket}|fcgi://localhost" 81 SetHandler "proxy:unix:${phpFpm.socket}|fcgi://localhost"
116 </FilesMatch> 82 </FilesMatch>
117 83
118 RewriteEngine On 84 RewriteEngine On
119 <IfModule mod_headers.c> 85 <IfModule mod_headers.c>
120 Header unset Access-Control-Allow-Origin 86 Header unset Access-Control-Allow-Origin
121 Header unset Access-Control-Allow-Methods 87 Header unset Access-Control-Allow-Methods
122 Header unset Access-Control-Allow-Headers 88 Header unset Access-Control-Allow-Headers
123 Header unset Access-Control-Allow-Credentials 89 Header unset Access-Control-Allow-Credentials
124 Header unset Access-Control-Expose-Headers 90 Header unset Access-Control-Expose-Headers
125 91
126 Header always set Access-Control-Allow-Origin "*" 92 Header always set Access-Control-Allow-Origin "*"
127 Header always set Access-Control-Allow-Methods "GET,POST,OPTIONS,PROPFIND,PROPPATCH,REPORT,PUT,MOVE,DELETE,LOCK,UNLOCK" 93 Header always set Access-Control-Allow-Methods "GET,POST,OPTIONS,PROPFIND,PROPPATCH,REPORT,PUT,MOVE,DELETE,LOCK,UNLOCK"
128 Header always set Access-Control-Allow-Headers "User-Agent,Authorization,Content-type,Depth,If-match,If-None-Match,Lock-Token,Timeout,Destination,Overwrite,Prefer,X-client,X-Requested-With" 94 Header always set Access-Control-Allow-Headers "User-Agent,Authorization,Content-type,Depth,If-match,If-None-Match,Lock-Token,Timeout,Destination,Overwrite,Prefer,X-client,X-Requested-With"
129 Header always set Access-Control-Allow-Credentials false 95 Header always set Access-Control-Allow-Credentials false
130 Header always set Access-Control-Expose-Headers "Etag,Preference-Applied" 96 Header always set Access-Control-Expose-Headers "Etag,Preference-Applied"
131 97
132 RewriteCond %{HTTP:Access-Control-Request-Method} !^$ 98 RewriteCond %{HTTP:Access-Control-Request-Method} !^$
133 RewriteCond %{REQUEST_METHOD} OPTIONS 99 RewriteCond %{REQUEST_METHOD} OPTIONS
134 RewriteRule ^(.*)$ $1 [R=200,L] 100 RewriteRule ^(.*)$ $1 [R=200,L]
135 </IfModule> 101 </IfModule>
136 </Directory> 102 </Directory>
137 ''; 103 '';
138 }; 104 };
139 phpFpm = rec { 105 phpFpm = rec {
140 serviceDeps = [ "postgresql.service" "openldap.service" ]; 106 serviceDeps = [ "postgresql.service" "openldap.service" ];
141 basedir = builtins.concatStringsSep ":" [ webapp "/var/secrets/webapps/dav-davical" awl ]; 107 basedir = builtins.concatStringsSep ":" [ webapp "/var/secrets/webapps/dav-davical" awl ];
142 socket = "/var/run/phpfpm/davical.sock"; 108 socket = "/var/run/phpfpm/davical.sock";
143 pool = '' 109 pool = ''
144 listen = ${socket} 110 listen = ${socket}
145 user = ${apache.user} 111 user = ${apache.user}
146 group = ${apache.group} 112 group = ${apache.group}
147 listen.owner = ${apache.user} 113 listen.owner = ${apache.user}
148 listen.group = ${apache.group} 114 listen.group = ${apache.group}
149 pm = dynamic 115 pm = dynamic
150 pm.max_children = 60 116 pm.max_children = 60
151 pm.start_servers = 2 117 pm.start_servers = 2
152 pm.min_spare_servers = 1 118 pm.min_spare_servers = 1
153 pm.max_spare_servers = 10 119 pm.max_spare_servers = 10
154 120
155 ; Needed to avoid clashes in browser cookies (same domain) 121 ; Needed to avoid clashes in browser cookies (same domain)
156 php_value[session.name] = DavicalPHPSESSID 122 php_value[session.name] = DavicalPHPSESSID
157 php_admin_value[open_basedir] = "${basedir}:/tmp:/var/lib/php/sessions/davical" 123 php_admin_value[open_basedir] = "${basedir}:/tmp:/var/lib/php/sessions/davical"
158 php_admin_value[include_path] = "${awl}/inc:${webapp}/inc" 124 php_admin_value[include_path] = "${awl}/inc:${webapp}/inc"
159 php_admin_value[session.save_path] = "/var/lib/php/sessions/davical" 125 php_admin_value[session.save_path] = "/var/lib/php/sessions/davical"
160 php_flag[magic_quotes_gpc] = Off 126 php_flag[magic_quotes_gpc] = Off
161 php_flag[register_globals] = Off 127 php_flag[register_globals] = Off
162 php_admin_value[error_reporting] = "E_ALL & ~E_NOTICE" 128 php_admin_value[error_reporting] = "E_ALL & ~E_NOTICE"
163 php_admin_value[default_charset] = "utf-8" 129 php_admin_value[default_charset] = "utf-8"
164 php_flag[magic_quotes_runtime] = Off 130 php_flag[magic_quotes_runtime] = Off
165 ''; 131 '';
166 };
167 }; 132 };
168in 133}
169 davical
diff --git a/nixops/modules/websites/tools/dav/davical_19eb79ebf9250e5f339675319902458c40ed1755.patch b/nixops/modules/websites/tools/dav/davical_19eb79ebf9250e5f339675319902458c40ed1755.patch
deleted file mode 100644
index 2a08a5c..0000000
--- a/nixops/modules/websites/tools/dav/davical_19eb79ebf9250e5f339675319902458c40ed1755.patch
+++ /dev/null
@@ -1,26 +0,0 @@
1diff --git a/inc/ui/collection-edit.php b/inc/ui/collection-edit.php
2index 3af9edd3b8c4ad9074113273175098841af6a28e..8c1d84012b035f7bc7faedcb24916581a02a5d3e 100644
3--- a/inc/ui/collection-edit.php
4+++ b/inc/ui/collection-edit.php
5@@ -190,7 +190,7 @@ $privilege_xlate = array(
6 * @param dbrow $row The row object we read from the database.
7 * @return string The formatted privileges.
8 */
9-function collection_privilege_format_function( $value, $column, $row ) {
10+function collection_privilege_format_function( $value, $column = NULL, $row = NULL ) {
11 global $privilege_xlate;
12
13 $privs = bits_to_privilege($value, 'calendar');
14diff --git a/inc/ui/principal-edit.php b/inc/ui/principal-edit.php
15index 20dee7fa4ca2235ff2f74be0dfb52cbe937ef822..2e37cd596b597bcce1e59d7c02a1c5fc2a7f88ce 100644
16--- a/inc/ui/principal-edit.php
17+++ b/inc/ui/principal-edit.php
18@@ -454,7 +454,7 @@ EOTEMPLATE;
19 * @param dbrow $row The row object we read from the database.
20 * @return string The formatted privileges.
21 */
22-function principal_privilege_format_function( $value, $column, $row ) {
23+function principal_privilege_format_function( $value, $column = NULL, $row = NULL ) {
24 global $privilege_xlate;
25
26 $privs = bits_to_privilege($value,'*');
diff --git a/nixops/modules/websites/tools/dav/default.nix b/nixops/modules/websites/tools/dav/default.nix
index 2a82a1d..c24f8db 100644
--- a/nixops/modules/websites/tools/dav/default.nix
+++ b/nixops/modules/websites/tools/dav/default.nix
@@ -1,8 +1,23 @@
1{ lib, pkgs, config, myconfig, mylibs, ... }: 1{ lib, pkgs, config, myconfig, mylibs, ... }:
2let 2let
3 infcloud = pkgs.callPackage ./infcloud.nix {}; 3 infcloud = rec {
4 webappName = "tools_infcloud";
5 root = "/run/current-system/webapps/${webappName}";
6 vhostConf = ''
7 Alias /carddavmate ${root}
8 Alias /caldavzap ${root}
9 Alias /infcloud ${root}
10 <Directory ${root}>
11 AllowOverride All
12 Options FollowSymlinks
13 Require all granted
14 DirectoryIndex index.html
15 </Directory>
16 '';
17 };
4 davical = pkgs.callPackage ./davical.nix { 18 davical = pkgs.callPackage ./davical.nix {
5 env = myconfig.env.tools.davical; 19 env = myconfig.env.tools.davical;
20 inherit (pkgs.webapps) davical awl;
6 }; 21 };
7 22
8 cfg = config.services.myWebsites.tools.dav; 23 cfg = config.services.myWebsites.tools.dav;
@@ -22,7 +37,7 @@ in {
22 hosts = ["dav.immae.eu" ]; 37 hosts = ["dav.immae.eu" ];
23 root = null; 38 root = null;
24 extraConfig = [ 39 extraConfig = [
25 infcloud.apache.vhostConf 40 infcloud.vhostConf
26 davical.apache.vhostConf 41 davical.apache.vhostConf
27 ]; 42 ];
28 }; 43 };
@@ -34,7 +49,7 @@ in {
34 system.extraSystemBuilderCmds = '' 49 system.extraSystemBuilderCmds = ''
35 mkdir -p $out/webapps 50 mkdir -p $out/webapps
36 ln -s ${davical.webRoot} $out/webapps/${davical.apache.webappName} 51 ln -s ${davical.webRoot} $out/webapps/${davical.apache.webappName}
37 ln -s ${infcloud.webRoot} $out/webapps/${infcloud.apache.webappName} 52 ln -s ${pkgs.webapps.infcloud} $out/webapps/${infcloud.webappName}
38 ''; 53 '';
39 }; 54 };
40} 55}
diff --git a/nixops/modules/websites/tools/dav/infcloud.nix b/nixops/modules/websites/tools/dav/infcloud.nix
deleted file mode 100644
index f1204ab..0000000
--- a/nixops/modules/websites/tools/dav/infcloud.nix
+++ /dev/null
@@ -1,40 +0,0 @@
1{ stdenv, fetchzip, ed }:
2let
3 infcloud = rec {
4 webRoot = stdenv.mkDerivation rec {
5 version = "0.13.1";
6 name = "InfCloud-${version}";
7 src = fetchzip {
8 url = "https://www.inf-it.com/InfCloud_${version}.zip";
9 sha256 = "1fjhs0cj0b9fhf5ysfz281mknmmg1z551bas143sxfcqlpa5aiiq";
10 };
11 buildPhase = ''
12 ./cache_update.sh
13 rm config.js
14 '';
15 installPhase = ''
16 cp -a . $out
17 ln -s ${./infcloud_config.js} $out/config.js
18 '';
19 buildInputs = [ ed ];
20 };
21 apache = rec {
22 user = "wwwrun";
23 group = "wwwrun";
24 webappName = "tools_infcloud";
25 root = "/run/current-system/webapps/${webappName}";
26 vhostConf = ''
27 Alias /carddavmate ${root}
28 Alias /caldavzap ${root}
29 Alias /infcloud ${root}
30 <Directory ${root}>
31 AllowOverride All
32 Options FollowSymlinks
33 Require all granted
34 DirectoryIndex index.html
35 </Directory>
36 '';
37 };
38 };
39in
40 infcloud
diff --git a/nixops/modules/websites/tools/dav/infcloud_config.js b/nixops/modules/websites/tools/dav/infcloud_config.js
deleted file mode 100644
index ba73860..0000000
--- a/nixops/modules/websites/tools/dav/infcloud_config.js
+++ /dev/null
@@ -1,1446 +0,0 @@
1/*
2InfCloud - the open source CalDAV/CardDAV Web Client
3Copyright (C) 2011-2015
4 Jan Mate <jan.mate@inf-it.com>
5 Andrej Lezo <andrej.lezo@inf-it.com>
6 Matej Mihalik <matej.mihalik@inf-it.com>
7
8This program is free software: you can redistribute it and/or modify
9it under the terms of the GNU Affero General Public License as
10published by the Free Software Foundation, either version 3 of the
11License, or (at your option) any later version.
12
13This program is distributed in the hope that it will be useful,
14but WITHOUT ANY WARRANTY; without even the implied warranty of
15MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16GNU Affero General Public License for more details.
17
18You should have received a copy of the GNU Affero General Public License
19along with this program. If not, see <http://www.gnu.org/licenses/>.
20*/
21
22
23// NOTE: see readme.txt before you start to configure this client!
24
25
26// NOTE: do not forget to execute the cache_update.sh script every time you
27// update this configuration file or any other files (otherwise your browser
28// will use the previous version of files stored in HTML5 cache). Alternatively
29// you can update the cache.manifest manually - edit the second line beginning
30// with "#V 20" to anything else (this file simple needs "some" change)
31
32
33// Supported setup types (use ONE of them):
34// a.) globalAccountSettings => username and password is hardcoded
35// in config.js, automatic login without the login screen
36// - advantages: fast login process = no username/password is required
37// - disadvantages: username/password is visible in your config.js, so
38// this type of setup is recommended ONLY for intranet/home users
39// b.) globalNetworkCheckSettings => standard setup with login screen
40// - advantages: username/password is required (no visible
41// username/password in config.js)
42// - disadvantages: if a user enters wrong username/password then
43// the browser will show authentication popup window (it is NOT
44// possible to disable it in JavaScript; see the next option)
45// c.) globalNetworkAccountSettings => advanced setup with login screen
46// - advantages: no authentication popup if you enter wrong username/
47// password, dynamic XML configuration generator (you can generate
48// different configurations for your users /by modifying the "auth"
49// module configuration or the PHP code itself/)
50// - disadvantages: requires PHP >= 5.3 and additional configuration,
51// only basic http authentication is supported => always use https!
52//
53//
54// What is a "principal URL"? => Check you server documentation!
55// - "principal URL" is NOT "collection URL"
56// - this client automatically detects collections for "principal URL"
57// - PROPER "principal URL" looks like:
58// https://server.com:8443/principals/users/USER/
59// https://server.com:8443/caldav.php/USER/
60// - INVALID principal URL looks like:
61// https://server.com:8443/principals/users/USER/collection/
62// => this is a collection URL
63// https://server.com:8443/caldav.php/USER/collection/
64// => this is a collection URL
65// https://server.com:8443/principals/users/USER
66// => missing trailing '/'
67// https://server.com:8443/caldav.php/USER
68// => missing trailing '/'
69// /caldav.php/USER/
70// => relative URL instead of full URL
71//
72//
73// List of properties used in globalAccountSettings, globalNetworkCheckSettings
74// and globalNetworkAccountSettings variables (+ in the "auth" module):
75// - href
76// Depending on the setup type set the value to:
77// a.) globalAccountSettings: full "principal URL"
78// b.) globalNetworkCheckSettings: "principal URL" WITHOUT the "USER/" part
79// c.) globalNetworkAccountSettings: "full URL" to the "auth" directory
80// This property is supported in:
81// globalAccountSettings
82// globalNetworkCheckSettings
83// globalNetworkAccountSettings
84// - userAuth
85// - userName
86// Set the username you want to login.
87// - userPassword
88// Set the password for the given username.
89// This property is supported in:
90// globalAccountSettings
91// - timeOut
92// This option sets the timeout for jQuery .ajax call (in miliseconds).
93// Example:
94// timeOut: 90000
95// This property is supported in:
96// globalAccountSettings
97// globalNetworkCheckSettings
98// globalNetworkAccountSettings
99// - lockTimeOut
100// NOTE: used only if server supports LOCK requests
101// This option sets the LOCK timeout value if resource locking
102// is used (in miliseconds).
103// Example:
104// lockTimeOut: 10000
105// This property is supported in:
106// globalAccountSettings
107// globalNetworkCheckSettings
108// globalNetworkAccountSettings (available in auth module only)
109// - checkContentType
110// This option enables a content-type checking for server response.
111// If enabled then only objects with proper content-type are inserted
112// into the interface.
113// If you cannot see data in the interface you may try to disable it (useful
114// if your server returns wrong value in "propstat/prop/getcontenttype").
115// If undefined then content-type checking is enabled.
116// Examples:
117// checkContentType: true
118// checkContentType: false
119// This property is supported in:
120// globalAccountSettings
121// globalNetworkCheckSettings
122// globalNetworkAccountSettings (available in auth module only)
123// - settingsAccount
124// NOTE: server support for custom DAV properties is REQUIRED!
125// This option sets the account where the client properties such as:
126// loaded collections, enabled collections, ... are saved during
127// the logout and resource/collection synchronisation
128// NOTE: set it to true ONLY for ONE account!
129// Examples:
130// settingsAccount: true
131// settingsAccount: false
132// This property is supported in:
133// globalAccountSettings
134// globalNetworkCheckSettings
135// globalNetworkAccountSettings (available in auth module only)
136// - delegation
137// NOTE: server support for this functionality is REQUIRED!
138// This option allows you to load delegated (shared) collections.
139// If set to true (default) then delegation functionality is enabled,
140// and the interface allows you to load delegated collections.
141// If false then delegation functionality is completely disabled.
142// Examples:
143// delegation: true
144// delegation: false
145// This property is supported in:
146// globalAccountSettings
147// globalNetworkCheckSettings
148// globalNetworkAccountSettings (available in auth module only)
149// - additionalResources
150// This options sets the list of additional resources (e.g. shared resources
151// accessible by all users). If the server supports delegation (see
152// the delegation option above) there is no reason to use this option!
153// Supported values:
154// - array of URL encoded resource names (not collections), such as:
155// 'company'
156// 'shared_resource'
157// If empty (default) or undefined then shared resources are not loaded
158// using this option, but may be loaded using the delegation option.
159// Examples:
160// additionalResources=[]
161// additionalResources=['public', 'shared_resource']
162// This property is supported in:
163// globalNetworkCheckSettings
164// - hrefLabel
165// This option sets the server name in the resource header (useful if
166// you want to see custom resource header above the collections).
167// You can use the following variables in the value:
168// %H = full hostname (including the port number)
169// %h = full hostname (without the port number)
170// %D = full domain name
171// %d = only the first and second level domain
172// %P = principal name
173// %p = principal name without the @domain.com part (if present)
174// %U = logged user name
175// %u = logged user name without the @domain.com part (if present)
176// If undefined, empty or or null then '%d/%p [%u]' is used.
177// Examples:
178// hrefLabel: '%d/%p [%u]'
179// hrefLabel: '%D/%u'
180// This property is supported in:
181// globalAccountSettings
182// globalNetworkCheckSettings
183// globalNetworkAccountSettings (available in auth module only)
184// - forceReadOnly
185// This option sets the list of collections as "read-only".
186// Supported values:
187// - true
188// all collections will be "read-only"
189// - array of URL encoded
190// - collections, such as:
191// '/caldav.php/user/calendar/'
192// '/caldav.php/user%40domain.com/calendar/'
193// - regexes, such as:
194// new RegExp('^/caldav.php/user/calendar[0-9]/$', 'i')
195// specifies the list of collections marked as "read-only"
196// If null (default) or undefined then server detected privileges are used.
197// Examples:
198// forceReadOnly: null
199// forceReadOnly: true
200// forceReadOnly: ['/caldav.php/user/calendar/',
201// '/caldav.php/user/calendar2/']
202// forceReadOnly: [new RegExp('^/.*/user/calendar[0-9]/$', 'i')]
203// This property is supported in:
204// globalAccountSettings
205// globalNetworkCheckSettings
206// globalNetworkAccountSettings (available in auth module only, with
207// different syntax for regexes)
208// - ignoreAlarms
209// This option sets list of calendar collections with disabled
210// alarm functionality.
211// Supported values:
212// - true
213// alarm functionality is disabled for all collections
214// - array of URL encoded
215// - collections, such as:
216// '/caldav.php/user/calendar/'
217// '/caldav.php/user%40domain.com/calendar/'
218// - regexes, such as:
219// new RegExp('^/caldav.php/user/calendar[0-9]/$', 'i')
220// specifies the list of collections with disabled alarm functionality.
221// If false (default) or undefined then alarm functionality is enabled
222// for all collections.
223// Examples:
224// ignoreAlarms: true
225// ignoreAlarms: ['/caldav.php/user/calendar/',
226// '/caldav.php/user/calendar2/']
227// ignoreAlarms: [new RegExp('^/.*/user/calendar[0-9]/$', 'i')]
228// This property is supported in:
229// globalAccountSettings
230// globalNetworkCheckSettings
231// globalNetworkAccountSettings (available in auth module only, with
232// different syntax for regexes)
233// - backgroundCalendars
234// This options defines a list of background calendars. If there is
235// at least one event defined for the given day in a background calendar,
236// the background color for that day will be pink/light-red.
237// Supported values:
238// - array of URL encoded
239// - collections, such as:
240// '/caldav.php/user/calendar/'
241// '/caldav.php/user%40domain.com/calendar/'
242// - regexes, such as:
243// new RegExp('^/caldav.php/user/calendar[0-9]/$', 'i')
244// specifies the list of background calendar collections.
245// Examples:
246// backgroundCalendars: ['/caldav.php/user/calendar/',
247// '/caldav.php/user/calendar2/']
248// backgroundCalendars: [new RegExp('^/.*/user/calendar[0-9]/$', 'i')]
249// This property is supported in:
250// globalAccountSettings
251// globalNetworkCheckSettings
252// globalNetworkAccountSettings (available in auth module only, with
253// different syntax for regexes)
254// Special options not present in configuration examples:
255// NOTE: use ONLY if you know what are you doing!
256// - crossDomain
257// This option sets the crossDomain for jQuery .ajax call. If null (default)
258// then the value is autodetected /and the result is shown in the console/
259// - withCredentials
260// This option sets the withCredentials for jQuery .ajax call. The default
261// value is false and there is NO REASON to change it to true!
262// NOTE: if true, Access-Control-Allow-Origin "*" (CORS header) not works!
263
264
265// globalAccountSettings
266// Use this option if you want to use automatic login (without a login
267// screen) with hardcoded username/password in config.js. Otherwise use
268// globalNetworkCheckSettings or globalNetworkAccountSettings (see below).
269// NOTE: if this option is used the value must be an array of object(s).
270// List of properties used in globalAccountSettings variable:
271// - href
272// Set this option to the full "principal URL".
273// NOTE: the last character in the value must be '/'
274// - userAuth
275// - userName
276// Set the username you want to login.
277// - userPassword
278// Set the password for the given username.
279// NOTE: for description of other properties see comments at the beginning
280// of this file.
281// NOTE: for minimal/fast setup you need to set only the href and userAuth
282// options. It is safe/recommended to keep the remaining options unchanged!
283// Example:
284//var globalAccountSettings=[
285// {
286// href: 'https://server1.com:8443/caldav.php/USERNAME1/',
287// userAuth:
288// {
289// userName: 'USERNAME1',
290// userPassword: 'PASSWORD1'
291// },
292// timeOut: 90000,
293// lockTimeOut: 10000,
294// checkContentType: true,
295// settingsAccount: true,
296// delegation: true,
297// hrefLabel: null,
298// forceReadOnly: null,
299// ignoreAlarms: false,
300// backgroundCalendars: []
301// },
302// {
303// href: 'https://server2.com:8443/caldav.php/USERNAME2/',
304// ...
305// ...
306// }
307//];
308
309
310// globalNetworkCheckSettings
311// Use this option if you want to use standard login screen without
312// hardcoded username/password in config.js (used by globalAccountSettings).
313// NOTE: if this option is used the value must be an object.
314// List of properties used in globalAccountSettings variable:
315// - href
316// Set this option to the "principal URL" WITHOUT the "USERNAME/"
317// part (this options uses the username from the login screen).
318// NOTE: the last character in the value must be '/'
319// NOTE: for description of other properties see comments at the beginning
320// of this file.
321// NOTE: for minimal/fast setup you need to set only the href option. It is
322// safe/recommended to keep the remaining options unchanged!
323// Example href values:
324// OS X server http example (see misc/readme_osx.txt for server setup):
325// href: 'http://osx.server.com:8008/principals/users/'
326// OS X server https example (see misc/readme_osx.txt for server setup):
327// href: 'https://osx.server.com:8443/principals/users/'
328// Cyrus server https example:
329// href: 'https://cyrus.server.com/dav/principals/user/'
330// Example:
331// Davical example which automatically detects the protocol, server name,
332// port, ... (client installed into Davical "htdocs" subdirectory;
333// works "out of the box", no additional setup required):
334var globalNetworkCheckSettings={
335 href: location.protocol+'//'+location.hostname+
336 (location.port ? ':'+location.port: '')+
337 location.pathname.replace(RegExp('/+[^/]+/*(index\.html)?$'),'')+
338 '/caldav.php/',
339 timeOut: 90000,
340 lockTimeOut: 10000,
341 checkContentType: true,
342 settingsAccount: true,
343 delegation: true,
344 additionalResources: [],
345 hrefLabel: null,
346 forceReadOnly: null,
347 ignoreAlarms: false,
348 backgroundCalendars: []
349}
350
351
352// globalNetworkAccountSettings
353// Try this option ONLY if you have working setup using
354// globalNetworkCheckSettings and want to fix the authentication popup
355// window problem (if invalid username/password is entered)!
356// If you use this option then your browser sends username/password to the PHP
357// "auth" module ("auth" directory) instead of the DAV server itself.
358// The "auth" module then validates your username/password against your server,
359// and if the authentication is successful, then it sends back a configuration
360// XML (requires additional configuration). The resulting XML is handled
361// IDENTICALLY as the globalAccountSettings configuration option.
362// NOTE: for the "auth" module configuration see readme.txt!
363// NOTE: this option invokes a login screen and disallows access until
364// the client gets correct XML configuration file from the server!
365// List of properties used in globalNetworkAccountSettings variable:
366// - href
367// Set this option to the "full URL" of the "auth" directory
368// NOTE: the last character in the value must be '/'
369// NOTE: for description of other properties see comments at the beginning
370// of this file.
371// Example href values:
372// href: 'https://server.com/client/auth/'
373// Example:
374// Use this configuration if the "auth" module is located in the client
375// installation subdirectory (default):
376//var globalNetworkAccountSettings={
377// href: location.protocol+'//'+location.hostname+
378// (location.port ? ':'+location.port : '')+
379// location.pathname.replace(RegExp('index\.html$'),'')+
380// 'auth/',
381// timeOut: 30000
382//};
383
384
385// globalUseJqueryAuth
386// Use jQuery .ajax() auth or custom header for HTTP basic auth (default).
387// Set this option to true if your server uses digest auth (note: you may
388// experience auth popups on some browsers).
389// If undefined (or empty), custom header for HTTP basic auth is used.
390// Example:
391//var globalUseJqueryAuth=false;
392
393
394// globalBackgroundSync
395// Enable background synchronization even if the browser window/tab has no
396// focus.
397// If false, synchronization is performed only if the browser window/tab
398// is focused. If undefined or not false, then background sync is enabled.
399// Example:
400var globalBackgroundSync=true;
401
402
403// globalSyncResourcesInterval
404// This option defines how often (in miliseconds) are resources/collections
405// asynchronously synchronized.
406// Example:
407var globalSyncResourcesInterval=120000;
408
409
410// globalEnableRefresh
411// This option enables or disables the manual synchronization button in
412// the interface. If this option is enabled then users can perform server
413// synchronization manually. Enabling this option may cause high server
414// load (even DDOS) if users will try to manually synchronize data too
415// often (instead of waiting for the automatic synchronization).
416// If undefined or false, the synchronization button is disabled.
417// NOTE: enable this option only if you really know what are you doing!
418// Example:
419var globalEnableRefresh=false;
420
421
422// globalEnableKbNavigation
423// Enable basic keyboard navigation using arrow keys?
424// If undefined or not false, keyboard navigation is enabled.
425// Example:
426var globalEnableKbNavigation=true;
427
428
429// globalSettingsType
430// Where to store user settings such as: active view, enabled/selected
431// collections, ... (the client store them into DAV property on the server).
432// NOTE: not all servers support storing DAV properties (some servers support
433// only subset /or none/ of these URLs).
434// Supported values:
435// - 'principal-URL', '', null or undefined (default) => settings are stored
436// to principal-URL (recommended for most servers)
437// - 'addressbook-home-set' => settings are are stored to addressbook-home-set
438// - 'calendar-home-set' => settings are stored to calendar-home-set
439// Example:
440//var globalSettingsType='';
441
442
443// globalCrossServerSettingsURL
444// Settings such as enabled/selected collections are stored on the server
445// (see the previous option) in form of full URL
446// (e.g.: https://user@server:port/principal/collection/), but even if this
447// approach is "correct" (you can use the same principal URL with multiple
448// different logins, ...) it causes a problem if your server is accessible
449// from multiple URLs (e.g. http://server/ and https://server/). If you want
450// to store only the "principal/collection/" part of the URL (instead of the
451// full URL) then enable this option.
452// Example:
453//var globalCrossServerSettingsURL=false;
454
455
456// globalInterfaceLanguage
457// Default interface language (note: this option is case sensitive):
458// cs_CZ (Čeština [Czech])
459// da_DK (Dansk [Danish]; thanks Niels Bo Andersen)
460// de_DE (Deutsch [German]; thanks Marten Gajda and Thomas Scheel)
461// en_US (English [English/US])
462// es_ES (Español [Spanish]; thanks Damián Vila)
463// fr_FR (Français [French]; thanks John Fischer)
464// it_IT (Italiano [Italian]; thanks Luca Ferrario)
465// ja_JP (日本語 [Japan]; thanks Muimu Nakayama)
466// hu_HU (Magyar [Hungarian])
467// nl_NL (Nederlands [Dutch]; thanks Johan Vromans)
468// sk_SK (Slovenčina [Slovak])
469// tr_TR (Türkçe [Turkish]; thanks Selcuk Pultar)
470// ru_RU (Русский [Russian]; thanks Александр Симонов)
471// uk_UA (Українська [Ukrainian]; thanks Serge Yakimchuck)
472// zh_CN (中国 [Chinese]; thanks Fandy)
473// Example:
474var globalInterfaceLanguage='fr_FR';
475
476
477// globalInterfaceCustomLanguages
478// If defined and not empty then only languages listed here are shown
479// at the login screen, otherwise (default) all languages are shown
480// NOTE: values in the array must refer to an existing localization
481// (see the option above)
482// Example:
483// globalInterfaceCustomLanguages=['en_US', 'sk_SK'];
484var globalInterfaceCustomLanguages=[];
485
486
487// globalSortAlphabet
488// Use JavaScript localeCompare() or custom alphabet for data sorting.
489// Custom alphabet is used by default because JavaScript localeCompare()
490// not supports collation and often returns "wrong" result. If set to null
491// then localeCompare() is used.
492// Example:
493// var globalSortAlphabet=null;
494var globalSortAlphabet=' 0123456789'+
495 'AÀÁÂÄÆÃÅĀBCÇĆČDĎEÈÉÊËĒĖĘĚFGĞHIÌÍÎİÏĪĮJKLŁĹĽMNŃÑŇOÒÓÔÖŐŒØÕŌ'+
496 'PQRŔŘSŚŠȘșŞşẞTŤȚțŢţUÙÚÛÜŰŮŪVWXYÝŸZŹŻŽ'+
497 'aàáâäæãåābcçćčdďeèéêëēėęěfgğhiìíîïīįıjklłĺľmnńñňoòóôöőœøõō'+
498 'pqrŕřsśšßtťuùúûüűůūvwxyýÿzźżžАБВГҐДЕЄЖЗИІЇЙКЛМНОПРСТУФХЦЧШЩЮЯ'+
499 'Ьабвгґдеєжзиіїйклмнопрстуфхцчшщюяь';
500
501
502// globalSearchTransformAlphabet
503// To support search without diacritics (e.g. search for 'd' will find: 'Ď', 'ď')
504// it is required to define something like "character equivalence".
505// key = regex text, value = search character
506// Example:
507var globalSearchTransformAlphabet={
508 '[ÀàÁáÂâÄäÆæÃãÅåĀā]': 'a', '[ÇçĆćČč]': 'c', '[Ďď]': 'd',
509 '[ÈèÉéÊêËëĒēĖėĘęĚě]': 'e', '[Ğğ]': 'g', '[ÌìÍíÎîİıÏïĪīĮį]': 'i',
510 '[ŁłĹ弾]': 'l', '[ŃńÑñŇň]': 'n', '[ÒòÓóÔôÖöŐőŒœØøÕõŌō]': 'o',
511 '[ŔŕŘř]': 'r', '[ŚśŠšȘșŞşẞß]': 's', '[ŤťȚțŢţ]': 't',
512 '[ÙùÚúÛûÜüŰűŮůŪū]': 'u', '[ÝýŸÿ]': 'y', '[ŹźŻżŽž]': 'z'
513};
514
515// globalResourceAlphabetSorting
516// If more than one resource (server account) is configured, sort the
517// resources alphabetically?
518// Example:
519var globalResourceAlphabetSorting=true;
520
521
522// globalNewVersionNotifyUsers
523// Update notification will be shown only to users with login names defined
524// in this array.
525// If undefined (or empty), update notifications will be shown to all users.
526// Example:
527// globalNewVersionNotifyUsers=['admin', 'peter'];
528var globalNewVersionNotifyUsers=[];
529
530
531// globalDatepickerFormat
532// Set the datepicker format (see
533// http://docs.jquery.com/UI/Datepicker/formatDate for valid values).
534// NOTE: date format is predefined for each localization - use this option
535// ONLY if you want to use custom date format (instead of the localization
536// predefined one).
537// Example:
538//var globalDatepickerFormat='dd.mm.yy';
539var globalDatepickerFormat='yy-mm-dd';
540
541
542// globalDatepickerFirstDayOfWeek
543// Set the datepicker first day of the week: Sunday is 0, Monday is 1, etc.
544// Example:
545var globalDatepickerFirstDayOfWeek=1;
546
547
548// globalHideInfoMessageAfter
549// How long are information messages (such as: success, error) displayed
550// (in miliseconds).
551// Example:
552var globalHideInfoMessageAfter=1800;
553
554
555// globalEditorFadeAnimation
556// Set the editor fade in/out animation duration when editing or saving data
557// (in miliseconds).
558// Example:
559var globalEditorFadeAnimation=666;
560
561
562
563
564// ******* CalDAV (CalDavZAP) related settings ******* //
565
566// globalEventStartPastLimit, globalEventStartFutureLimit, globalTodoPastLimit
567// Number of months pre-loaded from past/future in advance for calendars
568// and todo lists (if null then date range synchronization is disabled).
569// NOTE: interval synchronization is used only if your server supports
570// sync-collection REPORT (e.g. DAViCal).
571// NOTE: if you experience problems with data loading and your server has
572// no time-range filtering support set these variables to null.
573// Example:
574var globalEventStartPastLimit=3;
575var globalEventStartFutureLimit=3;
576var globalTodoPastLimit=1;
577
578
579// globalLoadedCalendarCollections
580// This option sets the list of calendar collections (down)loaded after login.
581// If empty then all calendar collections for the currently logged user are
582// loaded.
583// NOTE: settings stored on the server (see settingsAccount) overwrite this
584// option.
585// Example:
586var globalLoadedCalendarCollections=[];
587
588
589// globalLoadedTodoCollections
590// This option sets the list of todo collections (down)loaded after login.
591// If empty then all todo collections for the currently logged user are loaded.
592// NOTE: settings stored on the server (see settingsAccount) overwrite this
593// option.
594// Example:
595var globalLoadedTodoCollections=[];
596
597
598// globalActiveCalendarCollections
599// This options sets the list of calendar collections checked (enabled
600// checkbox => data visible in the interface) by default after login.
601// If empty then all loaded calendar collections for the currently logged
602// user are checked.
603// NOTE: only already (down)loaded collections can be checked (see
604// the globalLoadedCalendarCollections option).
605// NOTE: settings stored on the server (see settingsAccount) overwrite this
606// option.
607// Example:
608var globalActiveCalendarCollections=[];
609
610
611// globalActiveTodoCollections
612// This options sets the list of todo collections checked (enabled
613// checkbox => data visible in the interface) by default after login.
614// If empty then all loaded todo collections for the currently logged
615// user are checked.
616// NOTE: only already (down)loaded collections can be checked (see
617// the globalLoadedTodoCollections option).
618// NOTE: settings stored on the server (see settingsAccount) overwrite this
619// option.
620// Example:
621var globalActiveTodoCollections=[];
622
623
624// globalCalendarSelected
625// This option sets which calendar collection will be pre-selected
626// (if you create a new event) by default after login.
627// The value must be URL encoded path to a calendar collection,
628// for example: 'USER/calendar/'
629// If empty or undefined then the first available calendar collection
630// is selected automatically.
631// NOTE: only already (down)loaded collections can be pre-selected (see
632// the globalLoadedCalendarCollections option).
633// NOTE: settings stored on the server (see settingsAccount) overwrite this
634// option.
635// Example:
636//var globalCalendarSelected='';
637
638
639// globalTodoCalendarSelected
640// This option sets which todo collection will be pre-selected
641// (if you create a new todo) by default after login.
642// The value must be URL encoded path to a todo collection,
643// for example: 'USER/todo_calendar/'
644// If empty or undefined then the first available todo collection
645// is selected automatically.
646// NOTE: only already (down)loaded collections can be pre-selected (see
647// the globalLoadedTodoCollections option).
648// NOTE: settings stored on the server (see settingsAccount) overwrite this
649// option.
650// Example:
651//var globalTodoCalendarSelected='';
652
653
654// globalActiveView
655// This options sets the default fullcalendar view option (the default calendar
656// view after the first login).
657// Supported values:
658// - 'month'
659// - 'multiWeek'
660// - 'agendaWeek'
661// - 'agendaDay'
662// NOTE: we use custom and enhanced version of fullcalendar!
663// Example:
664var globalActiveView='multiWeek';
665
666
667// globalOpenFormMode
668// Open new event form on 'single' or 'double' click.
669// If undefined or not 'double', then 'single' is used.
670// Example:
671var globalOpenFormMode='double';
672
673
674// globalTodoListFilterSelected
675// This options sets the list of filters in todo list that are selected
676// after login.
677// Supported options:
678// - 'filterAction'
679// - 'filterProgress' (available only if globalAppleRemindersMode is disabled)
680// - 'filterCompleted'
681// - 'filterCanceled' (available only if globalAppleRemindersMode is disabled)
682// NOTE: settings stored on the server (see settingsAccount) overwrite this
683// option.
684// Example:
685var globalTodoListFilterSelected=['filterAction', 'filterProgress'];
686
687
688// globalCalendarStartOfBusiness, globalCalendarEndOfBusiness
689// These options set the start and end of business hours with 0.5 hour
690// precision. Non-business hours are faded out in the calendar interface.
691// If both variables are set to the same value then no fade out occurs.
692// Example:
693var globalCalendarStartOfBusiness=8;
694var globalCalendarEndOfBusiness=17;
695
696
697// globalDefaultEventDuration
698// This option sets the default duration (in minutes) for newly created events.
699// If undefined or null, globalCalendarEndOfBusiness value will be taken as
700// a default end time instead.
701// Example:
702var globalDefaultEventDuration=120;
703
704
705// globalAMPMFormat
706// This option enables to use 12 hours format (AM/PM) for displaying time.
707// NOTE: time format is predefined for each localization - use this option
708// ONLY if you want to use custom time format (instead of the localization
709// predefined one).
710// Example:
711//var globalAMPMFormat=false;
712
713
714// globalTimeFormatBasic
715// This option defines the time format information for events in month and
716// multiweek views. If undefined or null then default value is used.
717// If defined as empty string no time information is shown in these views.
718// See http://arshaw.com/fullcalendar/docs/utilities/formatDate/ for exact
719// formating rules.
720// Example:
721//var globalTimeFormatBasic='';
722
723
724// globalTimeFormatAgenda
725// This option defines the time format information for events in day and
726// week views. If undefined or null then default value is used.
727// If defined as empty string no time information is shown in these views.
728// See http://arshaw.com/fullcalendar/docs/utilities/formatDate/ for exact
729// formating rules.
730// Example:
731//var globalTimeFormatAgenda='';
732
733
734// globalDisplayHiddenEvents
735// This option defined whether events from unechecked calendars are displayed
736// with certain transparency (true) or completely hidden (false).
737// Example:
738var globalDisplayHiddenEvents=false;
739
740
741// globalTimeZoneSupport
742// This option enables timezone support in the client.
743// NOTE: timezone cannot be specified for all-day events because these don't
744// have start and end time.
745// If this option is disabled then local time is used.
746// Example:
747var globalTimeZoneSupport=true;
748
749
750// globalTimeZone
751// If timezone support is enabled, this option sets the default timezone.
752// See timezones.js or use the following command to get the list of supported
753// timezones (defined in timezones.js):
754// grep "'[^']\+': {" timezones.js | sed -Ee "s#(\s*'|':\s*\{)##g"
755// Example:
756var globalTimeZone='Europe/Paris';
757
758
759// globalTimeZonesEnabled
760// This option sets the list of available timezones in the interface (for the
761// list of supported timezones see the comment for the previous configuration
762// option).
763// NOTE: if there is at least one event/todo with a certain timezone defined,
764// that timezone is enabled (even if it is not present in this list).
765// Example:
766// var globalTimeZonesEnabled=['America/New_York', 'Europe/Berlin'];
767var globalTimeZonesEnabled=[];
768
769
770// globalRewriteTimezoneComponent
771// This options sets whether the client will enhance/replace (if you edit an
772// event or todo) the timezone information using the official IANA timezone
773// database information (recommended).
774// Example:
775var globalRewriteTimezoneComponent=true;
776
777
778// globalRemoveUnknownTimezone
779// This options sets whether the client will remove all non-standard timezone
780// names from events and todos (if you edit an event or todo)
781// (e.g.: /freeassociation.sourceforge.net/Tzfile/Europe/Vienna)
782// Example:
783var globalRemoveUnknownTimezone=false;
784
785
786// globalShowHiddenAlarms
787// This option sets whether the client will show alarm notifications for
788// unchecked calendars. If this option is enabled and you uncheck a calendar
789// in the calendar list, alarm notifications will be temporary disabled for
790// unchecked calendar(s).
791// Example:
792var globalShowHiddenAlarms=false;
793
794
795// globalIgnoreCompletedOrCancelledAlarms
796// This options sets whether the client will show alarm notifications for
797// already completed or cancelled todos. If enabled then alarm notification
798// for completed and cancelled todos are disabled.
799// Example:
800var globalIgnoreCompletedOrCancelledAlarms=true;
801
802
803// globalMozillaSupport
804// Mozilla automatically treats custom repeating event calculations as if
805// the start day of the week is Monday, despite what day is chosen in settings.
806// Set this variable to true to use the same approach, ensuring compatible
807// event rendering in special cases.
808// Example:
809var globalMozillaSupport=false;
810
811
812// globalCalendarColorPropertyXmlns
813// This options sets the namespace used for storing the "calendar-color"
814// property by the client.
815// If true, undefined (or empty) "http://apple.com/ns/ical/" is used (Apple
816// compatible). If false, then the calendar color modification functionality
817// is completely disabled.
818// Example:
819//var globalCalendarColorPropertyXmlns=true;
820
821
822// globalWeekendDays
823// This option sets the list of days considered as weekend days (these
824// are faded out in the calendar interface). Non-weekend days are automatically
825// considered as business days.
826// Sunday is 0, Monday is 1, etc.
827// Example:
828var globalWeekendDays=[0, 6];
829
830
831// globalAppleRemindersMode
832// If this option is enabled then then client will use the same approach
833// for handling repeating reminders (todos) as Apple. It is STRONGLY
834// recommended to enabled this option if you use any Apple clients for
835// reminders (todos).
836// Supported options:
837// - 'iOS6'
838// - 'iOS7'
839// - true (support of the latest iOS version - 'iOS8')
840// - false
841// If this option is enabled:
842// - RFC todo support is SEVERELY limited and the client mimics the behaviour
843// of Apple Reminders.app (to ensure maximum compatibility)
844// - when a single instance of repeating todo is edited, it becomes an
845// autonomous non-repeating todo with NO relation to the original repeating
846// todo
847// - capabilities of repeating todos are limited - only the first instance
848// is ever visible in the interface
849// - support for todo DTSTART attribute is disabled
850// - support for todo STATUS attribute other than COMPLETED and NEEDS-ACTION
851// is disabled
852// - [iOS6 only] support for LOCATION and URL attributes is disabled
853// Example:
854var globalAppleRemindersMode=true;
855
856
857// globalSubscribedCalendars
858// This option specifies a list of remote URLs to ics files (e.g.: used
859// for distributing holidays information). Subscribed calendars are
860// ALWAYS read-only. Remote servers where ics files are hosted MUST
861// return proper CORS headers (see readme.txt) otherwise this functionality
862// will not work!
863// NOTE: subsribed calendars are NOT "shared" calendars. For "shared"
864// calendars see the delegation option in globalAccountSettings,
865// globalNetworkCheckSettings and globalNetworkAccountSettings.
866// List of properties used in globalSubscribedCalendars variable:
867// - hrefLabel
868// This options defines the header string above the subcsribed calendars.
869// - calendars
870// This option specifies an array of remote calendar objects with the
871// following properties:
872// - href
873// Set this option to the "full URL" of the remote calendar
874// - userAuth
875// NOTE: keep empty if remote authentication is not required!
876// - userName
877// Set the username you want to login.
878// - userPassword
879// Set the password for the given username.
880// - typeList
881// Set the list of objects you want to process from remote calendars;
882// two options are available:
883// - 'vevent' (show remote events in the interface)
884// - 'vtodo' (show remote todos in the interface)
885// - ignoreAlarm
886// Set this option to true if you want to disable alarm notifications
887// from the remote calendar.
888// - displayName
889// Set this option to the name of the calendar you want to see
890// in the interface.
891// - color
892// Set the calendar color you want to see in the interface.
893// Example:
894//var globalSubscribedCalendars={
895// hrefLabel: 'Subscribed',
896// calendars: [
897// {
898// href: 'http://something.com/calendar.ics',
899// userAuth: {
900// userName: '',
901// userPassword: ''
902// },
903// typeList: ['vevent', 'vtodo'],
904// ignoreAlarm: true,
905// displayName: 'Remote Calendar 1',
906// color: '#ff0000'
907// },
908// {
909// href: 'http://calendar.com/calendar2.ics',
910// ...
911// ...
912// }
913// ]
914//};
915
916
917
918// ******* CardDAV (CardDavMATE) related settings ******* //
919
920
921// globalLoadedAddressbookCollections
922// This option sets the list of addressbook collections (down)loaded after
923// login. If empty then all addressbook collections for the currently logged
924// user are loaded.
925// NOTE: settings stored on the server (see settingsAccount) overwrite this
926// option.
927// Example:
928var globalLoadedAddressbookCollections=[];
929
930
931// globalActiveAddressbookCollections
932// This options sets the list of addressbook collections checked (enabled
933// checkbox => data visible in the interface) by default after login.
934// If empty then all loaded addressbook collections for the currently logged
935// user are checked.
936// NOTE: only already (down)loaded collections can be checked (see
937// the globalLoadedAddressbookCollections option).
938// NOTE: settings stored on the server (see settingsAccount) overwrite this
939// option.
940// Example:
941var globalActiveAddressbookCollections=[];
942
943
944// globalAddressbookSelected
945// This option sets which addressbook collection will be pre-selected
946// (if you create a new contact) by default after login.
947// The value must be URL encoded path to an addressbook collection,
948// for example: 'USER/addressbook/'
949// If empty or undefined then the first available addressbook collection
950// is selected automatically.
951// NOTE: only already (down)loaded collections can be pre-selected (see
952// the globalLoadedAddressbookCollections option).
953// NOTE: settings stored on the server (see settingsAccount) overwrite this
954// option.
955// Example:
956//var globalAddressbookSelected='';
957
958
959// globalCompatibility
960// This options is reserved for various compatibility settings.
961// NOTE: if this option is used the value must be an object.
962// Currently there is only one supported option:
963// - anniversaryOutputFormat
964// Different clients use different (and incompatible) approach
965// to store anniversary date in vCards. Apple stores this attribute as:
966// itemX.X-ABDATE;TYPE=pref:2000-01-01\r\n
967// itemX.X-ABLabel:_$!<Anniversary>!$_\r\n'
968// other clients store this attribute as:
969// X-ANNIVERSARY:2000-01-01\r\n
970// Choose 'apple' or 'other' (lower case) for your 3rd party client
971// compatibility. You can chose both: ['apple', 'other'], but it may
972// cause many problems in the future, for example: duplicate anniversary
973// dates, invalid/old anniversary date in your clients, ...)
974// Examples:
975// anniversaryOutputFormat: ['other']
976// anniversaryOutputFormat: ['apple', 'other']
977// Example:
978var globalCompatibility={anniversaryOutputFormat: ['apple']};
979
980
981// globalUriHandler{Tel,Email,Url,Profile}
982// These options set the URI handlers for TEL, EMAIL, URL and X-SOCIALPROFILE
983// vCard attributes. Set them to null (or comment out) to disable.
984// NOTE: for globalUriHandlerTel is recommended to use 'tel:', 'callto:'
985// or 'skype:'. The globalUriHandlerUrl value is used only if no URI handler
986// is defined in the URL.
987// NOTE: it is safe to keep these values unchanged!
988// Example:
989var globalUriHandlerTel='tel:';
990var globalUriHandlerEmail='mailto:';
991var globalUriHandlerUrl='http://';
992var globalUriHandlerProfile={
993 'twitter': 'http://twitter.com/%u',
994 'facebook': 'http://www.facebook.com/%u',
995 'flickr': 'http://www.flickr.com/photos/%u',
996 'linkedin': 'http://www.linkedin.com/in/%u',
997 'myspace': 'http://www.myspace.com/%u',
998 'sinaweibo': 'http://weibo.com/n/%u'
999};
1000
1001
1002// globalDefaultAddressCountry
1003// This option sets the default country for new address fields.
1004// See common.js or use the following command to get the list of
1005// all supported country codes (defined in common.js):
1006// grep -E "'[a-z]{2}':\s+\[" common.js | sed -Ee 's#^\s+|\s+\[\s+# #g'
1007// Example:
1008var globalDefaultAddressCountry='fr';
1009
1010
1011// globalAddressCountryEquivalence
1012// This option sets the processing of the country field specified
1013// in the vCard ADR attribute.
1014// By default the address field in vCard looks like:
1015// ADR;TYPE=WORK:;;1 Waters Edge;Baytown;LA;30314;USA\r\n
1016// what cause a problem, because the country field is a plain
1017// text and can contain any value, e.g.:
1018// USA
1019// United States of America
1020// US
1021// and because the address format can be completely different for
1022// each country, e.g.:
1023// China address example:
1024// [China]
1025// [Province] [City]
1026// [Street]
1027// [Postal]
1028// Japan address example:
1029// [Postal]
1030// [Prefecture] [County/City]
1031// [Further Divisions]
1032// [Japan]
1033// the client needs to correctly detect the country from the ADR
1034// attribute. Apple solved this problem by using:
1035// item1.ADR;TYPE=WORK:;;1 Waters Edge;Baytown;LA;30314;USA\r\n
1036// item1.X-ABADR:us\r\n
1037// where the second "related" attribute defines the country code
1038// for the ADR attribute. This client uses the same approach, but
1039// if the vCard is created by 3rd party clients and the X-ABADR
1040// is missing, it is possible to define additional "rules" for
1041// country matching. These rules are specied by the country code
1042// (for full list of country codes see the comment for pre previous
1043// option) and a case insensitive regular expression (which matches
1044// the plain text value in the country field).
1045// NOTE: if X-ABADR is not present and the country not matches any
1046// country defined in this option, then globalDefaultAddressCountry
1047// is used by default.
1048// Example:
1049var globalAddressCountryEquivalence=[
1050 {country: 'de', regex: '^\\W*Deutschland\\W*$'},
1051 {country: 'sk', regex: '^\\W*Slovensko\\W*$'}
1052];
1053
1054
1055// globalAddressCountryFavorites
1056// This option defines the list of countries which are shown at the top
1057// of the country list in the interface (for full list of country codes
1058// see the comment for pre globalDefaultAddressCountry option).
1059// Example:
1060// var globalAddressCountryFavorites=['de','sk'];
1061var globalAddressCountryFavorites=[];
1062
1063
1064// globalAddrColorPropertyXmlns
1065// This options sets the namespace used for storing the "addressbook-color"
1066// property by the client.
1067// If true, undefined (or empty) "http://inf-it.com/ns/ab/" is used.
1068// If false, then the addressbook color modification functionality
1069// is completely disabled, and addressbook colors in the interface are
1070// generated automatically.
1071// Example:
1072//var globalAddrColorPropertyXmlns=true;
1073
1074
1075// globalContactStoreFN
1076// This option specifies how the FN (formatted name) is stored into vCard.
1077// The value for this options must be an array of strings, that can contain
1078// the following variables:
1079// prefix
1080// last
1081// middle
1082// first
1083// suffix
1084// The string element of the array can contain any other characters (usually
1085// space or colon). Elements are added into FN only if the there is
1086// a variable match, for example if:
1087// last='Lastname'
1088// first='Firstname'
1089// middle='' (empty)
1090// and this option is set to:
1091// ['last', ' middle', ' first'] (space in the second and third element)
1092// the resulting value for FN will be: 'Lastname Firstname' and not
1093// 'Lastname Firstname' (two spaces), because the middle name is empty (so
1094// the second element is completely ignored /not added into FN/).
1095// NOTE: this attribute is NOT used by this client, and it is also NOT
1096// possible to directly edit it in the interface.
1097// Examples:
1098// var globalContactStoreFN=[' last', ' middle', ' first'];
1099// var globalContactStoreFN=['last', ', middle', ' ,first'];
1100var globalContactStoreFN=['prefix',' last',' middle',' first',' suffix'];
1101
1102
1103// globalGroupContactsByCompanies
1104// This options specifies how contacts are grouped in the interface.
1105// By default the interface looks like (very simple example):
1106// A
1107// Adams Adam
1108// Anderson Peter
1109// B
1110// Brown John
1111// Baker Josh
1112// if grouped by company/deparment the result is:
1113// Company A [Department X]
1114// Adams Adam
1115// Brown John
1116// Company B [Department Y]
1117// Anderson Peter
1118// Baker Josh
1119// If this option is set to true contacts are grouped by company/department,
1120// otherwise (default) contacts are grouped by letters of the alphabet.
1121// If undefined or not true, grouping by alphabet letters is used.
1122// NOTE: see also the globalCollectionDisplay option below.
1123var globalGroupContactsByCompanies=false;
1124
1125
1126// globalCollectionDisplay
1127// This options specifies how data columns in the contact list are displayed.
1128//
1129// NOTE: columns are displayed ONLY if there is enought horizontal place in
1130// the browser window (e.g. if you define 5 columns here, but your browser
1131// window is not wide enough, you will see only first 3 columns instead of 5).
1132//
1133// NOTE: see the globalContactDataMinVisiblePercentage option which defines the
1134// width for columns.
1135//
1136// The value must be an array of columns, where each column is represented by
1137// an object with the following properties:
1138// label => the value of this option is a string used as column header
1139// You can use the following localized variables in the label string:
1140// - {Name}
1141// - {FirstName}
1142// - {LastName}
1143// - {MiddleName}
1144// - {NickName}
1145// - {Prefix}
1146// - {Suffix}
1147// - {BirthDay}
1148// - {PhoneticLastName}
1149// - {PhoneticFirstName}
1150// - {JobTitle}
1151// - {Company}
1152// - {Department}
1153// - {Categories}
1154// - {NoteText}
1155// - {Address}, {AddressWork}, {AddressHome}, {AddressOther}
1156// - {Phone}, {PhoneWork}, {PhoneHome}, {PhoneCell}, {PhoneMain},
1157// {PhonePager}, {PhoneFax}, {PhoneIphone}, {PhoneOther}
1158// - {Email}, {EmailWork}, {EmailHome}, {EmailMobileme}, {EmailOther}
1159// - {URL}, {URLWork}, {URLHome}, {URLHomepage}, {URLOther}
1160// - {Dates}, {DatesAnniversary}, {DatesOther}
1161// - {Related}, {RelatedManager}, {RelatedAssistant}, {RelatedFather},
1162// {RelatedMother}, {RelatedParent}, {RelatedBrother}, {RelatedSister},
1163// {RelatedChild}, {RelatedFriend}, {RelatedSpouse}, {RelatedPartner},
1164// {RelatedOther}
1165// - {Profile}, {ProfileTwitter}, {ProfileFacebook}, {ProfileFlickr},
1166// {ProfileLinkedin}, {ProfileMyspace}, {ProfileSinaweibo}
1167// - {IM}, {IMWork}, {IMHome}, {IMMobileme}, {IMOther}, {IMAim}, {IMIcq},
1168// {IMIrc}, {IMJabber}, {IMMsn}, {IMYahoo}, {IMFacebook}, {IMGadugadu},
1169// {IMGoogletalk}, {IMQq}, {IMSkype}
1170// value => the value of this option is an array of format strings, or
1171// an object with the following properties:
1172// - company (used for company contacts)
1173// - personal (used for user contacts)
1174// where the value of these properties is an array of format strings used
1175// for company or user contacts (you can have different values in the same
1176// column for personal and company contacts).
1177// You can use the following simple variables in the format string:
1178// - {FirstName}
1179// - {LastName}
1180// - {MiddleName}
1181// - {NickName}
1182// - {Prefix}
1183// - {Suffix}
1184// - {BirthDay}
1185// - {PhoneticLastName}
1186// - {PhoneticFirstName}
1187// - {JobTitle}
1188// - {Company}
1189// - {Department}
1190// - {Categories}
1191// - {NoteText}
1192// You can also use parametrized variables, where the parameter is enclosed
1193// in square bracket. Paramatrized variables are useful to extract data
1194// such as home phone {Phone[type=home]}, extract the second phone number
1195// {Phone[:1]} (zero based indexing) or extract the third home phone number
1196// {Phone[type=home][:2]} from the vCard.
1197// NOTE: if the parametrized variable matches multiple items, e.g.:
1198// {Phone[type=work]} (if the contact has multiple work phones) then the
1199// first one is used!
1200//
1201// The following parametrized variables are supported (note: you can use
1202// all of them also without parameters /the first one will be used/):
1203// - {Address[type=XXX]} or {Address[:NUM]} or {Address[type=XXX][:NUM]}
1204// where supported values for XXX are:
1205// - work
1206// - home
1207// - other
1208// - any other custom value
1209// - {Phone[type=XXX]} or {Phone[:NUM]} or {Phone[type=XXX][:NUM]}
1210// where supported values for XXX are:
1211// - work
1212// - home
1213// - cell
1214// - main
1215// - pager
1216// - fax
1217// - iphone
1218// - other
1219// - any other custom value
1220// - {Email[type=XXX]} or {Email[:NUM]} or {Email[type=XXX][:NUM]}
1221// where supported values for XXX are:
1222// - work
1223// - home
1224// - mobileme
1225// - other
1226// - any other custom value
1227// - {URL[type=XXX]} or {URL[:NUM]} or {URL[type=XXX][:NUM]}
1228// where supported values for XXX are:
1229// - work
1230// - home
1231// - homepage
1232// - other
1233// - any other custom value
1234// - {Dates[type=XXX]} or {Dates[:NUM]} or {Dates[type=XXX][:NUM]}
1235// where supported values for XXX are:
1236// - anniversary
1237// - other
1238// - any other custom value
1239// - {Related[type=XXX]} or {Related[:NUM]} or {Related[type=XXX][:NUM]}
1240// where supported values for XXX are:
1241// - manager
1242// - assistant
1243// - father
1244// - mother
1245// - parent
1246// - brother
1247// - sister
1248// - child
1249// - friend
1250// - spouse
1251// - partner
1252// - other
1253// - any other custom value
1254// - {Profile[type=XXX]} or {Profile[:NUM]} or {Profile[type=XXX][:NUM]}
1255// where supported values for XXX are:
1256// - twitter
1257// - facebook
1258// - flickr
1259// - linkedin
1260// - myspace
1261// - sinaweibo
1262// - any other custom value
1263// - {IM[type=XXX]} or {IM[service-type=YYY]} or {IM[:NUM]}
1264// where supported values for XXX are:
1265// - work
1266// - home
1267// - mobileme
1268// - other
1269// - any other custom value
1270// and supported values for YYY are:
1271// - aim
1272// - icq
1273// - irc
1274// - jabber
1275// - msn
1276// - yahoo
1277// - facebook
1278// - gadugadu
1279// - googletalk
1280// - qq
1281// - skype
1282// - any other custom value
1283//
1284// NOTE: if you want to use the "any other custom value" option (for XXX
1285// or YYY above) you MUST double escape the following characters:
1286// =[]{}\
1287// for example:
1288// - for profile type "=XXX=" use: '{Profile[type=\\=XXX\\=]}'
1289// - for profile type "\XXX\" use: '{Profile[type=\\\\XXX\\\\]}'
1290//
1291// NOTE: if you want to use curly brackets in the format string you must
1292// double escape it, e.g.: ['{Company}', '\\{{Department}\\}']
1293//
1294// The format string (for the value option) is an array to allow full
1295// customization of the interface. For example if:
1296// value: ['{LastName} {MiddleName} {FirstName}']
1297// and the person has no middle name, then the result in the column
1298// will be (without quotes):
1299// "Parker Peter" (note: two space characters)
1300// but if you use:
1301// value: ['{LastName}', ' {MiddleName}', ' {FirstName}']
1302// then the result will be (without quotes):
1303// "Parker Peter" (note: only one space character)
1304// The reason is that only those elements of the array are appended
1305// into the result where non-empty substitution was performed (so the
1306// ' {MiddleName}' element in this case is ignored, because the person
1307// in the example above has no /more precisely has empty/ middle name).
1308//
1309// Examples:
1310// To specify two columns (named "Company" and "Department / LastName"),
1311// where the first will display the company name, and the second will display
1312// department for company contacts (with "Dep -" prefix), and lastname for
1313// personal contacts (with "Name -" prefix) use:
1314// var globalCollectionDisplay=[
1315// {
1316// label: 'Company',
1317// value: ['{Company}']
1318// },
1319// {
1320// label: 'Department / LastName',
1321// value: {
1322// company: ['Dep - {Department}'],
1323// personal: ['Name - {LastName}']
1324// }
1325// }
1326// ];
1327// To specify 3 columns (named "Categories", "URL" and "IM"), where the first
1328// will display categories, second will display the third work URL, and third
1329// will display ICQ IM use:
1330// var globalCollectionDisplay=[
1331// {
1332// label: 'Categories',
1333// value: ['{Categories}']
1334// },
1335// {
1336// label: 'URL',
1337// value: ['{URL[type=WORK][:2]}']
1338// },
1339// {
1340// label: 'IM',
1341// value: ['{IM[service-type=ICQ]}']
1342// }
1343// ];
1344//
1345// Recommended settings if globalGroupContactsByCompanies
1346// is set to false:
1347// var globalCollectionDisplay=[
1348// {
1349// label: '{Name}',
1350// value: ['{LastName}', ' {MiddleName}', ' {FirstName}']
1351// },
1352// {
1353// label: '{Company} [{Department}]',
1354// value: ['{Company}', ' [{Department}]']
1355// },
1356// {
1357// label: '{JobTitle}',
1358// value: ['{JobTitle}']
1359// },
1360// {
1361// label: '{Email}',
1362// value: ['{Email[:0]}']
1363// },
1364// {
1365// label: '{Phone} 1',
1366// value: ['{Phone[:0]}']
1367// },
1368// {
1369// label: '{Phone} 2',
1370// value: ['{Phone[:1]}']
1371// },
1372// {
1373// label: '{NoteText}',
1374// value: ['{NoteText}']
1375// }
1376// ];
1377//
1378// Recommended settings if globalGroupContactsByCompanies
1379// is set to true:
1380// var globalCollectionDisplay=[
1381// {
1382// label: '{Name}',
1383// value: {
1384// personal: ['{LastName}', ' {MiddleName}', ' {FirstName}'],
1385// company: ['{Company}', ' [{Department}]']
1386// }
1387// },
1388// {
1389// label: '{JobTitle}',
1390// value: ['{JobTitle}']
1391// },
1392// {
1393// label: '{Email}',
1394// value: ['{Email[:0]}']
1395// },
1396// {
1397// label: '{Phone} 1',
1398// value: ['{Phone[:0]}']
1399// },
1400// {
1401// label: '{Phone} 2',
1402// value: ['{Phone[:1]}']
1403// },
1404// {
1405// label: '{NoteText}',
1406// value: ['{NoteText}']
1407// }
1408// ];
1409//
1410// NOTE: if left undefined, the recommended settings will be used.
1411
1412
1413// globalCollectionSort
1414// This options sets the ordering of contacts in the interface. In general
1415// contacts are ordered alphabetically by an internal "sort string" which
1416// is created for each contact. Here you can specify how this internal string
1417// is created. The value is a simple array holding only the values from the
1418// value property defined in the globalCollectionDisplay option.
1419// If undefined, the definition from globalCollectionDisplay is used.
1420// Example:
1421// var globalCollectionSort = [
1422// ['{LastName}'],
1423// ['{FirstName}'],
1424// ['{MiddleName}'],
1425// {
1426// company: ['{Categories}'],
1427// personal: ['{Company}']
1428// }
1429// ];
1430var globalCollectionSort=[
1431 ['{LastName}'],
1432 ['{FirstName}'],
1433 ['{MiddleName}']
1434];
1435
1436
1437// globalContactDataMinVisiblePercentage
1438// This option defines how the width for columns are computed. If you set
1439// it to 1 then 100% of all data in the column will be visible (the column
1440// width is determined by the longest string in the column). If you set it
1441// to 0.95 then 95% of data will fit into the column width, and the remaining
1442// 5% will be truncated (" ...").
1443// Example:
1444var globalContactDataMinVisiblePercentage=0.95;
1445
1446