diff options
Diffstat (limited to 'nixops/modules/websites')
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 }: |
2 | let | 2 | rec { |
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 | }; |
168 | in | 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 @@ | |||
1 | diff --git a/inc/ui/collection-edit.php b/inc/ui/collection-edit.php | ||
2 | index 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'); | ||
14 | diff --git a/inc/ui/principal-edit.php b/inc/ui/principal-edit.php | ||
15 | index 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, ... }: |
2 | let | 2 | let |
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 }: | ||
2 | let | ||
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 | }; | ||
39 | in | ||
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 | /* | ||
2 | InfCloud - the open source CalDAV/CardDAV Web Client | ||
3 | Copyright (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 | |||
8 | This program is free software: you can redistribute it and/or modify | ||
9 | it under the terms of the GNU Affero General Public License as | ||
10 | published by the Free Software Foundation, either version 3 of the | ||
11 | License, or (at your option) any later version. | ||
12 | |||
13 | This program is distributed in the hope that it will be useful, | ||
14 | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
15 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
16 | GNU Affero General Public License for more details. | ||
17 | |||
18 | You should have received a copy of the GNU Affero General Public License | ||
19 | along 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): | ||
334 | var 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: | ||
400 | var globalBackgroundSync=true; | ||
401 | |||
402 | |||
403 | // globalSyncResourcesInterval | ||
404 | // This option defines how often (in miliseconds) are resources/collections | ||
405 | // asynchronously synchronized. | ||
406 | // Example: | ||
407 | var 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: | ||
419 | var 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: | ||
426 | var 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: | ||
474 | var 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']; | ||
484 | var 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; | ||
494 | var 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: | ||
507 | var 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: | ||
519 | var 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']; | ||
528 | var 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'; | ||
539 | var 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: | ||
545 | var globalDatepickerFirstDayOfWeek=1; | ||
546 | |||
547 | |||
548 | // globalHideInfoMessageAfter | ||
549 | // How long are information messages (such as: success, error) displayed | ||
550 | // (in miliseconds). | ||
551 | // Example: | ||
552 | var 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: | ||
559 | var 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: | ||
574 | var globalEventStartPastLimit=3; | ||
575 | var globalEventStartFutureLimit=3; | ||
576 | var 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: | ||
586 | var 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: | ||
595 | var 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: | ||
608 | var 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: | ||
621 | var 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: | ||
664 | var 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: | ||
671 | var 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: | ||
685 | var 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: | ||
693 | var globalCalendarStartOfBusiness=8; | ||
694 | var 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: | ||
702 | var 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: | ||
738 | var 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: | ||
747 | var 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: | ||
756 | var 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']; | ||
767 | var 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: | ||
775 | var 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: | ||
783 | var 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: | ||
792 | var 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: | ||
800 | var 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: | ||
809 | var 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: | ||
828 | var 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: | ||
854 | var 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: | ||
928 | var 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: | ||
941 | var 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: | ||
978 | var 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: | ||
989 | var globalUriHandlerTel='tel:'; | ||
990 | var globalUriHandlerEmail='mailto:'; | ||
991 | var globalUriHandlerUrl='http://'; | ||
992 | var 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: | ||
1008 | var 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: | ||
1049 | var 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']; | ||
1061 | var 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']; | ||
1100 | var 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. | ||
1123 | var 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 | |||
1257 | |||
1258 | // - flickr | ||
1259 | |||
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 | |||
1278 | // - gadugadu | ||
1279 | // - googletalk | ||
1280 | |||
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 | // ]; | ||
1430 | var 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: | ||
1444 | var globalContactDataMinVisiblePercentage=0.95; | ||
1445 | |||
1446 | |||