Browse Source

Merge pull request #1 from buxx/nonolost/master

Arnaud Lods 8 years ago
parent
commit
274c7b8ed7
100 changed files with 80816 additions and 444 deletions
  1. 4 0
      .travis.yml
  2. 451 400
      README.md
  3. 4 0
      tracim/development.ini.base
  4. 1 1
      tracim/migration/versions/b4b8d57b54e5_add_hash_column_for_digest_.py
  5. 28 0
      tracim/migration/versions/bdb195ed95bb_user_auth_token_columns.py
  6. 1 0
      tracim/setup.py
  7. 3 3
      tracim/test.ini
  8. 3 1
      tracim/tracim/command/__init__.py
  9. 24 1
      tracim/tracim/config/app_cfg.py
  10. 5 2
      tracim/tracim/controllers/admin/workspace.py
  11. 58 0
      tracim/tracim/controllers/calendar.py
  12. 4 0
      tracim/tracim/controllers/root.py
  13. BIN
      tracim/tracim/i18n/fr/LC_MESSAGES/tracim.mo
  14. 1 1
      tracim/tracim/i18n/fr/LC_MESSAGES/tracim.po
  15. 6 1
      tracim/tracim/lib/auth/internal.py
  16. 17 1
      tracim/tracim/lib/auth/ldap.py
  17. 38 0
      tracim/tracim/lib/calendar.py
  18. 24 5
      tracim/tracim/lib/daemons.py
  19. 1 1
      tracim/tracim/lib/radicale/auth.py
  20. 4 0
      tracim/tracim/lib/radicale/rights.py
  21. 2 1
      tracim/tracim/lib/userworkspace.py
  22. 30 0
      tracim/tracim/model/auth.py
  23. 0 24
      tracim/tracim/model/data.py
  24. 2 2
      tracim/tracim/model/serializers.py
  25. 15 0
      tracim/tracim/public/assets/css/dashboard.css
  26. 35 0
      tracim/tracim/public/caldavzap/.htaccess
  27. 24 0
      tracim/tracim/public/caldavzap/auth/.htaccess
  28. 41 0
      tracim/tracim/public/caldavzap/auth/common.inc
  29. 58 0
      tracim/tracim/public/caldavzap/auth/config.inc
  30. 14 0
      tracim/tracim/public/caldavzap/auth/cross_domain.inc
  31. 85 0
      tracim/tracim/public/caldavzap/auth/doc/example_config_response.xml
  32. 7 0
      tracim/tracim/public/caldavzap/auth/doc/readme.txt
  33. 33 0
      tracim/tracim/public/caldavzap/auth/index.php
  34. 58 0
      tracim/tracim/public/caldavzap/auth/plugins/generic.inc
  35. 12 0
      tracim/tracim/public/caldavzap/auth/plugins/generic_conf.inc
  36. 37 0
      tracim/tracim/public/caldavzap/auth/plugins/ldap.inc
  37. 12 0
      tracim/tracim/public/caldavzap/auth/plugins/ldap_conf.inc
  38. 150 0
      tracim/tracim/public/caldavzap/cache.manifest
  39. 79 0
      tracim/tracim/public/caldavzap/cache_handler.js
  40. 5 0
      tracim/tracim/public/caldavzap/cache_update.sh
  41. 294 0
      tracim/tracim/public/caldavzap/changelog.txt
  42. 628 0
      tracim/tracim/public/caldavzap/common.js
  43. 931 0
      tracim/tracim/public/caldavzap/config.js
  44. 2715 0
      tracim/tracim/public/caldavzap/css/default.css
  45. 180 0
      tracim/tracim/public/caldavzap/css/default_integration.css
  46. 1464 0
      tracim/tracim/public/caldavzap/css/fullcalendar.css
  47. 203 0
      tracim/tracim/public/caldavzap/css/jquery-ui.custom.css
  48. 553 0
      tracim/tracim/public/caldavzap/css/spectrum.custom.css
  49. 4265 0
      tracim/tracim/public/caldavzap/data_process.js
  50. BIN
      tracim/tracim/public/caldavzap/fonts/Roboto-Bold-webfont.eot
  51. 7496 0
      tracim/tracim/public/caldavzap/fonts/Roboto-Bold-webfont.svg
  52. BIN
      tracim/tracim/public/caldavzap/fonts/Roboto-Bold-webfont.ttf
  53. BIN
      tracim/tracim/public/caldavzap/fonts/Roboto-Bold-webfont.woff
  54. BIN
      tracim/tracim/public/caldavzap/fonts/Roboto-BoldItalic-webfont.eot
  55. 8652 0
      tracim/tracim/public/caldavzap/fonts/Roboto-BoldItalic-webfont.svg
  56. BIN
      tracim/tracim/public/caldavzap/fonts/Roboto-BoldItalic-webfont.ttf
  57. BIN
      tracim/tracim/public/caldavzap/fonts/Roboto-BoldItalic-webfont.woff
  58. BIN
      tracim/tracim/public/caldavzap/fonts/Roboto-Italic-webfont.eot
  59. 8164 0
      tracim/tracim/public/caldavzap/fonts/Roboto-Italic-webfont.svg
  60. BIN
      tracim/tracim/public/caldavzap/fonts/Roboto-Italic-webfont.ttf
  61. BIN
      tracim/tracim/public/caldavzap/fonts/Roboto-Italic-webfont.woff
  62. BIN
      tracim/tracim/public/caldavzap/fonts/Roboto-Light-webfont.eot
  63. 8162 0
      tracim/tracim/public/caldavzap/fonts/Roboto-Light-webfont.svg
  64. BIN
      tracim/tracim/public/caldavzap/fonts/Roboto-Light-webfont.ttf
  65. BIN
      tracim/tracim/public/caldavzap/fonts/Roboto-Light-webfont.woff
  66. BIN
      tracim/tracim/public/caldavzap/fonts/Roboto-LightItalic-webfont.eot
  67. 8162 0
      tracim/tracim/public/caldavzap/fonts/Roboto-LightItalic-webfont.svg
  68. BIN
      tracim/tracim/public/caldavzap/fonts/Roboto-LightItalic-webfont.ttf
  69. BIN
      tracim/tracim/public/caldavzap/fonts/Roboto-LightItalic-webfont.woff
  70. BIN
      tracim/tracim/public/caldavzap/fonts/Roboto-Medium-webfont.eot
  71. 7496 0
      tracim/tracim/public/caldavzap/fonts/Roboto-Medium-webfont.svg
  72. BIN
      tracim/tracim/public/caldavzap/fonts/Roboto-Medium-webfont.ttf
  73. BIN
      tracim/tracim/public/caldavzap/fonts/Roboto-Medium-webfont.woff
  74. BIN
      tracim/tracim/public/caldavzap/fonts/Roboto-MediumItalic-webfont.eot
  75. 8652 0
      tracim/tracim/public/caldavzap/fonts/Roboto-MediumItalic-webfont.svg
  76. BIN
      tracim/tracim/public/caldavzap/fonts/Roboto-MediumItalic-webfont.ttf
  77. BIN
      tracim/tracim/public/caldavzap/fonts/Roboto-MediumItalic-webfont.woff
  78. BIN
      tracim/tracim/public/caldavzap/fonts/Roboto-Regular-webfont.eot
  79. 7606 0
      tracim/tracim/public/caldavzap/fonts/Roboto-Regular-webfont.svg
  80. BIN
      tracim/tracim/public/caldavzap/fonts/Roboto-Regular-webfont.ttf
  81. BIN
      tracim/tracim/public/caldavzap/fonts/Roboto-Regular-webfont.woff
  82. 202 0
      tracim/tracim/public/caldavzap/fonts/license.txt
  83. 3307 0
      tracim/tracim/public/caldavzap/forms.js
  84. 14 0
      tracim/tracim/public/caldavzap/images/add_cal.svg
  85. 14 0
      tracim/tracim/public/caldavzap/images/add_cal_white.svg
  86. 9 0
      tracim/tracim/public/caldavzap/images/arrow_next.svg
  87. 9 0
      tracim/tracim/public/caldavzap/images/arrow_next_red.svg
  88. 9 0
      tracim/tracim/public/caldavzap/images/arrow_prev.svg
  89. 9 0
      tracim/tracim/public/caldavzap/images/arrow_prev_red.svg
  90. 26 0
      tracim/tracim/public/caldavzap/images/banner_calendar.svg
  91. 12 0
      tracim/tracim/public/caldavzap/images/banner_logout.svg
  92. 55 0
      tracim/tracim/public/caldavzap/images/banner_refresh.svg
  93. 21 0
      tracim/tracim/public/caldavzap/images/banner_todo.svg
  94. 20 0
      tracim/tracim/public/caldavzap/images/calendarB.svg
  95. 49 0
      tracim/tracim/public/caldavzap/images/cdz_logo.svg
  96. 22 0
      tracim/tracim/public/caldavzap/images/cloud.svg
  97. 11 0
      tracim/tracim/public/caldavzap/images/delegation.svg
  98. 14 0
      tracim/tracim/public/caldavzap/images/dp_left.svg
  99. 14 0
      tracim/tracim/public/caldavzap/images/dp_right.svg
  100. 0 0
      tracim/tracim/public/caldavzap/images/error_b.svg

+ 4 - 0
.travis.yml View File

@@ -5,6 +5,7 @@ python: "3.4"
5 5
 env:
6 6
   - DB=postgres
7 7
   - DB=mysql
8
+  - DB=sqlite
8 9
 
9 10
 addons:
10 11
   postgresql: "9.3"
@@ -27,6 +28,9 @@ before_script:
27 28
   - sh -c "if [ '$DB' = 'mysql' ]; then cd ${TRAVIS_BUILD_DIR}/tracim && sed -i \"s/<replace_database_uri_here>/mysql+oursql:\/\/root@localhost\/tracim_test/\" development.ini; fi"
28 29
   - sh -c "if [ '$DB' = 'mysql' ]; then pip install https://launchpad.net/oursql/py3k/py3k-0.9.4/+download/oursql-0.9.4.zip; fi"
29 30
 
31
+  - sh -c "if [ '$DB' = 'sqlite' ]; then cd ${TRAVIS_BUILD_DIR}/tracim && sed -i \"s/\(sqlalchemy.url *= *\).*/\sqlite:\/\/\/tracim_test.sqlite/\" test.ini; fi"
32
+  - sh -c "if [ '$DB' = 'sqlite' ]; then cd ${TRAVIS_BUILD_DIR}/tracim && sed -i \"s/<replace_database_uri_here>/sqlite:\/\/\/tracim.sqlite/\" development.ini; fi"
33
+
30 34
   - cd ${TRAVIS_BUILD_DIR}/tracim && gearbox setup-app --debug
31 35
 
32 36
 # command to run tests

+ 451 - 400
README.md View File

@@ -1,400 +1,451 @@
1
-[![Build Status](https://travis-ci.org/tracim/tracim.svg?branch=master)](https://travis-ci.org/tracim/tracim) [![Coverage Status](https://img.shields.io/coveralls/tracim/tracim.svg)](https://coveralls.io/r/tracim/tracim) [![Scrutinizer Code Quality](https://scrutinizer-ci.com/g/tracim/tracim/badges/quality-score.png?b=master)](https://scrutinizer-ci.com/g/tracim/tracim/?branch=master)
2
-
3
-# Tracim - Introduction #
4
-
5
-Tracim is a collaborative software designed to allow people to share and work on various data and document types.
6
-
7
-If you hesitate to install a wiki, a forum or a file management software, stop hesitating and install Tracim.
8
-
9
-With Tracim, you manage in the same place:
10
-
11
-- forum-like threads,
12
-- files and automatic versionning,
13
-- wiki-like pages for online information,
14
-
15
-All data offers:
16
-
17
-- information status: open / resolved / cancelled / deprecated
18
-- native versionning
19
-- comment threads making tracim knowledge-growth ready.
20
-
21
-Join Tracim community : http://tracim.org
22
-
23
-## Use-cases ##
24
-
25
-### Collaborate with clients ###
26
-
27
-Share information with your clients.
28
-
29
-In the same place you will be able to share trouble-shooting threads, files and general information. You can define who the information is shared with.
30
-
31
-Example: share the documentation with all your users, run a forum open to your clients, another forum for your collaborators and share troubleshooting threads with each of your clients in a private workspace.
32
-
33
-### Run a community of experts or passionate people ###
34
-
35
-Collaborate and share experience and stimulate knowledge growth.
36
-
37
-In a unique place, you centralize files and threads, and raw information too. Every collaborator can update the information status.
38
-Stop worrying about information loss: the traceability is at the hearth of Tracim.
39
-
40
-The newcomers knowledge growth is easy because all information has a status and full history.
41
-You get the status of information and know how it got there.
42
-
43
-### Work on quality-driven projects ###
44
-
45
-In quality-driven projects like research and development, knowledge and quality are more important that task ownership and deadlines.
46
-
47
-With Tracim, you centralize information, you can stay in touch by configuring your email notifications and work on several projects.
48
-
49
-### Manage documents and files ###
50
-
51
-Traceability and versionning are very important for high-quality processes. Unfortunately, specialized software are hard to setup and to use.
52
-
53
-Let's try Tracim ! You define access-control for each workspace and store documents and file there. Users can't delete information: everything is versionned and never deleted.
54
-
55
-The user interface is easy to use: it's based on the well-known folders and files explorer paradigm.
56
-
57
-----
58
-
59
-# Tracim - the software #
60
-
61
-## Licence ##
62
-
63
-Tracim is licensed under the terms of the 
64
-[GNU Affero General Public License](http://www.gnu.org/licenses/agpl.txt) as published by the [Free Software Foundation](http://www.fsf.org/).
65
-
66
-## Technical information ##
67
-
68
-Tracim is a web application:
69
-
70
-* developed with python >=3.4.
71
-* based on the [TurboGears](http://www.turbogears.org/) web framework.
72
-* relying on [PostgreSQL](http://www.postgresql.org/) as the storage engine.
73
-
74
-The user interface is based on the following resources and technologies:
75
-
76
-* [Mako](http://www.makotemplates.org/) templating engine (server-side)
77
-* [Bootstrap 3](http://getbootstrap.com/)
78
-* [jQuery](http://wwwjquery.corm)
79
-* Icons are taken from [Tango Icons](http://tango.freedesktop.org/) and [Font Awesome](http://fortawesome.github.io/Font-Awesome/)
80
-* The design is based on the [Bootstrap dashboard example](http://getbootstrap.com/examples/dashboard/) and uses some images from [Start Boostrap free templates](http://startbootstrap.com/)
81
-
82
-
83
-
84
-It runs on [Debian GNU/Linux](http://www.debian.org/), it should work out-of-the-box on [Ubuntu](http://www.ubuntu.com/) and also on other GNU/Linux distributions.
85
-
86
-Hopefully it works on BSD and Windows OSes (but this has not been tested yet)
87
-
88
-----
89
-
90
-# Use it (or give it a try) #
91
-
92
-## Online Demo ##
93
-
94
-The easiest way to test Tracim is to test it through the online demo:
95
-
96
-* [http://demo.tracim.fr](http://demo.tracim.fr)
97
-* login as admin: admin@admin.admin
98
-* password: admin@admin.admin
99
-
100
-## Ask for a dedicated instance ##
101
-
102
-If you want your own dedicated instance but do not want to manage it by yourself, let's contact me at damien.accorsi@free.fr
103
-
104
-## Install Tracim on your server ##
105
-
106
-Following the installation documentation below, you'll be able to run your own instance on your server.
107
-
108
-----
109
-
110
-# Installation #
111
-
112
-## Dependencies ##
113
-
114
-_Note: the following information is for Debian. For other OS, adapt the package names._
115
-
116
-You'll need to install the following packages:
117
-
118
-    apt-get install realpath python3 python-virtualenv python3-dev python-pip build-essential postgresql-server-dev-all libxml2-dev libxslt1-dev python-lxml
119
-
120
-If you work on a local database, then you also need to install PostgreSQL:
121
-
122
-    apt-get install postgresql postgresql-client
123
-
124
-## Installation ##
125
-
126
-### Get the source ###
127
-
128
-Get the sources from Bitbucket:
129
-
130
-    git clone https://github.com/tracim/tracim.git
131
-    cd tracim/
132
-
133
-*Note: Now everything is documented to be executed from the tracim directory newly created.*
134
-
135
-
136
-### Setting-up python virtualenv ###
137
-
138
-_Reminder : Tracim is developped and tested using python3.4._
139
-
140
-Tracim uses virtualenv as deployment environment. This ensure that there will be no 
141
-conflict between system-wide python installation and Tracim required ones.
142
-
143
-    virtualenv -p /usr/bin/python3 tg2env
144
-    source tg2env/bin/activate
145
-    cd tracim && python setup.py develop && cd -
146
-    pip install -r install/requirements.txt
147
-
148
-## Database Setup ##
149
-
150
-### Minimalist introduction to PostgreSQL ###
151
-
152
-If you already use/know PostgreSQL, you can directly go to *Test the database access*.
153
-
154
-#### Allowing local connections on PostgreSQL ####
155
-
156
-PostgreSQL stores connections ahtorization in *pg\_hba.conf*
157
-
158
-Edit the pg_hba.conf file and check that connectionx from 127.0.0.1 are allowed using user/password. You should find the following line in the file:
159
-
160
-    # IPv4 local connections:
161
-    host    all             all             127.0.0.1/32            md5
162
-
163
-Note: on Debian, the *pg\_hba.conf* file is found at */etc/postgresql/9.1/main/pg\_hba.conf*
164
-
165
-If you changed the file, reload PostgreSQL:
166
-
167
-    service postgresql reload
168
-
169
-#### Creating a user and associated database ####
170
-
171
-You need a database and associated user/password.
172
-
173
-Tracim comes with a tool that will make this step easy : pgtool.
174
-
175
-    ~/tracim$ ./bin/pgtool help
176
-
177
-login as *postgres* user and run the follwoing commands (which are self explanatory)
178
-
179
-    ./bin/pgtool create_user tracimuser tracimpassword
180
-    ./bin/pgtool create_database tracimdb
181
-    ./bin/pgtool grant_all_privileges tracimdb tracimuser
182
-
183
-Notes :
184
-
185
-* in order to login as postgres user, su as root (with your password) then su postgres.
186
-* pgtool also offers options to delete users / databases. Run *./bin/pgtool help* for more information
187
-
188
-#### Test the database access ####
189
-
190
-So, now you have a database and an associated user/password.
191
-
192
-A good habit is to test things before to use them, that's why we want to test the database access now. This is easily done with tracim pgtool :
193
-
194
-    ./bin/pgtool test_connection tracimdb tracimuser tracimpassword 127.0.0.1
195
-
196
-The result is similar to the following :
197
-
198
-    PG # CONNECT TO DATABASE
199
-    ------------------------
200
-    server:     127.0.0.1
201
-    database:   tracimdb
202
-    username:   bibi
203
-
204
-                  now              
205
-    -------------------------------
206
-     2014-11-10 09:40:23.306199+01
207
-    (1 row)
208
-
209
-In case of failure, you would get something like this:
210
-
211
-    PG # CONNECT TO DATABASE
212
-    ------------------------
213
-    server:     127.0.0.1
214
-    database:   tracimdb
215
-    username:   bibi
216
-
217
-    psql: FATAL:  password authentication failed for user "bibi"
218
-    FATAL:  password authentication failed for user "bibi"
219
-    ERRROR
220
-
221
-In this case, delete the user and database you previously created (using pgtool) and do it again. Do not forget to run the grant_all_rights command!
222
-
223
-## Configuration ##
224
-
225
-At this point, you have :
226
-
227
-* an installation of Tracim with its dedicated python3-ready virtualenv
228
-* a PostgreSQL server and dedicated database
229
-
230
-What you have to do now is to configure the application and to initialize the database content.
231
-
232
-### Create configuration ###
233
-
234
-    cp tracim/development.ini.base tracim/development.ini
235
-
236
-You can now edit the file and setup required files. Here are the main ones:
237
-
238
-#### Database access ####
239
-
240
-Configure database in the development.ini file. This is defined as sqlalchemy.url
241
-and the default value is below:
242
-
243
-    sqlalchemy.url = postgresql://tracimuser:tracimpassword@127.0.0.1:5432/tracimdb?client_encoding=utf8
244
-
245
-#### Listening port
246
-
247
-Default configuration is to listen on port 8080. If you want to adapt this to your environment, edit the .ini file and setup the port you want:
248
-
249
-    port = 8080
250
-
251
-#### Interface language
252
-
253
-The default language is English. You can change it to French by uncommenting the following line in the .ini file:
254
-
255
-    lang = fr
256
-
257
-#### SMTP parameters for resetpassword and notifications
258
-
259
-for some reason, you have to configure SMTP parameters for rest password process and SMTP parameters for notifications in separate places.
260
-
261
-The reset password related parameters are the follwoing ones :
262
-
263
-    resetpassword.email_sender = tracim@mycompany.com
264
-    resetpassword.smtp_host = smtp.mycompany.com
265
-    resetpassword.smtp_port = 25
266
-    resetpassword.smtp_login = username
267
-    resetpassword.smtp_passwd = password
268
-
269
-The main parameters for notifications are the following ones:
270
-
271
-    email.notification.activated = true
272
-    email.notification.from = Tracim Notification <tracim@tmycompany.com>
273
-    email.notification.smtp.server = smtp.mycompany.com
274
-    email.notification.smtp.port = 25
275
-    email.notification.smtp.user = username
276
-    email.notification.smtp.password = password
277
-
278
-#### Website ####
279
-
280
-You must define general parameters like the base_url and the website title which are required for home page and email notification links
281
-
282
-    website.title = My Company Intranet
283
-    website.base_url = http://intranet.mycompany.com:8080
284
-
285
-#### LDAP ####
286
-
287
-To use LDAP authentication, set ``auth_type`` parameter to "ldap":
288
-
289
-    auth_type = ldap
290
-
291
-Then add LDAP parameters
292
-
293
-    # LDAP server address
294
-    ldap_url = ldap://localhost:389
295
-
296
-    # Base dn to make queries
297
-    ldap_base_dn = dc=directory,dc=fsf,dc=org
298
-
299
-    # Bind dn to identify the search
300
-    ldap_bind_dn = cn=admin,dc=directory,dc=fsf,dc=org
301
-
302
-    # The bind password
303
-    ldap_bind_pass = toor
304
-
305
-    # Attribute name of user record who contain user login (email)
306
-    ldap_ldap_naming_attribute = uid
307
-
308
-    # Matching between ldap attribute and ldap user field (ldap_attr1=user_field1,ldap_attr2=user_field2,...)
309
-    ldap_user_attributes = mail=email
310
-
311
-    # TLS usage to communicate with your LDAP server
312
-    ldap_tls = False
313
-
314
-    # If True, LDAP own tracim group managment (not available for now!)
315
-    ldap_group_enabled = False
316
-
317
-You may need an administrator account to manage Tracim. Use the following command (from ``/install/dir/of/tracim/tracim``):
318
-
319
-```
320
-gearbox user create -l admin-email@domain.com -g managers -g administrators
321
-```
322
-
323
-Keep in mind ``admin-email@domain.com`` must match with LDAP user.
324
-
325
-#### Other parameters  ####
326
-
327
-There are other parameters which may be of some interest for you. For example, you can:
328
-
329
-* include a JS tracker like Piwik or Google Analytics,
330
-* define your own notification email subject
331
-* personalize notification email
332
-* personalize home page (background image, title color...)
333
-* ...
334
-
335
-### database schema ###
336
-
337
-The last step before to run the application is to initialize the database schema. This is done through the following command:
338
-
339
-    source tg2env/bin/activate
340
-    cd tracim && gearbox setup-app && cd -
341
-
342
-## Running the server ##
343
-
344
-### Running Tracim in standalone mode ###
345
-
346
-Now you can run the standalone server:
347
-
348
-    ./bin/run.sh
349
-    
350
-Which should result in something like this:
351
-
352
-    13:53:49,982 INFO  [gearbox] Starting subprocess with file monitor
353
-    13:53:50,646 WARNI [py.warnings] /tmp/tracim/protov1/tg2env/lib/python3.2/site-packages/tw2/core/validation.py:12: ImportWarning: Not importing directory '/tmp/tracim/protov1/tg2env/lib/python3.2/site-packages/tw2/core/i18n': missing __init__.py
354
-      from .i18n import _
355
-    
356
-    13:53:50,862 INFO  [gearbox] Starting server in PID 11174.
357
-    Starting HTTP server on http://0.0.0.0:8080
358
-    
359
-You can now enter the application at [http://localhost:8080](http://localhost:8080) and login:
360
-
361
-* user : admin@admin.admin
362
-* password : admin@admin.admin
363
-    
364
-Enjoy :)
365
-
366
-### Running Tracim through Apache WSGI ###
367
-
368
-#### Dependencies ####
369
-
370
-Install dependencies:
371
-
372
-    apt-get install apache2 libapache2-mod-wsgi-py3
373
-
374
-#### WSGI configuration ####
375
-
376
-Example of Apache WSGI configuration. This configuration refers to productionapp.wsgi which is a copy of the file *app.wsgi* available in the repo. (this file has to be updated to match with your environment and installation)
377
-
378
-    <VirtualHost *:80>
379
-        ServerAdmin webmaster@tracim.mycompany.com
380
-        ServerName tracim.mycompany.com
381
-
382
-        WSGIProcessGroup tracim
383
-        WSGIDaemonProcess tracim user=www-data group=adm threads=4 python-path=/opt/traciminstall/tg2env/lib/python3.2/site-packages
384
-        WSGIScriptAlias / /opt/traciminstall/tracim/productionapp.wsgi
385
-
386
-        #Serve static files directly without TurboGears
387
-        Alias /assets     /opt/traciminstall/tracim/tracim/public/assets
388
-        Alias /favicon.ico /opt/traciminstall/tracim/tracim/public/favicon.ico
389
-
390
-        CustomLog /var/log/apache2/demotracim-access.log combined
391
-        ErrorLog /var/log/apache2/demotracim-error.log
392
-        LogLevel debug
393
-    </VirtualHost>
394
-
395
-# Support and Community #
396
-
397
-Building the community is a work in progress.
398
-
399
-Need help ? Do not hesitate to contact me : damien.accorsi@free.fr
400
-
1
+[![Build Status](https://travis-ci.org/tracim/tracim.svg?branch=master)](https://travis-ci.org/tracim/tracim) [![Coverage Status](https://img.shields.io/coveralls/tracim/tracim.svg)](https://coveralls.io/r/tracim/tracim) [![Scrutinizer Code Quality](https://scrutinizer-ci.com/g/tracim/tracim/badges/quality-score.png?b=master)](https://scrutinizer-ci.com/g/tracim/tracim/?branch=master)
2
+
3
+# Tracim - Introduction #
4
+
5
+Tracim is a collaborative software designed to allow people to share and work on various data and document types.
6
+
7
+If you hesitate to install a wiki, a forum or a file management software, stop hesitating and install Tracim.
8
+
9
+With Tracim, you manage in the same place:
10
+
11
+- forum-like threads,
12
+- files and automatic versionning,
13
+- wiki-like pages for online information,
14
+
15
+All data offers:
16
+
17
+- information status: open / resolved / cancelled / deprecated
18
+- native versionning
19
+- comment threads making tracim knowledge-growth ready.
20
+
21
+Join Tracim community : http://tracim.org
22
+
23
+## Use-cases ##
24
+
25
+### Collaborate with clients ###
26
+
27
+Share information with your clients.
28
+
29
+In the same place you will be able to share trouble-shooting threads, files and general information. You can define who the information is shared with.
30
+
31
+Example: share the documentation with all your users, run a forum open to your clients, another forum for your collaborators and share troubleshooting threads with each of your clients in a private workspace.
32
+
33
+### Run a community of experts or passionate people ###
34
+
35
+Collaborate and share experience and stimulate knowledge growth.
36
+
37
+In a unique place, you centralize files and threads, and raw information too. Every collaborator can update the information status.
38
+Stop worrying about information loss: the traceability is at the hearth of Tracim.
39
+
40
+The newcomers knowledge growth is easy because all information has a status and full history.
41
+You get the status of information and know how it got there.
42
+
43
+### Work on quality-driven projects ###
44
+
45
+In quality-driven projects like research and development, knowledge and quality are more important that task ownership and deadlines.
46
+
47
+With Tracim, you centralize information, you can stay in touch by configuring your email notifications and work on several projects.
48
+
49
+### Manage documents and files ###
50
+
51
+Traceability and versionning are very important for high-quality processes. Unfortunately, specialized software are hard to setup and to use.
52
+
53
+Let's try Tracim ! You define access-control for each workspace and store documents and file there. Users can't delete information: everything is versionned and never deleted.
54
+
55
+The user interface is easy to use: it's based on the well-known folders and files explorer paradigm.
56
+
57
+----
58
+
59
+# Tracim - the software #
60
+
61
+## Licence ##
62
+
63
+Tracim is licensed under the terms of the
64
+[GNU Affero General Public License](http://www.gnu.org/licenses/agpl.txt) as published by the [Free Software Foundation](http://www.fsf.org/).
65
+
66
+## Technical information ##
67
+
68
+Tracim is a web application:
69
+
70
+* developed with python >=3.4.
71
+* based on the [TurboGears](http://www.turbogears.org/) web framework.
72
+* relying on [PostgreSQL](http://www.postgresql.org/) or [MySQL](https://www.mysql.fr/) or [sqlite](https://www.sqlite.org/) as the storage engine.
73
+
74
+The user interface is based on the following resources and technologies:
75
+
76
+* [Mako](http://www.makotemplates.org/) templating engine (server-side)
77
+* [Bootstrap 3](http://getbootstrap.com/)
78
+* [jQuery](http://wwwjquery.corm)
79
+* Icons are taken from [Tango Icons](http://tango.freedesktop.org/) and [Font Awesome](http://fortawesome.github.io/Font-Awesome/)
80
+* The design is based on the [Bootstrap dashboard example](http://getbootstrap.com/examples/dashboard/) and uses some images from [Start Boostrap free templates](http://startbootstrap.com/)
81
+
82
+It runs on [Debian GNU/Linux](http://www.debian.org/), it should work out-of-the-box on [Ubuntu](http://www.ubuntu.com/) and also on other GNU/Linux distributions.
83
+
84
+Hopefully it works on BSD and Windows OSes (but this has not been tested yet).
85
+
86
+----
87
+
88
+# Use it (or give it a try) #
89
+
90
+## Online Demo ##
91
+
92
+The easiest way to test Tracim is to test it through the online demo:
93
+
94
+* [http://demo.tracim.fr](http://demo.tracim.fr)
95
+* login as admin: admin@admin.admin
96
+* password: admin@admin.admin
97
+
98
+## Ask for a dedicated instance ##
99
+
100
+If you want your own dedicated instance but do not want to manage it by yourself, let's contact me at damien.accorsi@free.fr
101
+
102
+## Install Tracim on your server ##
103
+
104
+Following the installation documentation below, you'll be able to run your own instance on your server.
105
+
106
+----
107
+
108
+# Installation #
109
+
110
+## Dependencies ##
111
+
112
+_Note: the following information is for Debian. For other OS, adapt the package names._
113
+
114
+You'll need to install the following packages on your Operating System:
115
+
116
+    apt-get install git realpath python3 python-virtualenv python3-dev python-pip build-essential libxml2-dev libxslt1-dev python-lxml
117
+
118
+## Database ##
119
+
120
+If you want use PostgreSQL as database engine:
121
+
122
+    apt-get install postgresql-server-dev-all postgresql postgresql-client
123
+
124
+Or if you want to use MySQL as database engine
125
+
126
+    apt-get install mysql-server mysql-client libmysqlclient-dev
127
+
128
+Or if you want to use SQLite as database engine
129
+
130
+    apt-get install sqlite3
131
+
132
+## Installation ##
133
+
134
+### Get the source ###
135
+
136
+Get the sources from github with git:
137
+
138
+    git clone https://github.com/tracim/tracim.git
139
+    cd tracim/
140
+
141
+*Note: Now everything is documented to be executed from the tracim directory newly created.*
142
+
143
+### Setting-up python virtualenv ###
144
+
145
+_Reminder : Tracim is developed and tested using python3.4._
146
+
147
+We strongly recommend to use virtualenv as deployment environment. This ensure that there will be no conflict between system-wide python installation and Tracim required ones. To Create the virtual environment:
148
+
149
+    virtualenv -p /usr/bin/python3.4 tg2env
150
+
151
+And to activate it in your terminal session (**all tracim command execution must be executed under this virtual environment**)):
152
+
153
+    source tg2env/bin/activate
154
+
155
+To install tracim and it's dependencies:
156
+
157
+    cd tracim && python setup.py develop && cd -
158
+    pip install -r install/requirements.txt
159
+
160
+**Note**: If you want to use MySQL database, please refer to Configuration/database schema note to install required package.
161
+
162
+## Database Setup ##
163
+
164
+### Minimalist introduction to PostgreSQL ###
165
+
166
+If you already use/know PostgreSQL, you can directly go to *Test the database access*.
167
+
168
+#### Allowing local connections on PostgreSQL ####
169
+
170
+PostgreSQL stores connections ahtorization in *pg\_hba.conf*
171
+
172
+Edit the pg_hba.conf file and check that connectionx from 127.0.0.1 are allowed using user/password. You should find the following line in the file:
173
+
174
+    # IPv4 local connections:
175
+    host    all             all             127.0.0.1/32            md5
176
+
177
+Note: on Debian, the *pg\_hba.conf* file is found at */etc/postgresql/9.1/main/pg\_hba.conf*
178
+
179
+If you changed the file, reload PostgreSQL:
180
+
181
+    service postgresql reload
182
+
183
+#### Creating a user and associated database ####
184
+
185
+You need a database and associated user/password.
186
+
187
+Tracim comes with a tool that will make this step easy : pgtool.
188
+
189
+    ~/tracim$ ./bin/pgtool help
190
+
191
+login as *postgres* user and run the follwoing commands (which are self explanatory)
192
+
193
+    ./bin/pgtool create_user tracimuser tracimpassword
194
+    ./bin/pgtool create_database tracimdb
195
+    ./bin/pgtool grant_all_privileges tracimdb tracimuser
196
+
197
+Notes :
198
+
199
+* in order to login as postgres user, su as root (with your password) then su postgres.
200
+* pgtool also offers options to delete users / databases. Run *./bin/pgtool help* for more information
201
+
202
+#### Test the database access ####
203
+
204
+So, now you have a database and an associated user/password.
205
+
206
+A good habit is to test things before to use them, that's why we want to test the database access now. This is easily done with tracim pgtool :
207
+
208
+    ./bin/pgtool test_connection tracimdb tracimuser tracimpassword 127.0.0.1
209
+
210
+The result is similar to the following :
211
+
212
+    PG # CONNECT TO DATABASE
213
+    ------------------------
214
+    server:     127.0.0.1
215
+    database:   tracimdb
216
+    username:   bibi
217
+
218
+                  now
219
+    -------------------------------
220
+     2014-11-10 09:40:23.306199+01
221
+    (1 row)
222
+
223
+In case of failure, you would get something like this:
224
+
225
+    PG # CONNECT TO DATABASE
226
+    ------------------------
227
+    server:     127.0.0.1
228
+    database:   tracimdb
229
+    username:   bibi
230
+
231
+    psql: FATAL:  password authentication failed for user "bibi"
232
+    FATAL:  password authentication failed for user "bibi"
233
+    ERRROR
234
+
235
+In this case, delete the user and database you previously created (using pgtool) and do it again. Do not forget to run the grant_all_rights command!
236
+
237
+### Minimalist introduction to MySQL ###
238
+
239
+## Create database ##
240
+
241
+Connect to mysql with root user (password has been set at "Installation" -> "Dependencies" chapter, when installing package)
242
+
243
+    mysql -u root -p
244
+
245
+Create a database with following command:
246
+
247
+    CREATE DATABASE tracimdb;
248
+
249
+Create a user with following command:
250
+
251
+    CREATE USER 'tracimuser'@'localhost' IDENTIFIED BY 'tracimpassword';
252
+
253
+And allow him to manipulate created database with following command:
254
+
255
+    GRANT ALL PRIVILEGES ON tracimdb . * TO 'tracimuser'@'localhost';
256
+
257
+Then flush privileges:
258
+
259
+    FLUSH PRIVILEGES;
260
+
261
+You can now quit mysql prompt:
262
+
263
+    \q
264
+
265
+## Configuration ##
266
+
267
+At this point, you have :
268
+
269
+* an installation of Tracim with its dedicated python3-ready virtualenv
270
+* a PostgreSQL/MySQL server and dedicated database (if you don't use sqlite)
271
+
272
+What you have to do now is to configure the application and to initialize the database content.
273
+
274
+### Create configuration ###
275
+
276
+    cp tracim/development.ini.base tracim/development.ini
277
+
278
+You can now edit the file and setup required files. Here are the main ones:
279
+
280
+#### Database access ####
281
+
282
+Configure database in the development.ini file. This is defined as sqlalchemy.url. There is an example value for PostgreSQL below:
283
+
284
+    sqlalchemy.url = postgresql://tracimuser:tracimpassword@127.0.0.1:5432/tracimdb?client_encoding=utf8
285
+
286
+There is an example value for MySQL below (please refer to Configuration/database schema note to install required package):
287
+
288
+    sqlalchemy.url = mysql+oursql://tracimuser:tracimpassword@127.0.0.1/tracimdb
289
+
290
+There is an example value for SQLite below :
291
+
292
+    sqlalchemy.url = sqlite:///tracimdb.sqlite
293
+
294
+#### Listening port
295
+
296
+Default configuration is to listen on port 8080. If you want to adapt this to your environment, edit the .ini file and setup the port you want:
297
+
298
+    port = 8080
299
+
300
+#### Interface language
301
+
302
+The default language is English. You can change it to French by uncommenting the following line in the .ini file:
303
+
304
+    lang = fr
305
+
306
+#### SMTP parameters for resetpassword and notifications
307
+
308
+for technical reason, you have to configure SMTP parameters for rest password process and SMTP parameters for notifications in separate places.
309
+
310
+The reset password related parameters are the follwoing ones :
311
+
312
+    resetpassword.email_sender = tracim@mycompany.com
313
+    resetpassword.smtp_host = smtp.mycompany.com
314
+    resetpassword.smtp_port = 25
315
+    resetpassword.smtp_login = username
316
+    resetpassword.smtp_passwd = password
317
+
318
+The main parameters for notifications are the following ones:
319
+
320
+    email.notification.activated = true
321
+    email.notification.from = Tracim Notification <tracim@tmycompany.com>
322
+    email.notification.smtp.server = smtp.mycompany.com
323
+    email.notification.smtp.port = 25
324
+    email.notification.smtp.user = username
325
+    email.notification.smtp.password = password
326
+
327
+#### Website ####
328
+
329
+You must define general parameters like the base_url and the website title which are required for home page and email notification links
330
+
331
+    website.title = My Company Intranet
332
+    website.base_url = http://intranet.mycompany.com:8080
333
+
334
+#### LDAP ####
335
+
336
+To use LDAP authentication, set ``auth_type`` parameter to "ldap":
337
+
338
+    auth_type = ldap
339
+
340
+Then add LDAP parameters
341
+
342
+    # LDAP server address
343
+    ldap_url = ldap://localhost:389
344
+
345
+    # Base dn to make queries
346
+    ldap_base_dn = dc=directory,dc=fsf,dc=org
347
+
348
+    # Bind dn to identify the search
349
+    ldap_bind_dn = cn=admin,dc=directory,dc=fsf,dc=org
350
+
351
+    # The bind password
352
+    ldap_bind_pass = toor
353
+
354
+    # Attribute name of user record who contain user login (email)
355
+    ldap_ldap_naming_attribute = uid
356
+
357
+    # Matching between ldap attribute and ldap user field (ldap_attr1=user_field1,ldap_attr2=user_field2,...)
358
+    ldap_user_attributes = mail=email
359
+
360
+    # TLS usage to communicate with your LDAP server
361
+    ldap_tls = False
362
+
363
+    # If True, LDAP own tracim group managment (not available for now!)
364
+    ldap_group_enabled = False
365
+
366
+You may need an administrator account to manage Tracim. Use the following command (from ``/install/dir/of/tracim/tracim``):
367
+
368
+    gearbox user create -l admin@admin.admin -p admin@admin.admin -g managers -g administrators
369
+
370
+Keep in mind ``admin-email@domain.com`` must match with LDAP user.
371
+
372
+#### Other parameters  ####
373
+
374
+There are other parameters which may be of some interest for you. For example, you can:
375
+
376
+* include a JS tracker like Piwik or Google Analytics,
377
+* define your own notification email subject
378
+* personalize notification email
379
+* personalize home page (background image, title color...)
380
+* ...
381
+
382
+### database schema ###
383
+
384
+The last step before to run the application is to initialize the database schema. This is done through the following command:
385
+
386
+**Note**: If you want to use MySQL database, please install this pip package: ```pip install https://launchpad.net/oursql/py3k/py3k-0.9.4/+download/oursql-0.9.4.zip```
387
+
388
+    cd tracim && gearbox setup-app && cd -
389
+
390
+## Running the server ##
391
+
392
+### Running Tracim in standalone mode ###
393
+
394
+Now you can run the standalone server:
395
+
396
+    ./bin/run.sh
397
+
398
+Which should result in something like this:
399
+
400
+    13:53:49,982 INFO  [gearbox] Starting subprocess with file monitor
401
+    13:53:50,646 WARNI [py.warnings] /tmp/tracim/protov1/tg2env/lib/python3.2/site-packages/tw2/core/validation.py:12: ImportWarning: Not importing directory '/tmp/tracim/protov1/tg2env/lib/python3.2/site-packages/tw2/core/i18n': missing __init__.py
402
+      from .i18n import _
403
+
404
+    13:53:50,862 INFO  [gearbox] Starting server in PID 11174.
405
+    Starting HTTP server on http://0.0.0.0:8080
406
+
407
+You can now enter the application at [http://localhost:8080](http://localhost:8080) and login with admin user.
408
+
409
+ * user : admin@admin.admin
410
+ * password : admin@admin.admin
411
+
412
+If admin user not created yet, execute following command:
413
+
414
+    gearbox user create -l admin@admin.admin -p admin@admin.admin -g managers -g administrators
415
+
416
+Enjoy :)
417
+
418
+### Running Tracim through Apache WSGI ###
419
+
420
+#### Dependencies ####
421
+
422
+Install dependencies:
423
+
424
+    apt-get install apache2 libapache2-mod-wsgi-py3
425
+
426
+#### WSGI configuration ####
427
+
428
+Example of Apache WSGI configuration. This configuration refers to productionapp.wsgi which is a copy of the file *app.wsgi* available in the repo. (this file has to be updated to match with your environment and installation)
429
+
430
+    <VirtualHost *:80>
431
+        ServerAdmin webmaster@tracim.mycompany.com
432
+        ServerName tracim.mycompany.com
433
+
434
+        WSGIProcessGroup tracim
435
+        WSGIDaemonProcess tracim user=www-data group=adm threads=4 python-path=/opt/traciminstall/tg2env/lib/python3.2/site-packages
436
+        WSGIScriptAlias / /opt/traciminstall/tracim/productionapp.wsgi
437
+
438
+        #Serve static files directly without TurboGears
439
+        Alias /assets     /opt/traciminstall/tracim/tracim/public/assets
440
+        Alias /favicon.ico /opt/traciminstall/tracim/tracim/public/favicon.ico
441
+
442
+        CustomLog /var/log/apache2/demotracim-access.log combined
443
+        ErrorLog /var/log/apache2/demotracim-error.log
444
+        LogLevel debug
445
+    </VirtualHost>
446
+
447
+# Support and Community #
448
+
449
+Building the community is a work in progress.
450
+
451
+Need help ? Do not hesitate to contact me : damien.accorsi@free.fr

+ 4 - 0
tracim/development.ini.base View File

@@ -67,6 +67,9 @@ auth_type = internal
67 67
 # If True, LDAP own tracim group managment (not available for now!)
68 68
 # ldap_group_enabled = False
69 69
 
70
+# User auth token validity in seconds (used to interfaces like web calendars)
71
+user.auth_token.validity = 604800
72
+
70 73
 #By default session is store in cookies to avoid the overhead
71 74
 #of having to manage a session storage. On production you might
72 75
 #want to switch to a better session storage.
@@ -194,6 +197,7 @@ email.notification.smtp.password = your_smtp_password
194 197
 # radicale.server.ssl = false
195 198
 # radicale.server.filesystem.folder = ~/.config/radicale/collections
196 199
 # radicale.server.allow_origin = *
200
+# radicale.server.realm_message = Tracim Calendar - Password Required
197 201
 ## url can be extended like http://127.0.0.1:5232/calendar
198 202
 ## in this case, you have to create your own proxy behind this url.
199 203
 # radicale.client.base_url = http://127.0.0.1:5232

+ 1 - 1
tracim/migration/versions/b4b8d57b54e5_add_hash_column_for_digest_.py View File

@@ -8,7 +8,7 @@ Create Date: 2016-08-11 10:27:28.951506
8 8
 
9 9
 # revision identifiers, used by Alembic.
10 10
 revision = 'b4b8d57b54e5'
11
-down_revision = '534c4594ed29'
11
+down_revision = 'bdb195ed95bb'
12 12
 
13 13
 from alembic import op
14 14
 from sqlalchemy import Column, Unicode, Boolean

+ 28 - 0
tracim/migration/versions/bdb195ed95bb_user_auth_token_columns.py View File

@@ -0,0 +1,28 @@
1
+"""User auth token columns
2
+
3
+Revision ID: bdb195ed95bb
4
+Revises: 534c4594ed29
5
+Create Date: 2016-07-28 15:38:18.889151
6
+
7
+"""
8
+
9
+# revision identifiers, used by Alembic.
10
+revision = 'bdb195ed95bb'
11
+down_revision = '534c4594ed29'
12
+
13
+from alembic import op
14
+import sqlalchemy as sa
15
+
16
+
17
+def upgrade():
18
+    ### commands auto generated by Alembic - please adjust! ###
19
+    op.add_column('users', sa.Column('auth_token', sa.Unicode(length=255), nullable=True))
20
+    op.add_column('users', sa.Column('auth_token_created', sa.DateTime(), nullable=True))
21
+    ### end Alembic commands ###
22
+
23
+
24
+def downgrade():
25
+    ### commands auto generated by Alembic - please adjust! ###
26
+    op.drop_column('users', 'auth_token_created')
27
+    op.drop_column('users', 'auth_token')
28
+    ### end Alembic commands ###

+ 1 - 0
tracim/setup.py View File

@@ -42,6 +42,7 @@ install_requires=[
42 42
     "who-ldap==3.1.0",
43 43
     "python-ldap-test==0.2.1",
44 44
     "unicode-slugify==0.1.3",
45
+    "pytz==2014.7",
45 46
     ]
46 47
 
47 48
 setup(

+ 3 - 3
tracim/test.ini View File

@@ -19,7 +19,7 @@ host = 127.0.0.1
19 19
 port = 8080
20 20
 
21 21
 [app:main]
22
-sqlalchemy.url = postgresql://postgres:dummy@127.0.0.1:5432/tracim_test?client_encoding=utf8
22
+sqlalchemy.url = sqlite:///tracim_test.sqlite
23 23
 use = config:development.ini
24 24
 
25 25
 [app:main_without_authn]
@@ -27,7 +27,7 @@ use = main
27 27
 skip_authentication = True
28 28
 
29 29
 [app:ldap]
30
-sqlalchemy.url = postgresql://postgres:dummy@127.0.0.1:5432/tracim_test?client_encoding=utf8
30
+sqlalchemy.url = sqlite:///tracim_test.sqlite
31 31
 auth_type = ldap
32 32
 ldap_url = ldap://localhost:3333
33 33
 ldap_base_dn = dc=directory,dc=fsf,dc=org
@@ -40,7 +40,7 @@ ldap_group_enabled = False
40 40
 use = config:development.ini
41 41
 
42 42
 [app:radicale]
43
-sqlalchemy.url = postgresql://postgres:dummy@127.0.0.1:5432/tracim_test?client_encoding=utf8
43
+sqlalchemy.url = sqlite:///tracim_test.sqlite
44 44
 
45 45
 use = config:development.ini
46 46
 

+ 3 - 1
tracim/tracim/command/__init__.py View File

@@ -58,7 +58,9 @@ class AppContextCommand(BaseCommand):
58 58
         sys.path.insert(0, here_dir)
59 59
 
60 60
         # Load the wsgi app first so that everything is initialized right
61
-        wsgi_app = loadapp(config_name, relative_to=here_dir)
61
+        wsgi_app = loadapp(config_name, relative_to=here_dir, global_conf={
62
+            'disable_daemons': 'true',
63
+        })
62 64
         test_app = TestApp(wsgi_app)
63 65
 
64 66
         # Make available the tg.request and other global variables

+ 24 - 1
tracim/tracim/config/app_cfg.py View File

@@ -95,6 +95,11 @@ def start_daemons(manager: DaemonsManager):
95 95
     """
96 96
     Sart Tracim daemons
97 97
     """
98
+    from tg import config
99
+    # Don't start daemons if they are disabled
100
+    if 'disable_daemons' in config and config['disable_daemons']:
101
+        return
102
+
98 103
     manager.run('radicale', RadicaleDaemon)
99 104
     manager.run('webdav', WsgiDavDaemon)
100 105
 
@@ -253,7 +258,20 @@ class CFG(object):
253 258
         )
254 259
         self.RADICALE_SERVER_ALLOW_ORIGIN = tg.config.get(
255 260
             'radicale.server.allow_origin',
256
-            '*',
261
+            None,
262
+        )
263
+        if not self.RADICALE_SERVER_ALLOW_ORIGIN:
264
+            self.RADICALE_SERVER_ALLOW_ORIGIN = self.WEBSITE_BASE_URL
265
+            logger.warning(
266
+                self,
267
+                'NOTE: Generated radicale.server.allow_origin parameter with '
268
+                'followings parameters: website.base_url ({0})'
269
+                .format(self.WEBSITE_BASE_URL)
270
+            )
271
+
272
+        self.RADICALE_SERVER_REALM_MESSAGE = tg.config.get(
273
+            'radicale.server.realm_message',
274
+            'Tracim Calendar - Password Required',
257 275
         )
258 276
 
259 277
         self.RADICALE_CLIENT_BASE_URL_TEMPLATE = \
@@ -273,6 +291,11 @@ class CFG(object):
273 291
                 .format(self.RADICALE_CLIENT_BASE_URL_TEMPLATE)
274 292
             )
275 293
 
294
+        self.USER_AUTH_TOKEN_VALIDITY = int(tg.config.get(
295
+            'user.auth_token.validity',
296
+            '604800',
297
+        ))
298
+
276 299
     def get_tracker_js_content(self, js_tracker_file_path = None):
277 300
         js_tracker_file_path = tg.config.get('js_tracker_path', None)
278 301
         if js_tracker_file_path:

+ 5 - 2
tracim/tracim/controllers/admin/workspace.py View File

@@ -10,6 +10,7 @@ from tracim.controllers import TIMRestPathContextSetup
10 10
 
11 11
 from tracim.lib import CST
12 12
 from tracim.lib.base import BaseController
13
+from tracim.lib.helpers import on_off_to_boolean
13 14
 from tracim.lib.user import UserApi
14 15
 from tracim.lib.userworkspace import RoleApi
15 16
 from tracim.lib.content import ContentApi
@@ -191,10 +192,11 @@ class WorkspaceRestController(TIMRestController, BaseController):
191 192
         return dict(result = dictified_workspace, fake_api = fake_api)
192 193
 
193 194
     @tg.expose()
194
-    def post(self, name, description, calendar_enabled=False):
195
+    def post(self, name, description, calendar_enabled: str='off'):
195 196
         # FIXME - Check user profile
196 197
         user = tmpl_context.current_user
197 198
         workspace_api_controller = WorkspaceApi(user)
199
+        calendar_enabled = on_off_to_boolean(calendar_enabled)
198 200
 
199 201
         workspace = workspace_api_controller.create_workspace(name, description)
200 202
         workspace.calendar_enabled = calendar_enabled
@@ -215,9 +217,10 @@ class WorkspaceRestController(TIMRestController, BaseController):
215 217
         return DictLikeClass(result = dictified_workspace)
216 218
 
217 219
     @tg.expose('tracim.templates.workspace.edit')
218
-    def put(self, id, name, description, calendar_enabled):
220
+    def put(self, id, name, description, calendar_enabled: str='off'):
219 221
         user = tmpl_context.current_user
220 222
         workspace_api_controller = WorkspaceApi(user)
223
+        calendar_enabled = on_off_to_boolean(calendar_enabled)
221 224
 
222 225
         workspace = workspace_api_controller.get_one(id)
223 226
         workspace.label = name

+ 58 - 0
tracim/tracim/controllers/calendar.py View File

@@ -0,0 +1,58 @@
1
+# -*- coding: utf-8 -*-
2
+
3
+import tg
4
+from tg import tmpl_context
5
+
6
+from tracim.lib.base import BaseController
7
+from tracim.lib.calendar import CalendarManager
8
+from tracim.model.serializers import Context
9
+from tracim.model.serializers import CTX
10
+from tracim.model.serializers import DictLikeClass
11
+
12
+
13
+class CalendarController(BaseController):
14
+    """
15
+    Calendar web tracim page.
16
+    """
17
+
18
+    @tg.expose('tracim.templates.calendar.iframe_container')
19
+    def index(self):
20
+        user = tmpl_context.identity.get('user')
21
+        dictified_current_user = Context(CTX.CURRENT_USER).toDict(user)
22
+
23
+        fake_api = DictLikeClass(
24
+            current_user=dictified_current_user,
25
+        )
26
+
27
+        return DictLikeClass(fake_api=fake_api)
28
+
29
+
30
+class CalendarConfigController(BaseController):
31
+    """
32
+    CalDavZap javascript config generation
33
+    """
34
+
35
+    @tg.expose('tracim.templates.calendar.config')
36
+    def index(self):
37
+        # TODO BS 20160720: S'assurer d'être identifié !
38
+        user = tmpl_context.identity.get('user')
39
+        dictified_current_user = Context(CTX.CURRENT_USER).toDict(user)
40
+
41
+        fake_api = DictLikeClass(
42
+            current_user=dictified_current_user,
43
+        )
44
+        user_base_url = CalendarManager.get_user_base_url()
45
+        workspace_base_url = CalendarManager.get_workspace_base_url()
46
+        workspace_calendar_urls = CalendarManager\
47
+            .get_workspace_readable_calendars_urls_for_user(user)
48
+
49
+        # Template will use User.auth_token, ensure it's validity
50
+        user.ensure_auth_token()
51
+
52
+        return DictLikeClass(
53
+            fake_api=fake_api,
54
+            user_base_url=user_base_url,
55
+            workspace_base_url=workspace_base_url,
56
+            workspace_clendar_urls=workspace_calendar_urls,
57
+            auth_token=user.auth_token,
58
+        )

+ 4 - 0
tracim/tracim/controllers/root.py View File

@@ -22,6 +22,8 @@ from tracim.controllers.admin import AdminController
22 22
 from tracim.controllers.debug import DebugController
23 23
 from tracim.controllers.error import ErrorController
24 24
 from tracim.controllers.help import HelpController
25
+from tracim.controllers.calendar import CalendarController
26
+from tracim.controllers.calendar import CalendarConfigController
25 27
 from tracim.controllers.user import UserRestController
26 28
 from tracim.controllers.workspace import UserWorkspaceRestController
27 29
 from tracim.lib.utils import replace_reset_password_templates
@@ -48,6 +50,8 @@ class RootController(StandardController):
48 50
 
49 51
     admin = AdminController()
50 52
     help = HelpController()
53
+    calendar = CalendarController()
54
+    calendar_config = CalendarConfigController()
51 55
 
52 56
     debug = DebugController()
53 57
     error = ErrorController()

BIN
tracim/tracim/i18n/fr/LC_MESSAGES/tracim.mo View File


+ 1 - 1
tracim/tracim/i18n/fr/LC_MESSAGES/tracim.po View File

@@ -1694,7 +1694,7 @@ msgstr "Page créée le {date} à {time} par <b>{author}</b>"
1694 1694
 
1695 1695
 #: tracim/templates/page/getone.mak:60
1696 1696
 msgid "You are reading <b>an old revision</b> of the current page. (the shown revision is r{})."
1697
-msgstr "Vous consultez <b>une ancienne version</b> de al page courante. (la version affichée est la v{})."
1697
+msgstr "Vous consultez <b>une ancienne version</b> de la page courante. (la version affichée est la v{})."
1698 1698
 
1699 1699
 #: tracim/templates/page/getone.mak:72 tracim/templates/thread/getone.mak:61
1700 1700
 msgid "<b>This information is deprecated</b>"

+ 6 - 1
tracim/tracim/lib/auth/internal.py View File

@@ -29,7 +29,7 @@ class InternalApplicationAuthMetadata(TGAuthMetadata):
29 29
     def __init__(self, sa_auth):
30 30
         self.sa_auth = sa_auth
31 31
 
32
-    def authenticate(self, environ, identity):
32
+    def authenticate(self, environ, identity, allow_auth_token: bool=False):
33 33
         user = self.sa_auth.dbsession.query(self.sa_auth.user_class).filter(and_(
34 34
             self.sa_auth.user_class.is_active == True,
35 35
             self.sa_auth.user_class.email == identity['login']
@@ -43,6 +43,11 @@ class InternalApplicationAuthMetadata(TGAuthMetadata):
43 43
                 transaction.commit()
44 44
             return identity['login']
45 45
 
46
+        if user and allow_auth_token:
47
+            user.ensure_auth_token()
48
+            if user.auth_token == identity['password']:
49
+                return identity['login']
50
+
46 51
     def get_user(self, identity, userid):
47 52
         return self.sa_auth.dbsession.query(self.sa_auth.user_class).filter(
48 53
             and_(self.sa_auth.user_class.is_active == True, self.sa_auth.user_class.email == userid)).first()

+ 17 - 1
tracim/tracim/lib/auth/ldap.py View File

@@ -4,6 +4,7 @@ from tg.configuration.auth import TGAuthMetadata
4 4
 from who_ldap import LDAPAttributesPlugin as BaseLDAPAttributesPlugin, make_connection
5 5
 from who_ldap import LDAPGroupsPlugin as BaseLDAPGroupsPlugin
6 6
 from who_ldap import LDAPSearchAuthenticatorPlugin as BaseLDAPSearchAuthenticatorPlugin
7
+from sqlalchemy import and_
7 8
 
8 9
 from tracim.lib.auth.base import Auth
9 10
 from tracim.lib.exception import ConfigurationError
@@ -89,11 +90,26 @@ class LDAPSearchAuthenticatorPlugin(BaseLDAPSearchAuthenticatorPlugin):
89 90
     def set_auth(self, auth):
90 91
         self._auth = auth
91 92
 
92
-    def authenticate(self, environ, identity):
93
+    def authenticate(self, environ, identity, allow_auth_token: bool=False):
93 94
         # Note: super().authenticate return None if already authenticated or not found
94 95
         email = super().authenticate(environ, identity)
96
+
95 97
         if email:
96 98
             self._sync_ldap_user(email, environ, identity)
99
+
100
+        if not email and allow_auth_token and self.user_exist(email):
101
+            # Proceed to internal token auth
102
+            user = self.sa_auth.dbsession.query(self.sa_auth.user_class).filter(
103
+                and_(
104
+                    self.sa_auth.user_class.is_active == True,
105
+                    self.sa_auth.user_class.email == identity['login']
106
+                )
107
+            ).first()
108
+            if user:
109
+                user.ensure_auth_token()
110
+                if user.auth_token == identity['password']:
111
+                    email = identity['login']
112
+
97 113
         return email
98 114
 
99 115
     def _sync_ldap_user(self, email, environ, identity):

+ 38 - 0
tracim/tracim/lib/calendar.py View File

@@ -10,6 +10,7 @@ from tracim.lib.exceptions import UnknownCalendarType
10 10
 from tracim.lib.exceptions import NotFound
11 11
 from tracim.lib.user import UserApi
12 12
 from tracim.lib.workspace import UnsafeWorkspaceApi
13
+from tracim.lib.workspace import WorkspaceApi
13 14
 from tracim.model import User
14 15
 from tracim.model import DBSession
15 16
 from tracim.model import new_revision
@@ -29,6 +30,9 @@ CALENDAR_TYPE_WORKSPACE = WorkspaceCalendar
29 30
 CALENDAR_USER_URL_TEMPLATE = 'user/{id}.ics/'
30 31
 CALENDAR_WORKSPACE_URL_TEMPLATE = 'workspace/{id}.ics/'
31 32
 
33
+CALENDAR_USER_BASE_URL = '/user/'
34
+CALENDAR_WORKSPACE_BASE_URL = '/workspace/'
35
+
32 36
 
33 37
 class CalendarManager(object):
34 38
     @classmethod
@@ -38,6 +42,18 @@ class CalendarManager(object):
38 42
         return cfg.RADICALE_CLIENT_BASE_URL_TEMPLATE
39 43
 
40 44
     @classmethod
45
+    def get_user_base_url(cls):
46
+        from tracim.config.app_cfg import CFG
47
+        cfg = CFG.get_instance()
48
+        return os.path.join(cfg.RADICALE_CLIENT_BASE_URL_TEMPLATE, 'user/')
49
+
50
+    @classmethod
51
+    def get_workspace_base_url(cls):
52
+        from tracim.config.app_cfg import CFG
53
+        cfg = CFG.get_instance()
54
+        return os.path.join(cfg.RADICALE_CLIENT_BASE_URL_TEMPLATE, 'workspace/')
55
+
56
+    @classmethod
41 57
     def get_user_calendar_url(cls, user_id: int):
42 58
         user_path = CALENDAR_USER_URL_TEMPLATE.format(id=str(user_id))
43 59
         return os.path.join(cls.get_base_url(), user_path)
@@ -259,3 +275,25 @@ class CalendarManager(object):
259 275
             'start': event.get('dtend').dt.strftime('%Y-%m-%d %H:%M:%S%z'),
260 276
             'end': event.get('dtstart').dt.strftime('%Y-%m-%d %H:%M:%S%z'),
261 277
         }
278
+
279
+    @classmethod
280
+    def get_workspace_readable_calendars_urls_for_user(cls, user: User)\
281
+            -> [str]:
282
+        calendar_urls = []
283
+        workspace_api = WorkspaceApi(user)
284
+        for workspace in workspace_api.get_all_for_user(user):
285
+            if workspace.calendar_enabled:
286
+                calendar_urls.append(cls.get_workspace_calendar_url(
287
+                    workspace_id=workspace.workspace_id,
288
+                ))
289
+
290
+        return calendar_urls
291
+
292
+    def is_discovery_path(self, path: str) -> bool:
293
+        """
294
+        If collection url in one of them, Caldav client is tring to discover
295
+        collections.
296
+        :param path: collection path
297
+        :return: True if given collection path is an discover path
298
+        """
299
+        return path in ('user', 'workspace')

+ 24 - 5
tracim/tracim/lib/daemons.py View File

@@ -179,6 +179,7 @@ class RadicaleDaemon(Daemon):
179 179
         tracim_storage = 'tracim.lib.radicale.storage'
180 180
         fs_path = cfg.RADICALE_SERVER_FILE_SYSTEM_FOLDER
181 181
         allow_origin = cfg.RADICALE_SERVER_ALLOW_ORIGIN
182
+        realm_message = cfg.RADICALE_SERVER_REALM_MESSAGE
182 183
 
183 184
         radicale_config.set('auth', 'type', 'custom')
184 185
         radicale_config.set('auth', 'custom_handler', tracim_auth)
@@ -190,18 +191,36 @@ class RadicaleDaemon(Daemon):
190 191
         radicale_config.set('storage', 'custom_handler', tracim_storage)
191 192
         radicale_config.set('storage', 'filesystem_folder', fs_path)
192 193
 
193
-        if allow_origin:
194
-            try:
195
-                radicale_config.add_section('headers')
196
-            except DuplicateSectionError:
197
-                pass  # It is not a problem, we just want it exist
194
+        radicale_config.set('server', 'realm', realm_message)
198 195
 
196
+        try:
197
+            radicale_config.add_section('headers')
198
+        except DuplicateSectionError:
199
+            pass  # It is not a problem, we just want it exist
200
+
201
+        if allow_origin:
199 202
             radicale_config.set(
200 203
                 'headers',
201 204
                 'Access-Control-Allow-Origin',
202 205
                 allow_origin,
203 206
             )
204 207
 
208
+        # Radicale is not 100% CALDAV Compliant, we force some Allow-Methods
209
+        radicale_config.set(
210
+            'headers',
211
+            'Access-Control-Allow-Methods',
212
+            'DELETE, HEAD, GET, MKCALENDAR, MKCOL, MOVE, OPTIONS, PROPFIND, '
213
+            'PROPPATCH, PUT, REPORT',
214
+        )
215
+
216
+        # Radicale is not 100% CALDAV Compliant, we force some Allow-Headers
217
+        radicale_config.set(
218
+            'headers',
219
+            'Access-Control-Allow-Headers',
220
+            'X-Requested-With,X-Auth-Token,Content-Type,Content-Length,'
221
+            'X-Client,Authorization,depth,Prefer,If-None-Match,If-Match',
222
+        )
223
+
205 224
     def _get_server(self):
206 225
         from tracim.config.app_cfg import CFG
207 226
         cfg = CFG.get_instance()

+ 1 - 1
tracim/tracim/lib/radicale/auth.py View File

@@ -22,7 +22,7 @@ class Auth(object):
22 22
         email = config.get('sa_auth').authmetadata.authenticate({}, {
23 23
             'login': user,
24 24
             'password': password
25
-        })
25
+        }, allow_auth_token=True)
26 26
         if email:
27 27
             cls.current_user = UserApi(None).get_one_by_email(email)
28 28
 

+ 4 - 0
tracim/tracim/lib/radicale/rights.py View File

@@ -15,6 +15,10 @@ def authorized(user, collection, permission):
15 15
         return False
16 16
     current_user = UserApi(None).get_one_by_email(user)
17 17
     manager = CalendarManager(current_user)
18
+
19
+    if manager.is_discovery_path(collection.path):
20
+        return True
21
+
18 22
     try:
19 23
         calendar = manager.find_calendar_with_path(collection.path)
20 24
     except NotFound:

+ 2 - 1
tracim/tracim/lib/userworkspace.py View File

@@ -92,7 +92,8 @@ class RoleApi(object):
92 92
         role.workspace = workspace
93 93
         role.role = role_level
94 94
         if with_notif is not None:
95
-            role.do_notify = with_notif
95
+            from tracim.lib.helpers import on_off_to_boolean
96
+            role.do_notify = on_off_to_boolean(with_notif)
96 97
         if flush:
97 98
             DBSession.flush()
98 99
         return role

+ 30 - 0
tracim/tracim/model/auth.py View File

@@ -8,8 +8,11 @@ It's perfectly fine to re-use this definition in the tracim application,
8 8
 though.
9 9
 
10 10
 """
11
+import uuid
12
+
11 13
 import os
12 14
 from datetime import datetime
15
+import time
13 16
 from hashlib import sha256
14 17
 from slugify import slugify
15 18
 from sqlalchemy.ext.hybrid import hybrid_property
@@ -123,6 +126,8 @@ class User(DeclarativeBase):
123 126
     is_active = Column(Boolean, default=True, nullable=False)
124 127
     imported_from = Column(Unicode(32), nullable=True)
125 128
     _webdav_left_digest_response_hash = Column('webdav_left_digest_response_hash', Unicode(128))
129
+    auth_token = Column(Unicode(255))
130
+    auth_token_created = Column(DateTime)
126 131
 
127 132
     @hybrid_property
128 133
     def email_address(self):
@@ -253,6 +258,31 @@ class User(DeclarativeBase):
253 258
         from tracim.model.data import UserRoleInWorkspace
254 259
         return UserRoleInWorkspace.NOT_APPLICABLE
255 260
 
261
+    def ensure_auth_token(self) -> None:
262
+        """
263
+        Create auth_token if None, regenerate auth_token if too much old.
264
+        auth_token validity is set in
265
+        :return:
266
+        """
267
+        from tracim.config.app_cfg import CFG
268
+        validity_seconds = CFG.get_instance().USER_AUTH_TOKEN_VALIDITY
269
+
270
+        if not self.auth_token or not self.auth_token_created:
271
+            self.auth_token = uuid.uuid4()
272
+            self.auth_token_created = datetime.utcnow()
273
+            DBSession.flush()
274
+            return
275
+
276
+        now_seconds = time.mktime(datetime.utcnow().timetuple())
277
+        auth_token_seconds = time.mktime(self.auth_token_created.timetuple())
278
+        difference = now_seconds - auth_token_seconds
279
+
280
+        if difference > validity_seconds:
281
+            self.auth_token = uuid.uuid4()
282
+            self.auth_token_created = datetime.utcnow()
283
+            DBSession.flush()
284
+
285
+
256 286
 class Permission(DeclarativeBase):
257 287
     """
258 288
     Permission definition.

+ 0 - 24
tracim/tracim/model/data.py View File

@@ -1021,30 +1021,6 @@ class Content(DeclarativeBase):
1021 1021
         return format_timedelta(delta_from_datetime - datetime_object,
1022 1022
                                 locale=tg.i18n.get_lang()[0])
1023 1023
 
1024
-
1025
-    def extract_links_from_content(self, other_content: str=None) -> [LinkItem]:
1026
-        """
1027
-        parse html content and extract links. By default, it works on the description property
1028
-        :param other_content: if not empty, then parse the given html content instead of description
1029
-        :return: a list of LinkItem
1030
-        """
1031
-        links = []
1032
-        return links
1033
-        soup = BeautifulSoup(
1034
-            self.description if not other_content else other_content,
1035
-            'html.parser'  # Fixes hanging bug - http://stackoverflow.com/questions/12618567/problems-running-beautifulsoup4-within-apache-mod-python-django
1036
-        )
1037
-
1038
-        for link in soup.findAll('a'):
1039
-            href = link.get('href')
1040
-            label = link.contents
1041
-            links.append(LinkItem(href, label))
1042
-        links.sort(key=lambda link: link.href if link.href else '')
1043
-
1044
-        sorted_links = sorted(links, key=lambda link: link.label if link.label else link.href, reverse=True)
1045
-        ## FIXME - Does this return a sorted list ???!
1046
-        return sorted_links
1047
-
1048 1024
     def get_child_nb(self, content_type: ContentType, content_status = ''):
1049 1025
         child_nb = 0
1050 1026
         for child in self.get_valid_children():

+ 2 - 2
tracim/tracim/model/serializers.py View File

@@ -382,7 +382,7 @@ def serialize_node_for_page(content: Content, context: Context):
382 382
             icon=ContentType.get_icon(content.type),
383 383
             owner=context.toDict(data_container.owner),
384 384
             status=context.toDict(data_container.get_status()),
385
-            links=context.toDict(content.extract_links_from_content(data_container.description)),
385
+            links=[],
386 386
             revisions=context.toDict(sorted(content.revisions, key=lambda v: v.created, reverse=True)),
387 387
             selected_revision='latest' if content.revision_to_serialize<=0 else content.revision_to_serialize,
388 388
             history=Context(CTX.CONTENT_HISTORY).toDict(content.get_history()),
@@ -445,7 +445,7 @@ def serialize_node_for_page(item: Content, context: Context):
445 445
             icon = ContentType.get_icon(item.type),
446 446
             id = item.content_id,
447 447
             label = item.label,
448
-            links = context.toDict(item.extract_links_from_content(item.description)),
448
+            links=[],
449 449
             owner = context.toDict(item.owner),
450 450
             parent = context.toDict(item.parent),
451 451
             selected_revision = 'latest',

+ 15 - 0
tracim/tracim/public/assets/css/dashboard.css View File

@@ -290,6 +290,11 @@ div.t-page-metadata-row, div.t-metadata-row {
290 290
 #sidebar-left .btn.btn-link,
291 291
 #sidebar-left .list-unstyled a {
292 292
     color: #DDD;
293
+    margin-bottom: 20px; /* avoid left menu to be overwritten by footer */
294
+}
295
+
296
+#sidebar-left-menu {
297
+    margin-bottom: 20px; /* add a margin between menu bottom and footer top */
293 298
 }
294 299
 
295 300
 h1.page-header {
@@ -367,3 +372,13 @@ span.info.readonly {
367 372
     font-size: 0.8em;
368 373
     opacity: 0.7;
369 374
 }
375
+
376
+@media(min-width: 768px) and (max-width: 992px) {
377
+    .download-file-button i.fa {
378
+        font-size: 12px;
379
+    }
380
+}
381
+
382
+.no-padding {
383
+    padding: 0px;
384
+}

+ 35 - 0
tracim/tracim/public/caldavzap/.htaccess View File

@@ -0,0 +1,35 @@
1
+#########################################################################################################################
2
+# Apache configuration (REQUIRED for correct HTML5 cache functionality in browsers):
3
+# 1.) You NEED to enable the following Apache modules: mod_mime, mod_headers (optionally you can also enable mod_deflate)
4
+# 2.) You NEED to add the following lines into your Apache vhost configuration (without the # character):
5
+#     <Directory /client/installation/directory/>
6
+#        AllowOverride FileInfo Limit
7
+#         <IfVersion >= 2.3>
8
+#             Require all granted
9
+#         </IfVersion>
10
+#         <IfVersion < 2.3>
11
+#             Order allow,deny
12
+#             Allow from all
13
+#         </IfVersion>
14
+#     </Directory>
15
+#########################################################################################################################
16
+
17
+# Add "Content-Type: text/cache-manifest" header for .manifest files
18
+<IfModule mod_mime.c>
19
+    AddType text/cache-manifest .manifest
20
+</IfModule>
21
+
22
+# Add "Cache-Control: max-age=0, must-revalidate, no-cache, no-transform, private" header for all files
23
+#  for more information see: https://tools.ietf.org/html/rfc7234
24
+<IfModule mod_headers.c>
25
+    Header set Cache-Control "max-age=0, must-revalidate, no-cache, no-transform, private"
26
+</IfModule>
27
+
28
+<IfModule mod_deflate.c>
29
+    SetOutputFilter DEFLATE
30
+</IfModule>
31
+
32
+# If you use mod_cache set the correct path for the cache.manifest here
33
+#<IfModule mod_cache.c>
34
+#    CacheDisable cache.manifest
35
+#</IfModule>

+ 24 - 0
tracim/tracim/public/caldavzap/auth/.htaccess View File

@@ -0,0 +1,24 @@
1
+#####################################################################################################
2
+# Apache configuration (REQUIRED to prevent access for .inc files /especially config files/)
3
+# You NEED to add the following lines into your Apache vhost configuration (without the # character):
4
+# <Directory /client/installation/directory/auth/>
5
+#    AllowOverride Limit
6
+#     <IfVersion >= 2.3>
7
+#         Require all granted
8
+#     </IfVersion>
9
+#     <IfVersion < 2.3>
10
+#         Order allow,deny
11
+#         Allow from all
12
+#     </IfVersion>
13
+# </Directory>
14
+#####################################################################################################
15
+
16
+<Files ~ "\.inc$">
17
+	<IfVersion >= 2.3>
18
+		Require all granted
19
+	</IfVersion>
20
+	<IfVersion < 2.3>
21
+		Order allow,deny
22
+		Deny from all
23
+	</IfVersion>
24
+</Files>

+ 41 - 0
tracim/tracim/public/caldavzap/auth/common.inc View File

@@ -0,0 +1,41 @@
1
+<?php
2
+	function array_to_xml($array, $skip_top_closing=false, $level=0)
3
+	{
4
+		static $result="<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n";
5
+
6
+		foreach($array as $k => $v)
7
+		{
8
+			if(is_numeric($k))
9
+				array_to_xml($v, $skip_top_closing, $level);
10
+			else
11
+			{
12
+				for($j=0; $j<$level; $j++)
13
+					$result.="	";
14
+
15
+				$result.="<".htmlspecialchars($k);
16
+				if($k=='resources')
17
+					$result.=" xmlns=\"urn:com.inf-it:configuration\"";
18
+				if($v=='')
19
+					$result.=" />\n";
20
+				else
21
+				{
22
+					$result.=">";
23
+
24
+					if(is_array($v))
25
+					{
26
+						$result.="\n";
27
+						array_to_xml($v, $skip_top_closing, $level+1);
28
+						for($j=0; $j<$level; $j++)
29
+							$result.="	";
30
+					}
31
+					else
32
+						$result.=htmlspecialchars($v);
33
+
34
+					if($level!==0 || $skip_top_closing===false)
35
+						$result.="</".htmlspecialchars($k).">\n";
36
+				}
37
+			}
38
+		}
39
+		return $result;
40
+	}
41
+?>

+ 58 - 0
tracim/tracim/public/caldavzap/auth/config.inc View File

@@ -0,0 +1,58 @@
1
+<?php
2
+	// auth method: generic (auth/plugins/generic_conf.inc) or ldap (auth/plugins/ldap_conf.inc)
3
+	$config['auth_method']='generic';
4
+
5
+	// set to true for debugging XML response, otherwise set to false to avoid browser
6
+	//  to show http authentication window after unsuccessful authentication
7
+	$config['auth_send_authenticate_header']=false;
8
+
9
+	// successfull authentication XML specification (change the "http://www.server.com:80" to your protocol/server/port)
10
+	$config['accounts']=array('resources'=>array());
11
+
12
+	// note: if you want to use regex values, then use one of the following formats (the second example is with regex modifier): 're:.*someregex.*[0-9]$' or 're|i:.*someregex.*[0-9]$'
13
+	// note: 'crossdomain' and 'withcredentials' are still available but there is NO REASON to use them (crossDomain is detected automatically, and I've never seen anyone who understand when to use withCredentials /there is NO REASON to set it to true!/)
14
+	// note: 'syncinterval' was removed - use globalSyncResourcesInterval in config.js instead
15
+	$config['accounts']['resources'][]=array(
16
+		'resource'=>array(
17
+			'type'=>array('calendar'=>''),
18
+			'href'=>(empty($_SERVER['HTTPS']) ? 'http' : 'https').'://www.server.com:80/caldav.php/'.$_SERVER['PHP_AUTH_USER'].'/',
19
+			'hreflabel'=>'null',		// if undefined or empty href value is used (see above)
20
+			'forcereadonly'=>'null',	// see auth/doc/example_config_response.xml for proper use, for example: 'forcereadonly'=>array(array('collection'=>'/caldav.php/user/collection/'), array('collection'=>'re:^/caldav.php/user/collection[0-9]/$')),
21
+			'settingsaccount'=>'true',	// client properties are saved here (note: set it to true only for ONE account)
22
+			'checkcontenttype'=>'true',	// check content-type in the server response (if you cannot see data in the interface /buggy server response/ you may try to disable it)
23
+			'delegation'=>'true',		// see auth/doc/example_config_response.xml for proper use, for example: 'delegation'=>array(array('resource'=>'/caldav.php/user%40domain.com/'), array('resource'=>'re|i:^/caldav.php/a[b-x].+/$')),
24
+			'ignorealarms'=>'false',	// see auth/doc/example_config_response.xml for proper use, for example: 'ignorealarms'=>array(array('collection'=>'/caldav.php/user/collection/'), array('collection'=>'re:^/caldav.php/user/collection[0-9]/$')),
25
+			'backgroundcalendars'=>'',	// see auth/doc/example_config_response.xml for proper use, for example: 'backgroundcalendars'=>array(array('collection'=>'/caldav.php/user/collection/'), array('collection'=>'re|i:^/caldav.php/user/collection[0-9]/$')),
26
+			'userauth'=>array(
27
+				'username'=>$_SERVER['PHP_AUTH_USER'],
28
+				'password'=>$_SERVER['PHP_AUTH_PW']
29
+			),
30
+			'timeout'=>90000,
31
+			'locktimeout'=>10000
32
+		)
33
+	);
34
+
35
+/*
36
+	// additional accounts
37
+	$config['accounts']['resources'][]=array(
38
+		'resource'=>array(
39
+			'type'=>array('calendar'=>''),
40
+			'href'=>'http://www.server.com:80/caldav.php/resource/',
41
+			'hreflabel'=>'null',		// if undefined or empty href value is used (see above)
42
+			'forcereadonly'=>'null',	// see auth/doc/example_config_response.xml for proper use, for example: 'forcereadonly'=>array(array('collection'=>'/caldav.php/user/collection/'), array('collection'=>'re:^/caldav.php/user/collection[0-9]/$')),
43
+			'settingsaccount'=>'false',	// client properties are saved here (note: set it to true only for ONE account)
44
+			'checkcontenttype'=>'true',	// check content-type in the server response (if you cannot see data in the interface /buggy server response/ you may try to disable it)
45
+			'delegation'=>'true',		// see auth/doc/example_config_response.xml for proper use, for example: 'delegation'=>array(array('resource'=>'/caldav.php/user%40domain.com/'), array('resource'=>'re|i:^/caldav.php/a[b-x].+/$')),
46
+			'ignorealarms'=>'false',	// see auth/doc/example_config_response.xml for proper use, for example: 'ignorealarms'=>array(array('collection'=>'/caldav.php/user/collection/'), array('collection'=>'re:^/caldav.php/user/collection[0-9]/$')),
47
+			'backgroundcalendars'=>'',	// see auth/doc/example_config_response.xml for proper use, for example: 'backgroundcalendars'=>array(array('collection'=>'/caldav.php/user/collection/'), array('collection'=>'re|i:^/caldav.php/user/collection[0-9]/$')),
48
+			'userauth'=>array(
49
+				'username'=>$_SERVER['PHP_AUTH_USER'],
50
+				'password'=>$_SERVER['PHP_AUTH_PW']
51
+			),
52
+			'timeout'=>90000,
53
+			'locktimeout'=>10000
54
+		)
55
+	);
56
+*/
57
+
58
+?>

+ 14 - 0
tracim/tracim/public/caldavzap/auth/cross_domain.inc View File

@@ -0,0 +1,14 @@
1
+<?php
2
+	header_remove('Access-Control-Allow-Origin');
3
+	header_remove('Access-Control-Allow-Methods');
4
+	header_remove('Access-Control-Allow-Headers');
5
+	header_remove('Access-Control-Allow-Credentials');
6
+
7
+	header('Access-Control-Allow-Origin: *');
8
+	header('Access-Control-Allow-Methods: GET');
9
+	header('Access-Control-Allow-Headers: User-Agent,Authorization,Content-type,X-client');
10
+	header('Access-Control-Allow-Credentials: true');
11
+
12
+	if($_SERVER['REQUEST_METHOD']=='OPTIONS')	// Preflighted request
13
+		exit(0);
14
+?>

+ 85 - 0
tracim/tracim/public/caldavzap/auth/doc/example_config_response.xml View File

@@ -0,0 +1,85 @@
1
+<resources xmlns="urn:com.inf-it:configuration">
2
+	<resource>
3
+		<type>
4
+			<calendar />
5
+		</type>
6
+		<href>http://www.server.com:8080/principals/users/user/</href>
7
+		<hreflabel></hreflabel>
8
+		<crossdomain>null</crossdomain>
9
+		<forcereadonly>null</forcereadonly>
10
+		<withcredentials>false</withcredentials>
11
+		<settingsaccount>true</settingsaccount>
12
+		<checkcontenttype>true</checkcontenttype>
13
+		<delegation>true</delegation>
14
+		<ignorealarms>false</ignorealarms>
15
+		<backgroundcalendars />
16
+		<userauth>
17
+			<username>user</username>
18
+			<password>password</password>
19
+		</userauth>
20
+		<timeout>90000</timeout>
21
+		<locktimeout>10000</locktimeout>
22
+	</resource>
23
+	<resource>
24
+		<type>
25
+			<calendar />
26
+		</type>
27
+		<href>http://www.server2.com:80/caldav.php/user/</href>
28
+		<hreflabel></hreflabel>
29
+		<crossdomain>null</crossdomain>
30
+		<forcereadonly>true</forcereadonly>
31
+		<withcredentials>false</withcredentials>
32
+		<settingsaccount>false</settingsaccount>
33
+		<checkcontenttype>true</checkcontenttype>
34
+		<delegation>
35
+			<resource>/caldav.php/user/</resource>
36
+			<resource>/principals/users/user%40domain.com/</resource>
37
+			<resource>re:^/caldav.php/a[b-x].+/$</resource>
38
+			<resource>re|i:^/caldav.php/a[b-x].+/$</resource>
39
+		</delegation>
40
+		<ignorealarms>
41
+			<collection>/caldav.php/user/collection/</collection>
42
+			<collection>/caldav.php/user%40domain.com/collection/</collection>
43
+			<collection>re:^/caldav.php/user/collection[0-9]/$</collection>
44
+			<collection>re|i:^/caldav.php/user/collection[0-9]/$</collection>
45
+		</ignorealarms>
46
+		<backgroundcalendars>
47
+			<collection>/caldav.php/user/collection/</collection>
48
+			<collection>/caldav.php/user%40domain.com/collection/</collection>
49
+			<collection>re:^/caldav.php/user/collection[0-9]/$</collection>
50
+			<collection>re|i:^/caldav.php/user/collection[0-9]/$</collection>
51
+		</backgroundcalendars>
52
+		<userauth>
53
+			<username>user</username>
54
+			<password>password</password>
55
+		</userauth>
56
+		<timeout>90000</timeout>
57
+		<locktimeout>10000</locktimeout>
58
+	</resource>
59
+	<resource>
60
+		<type>
61
+			<calendar />
62
+		</type>
63
+		<href>https://www.server3.com:8443/caldav.php/user/</href>
64
+		<hreflabel></hreflabel>
65
+		<crossdomain>null</crossdomain>
66
+		<forcereadonly>
67
+			<collection>/caldav.php/user/collection/</collection>
68
+			<collection>/caldav.php/user%40domain.com/collection/</collection>
69
+			<collection>re:^/caldav.php/user/collection[0-9]/$</collection>
70
+			<collection>re|i:^/caldav.php/user/collection[0-9]/$</collection>
71
+		</forcereadonly>
72
+		<withcredentials>false</withcredentials>
73
+		<settingsaccount>false</settingsaccount>
74
+		<checkcontenttype>true</checkcontenttype>
75
+		<delegation>false</delegation>
76
+		<ignorealarms>false</ignorealarms>
77
+		<backgroundcalendars />
78
+		<userauth>
79
+			<username>user</username>
80
+			<password>password</password>
81
+		</userauth>
82
+		<timeout>90000</timeout>
83
+		<locktimeout>10000</locktimeout>
84
+	</resource>
85
+</resources>

+ 7 - 0
tracim/tracim/public/caldavzap/auth/doc/readme.txt View File

@@ -0,0 +1,7 @@
1
+1.) configure your auth method (see the plugins directory) and the response XML in auth/config.inc and set $config['auth_send_authenticate_header']=true
2
+2.) configure the selected auth module in plugins/PLUGIN_conf.inc
3
+3.) check the correct response by visiting http://your-server.com/client_dir/auth/ and entering username and password
4
+4.) set $config['auth_send_authenticate_header']=false in auth/config.inc
5
+
6
+By default the generic plugin is used for basic HTTP authentication ($config['auth_method']='generic'; in config.inc).
7
+

+ 33 - 0
tracim/tracim/public/caldavzap/auth/index.php View File

@@ -0,0 +1,33 @@
1
+<?php
2
+	require_once('config.inc');
3
+	require_once('common.inc');
4
+	require_once('cross_domain.inc');
5
+	require_once('plugins/'.$config['auth_method'].'.inc');	// configured module - it defines the 'MODULE_authenticate()' function
6
+
7
+	if(call_user_func($config['auth_method'].'_authenticate')!==1)
8
+	{
9
+		// HTTP authentication (exit if unsuccessfull)
10
+		if($config['auth_send_authenticate_header'])
11
+			header('WWW-Authenticate: Basic realm="Inf-IT Auth Module"');
12
+		header('HTTP/1.0 401 Unauthorized');
13
+echo <<<HTML
14
+<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
15
+<html>
16
+	<head>
17
+		<title>401 Authorization Required</title>
18
+	</head>
19
+	<body>
20
+		<h1>Authorization Required</h1>
21
+		<p>This server could not verify that you are authorized to access the document requested. Either you supplied the wrong credentials (e.g., bad password), or your browser doesn't understand how to supply the credentials required.</p>
22
+	</body>
23
+</html>
24
+HTML;
25
+		exit(0);
26
+	}
27
+	else
28
+	{
29
+		header('Content-type: text/xml; charset="utf-8"');
30
+		header('Cache-Control: max-age=0, must-revalidate, no-cache, no-store, no-transform, private');
31
+		echo array_to_xml($config['accounts']);
32
+	}
33
+?>

+ 58 - 0
tracim/tracim/public/caldavzap/auth/plugins/generic.inc View File

@@ -0,0 +1,58 @@
1
+<?php
2
+	require_once(dirname(__FILE__).'/generic_conf.inc');
3
+
4
+	function generic_authenticate()
5
+	{
6
+		global $pluginconfig;
7
+		if($_SERVER['PHP_AUTH_USER']!='' && $_SERVER['PHP_AUTH_PW']!='')
8
+		{
9
+			preg_match('#(https?)://([^/:]+)((?::[0-9]+)?)#i', $pluginconfig['base_url'], $matches);
10
+			$hostname_clean=$matches[2];
11
+			if($matches[1]=='https')
12
+				$hostname='ssl://'.$matches[2];
13
+			else
14
+				$hostname=$matches[2];
15
+
16
+			if($matches[3]=='')
17
+			{
18
+				if($matches[1]=='http')
19
+					$port=80;
20
+				else if($matches[1]=='https')
21
+					$port=443;
22
+			}
23
+			else
24
+				$port=substr($matches[3],1);
25
+
26
+			$fp=fsockopen($hostname, $port, $errno, $errstr, $pluginconfig['timeout']);
27
+			if(!$fp)
28
+			{
29
+				echo "$errstr ($errno)<br />\n";
30
+				return -2;
31
+			}
32
+			else
33
+			{
34
+				$request="<?xml version=\"1.0\" encoding=\"utf-8\"?><A:propfind xmlns:A=\"DAV:\"><A:prop><A:current-user-principal/></A:prop></A:propfind>";
35
+
36
+				$out="PROPFIND ".$pluginconfig['request']." HTTP/1.1\r\n";
37
+				$out.="Host: $hostname_clean\r\n";
38
+				$out.="Authorization: Basic ".base64_encode($_SERVER['PHP_AUTH_USER'].':'.$_SERVER['PHP_AUTH_PW'])."\r\n";
39
+				$out.="Depth: 0\r\n";
40
+				$out.="Content-Type: text/xml; charset=\"utf-8\"\r\n";
41
+				$out.="Content-Length:". strlen($request)."\r\n\r\n";
42
+				$out.=$request;
43
+				fwrite($fp, $out);
44
+
45
+				$result='';
46
+				if(!feof($fp))
47
+		    		$result.=fgets($fp);
48
+				fclose($fp);
49
+
50
+				if(strpos($result, 'HTTP/1.1 207')===0)
51
+					return 1;	// auth successful
52
+				else
53
+					return -1;	// auth unsuccessful
54
+			}
55
+		}
56
+		return 0;	// empty username or password
57
+	}
58
+?>

+ 12 - 0
tracim/tracim/public/caldavzap/auth/plugins/generic_conf.inc View File

@@ -0,0 +1,12 @@
1
+<?php
2
+	// Server base URL
3
+	$pluginconfig['base_url']=(empty($_SERVER['HTTPS']) ? 'http' : 'https').'://my.server.com:8080';
4
+
5
+	// Default values are usually OK
6
+	//  for Davical:
7
+	$pluginconfig['request']='/caldav.php';	// change only if your Davical is not installed into server root directory
8
+	//  for Lion server:
9
+	//$pluginconfig['request']='/principals/users';
10
+
11
+	$pluginconfig['timeout']=30;
12
+?>

+ 37 - 0
tracim/tracim/public/caldavzap/auth/plugins/ldap.inc View File

@@ -0,0 +1,37 @@
1
+<?php
2
+	require_once(dirname(__FILE__).'/ldap_conf.inc');
3
+
4
+	function ldap_authenticate()
5
+	{
6
+		global $pluginconfig;
7
+		if($_SERVER['PHP_AUTH_USER']!="" && $_SERVER['PHP_AUTH_PW']!="")
8
+		{
9
+			$ds=ldap_connect($pluginconfig['host']);
10
+
11
+			// if binding is required for LDAP search
12
+			if(isset($pluginconfig['bind_dn']) && isset($pluginconfig['bind_passwd']))
13
+			{
14
+				@ldap_set_option($ds, LDAP_OPT_PROTOCOL_VERSION, 3);
15
+				if(!($r=@ldap_bind($ds, $pluginconfig['bind_dn'], $pluginconfig['bind_passwd'])))
16
+					return -2;	// auth unsuccessful (bind error)
17
+			}
18
+
19
+			// perform the search
20
+			if(($r=ldap_search($ds, $pluginconfig['basedn'], '(&('.$pluginconfig['user_attr'].'='.$_SERVER['PHP_AUTH_USER'].')'.(isset($pluginconfig['filter']) && $pluginconfig['filter']!='' ? '('.$pluginconfig['filter'].')' : '' ).')'))!==false)
21
+			{
22
+				$result=@ldap_get_entries($ds, $r);
23
+				if($result[0])
24
+				{
25
+					@ldap_set_option($ds, LDAP_OPT_PROTOCOL_VERSION, 3);
26
+					if(@ldap_bind($ds, $result[0]['dn'], $_SERVER['PHP_AUTH_PW']))
27
+					{
28
+						@ldap_unbind($bi);
29
+						return 1;	// auth successful
30
+					}
31
+				}
32
+			}
33
+			return -1;	// auth unsuccessful
34
+		}
35
+		return 0;	// empty username or password
36
+	}
37
+?>

+ 12 - 0
tracim/tracim/public/caldavzap/auth/plugins/ldap_conf.inc View File

@@ -0,0 +1,12 @@
1
+<?php
2
+	// LDAP configuration parameters
3
+	$pluginconfig['host']='ldaps://ldap.server.com/';
4
+	$pluginconfig['basedn']='ou=People,dc=server,dc=com';
5
+	$pluginconfig['user_attr']='uid';
6
+	// if the server requires binding (if set to null then binding is not performed)
7
+	//$pluginconfig['bind_dn']=null;
8
+	//$pluginconfig['bind_passwd']=null;
9
+
10
+	// optional
11
+	$pluginconfig['filter']='accountStatus=active';
12
+?>

+ 150 - 0
tracim/tracim/public/caldavzap/cache.manifest View File

@@ -0,0 +1,150 @@
1
+CACHE MANIFEST
2
+#V 20160728145557
3
+
4
+CACHE:
5
+common.js
6
+config.js
7
+data_process.js
8
+forms.js
9
+interface.js
10
+localization.js
11
+main.js
12
+resource.js
13
+timezones.js
14
+vcalendar.js
15
+vcalendar_rfc_regex.js
16
+vtodo.js
17
+webdav_protocol.js
18
+css/default.css
19
+css/default_integration.css
20
+css/fullcalendar.css
21
+css/jquery-ui.custom.css
22
+css/spectrum.custom.css
23
+fonts/Roboto-BoldItalic-webfont.eot
24
+fonts/Roboto-BoldItalic-webfont.svg
25
+fonts/Roboto-BoldItalic-webfont.ttf
26
+fonts/Roboto-BoldItalic-webfont.woff
27
+fonts/Roboto-Bold-webfont.eot
28
+fonts/Roboto-Bold-webfont.svg
29
+fonts/Roboto-Bold-webfont.ttf
30
+fonts/Roboto-Bold-webfont.woff
31
+fonts/Roboto-Italic-webfont.eot
32
+fonts/Roboto-Italic-webfont.svg
33
+fonts/Roboto-Italic-webfont.ttf
34
+fonts/Roboto-Italic-webfont.woff
35
+fonts/Roboto-LightItalic-webfont.eot
36
+fonts/Roboto-LightItalic-webfont.svg
37
+fonts/Roboto-LightItalic-webfont.ttf
38
+fonts/Roboto-LightItalic-webfont.woff
39
+fonts/Roboto-Light-webfont.eot
40
+fonts/Roboto-Light-webfont.svg
41
+fonts/Roboto-Light-webfont.ttf
42
+fonts/Roboto-Light-webfont.woff
43
+fonts/Roboto-MediumItalic-webfont.eot
44
+fonts/Roboto-MediumItalic-webfont.svg
45
+fonts/Roboto-MediumItalic-webfont.ttf
46
+fonts/Roboto-MediumItalic-webfont.woff
47
+fonts/Roboto-Medium-webfont.eot
48
+fonts/Roboto-Medium-webfont.svg
49
+fonts/Roboto-Medium-webfont.ttf
50
+fonts/Roboto-Medium-webfont.woff
51
+fonts/Roboto-Regular-webfont.eot
52
+fonts/Roboto-Regular-webfont.svg
53
+fonts/Roboto-Regular-webfont.ttf
54
+fonts/Roboto-Regular-webfont.woff
55
+images/add_cal.svg
56
+images/add_cal_white.svg
57
+images/arrow_next_red.svg
58
+images/arrow_next.svg
59
+images/arrow_prev_red.svg
60
+images/arrow_prev.svg
61
+images/banner_calendar.svg
62
+images/banner_logout.svg
63
+images/banner_refresh.svg
64
+images/banner_todo.svg
65
+images/calendarB.svg
66
+images/cdz_logo.svg
67
+images/cloud.svg
68
+images/delegation.svg
69
+images/dp_left.svg
70
+images/dp_right.svg
71
+images/error_badge.svg
72
+images/error_b.svg
73
+images/error_w.svg
74
+images/in_progress_b.svg
75
+images/in_progress_dr.svg
76
+images/in_progress_r.svg
77
+images/in_progress_w.svg
78
+images/jumper_bottom_b.svg
79
+images/jumper_bottom_w.svg
80
+images/jumper_top_b.svg
81
+images/jumper_top_w.svg
82
+images/loadinfo.gif
83
+images/loadinfo_s1.gif
84
+images/loadinfo_s2.gif
85
+images/loadinfo_s3.gif
86
+images/loadinfo_s4.gif
87
+images/login.svg
88
+images/logout.svg
89
+images/needs_action_b.svg
90
+images/needs_action_dr.svg
91
+images/needs_action_r.svg
92
+images/needs_action_w.svg
93
+images/new_item.svg
94
+images/popupArrow.svg
95
+images/priority-1-dr.svg
96
+images/priority-1-r.svg
97
+images/priority-1.svg
98
+images/priority-1-w.svg
99
+images/priority-2-dr.svg
100
+images/priority-2-r.svg
101
+images/priority-2.svg
102
+images/priority-2-w.svg
103
+images/priority-3-dr.svg
104
+images/priority-3-r.svg
105
+images/priority-3.svg
106
+images/priority-3-w.svg
107
+images/read_only_b.svg
108
+images/read_only_w.svg
109
+images/remove_cal.svg
110
+images/remove_cal_white.svg
111
+images/reset_b.svg
112
+images/reset_dr.svg
113
+images/reset_drw.svg
114
+images/reset_r.svg
115
+images/reset_rw.svg
116
+images/reset_w.svg
117
+images/resource_arrow_down.svg
118
+images/resource_arrow_right.svg
119
+images/resource_arrow_up.svg
120
+images/resources.svg
121
+images/search.svg
122
+images/searchWhiteNew.svg
123
+images/select_bg_black.svg
124
+images/select_bg_dis.svg
125
+images/select_bg.svg
126
+images/select_black.svg
127
+images/select_dis.svg
128
+images/select_login.svg
129
+images/select.svg
130
+images/success_b.svg
131
+images/success_dr.svg
132
+images/success_drw.svg
133
+images/success_r.svg
134
+images/success_rw.svg
135
+images/success_w.svg
136
+images/todoB.svg
137
+lib/fullcalendar.js
138
+lib/ie_base64.js
139
+lib/jquery-2.1.4.min.js
140
+lib/jquery.autosize.js
141
+lib/jquery.browser.js
142
+lib/jquery.placeholder-1.1.9.js
143
+lib/jquery.quicksearch.js
144
+lib/jquery-ui-1.11.4.custom.js
145
+lib/jshash-2.2_sha256.js
146
+lib/rrule.js
147
+lib/spectrum.js
148
+
149
+NETWORK:
150
+*

+ 79 - 0
tracim/tracim/public/caldavzap/cache_handler.js View File

@@ -0,0 +1,79 @@
1
+// OFFLINE CACHE DEBUGGING
2
+
3
+/*var cacheStatusValues=[];
4
+cacheStatusValues[0]='uncached';
5
+cacheStatusValues[1]='idle';
6
+cacheStatusValues[2]='checking';
7
+cacheStatusValues[3]='downloading';
8
+cacheStatusValues[4]='updateready';
9
+cacheStatusValues[5]='obsolete';
10
+
11
+var cache=window.applicationCache;
12
+cache.addEventListener('cached', logEvent, false);
13
+cache.addEventListener('checking', logEvent, false);
14
+cache.addEventListener('downloading', logEvent, false);
15
+cache.addEventListener('error', logEvent, false);
16
+cache.addEventListener('noupdate', logEvent, false);
17
+cache.addEventListener('obsolete', logEvent, false);
18
+cache.addEventListener('progress', logEvent, false);
19
+cache.addEventListener('updateready', logEvent, false);
20
+
21
+function logEvent(e)
22
+{
23
+	var online, status, type, message;
24
+	online=(navigator.onLine) ? 'yes' : 'no';
25
+	status=cacheStatusValues[cache.status];
26
+	type=e.type;
27
+	message='online: '+online;
28
+	message+=', event: '+type;
29
+	message+=', status: '+status;
30
+	if(type=='error' && navigator.onLine)
31
+		message+=' (prolly a syntax error in manifest)';
32
+	console.log(message);
33
+}
34
+
35
+window.applicationCache.addEventListener('updateready', function(){
36
+		window.applicationCache.swapCache();
37
+		console.log('swap cache has been called');
38
+	}, false
39
+);
40
+
41
+//setInterval(function(){cache.update()}, 10000);*/
42
+
43
+// Check if a new cache is available on page load.
44
+window.addEventListener('load', function(e)
45
+{
46
+	window.applicationCache.addEventListener('cached', function(e)
47
+	{
48
+		if(!isUserLogged)
49
+			window.location.reload();
50
+		else
51
+			$('#cacheDialog').css('display','block');
52
+	}, false);
53
+
54
+	window.applicationCache.addEventListener('updateready', function(e)
55
+	{
56
+		if(!isUserLogged)
57
+			window.location.reload();
58
+		else
59
+			$('#cacheDialog').css('display','block');
60
+	}, false);
61
+
62
+	window.applicationCache.addEventListener('obsolete', function(e)
63
+	{
64
+		if(!isUserLogged)
65
+			window.location.reload();
66
+		else
67
+			$('#cacheDialog').css('display','block');
68
+	}, false);
69
+
70
+	window.applicationCache.addEventListener('noupdate', function(e)
71
+	{
72
+		if(!isUserLogged)
73
+		{
74
+			clearInterval(globalCacheUpdateInterval);
75
+			globalCacheUpdateInterval=setInterval(function(){window.applicationCache.update();}, 300000);
76
+			//$('#LoginPage .window').css('display', 'inline-block');
77
+		}
78
+	}, false);
79
+}, false);

+ 5 - 0
tracim/tracim/public/caldavzap/cache_update.sh View File

@@ -0,0 +1,5 @@
1
+#! /bin/bash
2
+# Use this script every time you modify any file to force browsers to reload it (empty HTML5 cache).
3
+
4
+command -v ed &> /dev/null || { echo "Error: 'ed' not installed. Aborting." > /dev/stderr; exit 1; }
5
+printf ",s/#V.*/#V $(date '+%Y%m%d%H%M%S')/\nw\nq\n" | ed -s cache.manifest

+ 294 - 0
tracim/tracim/public/caldavzap/changelog.txt View File

@@ -0,0 +1,294 @@
1
+CalDavZAP Changelog
2
+
3
+
4
+NOTE: if you are interested in integrated version of CalDavZAP and CardDavMATE (our CardDAV web client) please use InfCloud - http://www.inf-it.com/open-source/clients/infcloud/
5
+
6
+version 0.13.1 [2015-09-22]:
7
+- note: do not forget to execute the cache_update.sh script every time you update your configuration or any other file (otherwise your browser will use the previous version of files stored in HTML5 cache); alternatively you can update the cache.manifest manually - edit the second line beginning with "#V 20" to anything else (this file simple needs "some" change)
8
+- changed login screen autocomplete behaviour - we do not prevent browsers from remembering login/password anymore
9
+
10
+version 0.13.0 [2015-09-16]:
11
+- note: do not forget to execute the cache_update.sh script every time you update your configuration or any other file (otherwise your browser will use the previous version of files stored in HTML5 cache); alternatively you can update the cache.manifest manually - edit the second line beginning with "#V 20" to anything else (this file simple needs "some" change)
12
+- note: if you use a server with cross-domain setup see the modified Access-Control-Allow-Headers and Access-Control-Expose-Headers in readme.txt (or misc/config_davical.txt or misc/calendarserver.diff); you MUST update these headers, otherwise the client will NOT work
13
+- configuration - added globalEnableRefresh option which enables/disables the new "refresh all resources" icon in the left application menu (disabled by default)
14
+- added Chinese localization (zh_CN) - thanks Fandy
15
+- added shift+login shortcut to ignore settings stored on the server and use the default settings (this functionality was added long time ago, but I forgot to mention about it)
16
+- added support for "Prefer: return=representation" (and related "Preference-Applied: return=representation") for PUT requests (see http://tools.ietf.org/html/rfc7240); this change REQUIRES update of Access-Control-Allow-Headers and Access-Control-Expose-Headers if cross-domain setup is used
17
+- added full RFC2445 support - RRULE processing is now performed by rrule.js (see: https://github.com/jakubroztocil/rrule); thanks to this library we now support/expand all recurrences, although the most exotic ones are "read-only" (for these you will see "Other (modification not supported)" in the interface)
18
+- added DESCRIPTION property for VALARM components to make them RFC compliant
19
+- added check for unsupported XML 1.0 characters in user entered data - these are replaced by a space character (to prevent client and/or server side parsing errors)
20
+- added title with version number for the software name/description (login screen)
21
+- added vCalendar line folding (RFC2445 - section 4.1)
22
+- fixed event processing when multiple VEVENT and VTIMEZONE components are intermingled
23
+- fixed VTODO COMPLETED property (UTC time format)
24
+- fixed alarm window not being localized properly
25
+- fixed an occasional issue where all collections are double loaded on login
26
+- changed version checking - use internal build number for software version comparison to support update notification also for beta and rc builds
27
+- changed format and comments in config.js
28
+- changed storing of user settings (PROPPATCH request) - no server request will be made if there is no change in settings
29
+- updated jQuery to 2.1.4
30
+- updated localizations - thanks Niels Bo Andersen [da_DK], Marten Gajda [de_DE], Damian Vila [es_ES], Gabriela Vattier [fr_FR], Luca Ferrario [it_IT], Muimu Nakayama [ja_JP], Johan Vromans [nl_NL], Selcuk Pultar [tr_TR], Александр Симонов [ru_RU], Serge Yakimchuck [uk_UA]
31
+- updated timezone.js to latest IANA timezone database
32
+- other improvements and fixes
33
+
34
+version 0.12.1 [2015-03-16]:
35
+- note: do not forget to execute the cache_update.sh script every time you update your configuration or any other file (otherwise your browser will use the previous version of files stored in HTML5 cache); alternatively you can update the cache.manifest manually - edit the second line beginning with "#V 20" to anything else (this file simple needs "some" change)
36
+- note: you NEED to enable "mod_headers" in Apache (for other servers see your server documentation) which is used to generate proper HTTP headers (required for correct support of HTML5 cache in browsers); the previously used mod_expire is not longer used (see the changelog entry below)
37
+- added support for absolute collection URLs returned in PROPFIND request
38
+- fixed HTML5 cache related problems (especially in Firefox) by returning "Cache-Control: max-age=0, must-revalidate, no-cache, no-transform, private" header instead of "Cache-Control: max-age=0" - this fix requires enabled "mod_headers" (you can disable the previously used "mod_expires") in Apache - for more details see .htaccess
39
+- fixed processing of the language parameter in the title of event/todo
40
+- changed displaying of event/todo calendar list in event/todo form - now it is possible to create new event/todo also into inactive event/todo collection
41
+- updated jQuery-UI to 1.11.4
42
+- other improvements and fixes
43
+
44
+version 0.12.0 [2015-01-26]:
45
+- note: do not forget to execute the cache_update.sh script every time you update your configuration or any other file (otherwise your browser will use the previous version of files stored in HTML5 cache); alternatively you can update the cache.manifest manually - edit the second line beginning with "#V 20" to anything else (this file simple needs "some" change)
46
+- configuration - added globalDefaultEventDuration configuration variable - set the default duration (in minutes) for newly created events
47
+- added widened todo list with dynamic number of columns
48
+- added checkboxes for todos in the todo list - now you can change the status of a todo by clicking on its checkbox
49
+- added duplicate button for copying of events/todos
50
+- fixed loading of future/past todos - now the loading of additional future/past todos is performed also by clicking on datepicker calendar (in the todo list view)
51
+- updated jQuery to 2.1.3
52
+- updated jQuery-UI to 1.11.2
53
+- other improvements and fixes
54
+
55
+version 0.11.1 [2014-10-07]:
56
+- note: do not forget to execute the cache_update.sh script every time you update your configuration or any other file (otherwise your browser will use the previous version of files stored in HTML5 cache); alternatively you can update the cache.manifest manually - edit the second line beginning with "#V 20" to anything else (this file simple needs "some" change)
57
+- updated timezone.js to latest IANA timezone database
58
+- updated jQuery to 2.1.1
59
+- updated jQuery-UI to 1.11.1
60
+- fixed calendar color change functionality
61
+- other improvements and fixes
62
+
63
+version 0.11.0 [2014-10-02]:
64
+- note: do not forget to execute the cache_update.sh script every time you update your configuration or any other file (otherwise your browser will use the previous version of files stored in HTML5 cache); alternatively you can update the cache.manifest manually - edit the second line beginning with "#V 20" to anything else (this file simple needs "some" change)
65
+- note: this release contains new, changed and also removed configuration options (always use the latest config.js)
66
+- configuration - removed showHeader option from globalAccountSettings, globalNetworkCheckSettings and globalNetworkAccountSettings - it is incompatible with new functionality
67
+- configuration - added globalCrossServerSettingsURL configuration option - enable this option if your CalDavZAP installation is accessible from multiple URLs (URL1, URL2), otherwise settings (such as enabled/active collections) stored from the URL1 will be incompatible with settings stored from URL2
68
+- configuration - added globalCalendarColorPropertyXmlns configuration option - used to define the namespace for calendar-color property (see below)
69
+- configuration - changed default value for delegation option to true (in globalAccountSettings, globalNetworkCheckSettings and globalNetworkAccountSettings)
70
+- configuration - changed default value for globalEventStartPastLimit and globalEventStartFutureLimit from 2 to 3
71
+- added Japan localization (ja_JP) - thanks Muimu Nakayama
72
+- added support for loading and unloading of user collections and delegated collections (delegation functionality)
73
+- added support for calendar color change (write support for calendar-color property)
74
+- added arrow icons for agenda views to indicate out of view events
75
+- added currently logged user into the page title
76
+- added hover element for calendar events
77
+- updated localizations - thanks Michael Rasmussen [da_DK], Marten Gajda [de_DE], Damián Vila [es_ES], Jean-Christophe Bach [fr_FR], Luca Ferrario [it_IT], Johan Vromans [nl_NL], Selcuk Pultar [tr_TR], Александр Симонов [ru_RU], Yevgen Martsenyuk [uk_UA]
78
+- fixed occasional wrong UID processing when moving events/todos between different calendar collections
79
+- fixed issues with subscribed calendars
80
+- fixed processing of alarms
81
+- fixed an occasional parseDate bug due to daylight saving time in specific timezones
82
+- various fixes, optimalizations, improvements, visual updates and more
83
+
84
+version 0.10.0.5 [2014-04-14]:
85
+- note: do not forget to execute the cache_update.sh script every time you update your configuration or any other file (otherwise your browser will use the previous version of files stored in HTML5 cache); alternatively you can update the cache.manifest manually - edit the second line beginning with "#V 20" to anything else (this file simple needs "some" change)
86
+- updated Russian localization (ru_RU)
87
+- fixed wrong processing of RECURRENCE-ID property in UTC (Z) timezone
88
+- fixed occasional wrong processing of repeating events generated in future
89
+
90
+version 0.10.0.4 [2014-03-15]:
91
+- note: do not forget to execute the cache_update.sh script every time you update your configuration or any other file (otherwise your browser will use the previous version of files stored in HTML5 cache); alternatively you can update the cache.manifest manually - edit the second line beginning with "#V 20" to anything else (this file simple needs "some" change)
92
+- added Russian localization (ru_RU) - thanks Александр Симонов
93
+- fixed synchronization of removed events for servers without sync-collection report support
94
+- minor translation fixes
95
+
96
+version 0.10.0.3 [2014-03-12]:
97
+- note: do not forget to execute the cache_update.sh script every time you update your configuration or any other file (otherwise your browser will use the previous version of files stored in HTML5 cache); alternatively you can update the cache.manifest manually - edit the second line beginning with "#V 20" to anything else (this file simple needs "some" change)
98
+- added support for LDAP binding in auth/ldap module (see auth/plugins/ldap_conf.inc)
99
+- fixed occasional wrong processing of DTEND attribute
100
+- fixed incorrect creation of recurring events which caused that multiple different UIDs can be present in one calendar object (edit + save of previously created events will split them into multiple objects)
101
+
102
+version 0.10.0.2 [2014-02-17]:
103
+- note: do not forget to execute the cache_update.sh script every time you update your configuration or any other file (otherwise your browser will use the previous version of files stored in HTML5 cache); alternatively you can update the cache.manifest manually - edit the second line beginning with "#V 20" to anything else (this file simple needs "some" change)
104
+- added Ukrainian localization (uk_UA) - thanks Serge Yakimchuck
105
+- added misc/readme_baikal_sabredav.txt and misc/baikal-flat-0.2.7.diff to solve issues related to storing CalDavZAP properties on SabreDAV and Baïkal - thanks Johannes Zellner
106
+- fixed invalid XML response processing (SabreDAV and Baïkal)
107
+- fixed invalid XML request if globalEventStartPastLimit and globalEventStartFutureLimit are set to null
108
+- fixed "delegation" XML processing
109
+- updated French [fr_FR] localization - thanks Jean-Christophe Bach
110
+
111
+version 0.10.0.1 [2014-02-04]:
112
+- note: do not forget to execute the cache_update.sh script every time you update your configuration or any other file (otherwise your browser will use the previous version of files stored in HTML5 cache); alternatively you can update the cache.manifest manually - edit the second line beginning with "#V 20" to anything else (this file simple needs "some" change)
113
+- added Spanish localization (es_ES) - thanks Damián Vila
114
+- updated jQuery to 2.1.0
115
+- updated jQuery-UI to 1.10.4
116
+- changed various default date formats
117
+- changed alarm behaviour - it is no longer possible to create multiple identical alarms (they are automatically merged into one)
118
+- fixed a visual bug when displaying a simple todo alert
119
+- fixed rare issue where UNTIL attribute of recurrent events was not processed correctly
120
+
121
+version 0.10.0 [2014-01-22]:
122
+- note: do not forget to execute the cache_update.sh script every time you update your configuration or any other file (otherwise your browser will use the previous version of files stored in HTML5 cache); alternatively you can update the cache.manifest manually - edit the second line beginning with "#V 20" to anything else (this file simple needs "some" change)
123
+- note: this release contains new, changed and also removed configuration options (always use the latest config.js)
124
+- configuration - added globalEventStartPastLimit and globalEventStartFutureLimit for time-range filtering - note: for servers without time-range filtering support you need to set both variables to null (see config.js)
125
+- configuration - replaced globalInactiveCollections and globalInactiveTodoCollections by globalActiveCalendarCollections and globalActiveTodoCollections (see config.js)
126
+- configuration - removed globalResourceHeaderShowLogin option - it is replaced by much more flexible hrefLabel option in globalAccountSettings and globalNetworkCheckSettings (see config.js)
127
+- configuration - removed syncInterval option from globalAccountSettings and globalNetworkCheckSettings - detection of sync-token changes is now performed by ONE request instead of N (number of collections) - use globalSyncResourcesInterval instead
128
+- configuration - removed crossDomain and withCredentials options from default globalAccountSettings, globalNetworkCheckSettings and globalNetworkAccountSettings - both settings are still available but there is NO REASON to use them (crossDomain is detected automatically, and I've never seen anyone who understand when to use withCredentials /there is NO REASON to set it to true!/)
129
+- major improvements and changes in sychronization code - MUCH reduced number of HTTP request to server
130
+- major design changes (including the open source Roboto font)
131
+- major readme.txt update with detailed descriptions of most common setup problems
132
+- added support for time-range filtering (requires server with time-range filtering support) - EXTREME performance improvements
133
+- added workaround for buggy HTML5 cache handling in the latest Firefox
134
+- added "equivalency" for todo filters (globalAppleRemindersMode) - NEEDS-ACTION, IN-PROGRESS and CANCELLED are processed as NEEDS-ACTION
135
+- added calendar color indicator for event/todo forms (unified with the upcoming CardDavMATE)
136
+- added handling of unsupported settings
137
+- added support for 'headervalue' collection property (namespace: http://inf-it.com/ns/dav/) - useful for collection grouping
138
+- added new overlay with refresh button, when cache manifest change is detected (it forces users to reload the page)
139
+- added support/mapping for alternative timezone names - e.g. 'US/Pacific' (legacy name) is mapped to 'America/Los_Angeles' (current name)
140
+- changed resource list design (unified with the upcoming CardDavMATE)
141
+- changed todo processing if globalAppleRemindersMode is enabled - todos with start and no end are processed as simple todos
142
+- changed displaying of repeating todo confirm question
143
+- changed time-range filtering for todos - all todos from future are loaded from server initially
144
+- updated French [fr_FR] localization - thanks Jean-Christophe Bach
145
+- optimized window resizing functionality
146
+- fixed local timezone processing
147
+- fixed loader hanging after login if subscribed calendar list is empty
148
+- fixed generating of repeating events in future
149
+- fixed RRULE processing if specified in YYYYMMDD format
150
+- fixed displaying of arrows for repeating events
151
+- fixed sorting of resources
152
+- fixed various search issues
153
+- disabled opening of new event/todo form if only read-only collections are present
154
+- removed jQuery source mapping file reference
155
+- LOT of other improvements and fixes
156
+
157
+version 0.9.1.2 [2013-08-05]:
158
+- fixed processing of recurrent events (special recurrences - correct BYMONTHDAY processing)
159
+- fixed globalTimeFormatBasic configuration option processing (it is no longer ignored)
160
+- removed old and unused configuration options (globalDefaultDisplayTodo and globalTodoHideExpired)
161
+
162
+version 0.9.1.1 [2013-07-30]:
163
+- fixed processing of recurrent events with until date
164
+- fixed saving of until dates values in recurrent events
165
+- fixed parsing of double quoted TZID param values
166
+
167
+version 0.9.1 [2013-07-26]:
168
+- note: do not forget to execute the cache_update.sh script every time you update your configuration or any other file (otherwise your browser will use the previous version of files stored in HTML5 cache); alternatively you can update the cache.manifest manually - edit the second line beginning with "#V 20" to anything else (this file simple needs "some" change)
169
+- note: this release contains changed configuration options (always use the latest config.js)
170
+- configuration - changed globalAppleRemindersMode option values - newly supported values are iOS6, iOS7, true (it is set to latest supported iOS - in this case iOS7) and false (see config.js)
171
+- added Turkish localization (tr_TR) - thanks Selcuk Pultar
172
+- updated localizations - thanks Michael Rasmussen [da_DK], Marten Gajda [de_DE], John Fischer [fr_FR], Luca Ferrario [it_IT] and Johan Vromans [nl_NL]
173
+- added additional automatic fixes for invalid events
174
+- added support for STATUS attribute
175
+- added support for CALSCALE attribute (only GREGORIAN is supported; missing attribute = GREGORIAN)
176
+- added automatic change of "time to" after "time from" change (preserve the event/todo duration)
177
+- added support for dynamic height of NOTE field - thanks http://www.jacklmoore.com/autosize/
178
+- fixed problem with always visible completed todos when globalAppleRemindersMode enabled
179
+- fixed window resize callback
180
+- fixed incorrect detection of privileges for binded resources
181
+- fixed processing of RECURRENCE-ID in events/todos
182
+- fixed parsing of todo/event components with same UID in subscribed calendars
183
+- fixed parsing of due date timezone
184
+- fixed processing of DURATION value for allday events
185
+- fixed problem with multiple URL and LOCATION attributes
186
+- fixed handling of VERSION attribute
187
+- fixed repeating todo and event processing
188
+- fixed timezone picker problems
189
+- updated jQuery to 2.0.3
190
+- changed default "due date" for todos to date selected in the todo calendar
191
+- other improvements and fixes
192
+
193
+version 0.9.0 [2013-06-27]:
194
+- note: do not forget to execute the cache_update.sh script every time you update your configuration or any other file (otherwise your browser will use the previous version of files stored in HTML5 cache); alternatively you can update the cache.manifest manually - edit the second line beginning with "#V 20" to anything else (this file simple needs "some" change)
195
+- note: if you use DAViCal with cross-domain setup see the modified Apache configuration in misc/config_davical.txt (added Access-Control-Expose-Headers header)
196
+- note: if you use OS X Calendarserver it is recommended to re-patch your installation (added Access-Control-Expose-Headers header; see misc/readme_osx.txt)
197
+- note: this release contains new and also changed configuration options (always use the latest config.js)
198
+- configuration - added globalSettingsType option - set the destination for client settings on server (useful if your server not allows to store properties to "principal-URL" but allows to store them to "calendar-home-set")
199
+- configuration - added checkContentType option into globalAccountSettings and globalNetworkCheckSettings - enables content-type checking for server response (only objects with proper content-type are inserted into interface) - if you cannot see data in the interface you may try to disable it
200
+- configuration - added globalAppleRemindersMode option (enabled by default) - it enables workarounds for Apple clients (see config.js)
201
+- configuration - added globalIgnoreCompletedAlarms option (enabled by default) - it disables alarm for completed todos (see config.js)
202
+- MAJOR performance improvements
203
+- added support for Cyrus server - thanks Ken Murchison
204
+- added support for additional CalDAV servers (should work with the same servers as CardDavMATE)
205
+- added completely new and shiny interface for todos
206
+- added support for additional todo properties and repeating todos
207
+- added support for PRODID property for both events and todos
208
+- added new custom formats for time and day strings based on currently selected localization
209
+- added Hungarian localization (hu_HU)
210
+- changed cache.manifest - cache all image files in HTML5 cache
211
+- changed ordering of calendars in selectbox (globalSortAlphabet is used)
212
+- changed internal logic of resource loading, synchronization and version check functionality (to prepare for integration with CardDavMATE)
213
+- changed minimum height of events to height of "30 minutes" event
214
+- fixed Firefox placeholder colors
215
+- fixed and updated various localization strings
216
+- fixed events and todos sometimes being editable even with forceReadOnly flag enabled
217
+- fixed various timezone processing issues
218
+- fixed visual event form bug when using repeat option with weekend/business days
219
+- fixed current time indicator error during day/week transition
220
+- fixed timezone picker (at the bottom of the resource list) - it is no longer editable using keyboard navigation while editing event/todo
221
+- fixed wrong ajax parameter which may cause warnings in server log
222
+- fixed an issue when timezone picker was not always visible after login
223
+- updated left menu with new icons (thanks Kelecsenyi Timotej - http://timotejos.com/)
224
+- updated jQuery to 2.0.2 (and related fixes)
225
+- updated jQuery-UI to 1.10.3 (and related fixes)
226
+- updated auth module to reflect the latest changes in configuration options
227
+- updated misc directory (it is the same as in CardDavMATE)
228
+- updated localizations - thanks Marten Gajda [de_DE], John Fischer [fr_FR], Luca Ferrario [it_IT] and Johan Vromans [nl_NL] (note: Danish [da_DK] localization contains some untranslated strings)
229
+- LOT of other improvements and fixes
230
+
231
+version 0.8.1.1 [2013-02-25]:
232
+- fixed multiple bugs related to processing of recurrent events
233
+- fixed forced lower case problem of some strings in the interface
234
+- other minor fixes
235
+
236
+version 0.8.1 [2013-02-21]:
237
+- note: do not forget to execute the cache_update.sh script every time you update your configuration or any other file (otherwise your browser will use the previous version of files stored in HTML5 cache)
238
+- added support for background calendars in day view event list
239
+- added missing misc directory
240
+- fixed syntax error if configured using globalAccountSettings
241
+- fixed issues with delegation proccessing if multiple accounts are configured
242
+- fixed issue with pinned tab in Firefox (manual reloading is not required anymore)
243
+- fixed privileges for binded calendars - these are now strictly read only
244
+- fixed wrong proccessing of number of occurrences for recurrent events
245
+- fixed issue where readonly events could still be edited via drag and drop and resizing
246
+- fixed and optimized the "Revert" button functionality
247
+- fixed issue with saving empty URL property
248
+- fixed incorrect alarm box position
249
+- fixed bad positioning of error image for "repeat end" date field
250
+
251
+version 0.8.0 [2013-02-13]:
252
+- note: do not forget to execute the cache_update.sh script every time you update your configuration or any other file (otherwise your browser will use the previous version of files stored in HTML5 cache)
253
+- note: this release contains new configuration option (always use the latest config.js)
254
+- configuration - added globalUseJqueryAuth option - use jQuery .ajax() auth or custom header for HTTP basic auth (default); set this option to true if your server uses digest auth (note: you may experience auth popups on some browsers)
255
+- configuration - added globalRemoveUnknownTimezone (disabled by default) - it removes non-standard/unknown timezones if event/todo is edited (and saved)
256
+- configuration - added delegation option into globalAccountSettings and globalNetworkCheckSettings (sets additional delegated resources - if true then delegation is enabled for all available resources; if false (default) then delegation is disabled; if an array of URL encoded resources or regexes (for example: ['/caldav.php/user/', '/caldav.php/user%40domain.com/', new RegExp('^/caldav.php/a[b-x].+/$', 'i')] then delegation is enabled for all specified resources
257
+- configuration - added ignoreAlarms option into globalAccountSettings and globalNetworkCheckSettings (defines an array calendars with disabled alarm - if true then all alarms are ignored; if false (default) then alarms are enabled; if an array of URL encoded collections or regexes (for example: ['/caldav.php/user/collection/', '/caldav.php/user%40domain.com/collection/', new RegExp('^/caldav.php/user/collection[0-9]/$', 'i')] then alarm is disabled for all specified resources
258
+- configuration - added backgroundCalendars option into globalAccountSettings and globalNetworkCheckSettings - defines an array of background calendars - if there is at least one event defined for the given day in a background calendar, the background color for that day will be pink/light-red; to use this feature define an array of URL encoded collections or regexes (for example: ['/caldav.php/user/collection/', '/caldav.php/user%40domain.com/collection/', new RegExp('^/caldav.php/user/collection[0-9]/$', 'i')])
259
+- configuration - added user defined time format support for events via globalTimeFormatBasic and globalTimeFormatAgenda variables (see config.js)
260
+- configuration - changed forceReadonly property proccessing - URL encoded collections and also regexes are now supported (see config.js)
261
+- configuration - changed globalCalendarSelected variable proccessing - full UID (for example: http://username@domain.com:8080/caldav.php/user/calendar/) and also UID matching regexes are now supported (see config.js)
262
+- configuration - date and time formats are now predefined for each localization - if you want to use custom date and time formats instead of predefined formats (defined by localizations) use globalAMPMFormat and globalDatepickerFormat variables (commented out by default)
263
+- added Danish localization (da_DK) - thanks Niels Bo Andersen
264
+- added German localization (de_DE) - thanks Marten Gajda and Thomas Scheel
265
+- added Italian localization (it_IT) - thanks Luca Ferrario
266
+- added French localization (fr_FR) - thanks John Fischer
267
+- added Dutch localization (nl_NL) - thanks Johan Vromans
268
+- added additional functionality for today button - now it scrolls the calendar to ensure that the today slot is visible in the top of the view
269
+- added support for fallback to PROPFIND if REPORT is not supported and server returns incorrect 403 error code (instead of 400 or 501)
270
+- added support for events without DTEND or DURATION values
271
+- added support for DURATION property
272
+- added support for CLASS property (Privacy)
273
+- added support for TRANSP property (Availability)
274
+- added support for URL property
275
+- updated timezone.js to latest IANA timezone database
276
+- updated auth module to reflect the latest changes in configuration options
277
+- changed button label from "All future events" to "This and all future events" for more clarity
278
+- changed the "repeat end" option text from "after" to "occurences" for more clarity (event ends after X occurences, including the first one)
279
+- changed event listing in day view - now it scrolls to the very top if the currently displayed day is the first day of month (the button for loading the previous month is now visible)
280
+- changed event listing in day view - now it scrolls to the closest following day if the currently displayed day is not found (no events exist for that day)
281
+- fixed login => logout => relogin as different user bug
282
+- fixed "Unable to save" bug when creating/editing an event/todo
283
+- fixed cache_update.sh - replaced sed by ed due to cross OS compatibility problems
284
+- fixed duplicate scrollbar problem in week and day views
285
+- fixed useless revert button - it is no longer visible when creating a new event or todo
286
+- fixed position of the error image in todo completed field
287
+- fixed processing of UNTIL values in repeating events
288
+- fixed EXDATE value processing and saving
289
+- fixed January specific bug
290
+- fixed BYMONTH value processing - anniversaries
291
+- other improvements and fixes
292
+
293
+version 0.7.0 [2012-11-20]:
294
+- initial public release

+ 628 - 0
tracim/tracim/public/caldavzap/common.js View File

@@ -0,0 +1,628 @@
1
+/*
2
+CalDavZAP - the open source CalDAV 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
+// Used to match XML element names with any namespace
23
+jQuery.fn.filterNsNode=function(nameOrRegex)
24
+{
25
+	return this.filter(
26
+		function()
27
+		{
28
+			if(nameOrRegex instanceof RegExp)
29
+				return (this.nodeName.match(nameOrRegex) || this.nodeName.replace(RegExp('^[^:]+:',''),'').match(nameOrRegex));
30
+			else
31
+				return (this.nodeName===nameOrRegex || this.nodeName.replace(RegExp('^[^:]+:',''),'')===nameOrRegex);
32
+		}
33
+	);
34
+};
35
+
36
+// Escape jQuery selector
37
+function jqueryEscapeSelector(inputValue)
38
+{
39
+	return (inputValue==undefined ? '' : inputValue).toString().replace(/([ !"#$%&'()*+,./:;<=>?@[\\\]^`{|}~])/g,'\\$1');
40
+}
41
+
42
+// Generate random string (UID)
43
+function generateUID()
44
+{
45
+	uidChars='0123456789abcdefghijklmnopqrstuvwxyz';
46
+	UID='';
47
+	for(i=0;i<32;i++)
48
+	{
49
+		if(i==8 || i==12 || i==16 || i==20) UID+='-';
50
+		UID+=uidChars.charAt(Math.floor(Math.random()*(uidChars.length-1)));
51
+	}
52
+	return UID;
53
+}
54
+
55
+
56
+// IE compatibility
57
+if (typeof window.btoa=='undefined' && typeof base64.encode!='undefined') window.btoa=base64.encode;
58
+
59
+// Create Basic auth string (for HTTP header)
60
+function basicAuth(user, password)
61
+{
62
+	var tok=user+':'+password;
63
+	var hash=btoa(tok);
64
+	return 'Basic '+hash;
65
+}
66
+
67
+// multiply regex replace {'regex': value, 'regex': value}
68
+String.prototype.multiReplace=function(hash)
69
+{
70
+	var str=this, key;
71
+	for(key in hash)
72
+		str=str.replace(new RegExp(key,'g'), hash[key]);
73
+	return str;
74
+};
75
+
76
+// Used for sorting the contact and resource list ...
77
+String.prototype.customCompare=function(stringB, alphabet, dir, caseSensitive)
78
+{
79
+	var stringA=this;
80
+
81
+	if(alphabet==undefined || alphabet==null)
82
+		return stringA.localeCompare(stringB);
83
+	else
84
+	{
85
+		var pos=0,
86
+		min=Math.min(stringA.length, stringB.length);
87
+		dir=dir || 1;
88
+		caseSensitive=caseSensitive || false;
89
+		if(!caseSensitive)
90
+		{
91
+			stringA=stringA.toLowerCase();
92
+			stringB=stringB.toLowerCase();
93
+		}
94
+		while(stringA.charAt(pos)===stringB.charAt(pos) && pos<min){pos++;}
95
+
96
+		if(stringA.charAt(pos)=='')
97
+			return -dir;
98
+		else
99
+		{
100
+			var index1=alphabet.indexOf(stringA.charAt(pos));
101
+			var index2=alphabet.indexOf(stringB.charAt(pos));
102
+
103
+			if(index1==-1 || index2==-1)
104
+				return stringA.localeCompare(stringB);
105
+			else
106
+				return (index1<index2 ? -dir : dir);
107
+		}
108
+	}
109
+};
110
+
111
+function customResourceCompare(objA, objB)
112
+{
113
+	return objA.displayValue.customCompare(objB.displayValue, globalSortAlphabet, 1, false);
114
+}
115
+
116
+function checkColorBrightness(hex)
117
+{
118
+	var R=parseInt(hex.substring(0, 2), 16);
119
+	var G=parseInt(hex.substring(2, 4), 16);
120
+	var B=parseInt(hex.substring(4, 6), 16);
121
+	return Math.sqrt(0.241*R*R+0.691*G*G+0.068*B*B);
122
+}
123
+
124
+// Get unique values from array
125
+Array.prototype.unique=function()
126
+{
127
+	var o={}, i, l=this.length, r=[];
128
+	for(i=0;i<l;i++)
129
+		o[this[i]]=this[i];
130
+	for(i in o)
131
+		r.push(o[i]);
132
+	return r;
133
+};
134
+
135
+// Recursive replaceAll
136
+String.prototype.replaceAll=function(stringToFind,stringToReplace)
137
+{
138
+	var temp=this;
139
+	while(temp.indexOf(stringToFind)!=-1)
140
+		temp=temp.replace(stringToFind,stringToReplace);
141
+	return temp;
142
+};
143
+
144
+// Pad number with leading zeroes
145
+Number.prototype.pad=function(size){
146
+	var s=String(this);
147
+	while(s.length<size)
148
+		s='0'+s;
149
+	return s;
150
+};
151
+
152
+// Case insensitive search for attributes
153
+// Usage:	$('#selector').find(':attrCaseInsensitive(data-type,"'+typeList[i]+'")')
154
+jQuery.expr[':'].attrCaseInsensitive=function(elem, index, match)
155
+{
156
+	var matchParams=match[3].split(','),
157
+		attribute=matchParams[0].replace(/^\s*|\s*$/g,''),
158
+		value=matchParams[1].replace(/^\s*"|"\s*$/g,'').toLowerCase();
159
+	return jQuery(elem)['attr'](attribute)!=undefined && jQuery(elem)['attr'](attribute)==value;
160
+};
161
+
162
+// Capitalize given string
163
+function capitalize(string)
164
+{
165
+	return string.charAt(0).toUpperCase()+string.slice(1).toLowerCase();
166
+}
167
+var timezoneKeys = new Array();
168
+function populateTimezoneKeys()
169
+{
170
+	for(var i in timezones)
171
+	timezoneKeys.push(i);
172
+
173
+	timezoneKeys.push('0local');
174
+	timezoneKeys.push('1UTC');
175
+
176
+	timezoneKeys.sort();
177
+
178
+	timezoneKeys[0] = timezoneKeys[0].substring(1);
179
+	timezoneKeys[1] = timezoneKeys[1].substring(1);
180
+	jQuery.extend(timezones,{'UTC':{}});
181
+}
182
+
183
+Date.prototype.getWeekNo=function()
184
+{
185
+	var today = this;
186
+	Year = today.getFullYear();
187
+	Month = today.getMonth();
188
+	Day = today.getDate();
189
+	now = Date.UTC(Year,Month,Day,0,0,0);
190
+	var Firstday = new Date();
191
+	Firstday.setYear(Year);
192
+	Firstday.setMonth(0);
193
+	Firstday.setDate(1);
194
+	then = Date.UTC(Year,0,1,0,0,0);
195
+	var Compensation = Firstday.getDay();
196
+	if(((now-then)/86400000) > 3)
197
+		NumberOfWeek =  Math.round((((now-then)/86400000)+Compensation)/7);
198
+	else
199
+	{
200
+		if(Firstday.getDay()>4 || Firstday.getDay()==0)
201
+		NumberOfWeek =  53;
202
+	}
203
+	return NumberOfWeek;
204
+}
205
+
206
+function zeroPad(n) {
207
+	return (n < 10 ? '0' : '') + n;
208
+}
209
+
210
+var dateFormatters = {
211
+	s	: function(d)	{return d.getSeconds() },
212
+	ss	: function(d)	{return zeroPad(d.getSeconds())},
213
+	m	: function(d)	{return d.getMinutes()},
214
+	mm	: function(d)	{return zeroPad(d.getMinutes())},
215
+	h	: function(d)	{return d.getHours() % 12 || 12},
216
+	hh	: function(d)	{return zeroPad(d.getHours() % 12 || 12)},
217
+	H	: function(d)	{return d.getHours()},
218
+	HH	: function(d)	{return zeroPad(d.getHours())},
219
+	d	: function(d)	{return d.getDate()},
220
+	dd	: function(d)	{return zeroPad(d.getDate())},
221
+	ddd	: function(d,o)	{return o.dayNamesShort[d.getDay()]},
222
+	dddd: function(d,o)	{return o.dayNames[d.getDay()]},
223
+	W	: function(d)	{return d.getWeekNo()},
224
+	M	: function(d)	{return d.getMonth() + 1},
225
+	MM	: function(d)	{return zeroPad(d.getMonth() + 1)},
226
+	MMM	: function(d,o)	{return o.monthNamesShort[d.getMonth()]},
227
+	MMMM: function(d,o)	{return o.monthNames[d.getMonth()]},
228
+	yy	: function(d)	{return (d.getFullYear()+'').substring(2)},
229
+	yyyy: function(d)	{return d.getFullYear()},
230
+	t	: function(d)	{return d.getHours() < 12 ? 'a' : 'p'},
231
+	tt	: function(d)	{return d.getHours() < 12 ? 'am' : 'pm'},
232
+	T	: function(d)	{return d.getHours() < 12 ? 'A' : 'P'},
233
+	TT	: function(d)	{return d.getHours() < 12 ? 'AM' : 'PM'},
234
+	u	: function(d)	{return formatDates(d, null, "yyyy-MM-dd'T'HH:mm:ss'Z'")},
235
+	S	: function(d)	{
236
+		var date = d.getDate();
237
+		if (date > 10 && date < 20) {
238
+			return 'th';
239
+		}
240
+		return ['st', 'nd', 'rd'][date%10-1] || 'th';
241
+	}
242
+};
243
+
244
+
245
+function formatDates(date1, date2, format, options) {
246
+	options = options;
247
+	var date = date1,
248
+		otherDate = date2,
249
+		i, len = format.length, c,
250
+		i2, formatter,
251
+		res = '';
252
+	for (i=0; i<len; i++) {
253
+		c = format.charAt(i);
254
+		if (c == "'") {
255
+			for (i2=i+1; i2<len; i2++) {
256
+				if (format.charAt(i2) == "'") {
257
+					if (date) {
258
+						if (i2 == i+1) {
259
+							res += "'";
260
+						}else{
261
+							res += format.substring(i+1, i2);
262
+						}
263
+						i = i2;
264
+					}
265
+					break;
266
+				}
267
+			}
268
+		}
269
+		else if (c == '(') {
270
+			for (i2=i+1; i2<len; i2++) {
271
+				if (format.charAt(i2) == ')') {
272
+					var subres = formatDates(date, null, format.substring(i+1, i2), options);
273
+					if (parseInt(subres.replace(/\D/, ''), 10)) {
274
+						res += subres;
275
+					}
276
+					i = i2;
277
+					break;
278
+				}
279
+			}
280
+		}
281
+		else if (c == '[') {
282
+			for (i2=i+1; i2<len; i2++) {
283
+				if (format.charAt(i2) == ']') {
284
+					var subformat = format.substring(i+1, i2);
285
+					var subres = formatDates(date, null, subformat, options);
286
+					if (subres != formatDates(otherDate, null, subformat, options)) {
287
+						res += subres;
288
+					}
289
+					i = i2;
290
+					break;
291
+				}
292
+			}
293
+		}
294
+		else if (c == '{') {
295
+			date = date2;
296
+			otherDate = date1;
297
+		}
298
+		else if (c == '}') {
299
+			date = date1;
300
+			otherDate = date2;
301
+		}
302
+		else {
303
+			for (i2=len; i2>i; i2--) {
304
+				if (formatter = dateFormatters[format.substring(i, i2)]) {
305
+					if (date) {
306
+						res += formatter(date, options);
307
+					}
308
+					i = i2 - 1;
309
+					break;
310
+				}
311
+			}
312
+			if (i2 == i) {
313
+				if (date) {
314
+					res += c;
315
+				}
316
+			}
317
+		}
318
+	}
319
+	return res;
320
+};
321
+function vObjectLineFolding(inputText)
322
+{
323
+	var outputText='';
324
+	var maxLineOctetLength=75;
325
+	var count=0;
326
+
327
+	for(var i=0; inputText[i]!=undefined; i++)
328
+	{
329
+		var currentChar=inputText.charCodeAt(i);
330
+		var nextChar=inputText.charCodeAt(i+1);
331
+		if(currentChar==0x000D && nextChar==0x000A)
332
+		{
333
+			count=0;
334
+			outputText+='\r\n';
335
+			i++;
336
+			continue;
337
+		}
338
+
339
+		var surrogatePair=false;
340
+		if(currentChar<0x0080)
341
+			var charNum=1;
342
+		else if(currentChar<0x0800)
343
+			var charNum=2;
344
+		else if(currentChar<0xd800 || currentChar>=0xe000)
345
+			var charNum=3;
346
+		else
347
+		{
348
+			// surrogate pair
349
+			// UTF-16 encodes 0x10000-0x10FFFF by subtracting 0x10000 and splitting
350
+			// the 20 bits of 0x0-0xFFFFF into two halves
351
+			charNum=4;
352
+			surrogatePair=true;
353
+		}
354
+
355
+		if(count>maxLineOctetLength-charNum)
356
+		{
357
+			outputText+='\r\n ';
358
+			count=1;
359
+		}
360
+		outputText+=String.fromCharCode(currentChar);
361
+		if(surrogatePair)
362
+		{
363
+			outputText+=String.fromCharCode(vCardText.charCodeAt(i+1));
364
+			i++;
365
+		}
366
+		count+=charNum;
367
+	}
368
+	return outputText;
369
+}
370
+
371
+function rgbToHex(rgb)
372
+{
373
+	rgb=rgb.match(/^rgba?\((\d+),\s*(\d+),\s*(\d+)(?:,\s*(\d+(?:\.\d*)?|(?:\.\d+)))?\)$/);
374
+	function hex(x)
375
+	{
376
+		return ("0"+parseInt(x).toString(16)).slice(-2);
377
+	}
378
+	return "#"+hex(rgb[1])+hex(rgb[2])+hex(rgb[3]);
379
+}
380
+
381
+function hexToRgba(hex, transparency) {
382
+	var bigint=parseInt(hex.substring(1), 16);
383
+	var r=(bigint >> 16) & 255;
384
+	var g=(bigint >> 8) & 255;
385
+	var b=bigint & 255;
386
+
387
+	return 'rgba('+r+','+g+','+b+','+transparency+')';
388
+}
389
+
390
+function rgbToRgba(rgb, transparency)
391
+{
392
+	rgb=rgb.match(/^rgba?\((\d+),\s*(\d+),\s*(\d+)(?:,\s*(\d+(?:\.\d*)?|(?:\.\d+)))?\)$/);
393
+	return 'rgba('+rgb[1]+','+rgb[2]+','+rgb[3]+','+transparency+')';
394
+}
395
+
396
+function dataGetChecked(resourceListSelector)
397
+{
398
+	var checkedArr=$(resourceListSelector).find('input[type=checkbox]:checked').not('.unloadCheck').filter('[data-id]').filter(function(){return this.indeterminate==false}).map(function(){return $(this).attr('data-id')}).get();
399
+
400
+	for(i=checkedArr.length-1; i>=0; i--)
401
+		if(checkedArr[i].match(new RegExp('[^/]$'))!=null && checkedArr.indexOf(checkedArr[i].replace(new RegExp('[^/]+$'), ''))!=-1)
402
+			checkedArr.splice(i, 1);
403
+
404
+	return checkedArr;
405
+}
406
+
407
+function resourceChBoxClick(obj, resourceListSelector, headerSelector, returnChecked)
408
+{
409
+	$(obj).parent().nextUntil(headerSelector).find('input[type=checkbox]:visible').prop('checked', $(obj).prop('checked')).prop('indeterminate', false);
410
+	if(returnChecked)
411
+		return dataGetChecked(resourceListSelector);
412
+}
413
+
414
+function collectionChBoxClick(obj, resourceListSelector, headerSelector, collectionSelector, groupSelector, returnChecked)
415
+{
416
+	if(collectionSelector.match('_item$'))
417
+	{
418
+		var tmp_coh=$(obj).parent().prevAll(headerSelector).first();
419
+		var tmp_co_chbxs=tmp_coh.nextUntil(headerSelector).find('input[type=checkbox]:visible');
420
+	}
421
+	else
422
+	{
423
+		var tmp_coh=$(obj).parent().parent().prevAll(headerSelector).first();
424
+		var tmp_co_chbxs=tmp_coh.nextUntil(headerSelector).find(collectionSelector).find('input[type=checkbox]:visible');
425
+	}
426
+
427
+	if(groupSelector!=null)
428
+	{
429
+		if($(obj).prop('checked')==false && $(obj).prop('indeterminate')==false && $(obj).attr('data-ind')=='false' &&
430
+		$(obj).parent().next(groupSelector).height()>0/* note: ':visible' is not working! */)
431
+		{
432
+			$(obj).prop('indeterminate', true);
433
+			$(obj).prop('checked', true);
434
+			$(obj).attr('data-ind', 'true');
435
+			tmp_coh.find('input[type=checkbox]:visible').prop('indeterminate', true).prop('checked', false);
436
+
437
+			if(returnChecked)
438
+				return dataGetChecked(resourceListSelector);
439
+			return true;
440
+		}
441
+		else if($(obj).attr('data-ind')=='true')
442
+			$(obj).attr('data-ind', 'false');
443
+
444
+		$(obj).parent().next(groupSelector).find('input[type=checkbox]').prop('checked', $(obj).prop('checked'));
445
+	}
446
+
447
+	if(tmp_co_chbxs.length==tmp_co_chbxs.filter(':checked').length)
448
+		tmp_coh.find('input[type=checkbox]:visible').prop('checked', true).prop('indeterminate', false);
449
+	else if(tmp_co_chbxs.filter(':checked').length==0 && tmp_co_chbxs.filter(function(){return this.indeterminate==true}).length==0)
450
+		tmp_coh.find('input[type=checkbox]:visible').prop('checked', false).prop('indeterminate', false);
451
+	else
452
+		tmp_coh.find('input[type=checkbox]:visible').prop('indeterminate', true).prop('checked', false);
453
+
454
+	if(returnChecked)
455
+		return dataGetChecked(resourceListSelector);
456
+}
457
+
458
+function groupChBoxClick(obj, resourceListSelector, headerSelector, collectionSelector, groupSelector, returnChecked)
459
+{
460
+	var tmp_cg=$(obj).closest(groupSelector);
461
+	var tmp_cg_chbxs=tmp_cg.find('input[type=checkbox]:visible');
462
+	var tmp_co_chbxs=tmp_cg.prev().find('input[type=checkbox]:visible');
463
+
464
+	if(tmp_cg_chbxs.filter(':checked').length==0)
465
+		tmp_co_chbxs.prop('checked', false).prop('indeterminate', false);
466
+	else
467
+		tmp_co_chbxs.prop('indeterminate', true).prop('checked', false);
468
+
469
+	return collectionChBoxClick(tmp_co_chbxs, resourceListSelector, headerSelector, collectionSelector, null, returnChecked);
470
+}
471
+
472
+function loadResourceChBoxClick(obj, resourceListSelector, headerSelector, collectionSelector, resourceItemSelector)
473
+{
474
+	if(collectionSelector.match('_item$'))
475
+	{
476
+		var firstCollection=$(obj).parent().nextUntil(headerSelector).first();
477
+		if($(obj).prop('checked'))
478
+			$(obj).parent().nextUntil(headerSelector).addBack().removeClass('unloaded');
479
+		else
480
+			$(obj).parent().nextUntil(headerSelector).addBack().addClass('unloaded');
481
+	}
482
+	else
483
+	{
484
+		var firstCollection=$(obj).parent().nextUntil(headerSelector).first().find(collectionSelector);
485
+		if($(obj).prop('checked'))
486
+		{
487
+			$(obj).parent().nextUntil(headerSelector).find(collectionSelector).removeClass('unloaded');
488
+			$(obj).parent().removeClass('unloaded');
489
+		}
490
+		else
491
+		{
492
+			$(obj).parent().nextUntil(headerSelector).find(collectionSelector).addClass('unloaded');
493
+			$(obj).parent().addClass('unloaded');
494
+		}
495
+	}
496
+
497
+	$(resourceListSelector).find(headerSelector).find('.unloadCheckHeader:checked').prop('disabled',false);
498
+	$(resourceListSelector).find(collectionSelector).find('.unloadCheck:checked').prop('disabled',false);
499
+	if(!$(resourceListSelector).find(headerSelector).find('.unloadCheckHeader').filter(function(){return $(this).prop('checked') || $(this).prop('indeterminate');}).length)
500
+	{
501
+		$(obj).prop({'checked':false,'indeterminate':true});
502
+		$(obj).parent().removeClass('unloaded');
503
+		$(obj).parent().nextUntil(headerSelector).find('.unloadCheck').prop({'checked':false,'indeterminate':false});
504
+		firstCollection.removeClass('unloaded').find('.unloadCheck').prop({'checked':true,'indeterminate':false,'disabled':true});
505
+	}
506
+	else
507
+	{
508
+		$(obj).parent().nextUntil(headerSelector).find('.unloadCheck').prop({'checked':$(obj).prop('checked'),'indeterminate':false});
509
+		var checkedCollections=$(resourceListSelector).find(collectionSelector).find('.unloadCheck:checked');
510
+		if(checkedCollections.length==1)
511
+		{
512
+			var collection=checkedCollections.parents(resourceItemSelector);
513
+			if(!collection.prev().hasClass(resourceItemSelector.slice(1)) && !collection.next().hasClass(resourceItemSelector.slice(1)))
514
+				collection.prev().find('.unloadCheckHeader').prop('disabled',true);
515
+			checkedCollections.prop('disabled',true);
516
+		}
517
+	}
518
+}
519
+
520
+function loadCollectionChBoxClick(obj, resourceListSelector, headerSelector, collectionSelector, resourceItemSelector)
521
+{
522
+	if($(obj).prop('checked'))
523
+		$(obj).parent().removeClass('unloaded');
524
+	else
525
+		$(obj).parent().addClass('unloaded');
526
+
527
+	var checkedCollections=$(resourceListSelector).find(collectionSelector).find('.unloadCheck:checked');
528
+	if(checkedCollections.length==1)
529
+	{
530
+		var collection=checkedCollections.parents(resourceItemSelector);
531
+		if(!collection.prev().hasClass(resourceItemSelector.slice(1)) && !collection.next().hasClass(resourceItemSelector.slice(1)))
532
+			collection.prev().find('.unloadCheckHeader').prop('disabled',true);
533
+		checkedCollections.prop('disabled',true);
534
+	}
535
+	else
536
+	{
537
+		$(resourceListSelector).find(headerSelector).find('.unloadCheckHeader:checked').prop('disabled',false);
538
+		checkedCollections.prop('disabled',false);
539
+	}
540
+
541
+	if(collectionSelector.match('_item$'))
542
+	{
543
+		var tmp_coh=$(obj).parent().prevAll(headerSelector).first();
544
+		var tmp_co_chbxs=tmp_coh.nextUntil(headerSelector).find('.unloadCheck');
545
+	}
546
+	else
547
+	{
548
+		var tmp_coh=$(obj).parent().parent().prevAll(headerSelector).first();
549
+		var tmp_co_chbxs=tmp_coh.nextUntil(headerSelector).find(collectionSelector).find('.unloadCheck');
550
+	}
551
+
552
+	if(tmp_co_chbxs.length==tmp_co_chbxs.filter(':checked').length)
553
+		tmp_coh.removeClass('unloaded').find('.unloadCheckHeader').prop('checked', true).prop('indeterminate', false);
554
+	else if(tmp_co_chbxs.filter(':checked').length==0 && tmp_co_chbxs.filter(function(){return this.indeterminate==true}).length==0)
555
+		tmp_coh.addClass('unloaded').find('.unloadCheckHeader').prop('checked', false).prop('indeterminate', false);
556
+	else
557
+		tmp_coh.removeClass('unloaded').find('.unloadCheckHeader').prop('indeterminate', true).prop('checked', false);
558
+}
559
+
560
+// Escape vCalendar value - RFC2426 (Section 2.4.2)
561
+function vcalendarEscapeValue(inputValue)
562
+{
563
+	return (inputValue==undefined ? '' : inputValue).replace(vCalendar.pre['escapeRex'],"\\$1").replace(vCalendar.pre['escapeRex2'],'\\n');
564
+}
565
+
566
+// Unescape vCalendar value - RFC2426 (Section 2.4.2)
567
+function vcalendarUnescapeValue(inputValue)
568
+{
569
+	var outputValue='';
570
+
571
+	if(inputValue!=undefined)
572
+	{
573
+		for(var i=0;i<inputValue.length;i++)
574
+			if(inputValue[i]=='\\' && i+1<inputValue.length)
575
+			{
576
+				if(inputValue[++i]=='n')
577
+					outputValue+='\n';
578
+				else
579
+					outputValue+=inputValue[i];
580
+			}
581
+			else
582
+				outputValue+=inputValue[i];
583
+	}
584
+	return outputValue;
585
+}
586
+
587
+// Split parameters and remove double quotes from values (if parameter values are quoted)
588
+function vcalendarSplitParam(inputValue)
589
+{
590
+	var result=vcalendarSplitValue(inputValue, ';');
591
+	var index;
592
+
593
+	for(var i=0;i<result.length;i++)
594
+	{
595
+		index=result[i].indexOf('=');
596
+		if(index!=-1 && index+1<result[i].length && result[i][index+1]=='"' && result[i][result[i].length-1]=='"')
597
+			result[i]=result[i].substring(0,index+1)+result[i].substring(index+2,result[i].length-1);
598
+	}
599
+	return result;
600
+}
601
+
602
+// Split string by separator (but not '\' escaped separator)
603
+function vcalendarSplitValue(inputValue, inputDelimiter)
604
+{
605
+	var outputArray=new Array();
606
+	var i=0;
607
+	var j=0;
608
+
609
+	for(i=0;i<inputValue.length;i++)
610
+	{
611
+		if(inputValue[i]==inputDelimiter)
612
+		{
613
+			if(outputArray[j]==undefined)
614
+				outputArray[j]='';
615
+			++j;
616
+			continue;
617
+		}
618
+		outputArray[j]=(outputArray[j]==undefined ? '' : outputArray[j])+inputValue[i];
619
+		if(inputValue[i]=='\\' && i+1<inputValue.length)
620
+			outputArray[j]=outputArray[j]+inputValue[++i];
621
+	}
622
+	return outputArray;
623
+}
624
+
625
+function dateFormatJqToFc(input)
626
+{
627
+	return input.replaceAll('DD','dddd').replaceAll('D','ddd').replace(/(MM|M)/g, '$1MM').replaceAll('m','M').replace(/y/g,'yy');
628
+}

+ 931 - 0
tracim/tracim/public/caldavzap/config.js View File

@@ -0,0 +1,931 @@
1
+/*
2
+CalDavZAP - the open source CalDAV 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
+var globalAccountSettings=[
310
+	{
311
+		href: 'http://127.0.0.1:5232/user/3.ics/',
312
+		userAuth:
313
+		{
314
+			userName: 'bastien.sevajol@algoo.fr',
315
+			userPassword: 'bastien.sevajol@algoo.fr'
316
+			//userName: 'bastien',
317
+			//userPassword: 'bastien'
318
+		},
319
+		timeOut: 90000,
320
+		lockTimeOut: 10000,
321
+		checkContentType: true,
322
+		settingsAccount: true,
323
+		delegation: true,
324
+		hrefLabel: null,
325
+		forceReadOnly: null,
326
+		ignoreAlarms: false,
327
+		backgroundCalendars: []
328
+	}
329
+];
330
+
331
+// globalNetworkCheckSettings
332
+// Use this option if you want to use standard login screen without
333
+// hardcoded username/password in config.js (used by globalAccountSettings).
334
+// NOTE: if this option is used the value must be an object.
335
+// List of properties used in globalAccountSettings variable:
336
+// - href
337
+//   Set this option to the "principal URL" WITHOUT the "USERNAME/"
338
+//   part (this options uses the username from the login screen).
339
+//   NOTE: the last character in the value must be '/'
340
+// NOTE: for description of other properties see comments at the beginning
341
+// of this file.
342
+// NOTE: for minimal/fast setup you need to set only the href option. It is
343
+// safe/recommended to keep the remaining options unchanged!
344
+// Example href values:
345
+// OS X server http example (see misc/readme_osx.txt for server setup):
346
+//   href: 'http://osx.server.com:8008/principals/users/'
347
+// OS X server https example (see misc/readme_osx.txt for server setup):
348
+//   href: 'https://osx.server.com:8443/principals/users/'
349
+// Cyrus server https example:
350
+//   href: 'https://cyrus.server.com/dav/principals/user/'
351
+// Example:
352
+// Davical example which automatically detects the protocol, server name,
353
+// port, ... (client installed into Davical "htdocs" subdirectory;
354
+// works "out of the box", no additional setup required):
355
+// var globalNetworkCheckSettings={
356
+// 	href: location.protocol+'//'+location.hostname+
357
+// 		(location.port ? ':'+location.port: '')+
358
+// 		location.pathname.replace(RegExp('/+[^/]+/*(index\.html)?$'),'')+
359
+// 		'/caldav.php/',
360
+// 	timeOut: 90000,
361
+// 	lockTimeOut: 10000,
362
+//      checkContentType: true,
363
+// 	settingsAccount: true,
364
+//      delegation: true,
365
+// 	additionalResources: [],
366
+//      hrefLabel: null,
367
+// 	forceReadOnly: null,
368
+//      ignoreAlarms: false,
369
+// 	backgroundCalendars: []
370
+// }
371
+
372
+
373
+// globalNetworkAccountSettings
374
+// Try this option ONLY if you have working setup using
375
+// globalNetworkCheckSettings and want to fix the authentication popup
376
+// window problem (if invalid username/password is entered)!
377
+// If you use this option then your browser sends username/password to the PHP
378
+// "auth" module ("auth" directory) instead of the DAV server itself.
379
+// The "auth" module then validates your username/password against your server,
380
+// and if the authentication is successful, then it sends back a configuration
381
+// XML (requires additional configuration). The resulting XML is handled
382
+// IDENTICALLY as the globalAccountSettings configuration option.
383
+// NOTE: for the "auth" module configuration see readme.txt!
384
+// NOTE: this option invokes a login screen and disallows access until
385
+// the client gets correct XML configuration file from the server!
386
+// List of properties used in globalNetworkAccountSettings variable:
387
+// - href
388
+//   Set this option to the "full URL" of the "auth" directory
389
+//   NOTE: the last character in the value must be '/'
390
+// NOTE: for description of other properties see comments at the beginning
391
+// of this file.
392
+// Example href values:
393
+//   href: 'https://server.com/client/auth/'
394
+// Example:
395
+// Use this configuration if the "auth" module is located in the client
396
+// installation subdirectory (default):
397
+//var globalNetworkAccountSettings={
398
+//	href: location.protocol+'//'+location.hostname+
399
+//		(location.port ? ':'+location.port : '')+
400
+//		location.pathname.replace(RegExp('index\.html$'),'')+
401
+//		'auth/',
402
+//	timeOut: 30000
403
+//};
404
+
405
+
406
+// globalUseJqueryAuth
407
+// Use jQuery .ajax() auth or custom header for HTTP basic auth (default).
408
+// Set this option to true if your server uses digest auth (note: you may
409
+// experience auth popups on some browsers).
410
+// If undefined (or empty), custom header for HTTP basic auth is used.
411
+// Example:
412
+//var globalUseJqueryAuth=false;
413
+
414
+
415
+// globalBackgroundSync
416
+// Enable background synchronization even if the browser window/tab has no
417
+// focus.
418
+// If false, synchronization is performed only if the browser window/tab
419
+// is focused. If undefined or not false, then background sync is enabled.
420
+// Example:
421
+var globalBackgroundSync=true;
422
+
423
+
424
+// globalSyncResourcesInterval
425
+// This option defines how often (in miliseconds) are resources/collections
426
+// asynchronously synchronized.
427
+// Example:
428
+var globalSyncResourcesInterval=120000;
429
+
430
+
431
+// globalEnableRefresh
432
+// This option enables or disables the manual synchronization button in
433
+// the interface. If this option is enabled then users can perform server
434
+// synchronization manually. Enabling this option may cause high server
435
+// load (even DDOS) if users will try to manually synchronize data too
436
+// often (instead of waiting for the automatic synchronization).
437
+// If undefined or false, the synchronization button is disabled.
438
+// NOTE: enable this option only if you really know what are you doing!
439
+// Example:
440
+var globalEnableRefresh=false;
441
+
442
+
443
+// globalEnableKbNavigation
444
+// Enable basic keyboard navigation using arrow keys?
445
+// If undefined or not false, keyboard navigation is enabled.
446
+// Example:
447
+var globalEnableKbNavigation=true;
448
+
449
+
450
+// globalSettingsType
451
+// Where to store user settings such as: active view, enabled/selected
452
+// collections, ... (the client store them into DAV property on the server).
453
+// NOTE: not all servers support storing DAV properties (some servers support
454
+// only subset /or none/ of these URLs).
455
+// Supported values:
456
+// - 'principal-URL', '', null or undefined (default) => settings are stored
457
+//   to principal-URL (recommended for most servers)
458
+// - 'addressbook-home-set' => settings are are stored to addressbook-home-set
459
+// Example:
460
+//var globalSettingsType='';
461
+
462
+
463
+// globalCrossServerSettingsURL
464
+// Settings such as enabled/selected collections are stored on the server
465
+// (see the previous option) in form of full URL
466
+// (e.g.: https://user@server:port/principal/collection/), but even if this
467
+// approach is "correct" (you can use the same principal URL with multiple
468
+// different logins, ...) it causes a problem if your server is accessible
469
+// from multiple URLs (e.g. http://server/ and https://server/). If you want
470
+// to store only the "principal/collection/" part of the URL (instead of the
471
+// full URL) then enable this option.
472
+// Example:
473
+//var globalCrossServerSettingsURL=false;
474
+
475
+
476
+// globalInterfaceLanguage
477
+// Default interface language (note: this option is case sensitive):
478
+//   cs_CZ (Čeština [Czech])
479
+//   da_DK (Dansk [Danish]; thanks Niels Bo Andersen)
480
+//   de_DE (Deutsch [German]; thanks Marten Gajda and Thomas Scheel)
481
+//   en_US (English [English/US])
482
+//   es_ES (Español [Spanish]; thanks Damián Vila)
483
+//   fr_FR (Français [French]; thanks John Fischer)
484
+//   it_IT (Italiano [Italian]; thanks Luca Ferrario)
485
+//   ja_JP (日本語 [Japan]; thanks Muimu Nakayama)
486
+//   hu_HU (Magyar [Hungarian])
487
+//   nl_NL (Nederlands [Dutch]; thanks Johan Vromans)
488
+//   sk_SK (Slovenčina [Slovak])
489
+//   tr_TR (Türkçe [Turkish]; thanks Selcuk Pultar)
490
+//   ru_RU (Русский [Russian]; thanks Александр Симонов)
491
+//   uk_UA (Українська [Ukrainian]; thanks Serge Yakimchuck)
492
+//   zh_CN (中国 [Chinese]; thanks Fandy)
493
+// Example:
494
+var globalInterfaceLanguage='en_US';
495
+
496
+
497
+// globalInterfaceCustomLanguages
498
+// If defined and not empty then only languages listed here are shown
499
+// at the login screen, otherwise (default) all languages are shown
500
+// NOTE: values in the array must refer to an existing localization
501
+// (see the option above)
502
+// Example:
503
+//   globalInterfaceCustomLanguages=['en_US', 'sk_SK'];
504
+var globalInterfaceCustomLanguages=[];
505
+
506
+
507
+// globalSortAlphabet
508
+// Use JavaScript localeCompare() or custom alphabet for data sorting.
509
+// Custom alphabet is used by default because JavaScript localeCompare()
510
+// not supports collation and often returns "wrong" result. If set to null
511
+// then localeCompare() is used.
512
+// Example:
513
+//   var globalSortAlphabet=null;
514
+var globalSortAlphabet=' 0123456789'+
515
+	'AÀÁÂÄÆÃÅĀBCÇĆČDĎEÈÉÊËĒĖĘĚFGĞHIÌÍÎİÏĪĮJKLŁĹĽMNŃÑŇOÒÓÔÖŐŒØÕŌ'+
516
+	'PQRŔŘSŚŠȘșŞşẞTŤȚțŢţUÙÚÛÜŰŮŪVWXYÝŸZŹŻŽ'+
517
+	'aàáâäæãåābcçćčdďeèéêëēėęěfgğhiìíîïīįıjklłĺľmnńñňoòóôöőœøõō'+
518
+	'pqrŕřsśšßtťuùúûüűůūvwxyýÿzźżžАБВГҐДЕЄЖЗИІЇЙКЛМНОПРСТУФХЦЧШЩЮЯ'+
519
+	'Ьабвгґдеєжзиіїйклмнопрстуфхцчшщюяь';
520
+
521
+
522
+// globalSearchTransformAlphabet
523
+// To support search without diacritics (e.g. search for 'd' will find: 'Ď', 'ď')
524
+// it is required to define something like "character equivalence".
525
+// key = regex text, value = search character
526
+// Example:
527
+var globalSearchTransformAlphabet={
528
+	'[ÀàÁáÂâÄäÆæÃãÅåĀā]': 'a', '[ÇçĆćČč]': 'c', '[Ďď]': 'd',
529
+	'[ÈèÉéÊêËëĒēĖėĘęĚě]': 'e', '[Ğğ]': 'g', '[ÌìÍíÎîİıÏïĪīĮį]': 'i',
530
+	'[ŁłĹ弾]': 'l', '[ŃńÑñŇň]': 'n', '[ÒòÓóÔôÖöŐőŒœØøÕõŌō]': 'o',
531
+	'[ŔŕŘř]': 'r', '[ŚśŠšȘșŞşẞß]': 's', '[ŤťȚțŢţ]': 't',
532
+	'[ÙùÚúÛûÜüŰűŮůŪū]': 'u', '[ÝýŸÿ]': 'y', '[ŹźŻżŽž]': 'z'
533
+};
534
+
535
+// globalResourceAlphabetSorting
536
+// If more than one resource (server account) is configured, sort the
537
+// resources alphabetically?
538
+// Example:
539
+var globalResourceAlphabetSorting=true;
540
+
541
+
542
+// globalNewVersionNotifyUsers
543
+// Update notification will be shown only to users with login names defined
544
+// in this array.
545
+// If undefined (or empty), update notifications will be shown to all users.
546
+// Example:
547
+//   globalNewVersionNotifyUsers=['admin', 'peter'];
548
+var globalNewVersionNotifyUsers=[];
549
+
550
+
551
+// globalDatepickerFormat
552
+// Set the datepicker format (see 
553
+// http://docs.jquery.com/UI/Datepicker/formatDate for valid values).
554
+// NOTE: date format is predefined for each localization - use this option
555
+// ONLY if you want to use custom date format (instead of the localization
556
+// predefined one).
557
+// Example:
558
+//var globalDatepickerFormat='dd.mm.yy';
559
+
560
+
561
+// globalDatepickerFirstDayOfWeek
562
+// Set the datepicker first day of the week: Sunday is 0, Monday is 1, etc.
563
+// Example:
564
+var globalDatepickerFirstDayOfWeek=1;
565
+
566
+
567
+// globalHideInfoMessageAfter
568
+// How long are information messages (such as: success, error) displayed
569
+// (in miliseconds).
570
+// Example:
571
+var globalHideInfoMessageAfter=1800;
572
+
573
+
574
+// globalEditorFadeAnimation
575
+// Set the editor fade in/out animation duration when editing or saving data
576
+// (in miliseconds).
577
+// Example:
578
+var globalEditorFadeAnimation=666;
579
+
580
+
581
+
582
+// globalEventStartPastLimit, globalEventStartFutureLimit, globalTodoPastLimit
583
+// Number of months pre-loaded from past/future in advance for calendars
584
+// and todo lists (if null then date range synchronization is disabled).
585
+// NOTE: interval synchronization is used only if your server supports
586
+// sync-collection REPORT (e.g. DAViCal).
587
+// NOTE: if you experience problems with data loading and your server has
588
+// no time-range filtering support set these variables to null.
589
+// Example:
590
+var globalEventStartPastLimit=3;
591
+var globalEventStartFutureLimit=3;
592
+var globalTodoPastLimit=1;
593
+
594
+
595
+// globalLoadedCalendarCollections
596
+// This option sets the list of calendar collections (down)loaded after login.
597
+// If empty then all calendar collections for the currently logged user are
598
+// loaded.
599
+// NOTE: settings stored on the server (see settingsAccount) overwrite this
600
+// option.
601
+// Example:
602
+var globalLoadedCalendarCollections=[];
603
+
604
+
605
+// globalLoadedTodoCollections
606
+// This option sets the list of todo collections (down)loaded after login.
607
+// If empty then all todo collections for the currently logged user are loaded.
608
+// NOTE: settings stored on the server (see settingsAccount) overwrite this
609
+// option.
610
+// Example:
611
+var globalLoadedTodoCollections=[];
612
+
613
+
614
+// globalActiveCalendarCollections
615
+// This options sets the list of calendar collections checked (enabled
616
+// checkbox => data visible in the interface) by default after login.
617
+// If empty then all loaded calendar collections for the currently logged
618
+// user are checked.
619
+// NOTE: only already (down)loaded collections can be checked (see 
620
+// the globalLoadedCalendarCollections option).
621
+// NOTE: settings stored on the server (see settingsAccount) overwrite this
622
+// option.
623
+// Example:
624
+var globalActiveCalendarCollections=[];
625
+
626
+
627
+// globalActiveTodoCollections
628
+// This options sets the list of todo collections checked (enabled
629
+// checkbox => data visible in the interface) by default after login.
630
+// If empty then all loaded todo collections for the currently logged
631
+// user are checked.
632
+// NOTE: only already (down)loaded collections can be checked (see 
633
+// the globalLoadedTodoCollections option).
634
+// NOTE: settings stored on the server (see settingsAccount) overwrite this
635
+// option.
636
+// Example:
637
+var globalActiveTodoCollections=[];
638
+
639
+
640
+// globalCalendarSelected
641
+// This option sets which calendar collection will be pre-selected
642
+// (if you create a new event) by default after login.
643
+// The value must be URL encoded path to a calendar collection,
644
+// for example: 'USER/calendar/'
645
+// If empty or undefined then the first available calendar collection
646
+// is selected automatically.
647
+// NOTE: only already (down)loaded collections can be pre-selected (see
648
+// the globalLoadedCalendarCollections option).
649
+// NOTE: settings stored on the server (see settingsAccount) overwrite this
650
+// option.
651
+// Example:
652
+//var globalCalendarSelected='';
653
+
654
+
655
+// globalTodoCalendarSelected
656
+// This option sets which todo collection will be pre-selected
657
+// (if you create a new todo) by default after login.
658
+// The value must be URL encoded path to a todo collection,
659
+// for example: 'USER/todo_calendar/'
660
+// If empty or undefined then the first available todo collection
661
+// is selected automatically.
662
+// NOTE: only already (down)loaded collections can be pre-selected (see 
663
+// the globalLoadedTodoCollections option).
664
+// NOTE: settings stored on the server (see settingsAccount) overwrite this
665
+// option.
666
+// Example:
667
+//var globalTodoCalendarSelected='';
668
+
669
+
670
+// globalActiveView
671
+// This options sets the default fullcalendar view option (the default calendar
672
+// view after the first login).
673
+// Supported values:
674
+// - 'month'
675
+// - 'multiWeek'
676
+// - 'agendaWeek'
677
+// - 'agendaDay'
678
+// NOTE: we use custom and enhanced version of fullcalendar!
679
+// Example:
680
+var globalActiveView='multiWeek';
681
+
682
+
683
+// globalOpenFormMode
684
+// Open new event form on 'single' or 'double' click.
685
+// If undefined or not 'double', then 'single' is used.
686
+// Example:
687
+var globalOpenFormMode='double';
688
+
689
+
690
+// globalTodoListFilterSelected
691
+// This options sets the list of filters in todo list that are selected
692
+// after login.
693
+// Supported options:
694
+// - 'filterAction'
695
+// - 'filterProgress' (available only if globalAppleRemindersMode is disabled)
696
+// - 'filterCompleted'
697
+// - 'filterCanceled' (available only if globalAppleRemindersMode is disabled)
698
+// NOTE: settings stored on the server (see settingsAccount) overwrite this
699
+// option.
700
+// Example:
701
+var globalTodoListFilterSelected=['filterAction', 'filterProgress'];
702
+
703
+
704
+// globalCalendarStartOfBusiness, globalCalendarEndOfBusiness
705
+// These options set the start and end of business hours with 0.5 hour
706
+// precision. Non-business hours are faded out in the calendar interface.
707
+// If both variables are set to the same value then no fade out occurs.
708
+// Example:
709
+var globalCalendarStartOfBusiness=8;
710
+var globalCalendarEndOfBusiness=17;
711
+
712
+
713
+// globalDefaultEventDuration
714
+// This option sets the default duration (in minutes) for newly created events.
715
+// If undefined or null, globalCalendarEndOfBusiness value will be taken as
716
+// a default end time instead.
717
+// Example:
718
+var globalDefaultEventDuration=120;
719
+
720
+
721
+// globalAMPMFormat
722
+// This option enables to use 12 hours format (AM/PM) for displaying time.
723
+// NOTE: time format is predefined for each localization - use this option
724
+// ONLY if you want to use custom time format (instead of the localization
725
+// predefined one).
726
+// Example:
727
+//var globalAMPMFormat=false;
728
+
729
+
730
+// globalTimeFormatBasic
731
+// This option defines the time format information for events in month and
732
+// multiweek views. If undefined or null then default value is used.
733
+// If defined as empty string no time information is shown in these views.
734
+// See http://arshaw.com/fullcalendar/docs/utilities/formatDate/ for exact
735
+// formating rules.
736
+// Example:
737
+//var globalTimeFormatBasic='';
738
+
739
+
740
+// globalTimeFormatAgenda
741
+// This option defines the time format information for events in day and
742
+// week views. If undefined or null then default value is used.
743
+// If defined as empty string no time information is shown in these views.
744
+// See http://arshaw.com/fullcalendar/docs/utilities/formatDate/ for exact
745
+// formating rules.
746
+// Example:
747
+//var globalTimeFormatAgenda='';
748
+
749
+
750
+// globalDisplayHiddenEvents
751
+// This option defined whether events from unechecked calendars are displayed
752
+// with certain transparency (true) or completely hidden (false).
753
+// Example:
754
+var globalDisplayHiddenEvents=false;
755
+
756
+
757
+// globalTimeZoneSupport
758
+// This option enables timezone support in the client.
759
+// NOTE: timezone cannot be specified for all-day events because these don't
760
+// have start and end time.
761
+// If this option is disabled then local time is used.
762
+// Example:
763
+var globalTimeZoneSupport=true;
764
+
765
+
766
+// globalTimeZone
767
+// If timezone support is enabled, this option sets the default timezone.
768
+// See timezones.js or use the following command to get the list of supported
769
+// timezones (defined in timezones.js):
770
+// grep "'[^']\+': {" timezones.js | sed -Ee "s#(\s*'|':\s*\{)##g"
771
+// Example:
772
+var globalTimeZone='Europe/Berlin';
773
+
774
+
775
+// globalTimeZonesEnabled
776
+// This option sets the list of available timezones in the interface (for the 
777
+// list of supported timezones see the comment for the previous configuration
778
+// option).
779
+// NOTE: if there is at least one event/todo with a certain timezone defined,
780
+// that timezone is enabled (even if it is not present in this list).
781
+// Example:
782
+//   var globalTimeZonesEnabled=['America/New_York', 'Europe/Berlin'];	
783
+var globalTimeZonesEnabled=[];
784
+
785
+
786
+// globalRewriteTimezoneComponent
787
+// This options sets whether the client will enhance/replace (if you edit an
788
+// event or todo) the timezone information using the official IANA timezone
789
+// database information (recommended).
790
+// Example:
791
+var globalRewriteTimezoneComponent=true;
792
+
793
+
794
+// globalRemoveUnknownTimezone
795
+// This options sets whether the client will remove all non-standard timezone
796
+// names from events and todos (if you edit an event or todo)
797
+// (e.g.: /freeassociation.sourceforge.net/Tzfile/Europe/Vienna)
798
+// Example:
799
+var globalRemoveUnknownTimezone=false;
800
+
801
+
802
+// globalShowHiddenAlarms
803
+// This option sets whether the client will show alarm notifications for
804
+// unchecked calendars. If this option is enabled and you uncheck a calendar
805
+// in the calendar list, alarm notifications will be temporary disabled for
806
+// unchecked calendar(s).
807
+// Example:
808
+var globalShowHiddenAlarms=false;
809
+
810
+
811
+// globalIgnoreCompletedOrCancelledAlarms
812
+// This options sets whether the client will show alarm notifications for
813
+// already completed or cancelled todos. If enabled then alarm notification
814
+// for completed and cancelled todos are disabled.
815
+// Example:
816
+var globalIgnoreCompletedOrCancelledAlarms=true;
817
+
818
+
819
+// globalMozillaSupport
820
+// Mozilla automatically treats custom repeating event calculations as if
821
+// the start day of the week is Monday, despite what day is chosen in settings.
822
+// Set this variable to true to use the same approach, ensuring compatible
823
+// event rendering in special cases.
824
+// Example:
825
+var globalMozillaSupport=false;
826
+
827
+
828
+// globalCalendarColorPropertyXmlns
829
+// This options sets the namespace used for storing the "calendar-color"
830
+// property by the client.
831
+// If true, undefined (or empty) "http://apple.com/ns/ical/" is used (Apple
832
+// compatible). If false, then the calendar color modification functionality
833
+// is completely disabled.
834
+// Example:
835
+//var globalCalendarColorPropertyXmlns=true;
836
+
837
+
838
+// globalWeekendDays
839
+// This option sets the list of days considered as weekend days (these
840
+// are faded out in the calendar interface). Non-weekend days are automatically
841
+// considered as business days.
842
+// Sunday is 0, Monday is 1, etc.
843
+// Example:
844
+var globalWeekendDays=[0, 6];
845
+
846
+
847
+// globalAppleRemindersMode
848
+// If this option is enabled then then client will use the same approach
849
+// for handling repeating reminders (todos) as Apple. It is STRONGLY
850
+// recommended to enabled this option if you use any Apple clients for
851
+// reminders (todos).
852
+// Supported options:
853
+// - 'iOS6'
854
+// - 'iOS7'
855
+// - true (support of the latest iOS version - 'iOS8')
856
+// - false
857
+// If this option is enabled:
858
+// - RFC todo support is SEVERELY limited and the client mimics the behaviour
859
+//   of Apple Reminders.app (to ensure maximum compatibility)
860
+// - when a single instance of repeating todo is edited, it becomes an
861
+//   autonomous non-repeating todo with NO relation to the original repeating
862
+//   todo
863
+// - capabilities of repeating todos are limited - only the first instance
864
+//   is ever visible in the interface
865
+// - support for todo DTSTART attribute is disabled
866
+// - support for todo STATUS attribute other than COMPLETED and NEEDS-ACTION
867
+//   is disabled
868
+// - [iOS6 only] support for LOCATION and URL attributes is disabled
869
+// Example:
870
+var globalAppleRemindersMode=true;
871
+
872
+
873
+// globalSubscribedCalendars
874
+// This option specifies a list of remote URLs to ics files (e.g.: used
875
+// for distributing holidays information). Subscribed calendars are
876
+// ALWAYS read-only. Remote servers where ics files are hosted MUST
877
+// return proper CORS headers (see readme.txt) otherwise this functionality
878
+// will not work!
879
+// NOTE: subsribed calendars are NOT "shared" calendars. For "shared"
880
+// calendars see the delegation option in globalAccountSettings,
881
+// globalNetworkCheckSettings and globalNetworkAccountSettings.
882
+// List of properties used in globalSubscribedCalendars variable:
883
+// - hrefLabel
884
+//   This options defines the header string above the subcsribed calendars.
885
+// - calendars
886
+//   This option specifies an array of remote calendar objects with the
887
+//   following properties:
888
+//   - href
889
+//     Set this option to the "full URL" of the remote calendar
890
+//   - userAuth
891
+//     NOTE: keep empty if remote authentication is not required!
892
+//     - userName
893
+//       Set the username you want to login.
894
+//     - userPassword
895
+//       Set the password for the given username.
896
+//   - typeList
897
+//     Set the list of objects you want to process from remote calendars;
898
+//     two options are available:
899
+//     - 'vevent' (show remote events in the interface) 
900
+//     - 'vtodo' (show remote todos in the interface) 
901
+//   - ignoreAlarm
902
+//     Set this option to true if you want to disable alarm notifications
903
+//     from the remote calendar.
904
+//   - displayName
905
+//     Set this option to the name of the calendar you want to see
906
+//     in the interface.
907
+//   - color
908
+//     Set the calendar color you want to see in the interface.
909
+// Example:
910
+//var globalSubscribedCalendars={
911
+//	hrefLabel: 'Subscribed',
912
+//	calendars: [
913
+//		{
914
+//			href: 'http://something.com/calendar.ics',
915
+//			userAuth: {
916
+//				userName: '',
917
+//				userPassword: ''
918
+//			},
919
+//			typeList: ['vevent', 'vtodo'],
920
+//			ignoreAlarm: true,
921
+//			displayName: 'Remote Calendar 1',
922
+//			color: '#ff0000'
923
+//		},
924
+//		{
925
+//			href: 'http://calendar.com/calendar2.ics',
926
+//			...
927
+//			...
928
+//		}
929
+//	]
930
+//};
931
+

File diff suppressed because it is too large
+ 2715 - 0
tracim/tracim/public/caldavzap/css/default.css


+ 180 - 0
tracim/tracim/public/caldavzap/css/default_integration.css View File

@@ -0,0 +1,180 @@
1
+.integration_d
2
+{
3
+	position: absolute;
4
+	display: none;
5
+	overflow: hidden;
6
+	top: 0;
7
+	bottom: 0;
8
+	left: 0;
9
+	width: 49px;
10
+	background: #f0f0f0;
11
+	color: #FFFFFF;
12
+	border-right: 1px solid #c0c0c0;
13
+	z-index: 26;
14
+	padding-top: 3px;
15
+	cursor: default;
16
+
17
+	user-select: none;
18
+	-webkit-user-select: none;
19
+	-moz-user-select: none;
20
+}
21
+
22
+.integration_d div
23
+{
24
+	display: none;
25
+	height: 36px;
26
+	width: 36px;
27
+	padding: 7px 7px;
28
+	cursor: pointer;
29
+}
30
+
31
+.integration_d .intBlank
32
+{
33
+	cursor: default;
34
+}
35
+
36
+#intCaldav
37
+{
38
+	background: url(../images/banner_calendar.svg) no-repeat center;
39
+}
40
+
41
+#intCaldavTodo
42
+{
43
+	background: url(../images/banner_todo.svg) no-repeat center;
44
+}
45
+
46
+#intCarddav
47
+{
48
+	background: url(../images/banner_addressbook.svg) no-repeat center;
49
+}
50
+
51
+#intProjects
52
+{
53
+	background: url(../images/banner_projects.svg) no-repeat center;
54
+}
55
+
56
+#intReports
57
+{
58
+	background: url(../images/banner_reports.svg) no-repeat center;
59
+}
60
+
61
+#intSettings
62
+{
63
+	background: url(../images/banner_settings.svg) no-repeat center;
64
+}
65
+
66
+#intRefresh
67
+{
68
+	background: url(../images/banner_refresh.svg) no-repeat center;
69
+}
70
+
71
+#intLogout
72
+{
73
+	background: url(../images/banner_logout.svg) no-repeat center;
74
+}
75
+
76
+.int_error
77
+{
78
+	display: none;
79
+	margin: 28px 0px 0px 28px;
80
+}
81
+
82
+#resourceCalDAV_h, #resourceCalDAVTODO_h, #ResourceCalDAVList, #ResourceCalDAVTODOList, #timezoneWrapper, #timezoneWrapperTODO
83
+{
84
+	left: 50px;
85
+}
86
+
87
+#main, #main_h, #searchForm, #mainTODO, #main_h_TODO, #searchFormTODO
88
+{
89
+	left: 274px;
90
+}
91
+
92
+#MainLoader, #EventDisabler, #TodoDisabler, #AlertDisabler, #ProjectsDisabler
93
+{
94
+	left: 50px;
95
+}
96
+
97
+#CalendarLoader, #CalendarLoaderTODO
98
+{
99
+	left: 275px;
100
+}
101
+
102
+.resourcesCardDAV_d, #ResourceCardDAVList, #ResourceCardDAVListOverlay
103
+{
104
+	left: 50px;
105
+}
106
+
107
+.collection_d, #SearchBox, #ABList, #ABListOverlay, #AddressbookOverlay
108
+{
109
+	left: 275px;
110
+}
111
+
112
+/*.contact_d, #ABContactColor, #ABContactOverlay, #ABMessage
113
+{
114
+	left: 526px;
115
+}
116
+
117
+#ABContact
118
+{
119
+	left: 529px;
120
+}*/
121
+
122
+.filters_d, .statistics_d, #FilterList, #ProjectsData, #SystemProjectsLock, #SystemReportsLock, #ProjectListDisabler
123
+{
124
+	left: 50px;
125
+}
126
+
127
+.projects_d, #ProjectList, #SearchBoxProject, #ProjectListOverlay
128
+{
129
+	left: 375px;
130
+}
131
+
132
+.project_d, #ProjectForm, #ProjectFormLoader, #ProjectEventsContainer, #ActivityListDisabler, #ProjectFormMessage
133
+{
134
+	left: 626px;
135
+}
136
+
137
+.resourcesReports_d, #ResourceReportsList
138
+{
139
+	left: 50px;
140
+}
141
+
142
+.resourcesSettings_d, #ResourceSettingsList
143
+{
144
+	left: 50px;
145
+}
146
+
147
+#ResourceReportsListOverlay
148
+{
149
+	left: 50px;
150
+}
151
+
152
+.report_filters_d, #ReportFilterList
153
+{
154
+	left: 275px;
155
+}
156
+
157
+.reports_d, #ReportsColor, #ReportsFormOverlay
158
+{
159
+	left: 600px;
160
+}
161
+
162
+#ReportsForm
163
+{
164
+	left: 603px;
165
+}
166
+
167
+#ResourceSettingsListOverlay
168
+{
169
+	left: 50px;
170
+}
171
+
172
+.settings_d, #SettingsColor, #SettingsFormOverlay
173
+{
174
+	left: 275px;
175
+}
176
+
177
+#SettingsForm
178
+{
179
+	left: 278px;
180
+}

File diff suppressed because it is too large
+ 1464 - 0
tracim/tracim/public/caldavzap/css/fullcalendar.css


+ 203 - 0
tracim/tracim/public/caldavzap/css/jquery-ui.custom.css View File

@@ -0,0 +1,203 @@
1
+/*
2
+ * jQuery UI CSS Framework
3
+ *
4
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
5
+ * Dual licensed under the MIT or GPL Version 2 licenses.
6
+ * http://jquery.org/license
7
+ *
8
+ * http://docs.jquery.com/UI/Theming/API
9
+ */
10
+
11
+/* Layout helpers
12
+----------------------------------*/
13
+.ui-helper-clearfix:before, .ui-helper-clearfix:after { content: ""; display: table; }
14
+.ui-helper-clearfix:after { clear: both; }
15
+.ui-helper-clearfix { zoom: 1; }
16
+.ui-helper-hidden-accessible { display: none; }
17
+
18
+/* Interaction Cues
19
+----------------------------------*/
20
+.ui-state-disabled { cursor: default !important; }
21
+
22
+/* states and images */
23
+.ui-icon { display: block; text-indent: -99999px; overflow: hidden; background-repeat: no-repeat; }
24
+
25
+/*
26
+ * jQuery UI CSS Framework
27
+ *
28
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
29
+ * Dual licensed under the MIT or GPL Version 2 licenses.
30
+ * http://jquery.org/license
31
+ *
32
+ * http://docs.jquery.com/UI/Theming/API
33
+ *
34
+ * To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Trebuchet%20MS,%20Tahoma,%20Verdana,%20Arial,%20sans-serif&fwDefault=bold&fsDefault=1.1em&cornerRadius=4px&bgColorHeader=f6a828&bgTextureHeader=12_gloss_wave.png&bgImgOpacityHeader=35&borderColorHeader=e78f08&fcHeader=ffffff&iconColorHeader=ffffff&bgColorContent=eeeeee&bgTextureContent=03_highlight_soft.png&bgImgOpacityContent=100&borderColorContent=dddddd&fcContent=333333&iconColorContent=222222&bgColorDefault=f6f6f6&bgTextureDefault=02_glass.png&bgImgOpacityDefault=100&borderColorDefault=cccccc&fcDefault=1c94c4&iconColorDefault=ef8c08&bgColorHover=fdf5ce&bgTextureHover=02_glass.png&bgImgOpacityHover=100&borderColorHover=fbcb09&fcHover=c77405&iconColorHover=ef8c08&bgColorActive=ffffff&bgTextureActive=02_glass.png&bgImgOpacityActive=65&borderColorActive=fbd850&fcActive=eb8f00&iconColorActive=ef8c08&bgColorHighlight=ffe45c&bgTextureHighlight=03_highlight_soft.png&bgImgOpacityHighlight=75&borderColorHighlight=fed22f&fcHighlight=363636&iconColorHighlight=228ef1&bgColorError=b81900&bgTextureError=08_diagonals_thick.png&bgImgOpacityError=18&borderColorError=cd0a0a&fcError=ffffff&iconColorError=ffd27a&bgColorOverlay=666666&bgTextureOverlay=08_diagonals_thick.png&bgImgOpacityOverlay=20&opacityOverlay=50&bgColorShadow=000000&bgTextureShadow=01_flat.png&bgImgOpacityShadow=10&opacityShadow=20&thicknessShadow=5px&offsetTopShadow=-5px&offsetLeftShadow=-5px&cornerRadiusShadow=5px
35
+ */
36
+
37
+/* Component containers
38
+----------------------------------*/
39
+.ui-widget { font-family: inherit; font-size: 1em; }
40
+.ui-widget-content { border: 1px solid #c0c0c0; background: #ffffff; color: #404040; }
41
+.ui-widget-header { border: none; background: #f0f0f0; color: #404040; font-weight: 500; }
42
+
43
+/* Interaction states
44
+----------------------------------*/
45
+.ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default { border: 1px solid #c0c0c0; background: #ffffff; font-weight: 400; color: #404040; }
46
+.ui-widget-content .ui-datepicker-week-end .ui-state-default {background: #f7f7f7;}
47
+.ui-state-default a, .ui-state-default a:link, .ui-state-default a:visited { color: #555555; text-decoration: none; }
48
+.ui-state-hover, .ui-widget-content .ui-datepicker-week-end .ui-state-hover, .ui-widget-content .ui-state-hover, .ui-widget-header .ui-state-hover, .ui-state-focus, .ui-widget-content .ui-state-focus, .ui-widget-header .ui-state-focus { background: #e7e7e7; font-weight: 400; color: #404040; }
49
+.ui-state-hover a, .ui-state-hover a:hover, .ui-widget-content .ui-datepicker-week-end .ui-state-hover a:hover { color: #212121; text-decoration: none;}
50
+.ui-widget-content .ui-datepicker-today .ui-state-default {background: #c0c0c0; color: #404040;}
51
+.ui-state-active, .ui-widget-content .ui-datepicker-week-end .ui-state-active, .ui-widget-content .ui-datepicker-today .ui-state-active, .ui-widget-content .ui-state-active, .ui-widget-header .ui-state-active { border: 1px solid #585858; background: #585858; font-weight: 400; color: #ffffff; }
52
+.ui-state-active a, .ui-state-active a:link, .ui-state-active a:visited { color: #212121; text-decoration: none; }
53
+.ui-widget :active { outline: none; }
54
+
55
+/* Interaction Cues
56
+----------------------------------*/
57
+.ui-state-error, .ui-widget-content .ui-state-error, .ui-widget-header .ui-state-error {border: 1px solid #cd0a0a; background: #fef1ec; color: #cd0a0a; }
58
+.ui-state-error a, .ui-widget-content .ui-state-error a, .ui-widget-header .ui-state-error a { color: #cd0a0a; }
59
+.ui-state-error-text, .ui-widget-content .ui-state-error-text, .ui-widget-header .ui-state-error-text { color: #cd0a0a; }
60
+.ui-priority-primary, .ui-widget-content .ui-priority-primary, .ui-widget-header .ui-priority-primary { font-weight: 500; }
61
+
62
+/* states and images */
63
+.ui-icon { width: 17px; height: 19px; }
64
+
65
+/* positioning */
66
+.ui-icon-circle-triangle-e { background-image: url(../images/dp_right.svg); }
67
+.ui-icon-circle-triangle-w { background-image: url(../images/dp_left.svg); }
68
+
69
+/*
70
+ * jQuery UI Autocomplete
71
+ *
72
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
73
+ * Dual licensed under the MIT or GPL Version 2 licenses.
74
+ * http://jquery.org/license
75
+ *
76
+ * http://docs.jquery.com/UI/Autocomplete#theming
77
+ */
78
+.ui-autocomplete { position: absolute; cursor: default; max-height: 80px; overflow-y: auto; overflow-x: hidden; padding-right: 20px;}
79
+
80
+/* workarounds */
81
+* html .ui-autocomplete { width:1px; } /* without this, the menu expands to 100% in IE6 */
82
+
83
+/*
84
+ * jQuery UI Menu
85
+ *
86
+ * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
87
+ * Dual licensed under the MIT or GPL Version 2 licenses.
88
+ * http://jquery.org/license
89
+ *
90
+ * http://docs.jquery.com/UI/Menu#theming
91
+ */
92
+.ui-menu {
93
+	list-style: none;
94
+	padding: 0px;
95
+	margin: 0;
96
+	display: block;
97
+	float: left;
98
+	border-color: #e0e0e0;
99
+}
100
+.ui-menu .ui-menu {
101
+	margin-top: -3px;
102
+}
103
+.ui-menu .ui-menu-item {
104
+	margin: 0;
105
+	padding: 0;
106
+	zoom: 1;
107
+	float: left;
108
+	clear: left;
109
+	width: 100%;
110
+	white-space: pre;
111
+}
112
+.ui-menu .ui-menu-item a {
113
+	text-decoration: none;
114
+	display: block;
115
+	padding: 2px 2px;
116
+	zoom: 1;
117
+	white-space: pre;
118
+}
119
+.ui-menu .ui-menu-item a.ui-state-hover,
120
+.ui-menu .ui-menu-item a.ui-state-active {
121
+	font-weight: 400;
122
+	background: #f0f0f0;
123
+}
124
+
125
+button.ui-datepicker-current
126
+{
127
+  width:40%;
128
+  margin:5px 1px 5px 1px;
129
+  float:left;
130
+}
131
+button.ui-datepicker-close
132
+{
133
+  width:40%;
134
+  margin:5px 1px 5px 1px;
135
+  float:right;
136
+}
137
+
138
+/*
139
+ * jQuery UI Slider
140
+ *
141
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
142
+ * Dual licensed under the MIT or GPL Version 2 licenses.
143
+ * http://jquery.org/license
144
+ *
145
+ * http://docs.jquery.com/UI/Slider#theming
146
+ */
147
+.ui-slider { position: relative; text-align: left; }
148
+.ui-slider .ui-slider-handle { position: absolute; z-index: 2; width: 1.2em; height: 1.2em; cursor: default; }
149
+.ui-slider .ui-slider-range { position: absolute; z-index: 1; font-size: .7em; display: block; border: 0; background-position: 0 0; }
150
+
151
+.ui-slider-horizontal { height: .8em; }
152
+.ui-slider-horizontal .ui-slider-handle { top: -.3em; margin-left: -.6em; }
153
+.ui-slider-horizontal .ui-slider-range { top: 0; height: 100%; }
154
+.ui-slider-horizontal .ui-slider-range-min { left: 0; }
155
+.ui-slider-horizontal .ui-slider-range-max { right: 0; }
156
+
157
+.ui-slider-vertical { width: .8em; height: 100px; }
158
+.ui-slider-vertical .ui-slider-handle { left: -.3em; margin-left: 0; margin-bottom: -.6em; }
159
+.ui-slider-vertical .ui-slider-range { left: 0; width: 100%; }
160
+.ui-slider-vertical .ui-slider-range-min { bottom: 0; }
161
+.ui-slider-vertical .ui-slider-range-max { top: 0; }
162
+
163
+/*
164
+ * jQuery UI Datepicker
165
+ *
166
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
167
+ * Dual licensed under the MIT or GPL Version 2 licenses.
168
+ * http://jquery.org/license
169
+ *
170
+ * http://docs.jquery.com/UI/Datepicker#theming
171
+ */
172
+
173
+.ui-datepicker { width: 184px; padding: 4px; z-index: 21; display: none; cursor:default; user-select: none; -webkit-user-select:none; -moz-user-select: -moz-none;}
174
+.ui-datepicker .ui-datepicker-header { position:relative; height: 19px; padding: 2px 0px; margin: 2px 2px 1px 2px; }
175
+.ui-datepicker .ui-datepicker-prev, .ui-datepicker .ui-datepicker-next { position:absolute; top: 2px; width: 17px; height: 19px; }
176
+.ui-datepicker .ui-datepicker-prev { left: 2px; }
177
+.ui-datepicker .ui-datepicker-next { right: 2px; }
178
+.ui-datepicker .ui-datepicker-title { margin: 0px 24px; text-align: center; white-space: nowrap;}
179
+.ui-datepicker .ui-datepicker-title select { margin: 0px 0px; background-color: #ffffff; }
180
+.ui-datepicker .ui-datepicker-title span { display: inline-block; margin-top: 3px; }
181
+.ui-datepicker select.ui-datepicker-month-year {width: 100%;}
182
+.ui-datepicker select.ui-datepicker-month { padding-bottom: 0px; width: 40px; max-height: 19px; line-height: 19px; margin-left: 2px; }
183
+.ui-datepicker select.ui-datepicker-year { padding-bottom: 0px; width: 57px; max-height: 19px; line-height: 19px; }
184
+.ui-datepicker table { font-size: 0.95em; border-collapse: collapse; margin: 3px 0px 1px 1px; }
185
+.ui-datepicker th { display: none; }
186
+.ui-datepicker td { border: 0; padding: 2px; }
187
+.ui-datepicker td span, .ui-datepicker td a { display: block; width: 18px; padding: 1px 2px 1px 0px; text-align: right; text-decoration: none; overflow: hidden; }
188
+.ui-datepicker .ui-datepicker-buttonpane { background-image: none; margin: .7em 0 0 0; padding:0 .2em; border: 0; }
189
+.ui-datepicker .ui-datepicker-buttonpane button { border: 1px solid #c0c0c0; background: #ffffff; font-weight: 400; color: #000000; padding: 0px;}
190
+.ui-datepicker-calendar th {font-weight: 400;}
191
+
192
+/* RTL support */
193
+.ui-datepicker-rtl { direction: rtl; }
194
+.ui-datepicker-rtl .ui-datepicker-prev { right: 2px; left: auto; }
195
+.ui-datepicker-rtl .ui-datepicker-next { left: 2px; right: auto; }
196
+.ui-datepicker-rtl .ui-datepicker-prev:hover { right: 1px; left: auto; }
197
+.ui-datepicker-rtl .ui-datepicker-next:hover { left: 1px; right: auto; }
198
+.ui-datepicker-rtl .ui-datepicker-buttonpane { clear:right; }
199
+.ui-datepicker-rtl .ui-datepicker-buttonpane button { float: left; }
200
+.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current { float:right; }
201
+.ui-datepicker-rtl .ui-datepicker-group { float:right; }
202
+.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header { border-right-width: 0px; border-left-width:1px; }
203
+.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header { border-right-width: 0px; border-left-width:1px; }

+ 553 - 0
tracim/tracim/public/caldavzap/css/spectrum.custom.css View File

@@ -0,0 +1,553 @@
1
+/***
2
+Spectrum Colorpicker v1.2.0
3
+https://github.com/bgrins/spectrum
4
+Author: Brian Grinstead
5
+License: MIT
6
+***/
7
+
8
+.sp-container {
9
+	position:absolute;
10
+	top:0;
11
+	left:0;
12
+	display:inline-block;
13
+	*display: inline;
14
+	*zoom: 1;
15
+	/* https://github.com/bgrins/spectrum/issues/40 */
16
+	z-index: 9999994;
17
+	overflow: hidden;
18
+	border-bottom: 1px solid #c0c0c0;
19
+}
20
+
21
+.sp-container.sp-flat {
22
+	position: relative;
23
+}
24
+
25
+.sp-arrow
26
+{
27
+	position: absolute;
28
+	top: 0;
29
+	left: 106px;
30
+	width: 12px;
31
+	height: 6px;
32
+	background-image: url('../images/resource_arrow_down.svg');
33
+}
34
+
35
+/* http://ansciath.tumblr.com/post/7347495869/css-aspect-ratio */
36
+.sp-top {
37
+  position:relative;
38
+  width: 100%;
39
+  display:inline-block;
40
+}
41
+.sp-top-inner {
42
+   position:absolute;
43
+   top:0;
44
+   left:0;
45
+   bottom:0;
46
+   right:0;
47
+}
48
+.sp-color {
49
+	position: absolute;
50
+	top:0;
51
+	left:0;
52
+	bottom:0;
53
+	right:20%;
54
+}
55
+.sp-hue {
56
+	position: absolute;
57
+	top:0;
58
+	right:0;
59
+	bottom:0;
60
+	left:84%;
61
+	height: 100%;
62
+}
63
+
64
+.sp-clear-enabled .sp-hue {
65
+	top:33px;
66
+	height: 77.5%;
67
+}
68
+
69
+.sp-fill {
70
+	padding-top: 80%;
71
+}
72
+.sp-sat, .sp-val {
73
+	position: absolute;
74
+	top:0;
75
+	left:0;
76
+	right:0;
77
+	bottom:0;
78
+}
79
+
80
+.sp-alpha-enabled .sp-top {
81
+	margin-bottom: 18px;
82
+}
83
+.sp-alpha-enabled .sp-alpha {
84
+	display: block;
85
+}
86
+.sp-alpha-handle {
87
+	position:absolute;
88
+	top:-4px;
89
+	bottom: -4px;
90
+	width: 6px;
91
+	left: 50%;
92
+	cursor: pointer;
93
+	border: 1px solid black;
94
+	background: white;
95
+	opacity: .8;
96
+}
97
+.sp-alpha {
98
+	display: none;
99
+	position: absolute;
100
+	bottom: -14px;
101
+	right: 0;
102
+	left: 0;
103
+	height: 8px;
104
+}
105
+.sp-alpha-inner {
106
+	border: solid 1px #333;
107
+}
108
+
109
+.sp-clear {
110
+	display: none;
111
+}
112
+
113
+.sp-clear.sp-clear-display {
114
+	background-position: center;
115
+}
116
+
117
+.sp-clear-enabled .sp-clear {
118
+	display: block;
119
+	position:absolute;
120
+	top:0px;
121
+	right:0;
122
+	bottom:0;
123
+	left:84%;
124
+	height: 28px;
125
+}
126
+
127
+/* Don't allow text selection */
128
+.sp-container, .sp-replacer, .sp-preview, .sp-dragger, .sp-slider, .sp-alpha, .sp-clear, .sp-alpha-handle, .sp-container.sp-dragging .sp-input, .sp-container button  {
129
+	cursor:default;
130
+	-webkit-user-select:none;
131
+	-moz-user-select: -moz-none;
132
+	-o-user-select:none;
133
+	user-select: none;
134
+}
135
+
136
+.sp-container.sp-input-disabled .sp-input-container {
137
+	display: none;
138
+}
139
+.sp-container.sp-buttons-disabled .sp-button-container {
140
+	display: none;
141
+}
142
+.sp-palette-only .sp-picker-container {
143
+	display: none;
144
+}
145
+.sp-palette-disabled .sp-palette-container {
146
+	display: none;
147
+}
148
+
149
+.sp-initial-disabled .sp-initial {
150
+	display: none;
151
+}
152
+
153
+
154
+/* Gradients for hue, saturation and value instead of images.  Not pretty... but it works */
155
+.sp-sat {
156
+	background-image: -webkit-gradient(linear,  0 0, 100% 0, from(#FFF), to(rgba(204, 154, 129, 0)));
157
+	background-image: -webkit-linear-gradient(left, #FFF, rgba(204, 154, 129, 0));
158
+	background-image: -moz-linear-gradient(left, #fff, rgba(204, 154, 129, 0));
159
+	background-image: -o-linear-gradient(left, #fff, rgba(204, 154, 129, 0));
160
+	background-image: -ms-linear-gradient(left, #fff, rgba(204, 154, 129, 0));
161
+	background-image: linear-gradient(to right, #fff, rgba(204, 154, 129, 0));
162
+	-ms-filter: "progid:DXImageTransform.Microsoft.gradient(GradientType = 1, startColorstr=#FFFFFFFF, endColorstr=#00CC9A81)";
163
+	filter : progid:DXImageTransform.Microsoft.gradient(GradientType = 1, startColorstr='#FFFFFFFF', endColorstr='#00CC9A81');
164
+}
165
+.sp-val {
166
+	background-image: -webkit-gradient(linear, 0 100%, 0 0, from(#000000), to(rgba(204, 154, 129, 0)));
167
+	background-image: -webkit-linear-gradient(bottom, #000000, rgba(204, 154, 129, 0));
168
+	background-image: -moz-linear-gradient(bottom, #000, rgba(204, 154, 129, 0));
169
+	background-image: -o-linear-gradient(bottom, #000, rgba(204, 154, 129, 0));
170
+	background-image: -ms-linear-gradient(bottom, #000, rgba(204, 154, 129, 0));
171
+	background-image: linear-gradient(to top, #000, rgba(204, 154, 129, 0));
172
+	-ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr=#00CC9A81, endColorstr=#FF000000)";
173
+	filter : progid:DXImageTransform.Microsoft.gradient(startColorstr='#00CC9A81', endColorstr='#FF000000');
174
+}
175
+
176
+.sp-hue {
177
+	background: -moz-linear-gradient(top, #ff0000 0%, #ffff00 17%, #00ff00 33%, #00ffff 50%, #0000ff 67%, #ff00ff 83%, #ff0000 100%);
178
+	background: -ms-linear-gradient(top, #ff0000 0%, #ffff00 17%, #00ff00 33%, #00ffff 50%, #0000ff 67%, #ff00ff 83%, #ff0000 100%);
179
+	background: -o-linear-gradient(top, #ff0000 0%, #ffff00 17%, #00ff00 33%, #00ffff 50%, #0000ff 67%, #ff00ff 83%, #ff0000 100%);
180
+	background: -webkit-gradient(linear, left top, left bottom, from(#ff0000), color-stop(0.17, #ffff00), color-stop(0.33, #00ff00), color-stop(0.5, #00ffff), color-stop(0.67, #0000ff), color-stop(0.83, #ff00ff), to(#ff0000));
181
+	background: -webkit-linear-gradient(top, #ff0000 0%, #ffff00 17%, #00ff00 33%, #00ffff 50%, #0000ff 67%, #ff00ff 83%, #ff0000 100%);
182
+}
183
+
184
+/* IE filters do not support multiple color stops.
185
+   Generate 6 divs, line them up, and do two color gradients for each.
186
+   Yes, really.
187
+ */
188
+.sp-1 {
189
+	height:17%;
190
+	filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0000', endColorstr='#ffff00');
191
+}
192
+.sp-2 {
193
+	height:16%;
194
+	filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffff00', endColorstr='#00ff00');
195
+}
196
+.sp-3 {
197
+	height:17%;
198
+	filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00ff00', endColorstr='#00ffff');
199
+}
200
+.sp-4 {
201
+	height:17%;
202
+	filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00ffff', endColorstr='#0000ff');
203
+}
204
+.sp-5 {
205
+	height:16%;
206
+	filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#0000ff', endColorstr='#ff00ff');
207
+}
208
+.sp-6 {
209
+	height:17%;
210
+	filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff00ff', endColorstr='#ff0000');
211
+}
212
+
213
+.sp-hidden {
214
+	display: none !important;
215
+}
216
+
217
+/* Clearfix hack */
218
+.sp-cf:before, .sp-cf:after { content: ""; display: table; }
219
+.sp-cf:after { clear: both; }
220
+.sp-cf { *zoom: 1; }
221
+
222
+/* Mobile devices, make hue slider bigger so it is easier to slide */
223
+@media (max-device-width: 480px) {
224
+	.sp-color { right: 40%; }
225
+	.sp-hue { left: 63%; }
226
+	.sp-fill { padding-top: 60%; }
227
+}
228
+.sp-dragger {
229
+   border-radius: 5px;
230
+   height: 5px;
231
+   width: 5px;
232
+   border: 1px solid #fff;
233
+   background: #000;
234
+   cursor: pointer;
235
+   position:absolute;
236
+   top:0;
237
+   left: 0;
238
+}
239
+.sp-slider {
240
+	position: absolute;
241
+	top:0;
242
+	cursor:pointer;
243
+	height: 3px;
244
+	left: -1px;
245
+	right: -1px;
246
+	border: 1px solid #000;
247
+	background: white;
248
+	opacity: .8;
249
+}
250
+
251
+/*
252
+Theme authors:
253
+Here are the basic themeable display options (colors, fonts, global widths).
254
+See http://bgrins.github.io/spectrum/themes/ for instructions.
255
+*/
256
+
257
+.sp-container {
258
+	border-radius: 0;
259
+	background-color: #f0f0f0;
260
+	padding: 0;
261
+}
262
+.sp-container, .sp-container button, .sp-container input, .sp-color, .sp-hue, .sp-clear
263
+{
264
+	-webkit-box-sizing: border-box;
265
+	-moz-box-sizing: border-box;
266
+	-ms-box-sizing: border-box;
267
+	box-sizing: border-box;
268
+}
269
+
270
+.sp-top
271
+{
272
+	margin-bottom: 3px;
273
+}
274
+
275
+.sp-color, .sp-hue, .sp-clear
276
+{
277
+	border: solid 1px #666;
278
+}
279
+
280
+/* Input */
281
+/*.sp-input-container {
282
+	float:right;
283
+	width: 100px;
284
+	margin-bottom: 4px;
285
+}
286
+.sp-initial-disabled  .sp-input-container {
287
+	width: 100%;
288
+}
289
+.sp-input {
290
+   font-size: 12px !important;
291
+   border: 1px inset;
292
+   padding: 4px 5px;
293
+   margin: 0;
294
+   width: 100%;
295
+   background:transparent;
296
+   border-radius: 3px;
297
+   color: #222;
298
+}
299
+.sp-input:focus  {
300
+	border: 1px solid orange;
301
+}*/
302
+.sp-input-container {
303
+	width: 100%;
304
+	margin-bottom: 4px;
305
+}
306
+.sp-input {
307
+   padding: 4px 5px;
308
+   margin: 0;
309
+   width: 100%;
310
+}
311
+/*.sp-input.sp-validation-error
312
+{
313
+	border: 1px solid red;
314
+	background: #fdd;
315
+}*/
316
+.sp-picker-container , .sp-palette-container
317
+{
318
+	float:left;
319
+	position: relative;
320
+	padding: 10px;
321
+}
322
+.sp-picker-container
323
+{
324
+	width: 204px;
325
+	/*width: 172px;*/
326
+}
327
+
328
+/* Palettes */
329
+.sp-palette-container
330
+{
331
+	border-right: solid 1px #ccc;
332
+}
333
+
334
+.sp-palette .sp-thumb-el {
335
+	display: block;
336
+	position:relative;
337
+	float:left;
338
+	width: 24px;
339
+	height: 15px;
340
+	margin: 3px;
341
+	cursor: pointer;
342
+	border:solid 2px transparent;
343
+}
344
+.sp-palette .sp-thumb-el:hover, .sp-palette .sp-thumb-el.sp-thumb-active {
345
+	border-color: orange;
346
+}
347
+.sp-thumb-el
348
+{
349
+	position:relative;
350
+}
351
+
352
+/* Initial */
353
+.sp-initial
354
+{
355
+	float: left;
356
+	border: solid 1px #333;
357
+}
358
+.sp-initial span {
359
+	width: 30px;
360
+	height: 25px;
361
+	border:none;
362
+	display:block;
363
+	float:left;
364
+	margin:0;
365
+}
366
+
367
+.sp-initial .sp-clear-display {
368
+	background-position: center;
369
+}
370
+
371
+/* Buttons */
372
+.sp-button-container {
373
+	width: 100%;
374
+}
375
+
376
+/* Replacer (the little preview div that shows up instead of the <input>) */
377
+.sp-replacer {
378
+	margin:0;
379
+	overflow:hidden;
380
+	cursor:pointer;
381
+	padding: 4px;
382
+	/*display:inline-block;*/
383
+	display: none;
384
+	*zoom: 1;
385
+	*display: inline;
386
+	border: solid 1px #91765d;
387
+	background: #eee;
388
+	color: #333;
389
+	vertical-align: middle;
390
+}
391
+.sp-replacer:hover, .sp-replacer.sp-active {
392
+	border-color: #F0C49B;
393
+	color: #111;
394
+}
395
+.sp-replacer.sp-disabled {
396
+	cursor:default;
397
+	border-color: silver;
398
+	color: silver;
399
+}
400
+.sp-dd {
401
+	padding: 2px 0;
402
+	height: 16px;
403
+	line-height: 16px;
404
+	float:left;
405
+	font-size:10px;
406
+}
407
+.sp-preview
408
+{
409
+	position:relative;
410
+	width:25px;
411
+	height: 20px;
412
+	border: solid 1px #222;
413
+	margin-right: 5px;
414
+	float:left;
415
+	z-index: 0;
416
+}
417
+
418
+.sp-palette
419
+{
420
+	*width: 220px;
421
+	max-width: 220px;
422
+}
423
+.sp-palette .sp-thumb-el
424
+{
425
+	width:16px;
426
+	height: 16px;
427
+	margin:2px 1px;
428
+	border: solid 1px #d0d0d0;
429
+}
430
+
431
+.sp-container
432
+{
433
+	padding-bottom:0;
434
+}
435
+
436
+
437
+/* Buttons: http://hellohappy.org/css3-buttons/ */
438
+/*.sp-container button {
439
+  background-color: #eeeeee;
440
+  background-image: -webkit-linear-gradient(top, #eeeeee, #cccccc);
441
+  background-image: -moz-linear-gradient(top, #eeeeee, #cccccc);
442
+  background-image: -ms-linear-gradient(top, #eeeeee, #cccccc);
443
+  background-image: -o-linear-gradient(top, #eeeeee, #cccccc);
444
+  background-image: linear-gradient(to bottom, #eeeeee, #cccccc);
445
+  border: 1px solid #ccc;
446
+  border-bottom: 1px solid #bbb;
447
+  border-radius: 3px;
448
+  color: #333;
449
+  font-size: 14px;
450
+  line-height: 1;
451
+  padding: 5px 4px;
452
+  text-align: center;
453
+  text-shadow: 0 1px 0 #eee;
454
+  vertical-align: middle;
455
+}
456
+.sp-container button:hover {
457
+	background-color: #dddddd;
458
+	background-image: -webkit-linear-gradient(top, #dddddd, #bbbbbb);
459
+	background-image: -moz-linear-gradient(top, #dddddd, #bbbbbb);
460
+	background-image: -ms-linear-gradient(top, #dddddd, #bbbbbb);
461
+	background-image: -o-linear-gradient(top, #dddddd, #bbbbbb);
462
+	background-image: linear-gradient(to bottom, #dddddd, #bbbbbb);
463
+	border: 1px solid #bbb;
464
+	border-bottom: 1px solid #999;
465
+	cursor: pointer;
466
+	text-shadow: 0 1px 0 #ddd;
467
+}
468
+.sp-container button:active {
469
+	border: 1px solid #aaa;
470
+	border-bottom: 1px solid #888;
471
+	-webkit-box-shadow: inset 0 0 5px 2px #aaaaaa, 0 1px 0 0 #eeeeee;
472
+	-moz-box-shadow: inset 0 0 5px 2px #aaaaaa, 0 1px 0 0 #eeeeee;
473
+	-ms-box-shadow: inset 0 0 5px 2px #aaaaaa, 0 1px 0 0 #eeeeee;
474
+	-o-box-shadow: inset 0 0 5px 2px #aaaaaa, 0 1px 0 0 #eeeeee;
475
+	box-shadow: inset 0 0 5px 2px #aaaaaa, 0 1px 0 0 #eeeeee;
476
+}
477
+.sp-cancel
478
+{
479
+	font-size: 11px;
480
+	color: #d93f3f !important;
481
+	margin:0;
482
+	padding:2px;
483
+	margin-right: 5px;
484
+	vertical-align: middle;
485
+	text-decoration:none;
486
+
487
+}
488
+.sp-cancel:hover
489
+{
490
+	color: #d93f3f !important;
491
+	text-decoration: underline;
492
+}*/
493
+
494
+.sp-container input[type=button]
495
+{
496
+	width: 40%;
497
+}
498
+
499
+.sp-cancel
500
+{
501
+	float: right;
502
+}
503
+
504
+.sp-palette span:hover, .sp-palette span.sp-thumb-active
505
+{
506
+	border-color: #000;
507
+}
508
+
509
+.sp-preview, .sp-alpha, .sp-thumb-el
510
+{
511
+	position:relative;
512
+	background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAGUlEQVQYV2M4gwH+YwCGIasIUwhT25BVBADtzYNYrHvv4gAAAABJRU5ErkJggg==);
513
+}
514
+.sp-preview-inner, .sp-alpha-inner, .sp-thumb-inner
515
+{
516
+	display:block;
517
+	position:absolute;
518
+	top:0;left:0;bottom:0;right:0;
519
+}
520
+
521
+.sp-palette .sp-thumb-inner
522
+{
523
+	background-position: 50% 50%;
524
+	background-repeat: no-repeat;
525
+}
526
+
527
+.sp-palette .sp-thumb-light.sp-thumb-active .sp-thumb-inner
528
+{
529
+	background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAIVJREFUeNpiYBhsgJFMffxAXABlN5JruT4Q3wfi/0DsT64h8UD8HmpIPCWG/KemIfOJCUB+Aoacx6EGBZyHBqI+WsDCwuQ9mhxeg2A210Ntfo8klk9sOMijaURm7yc1UP2RNCMbKE9ODK1HM6iegYLkfx8pligC9lCD7KmRof0ZhjQACDAAceovrtpVBRkAAAAASUVORK5CYII=);
530
+}
531
+
532
+.sp-palette .sp-thumb-dark.sp-thumb-active .sp-thumb-inner
533
+{
534
+	background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjEwMPRyoQAAAMdJREFUOE+tkgsNwzAMRMugEAahEAahEAZhEAqlEAZhEAohEAYh81X2dIm8fKpEspLGvudPOsUYpxE2BIJCroJmEW9qJ+MKaBFhEMNabSy9oIcIPwrB+afvAUFoK4H0tMaQ3XtlrggDhOVVMuT4E5MMG0FBbCEYzjYT7OxLEvIHQLY2zWwQ3D+9luyOQTfKDiFD3iUIfPk8VqrKjgAiSfGFPecrg6HN6m/iBcwiDAo7WiBeawa+Kwh7tZoSCGLMqwlSAzVDhoK+6vH4G0P5wdkAAAAASUVORK5CYII=);
535
+}
536
+
537
+.sp-clear-display {
538
+	background-repeat:no-repeat;
539
+	background-position: center;
540
+	background-image: url(data:image/gif;base64,R0lGODlhFAAUAPcAAAAAAJmZmZ2dnZ6enqKioqOjo6SkpKWlpaampqenp6ioqKmpqaqqqqurq/Hx8fLy8vT09PX19ff39/j4+Pn5+fr6+vv7+wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAP8ALAAAAAAUABQAAAihAP9FoPCvoMGDBy08+EdhQAIJCCMybCDAAYUEARBAlFiQQoMABQhKUJBxY0SPICEYHBnggEmDKAuoPMjS5cGYMxHW3IiT478JJA8M/CjTZ0GgLRekNGpwAsYABHIypcAgQMsITDtWJYBR6NSqMico9cqR6tKfY7GeBCuVwlipDNmefAtTrkSzB1RaIAoXodsABiZAEFB06gIBWC1mLVgBa0AAOw==);
541
+}
542
+
543
+.sp-inverse.sp-container {
544
+	border-top: 1px solid #c0c0c0;
545
+	border-bottom: none;
546
+}
547
+
548
+.sp-inverse .sp-arrow
549
+{
550
+	top: auto;
551
+	bottom: 0;
552
+	background-image: url('../images/resource_arrow_up.svg');
553
+}

File diff suppressed because it is too large
+ 4265 - 0
tracim/tracim/public/caldavzap/data_process.js


BIN
tracim/tracim/public/caldavzap/fonts/Roboto-Bold-webfont.eot View File


File diff suppressed because it is too large
+ 7496 - 0
tracim/tracim/public/caldavzap/fonts/Roboto-Bold-webfont.svg


BIN
tracim/tracim/public/caldavzap/fonts/Roboto-Bold-webfont.ttf View File


BIN
tracim/tracim/public/caldavzap/fonts/Roboto-Bold-webfont.woff View File


BIN
tracim/tracim/public/caldavzap/fonts/Roboto-BoldItalic-webfont.eot View File


File diff suppressed because it is too large
+ 8652 - 0
tracim/tracim/public/caldavzap/fonts/Roboto-BoldItalic-webfont.svg


BIN
tracim/tracim/public/caldavzap/fonts/Roboto-BoldItalic-webfont.ttf View File


BIN
tracim/tracim/public/caldavzap/fonts/Roboto-BoldItalic-webfont.woff View File


BIN
tracim/tracim/public/caldavzap/fonts/Roboto-Italic-webfont.eot View File


File diff suppressed because it is too large
+ 8164 - 0
tracim/tracim/public/caldavzap/fonts/Roboto-Italic-webfont.svg


BIN
tracim/tracim/public/caldavzap/fonts/Roboto-Italic-webfont.ttf View File


BIN
tracim/tracim/public/caldavzap/fonts/Roboto-Italic-webfont.woff View File


BIN
tracim/tracim/public/caldavzap/fonts/Roboto-Light-webfont.eot View File


File diff suppressed because it is too large
+ 8162 - 0
tracim/tracim/public/caldavzap/fonts/Roboto-Light-webfont.svg


BIN
tracim/tracim/public/caldavzap/fonts/Roboto-Light-webfont.ttf View File


BIN
tracim/tracim/public/caldavzap/fonts/Roboto-Light-webfont.woff View File


BIN
tracim/tracim/public/caldavzap/fonts/Roboto-LightItalic-webfont.eot View File


File diff suppressed because it is too large
+ 8162 - 0
tracim/tracim/public/caldavzap/fonts/Roboto-LightItalic-webfont.svg


BIN
tracim/tracim/public/caldavzap/fonts/Roboto-LightItalic-webfont.ttf View File


BIN
tracim/tracim/public/caldavzap/fonts/Roboto-LightItalic-webfont.woff View File


BIN
tracim/tracim/public/caldavzap/fonts/Roboto-Medium-webfont.eot View File


File diff suppressed because it is too large
+ 7496 - 0
tracim/tracim/public/caldavzap/fonts/Roboto-Medium-webfont.svg


BIN
tracim/tracim/public/caldavzap/fonts/Roboto-Medium-webfont.ttf View File


BIN
tracim/tracim/public/caldavzap/fonts/Roboto-Medium-webfont.woff View File


BIN
tracim/tracim/public/caldavzap/fonts/Roboto-MediumItalic-webfont.eot View File


File diff suppressed because it is too large
+ 8652 - 0
tracim/tracim/public/caldavzap/fonts/Roboto-MediumItalic-webfont.svg


BIN
tracim/tracim/public/caldavzap/fonts/Roboto-MediumItalic-webfont.ttf View File


BIN
tracim/tracim/public/caldavzap/fonts/Roboto-MediumItalic-webfont.woff View File


BIN
tracim/tracim/public/caldavzap/fonts/Roboto-Regular-webfont.eot View File


File diff suppressed because it is too large
+ 7606 - 0
tracim/tracim/public/caldavzap/fonts/Roboto-Regular-webfont.svg


BIN
tracim/tracim/public/caldavzap/fonts/Roboto-Regular-webfont.ttf View File


BIN
tracim/tracim/public/caldavzap/fonts/Roboto-Regular-webfont.woff View File


+ 202 - 0
tracim/tracim/public/caldavzap/fonts/license.txt View File

@@ -0,0 +1,202 @@
1
+
2
+                                 Apache License
3
+                           Version 2.0, January 2004
4
+                        http://www.apache.org/licenses/
5
+
6
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
7
+
8
+   1. Definitions.
9
+
10
+      "License" shall mean the terms and conditions for use, reproduction,
11
+      and distribution as defined by Sections 1 through 9 of this document.
12
+
13
+      "Licensor" shall mean the copyright owner or entity authorized by
14
+      the copyright owner that is granting the License.
15
+
16
+      "Legal Entity" shall mean the union of the acting entity and all
17
+      other entities that control, are controlled by, or are under common
18
+      control with that entity. For the purposes of this definition,
19
+      "control" means (i) the power, direct or indirect, to cause the
20
+      direction or management of such entity, whether by contract or
21
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
22
+      outstanding shares, or (iii) beneficial ownership of such entity.
23
+
24
+      "You" (or "Your") shall mean an individual or Legal Entity
25
+      exercising permissions granted by this License.
26
+
27
+      "Source" form shall mean the preferred form for making modifications,
28
+      including but not limited to software source code, documentation
29
+      source, and configuration files.
30
+
31
+      "Object" form shall mean any form resulting from mechanical
32
+      transformation or translation of a Source form, including but
33
+      not limited to compiled object code, generated documentation,
34
+      and conversions to other media types.
35
+
36
+      "Work" shall mean the work of authorship, whether in Source or
37
+      Object form, made available under the License, as indicated by a
38
+      copyright notice that is included in or attached to the work
39
+      (an example is provided in the Appendix below).
40
+
41
+      "Derivative Works" shall mean any work, whether in Source or Object
42
+      form, that is based on (or derived from) the Work and for which the
43
+      editorial revisions, annotations, elaborations, or other modifications
44
+      represent, as a whole, an original work of authorship. For the purposes
45
+      of this License, Derivative Works shall not include works that remain
46
+      separable from, or merely link (or bind by name) to the interfaces of,
47
+      the Work and Derivative Works thereof.
48
+
49
+      "Contribution" shall mean any work of authorship, including
50
+      the original version of the Work and any modifications or additions
51
+      to that Work or Derivative Works thereof, that is intentionally
52
+      submitted to Licensor for inclusion in the Work by the copyright owner
53
+      or by an individual or Legal Entity authorized to submit on behalf of
54
+      the copyright owner. For the purposes of this definition, "submitted"
55
+      means any form of electronic, verbal, or written communication sent
56
+      to the Licensor or its representatives, including but not limited to
57
+      communication on electronic mailing lists, source code control systems,
58
+      and issue tracking systems that are managed by, or on behalf of, the
59
+      Licensor for the purpose of discussing and improving the Work, but
60
+      excluding communication that is conspicuously marked or otherwise
61
+      designated in writing by the copyright owner as "Not a Contribution."
62
+
63
+      "Contributor" shall mean Licensor and any individual or Legal Entity
64
+      on behalf of whom a Contribution has been received by Licensor and
65
+      subsequently incorporated within the Work.
66
+
67
+   2. Grant of Copyright License. Subject to the terms and conditions of
68
+      this License, each Contributor hereby grants to You a perpetual,
69
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
70
+      copyright license to reproduce, prepare Derivative Works of,
71
+      publicly display, publicly perform, sublicense, and distribute the
72
+      Work and such Derivative Works in Source or Object form.
73
+
74
+   3. Grant of Patent License. Subject to the terms and conditions of
75
+      this License, each Contributor hereby grants to You a perpetual,
76
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
77
+      (except as stated in this section) patent license to make, have made,
78
+      use, offer to sell, sell, import, and otherwise transfer the Work,
79
+      where such license applies only to those patent claims licensable
80
+      by such Contributor that are necessarily infringed by their
81
+      Contribution(s) alone or by combination of their Contribution(s)
82
+      with the Work to which such Contribution(s) was submitted. If You
83
+      institute patent litigation against any entity (including a
84
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
85
+      or a Contribution incorporated within the Work constitutes direct
86
+      or contributory patent infringement, then any patent licenses
87
+      granted to You under this License for that Work shall terminate
88
+      as of the date such litigation is filed.
89
+
90
+   4. Redistribution. You may reproduce and distribute copies of the
91
+      Work or Derivative Works thereof in any medium, with or without
92
+      modifications, and in Source or Object form, provided that You
93
+      meet the following conditions:
94
+
95
+      (a) You must give any other recipients of the Work or
96
+          Derivative Works a copy of this License; and
97
+
98
+      (b) You must cause any modified files to carry prominent notices
99
+          stating that You changed the files; and
100
+
101
+      (c) You must retain, in the Source form of any Derivative Works
102
+          that You distribute, all copyright, patent, trademark, and
103
+          attribution notices from the Source form of the Work,
104
+          excluding those notices that do not pertain to any part of
105
+          the Derivative Works; and
106
+
107
+      (d) If the Work includes a "NOTICE" text file as part of its
108
+          distribution, then any Derivative Works that You distribute must
109
+          include a readable copy of the attribution notices contained
110
+          within such NOTICE file, excluding those notices that do not
111
+          pertain to any part of the Derivative Works, in at least one
112
+          of the following places: within a NOTICE text file distributed
113
+          as part of the Derivative Works; within the Source form or
114
+          documentation, if provided along with the Derivative Works; or,
115
+          within a display generated by the Derivative Works, if and
116
+          wherever such third-party notices normally appear. The contents
117
+          of the NOTICE file are for informational purposes only and
118
+          do not modify the License. You may add Your own attribution
119
+          notices within Derivative Works that You distribute, alongside
120
+          or as an addendum to the NOTICE text from the Work, provided
121
+          that such additional attribution notices cannot be construed
122
+          as modifying the License.
123
+
124
+      You may add Your own copyright statement to Your modifications and
125
+      may provide additional or different license terms and conditions
126
+      for use, reproduction, or distribution of Your modifications, or
127
+      for any such Derivative Works as a whole, provided Your use,
128
+      reproduction, and distribution of the Work otherwise complies with
129
+      the conditions stated in this License.
130
+
131
+   5. Submission of Contributions. Unless You explicitly state otherwise,
132
+      any Contribution intentionally submitted for inclusion in the Work
133
+      by You to the Licensor shall be under the terms and conditions of
134
+      this License, without any additional terms or conditions.
135
+      Notwithstanding the above, nothing herein shall supersede or modify
136
+      the terms of any separate license agreement you may have executed
137
+      with Licensor regarding such Contributions.
138
+
139
+   6. Trademarks. This License does not grant permission to use the trade
140
+      names, trademarks, service marks, or product names of the Licensor,
141
+      except as required for reasonable and customary use in describing the
142
+      origin of the Work and reproducing the content of the NOTICE file.
143
+
144
+   7. Disclaimer of Warranty. Unless required by applicable law or
145
+      agreed to in writing, Licensor provides the Work (and each
146
+      Contributor provides its Contributions) on an "AS IS" BASIS,
147
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
148
+      implied, including, without limitation, any warranties or conditions
149
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
150
+      PARTICULAR PURPOSE. You are solely responsible for determining the
151
+      appropriateness of using or redistributing the Work and assume any
152
+      risks associated with Your exercise of permissions under this License.
153
+
154
+   8. Limitation of Liability. In no event and under no legal theory,
155
+      whether in tort (including negligence), contract, or otherwise,
156
+      unless required by applicable law (such as deliberate and grossly
157
+      negligent acts) or agreed to in writing, shall any Contributor be
158
+      liable to You for damages, including any direct, indirect, special,
159
+      incidental, or consequential damages of any character arising as a
160
+      result of this License or out of the use or inability to use the
161
+      Work (including but not limited to damages for loss of goodwill,
162
+      work stoppage, computer failure or malfunction, or any and all
163
+      other commercial damages or losses), even if such Contributor
164
+      has been advised of the possibility of such damages.
165
+
166
+   9. Accepting Warranty or Additional Liability. While redistributing
167
+      the Work or Derivative Works thereof, You may choose to offer,
168
+      and charge a fee for, acceptance of support, warranty, indemnity,
169
+      or other liability obligations and/or rights consistent with this
170
+      License. However, in accepting such obligations, You may act only
171
+      on Your own behalf and on Your sole responsibility, not on behalf
172
+      of any other Contributor, and only if You agree to indemnify,
173
+      defend, and hold each Contributor harmless for any liability
174
+      incurred by, or claims asserted against, such Contributor by reason
175
+      of your accepting any such warranty or additional liability.
176
+
177
+   END OF TERMS AND CONDITIONS
178
+
179
+   APPENDIX: How to apply the Apache License to your work.
180
+
181
+      To apply the Apache License to your work, attach the following
182
+      boilerplate notice, with the fields enclosed by brackets "[]"
183
+      replaced with your own identifying information. (Don't include
184
+      the brackets!)  The text should be enclosed in the appropriate
185
+      comment syntax for the file format. We also recommend that a
186
+      file or class name and description of purpose be included on the
187
+      same "printed page" as the copyright notice for easier
188
+      identification within third-party archives.
189
+
190
+   Copyright [yyyy] [name of copyright owner]
191
+
192
+   Licensed under the Apache License, Version 2.0 (the "License");
193
+   you may not use this file except in compliance with the License.
194
+   You may obtain a copy of the License at
195
+
196
+       http://www.apache.org/licenses/LICENSE-2.0
197
+
198
+   Unless required by applicable law or agreed to in writing, software
199
+   distributed under the License is distributed on an "AS IS" BASIS,
200
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
201
+   See the License for the specific language governing permissions and
202
+   limitations under the License.

File diff suppressed because it is too large
+ 3307 - 0
tracim/tracim/public/caldavzap/forms.js


+ 14 - 0
tracim/tracim/public/caldavzap/images/add_cal.svg View File

@@ -0,0 +1,14 @@
1
+<?xml version="1.0" encoding="utf-8"?>
2
+<!-- Generator: Adobe Illustrator 15.1.0, SVG Export Plug-In  -->
3
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
4
+	<!ENTITY ns_flows "http://ns.adobe.com/Flows/1.0/">
5
+]>
6
+<svg version="1.1"
7
+	 xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/"
8
+	 x="0px" y="0px" width="11px" height="11px" viewBox="0 0 11 11" overflow="visible" enable-background="new 0 0 11 11"
9
+	 xml:space="preserve">
10
+<defs>
11
+</defs>
12
+<rect x="4" fill="#404040" width="3" height="11"/>
13
+<rect y="4" fill="#404040" width="11" height="3"/>
14
+</svg>

+ 14 - 0
tracim/tracim/public/caldavzap/images/add_cal_white.svg View File

@@ -0,0 +1,14 @@
1
+<?xml version="1.0" encoding="utf-8"?>
2
+<!-- Generator: Adobe Illustrator 15.1.0, SVG Export Plug-In  -->
3
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
4
+	<!ENTITY ns_flows "http://ns.adobe.com/Flows/1.0/">
5
+]>
6
+<svg version="1.1"
7
+	 xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/"
8
+	 x="0px" y="0px" width="11px" height="11px" viewBox="0 0 11 11" overflow="visible" enable-background="new 0 0 11 11"
9
+	 xml:space="preserve">
10
+<defs>
11
+</defs>
12
+<rect x="4" fill="#FFFFFF" width="3" height="11"/>
13
+<rect y="4" fill="#FFFFFF" width="11" height="3"/>
14
+</svg>

+ 9 - 0
tracim/tracim/public/caldavzap/images/arrow_next.svg View File

@@ -0,0 +1,9 @@
1
+<?xml version="1.0" encoding="utf-8"?>
2
+<!-- Generator: Adobe Illustrator 17.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
3
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
4
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
5
+	 width="12px" height="14px" viewBox="0 0 12 14" enable-background="new 0 0 12 14" xml:space="preserve">
6
+<g>
7
+	<path fill="#404040" d="M9.121,7.139L5.397,12H2.778l3.726-4.861L2.778,2.286h2.619L9.121,7.139z"/>
8
+</g>
9
+</svg>

+ 9 - 0
tracim/tracim/public/caldavzap/images/arrow_next_red.svg View File

@@ -0,0 +1,9 @@
1
+<?xml version="1.0" encoding="utf-8"?>
2
+<!-- Generator: Adobe Illustrator 17.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
3
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
4
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
5
+	 width="12px" height="14px" viewBox="0 0 12 14" enable-background="new 0 0 12 14" xml:space="preserve">
6
+<g>
7
+	<path fill="#E30613" d="M9.121,7.139L5.397,12H2.778l3.726-4.861L2.778,2.286h2.619L9.121,7.139z"/>
8
+</g>
9
+</svg>

+ 9 - 0
tracim/tracim/public/caldavzap/images/arrow_prev.svg View File

@@ -0,0 +1,9 @@
1
+<?xml version="1.0" encoding="utf-8"?>
2
+<!-- Generator: Adobe Illustrator 17.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
3
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
4
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
5
+	 width="12px" height="14px" viewBox="0 0 12 14" enable-background="new 0 0 12 14" xml:space="preserve">
6
+<g>
7
+	<path fill="#404040" d="M9.121,12H6.504L2.778,7.139l3.726-4.854h2.617L5.397,7.139L9.121,12z"/>
8
+</g>
9
+</svg>

+ 9 - 0
tracim/tracim/public/caldavzap/images/arrow_prev_red.svg View File

@@ -0,0 +1,9 @@
1
+<?xml version="1.0" encoding="utf-8"?>
2
+<!-- Generator: Adobe Illustrator 17.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
3
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
4
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
5
+	 width="12px" height="14px" viewBox="0 0 12 14" enable-background="new 0 0 12 14" xml:space="preserve">
6
+<g>
7
+	<path fill="#E30613" d="M9.121,12H6.504L2.778,7.139l3.726-4.854h2.617L5.397,7.139L9.121,12z"/>
8
+</g>
9
+</svg>

+ 26 - 0
tracim/tracim/public/caldavzap/images/banner_calendar.svg View File

@@ -0,0 +1,26 @@
1
+<?xml version="1.0" encoding="utf-8"?>
2
+<!-- Generator: Adobe Illustrator 17.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
3
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
4
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
5
+	 width="36px" height="36px" viewBox="0 0 36 36" enable-background="new 0 0 36 36" xml:space="preserve">
6
+<rect x="2" y="10" fill="#FFFFFF" width="32" height="24"/>
7
+<g>
8
+	<path fill="#585858" d="M24,1v4c0,0.551,0.448,1,1,1h1c0.552,0,1-0.449,1-1V1c0-0.551-0.448-1-1-1h-1C24.448,0,24,0.449,24,1z"/>
9
+	<path fill="#585858" d="M33,3h-4v2c0,1.654-1.346,3-3,3h-1c-1.654,0-3-1.346-3-3V3h-8v2c0,1.654-1.346,3-3,3h-1
10
+		C8.346,8,7,6.654,7,5V3H3C1.346,3,0,4.346,0,6v27c0,1.654,1.346,3,3,3h30c1.654,0,3-1.346,3-3V6C36,4.346,34.654,3,33,3z M34,33
11
+		c0,0.552-0.448,1-1,1H3c-0.551,0-1-0.448-1-1V10h32V33z"/>
12
+	<path fill="#585858" d="M9,1v4c0,0.551,0.449,1,1,1h1c0.551,0,1-0.449,1-1V1c0-0.551-0.449-1-1-1h-1C9.449,0,9,0.449,9,1z"/>
13
+</g>
14
+<path fill="#585858" d="M11,17c0,0.552-0.448,1-1,1H8c-0.552,0-1-0.448-1-1v-2c0-0.552,0.448-1,1-1h2c0.552,0,1,0.448,1,1V17z"/>
15
+<path fill="#585858" d="M17,17c0,0.552-0.448,1-1,1h-2c-0.552,0-1-0.448-1-1v-2c0-0.552,0.448-1,1-1h2c0.552,0,1,0.448,1,1V17z"/>
16
+<path fill="#585858" d="M23,17c0,0.552-0.448,1-1,1h-2c-0.552,0-1-0.448-1-1v-2c0-0.552,0.448-1,1-1h2c0.552,0,1,0.448,1,1V17z"/>
17
+<path fill="#585858" d="M29,17c0,0.552-0.448,1-1,1h-2c-0.552,0-1-0.448-1-1v-2c0-0.552,0.448-1,1-1h2c0.552,0,1,0.448,1,1V17z"/>
18
+<path fill="#585858" d="M11,23c0,0.552-0.448,1-1,1H8c-0.552,0-1-0.448-1-1v-2c0-0.552,0.448-1,1-1h2c0.552,0,1,0.448,1,1V23z"/>
19
+<path fill="#585858" d="M17,23c0,0.552-0.448,1-1,1h-2c-0.552,0-1-0.448-1-1v-2c0-0.552,0.448-1,1-1h2c0.552,0,1,0.448,1,1V23z"/>
20
+<path fill="#585858" d="M23,23c0,0.552-0.448,1-1,1h-2c-0.552,0-1-0.448-1-1v-2c0-0.552,0.448-1,1-1h2c0.552,0,1,0.448,1,1V23z"/>
21
+<path fill="#585858" d="M29,23c0,0.552-0.448,1-1,1h-2c-0.552,0-1-0.448-1-1v-2c0-0.552,0.448-1,1-1h2c0.552,0,1,0.448,1,1V23z"/>
22
+<path fill="#585858" d="M11,29c0,0.552-0.448,1-1,1H8c-0.552,0-1-0.448-1-1v-2c0-0.552,0.448-1,1-1h2c0.552,0,1,0.448,1,1V29z"/>
23
+<path fill="#585858" d="M17,29c0,0.552-0.448,1-1,1h-2c-0.552,0-1-0.448-1-1v-2c0-0.552,0.448-1,1-1h2c0.552,0,1,0.448,1,1V29z"/>
24
+<path fill="#585858" d="M23,29c0,0.552-0.448,1-1,1h-2c-0.552,0-1-0.448-1-1v-2c0-0.552,0.448-1,1-1h2c0.552,0,1,0.448,1,1V29z"/>
25
+<path fill="#585858" d="M29,29c0,0.552-0.448,1-1,1h-2c-0.552,0-1-0.448-1-1v-2c0-0.552,0.448-1,1-1h2c0.552,0,1,0.448,1,1V29z"/>
26
+</svg>

+ 12 - 0
tracim/tracim/public/caldavzap/images/banner_logout.svg View File

@@ -0,0 +1,12 @@
1
+<?xml version="1.0" encoding="utf-8"?>
2
+<!-- Generator: Adobe Illustrator 17.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
3
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
4
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
5
+	 width="36" height="36" viewBox="0 0 36 36" enable-background="new 0 0 36 36" xml:space="preserve">
6
+<rect x="2" y="4" fill="#FFFFFF" width="32" height="30"/>
7
+<path fill="#585858" d="M33,36H3c-1.7,0-3-1.3-3-3V5c0-1.7,1.3-3,3-3h30c1.7,0,3,1.3,3,3v28C36,34.7,34.7,36,33,36z M3,4
8
+	C2.4,4,2,4.4,2,5v28c0,0.6,0.4,1,1,1h30c0.6,0,1-0.4,1-1V5c0-0.6-0.4-1-1-1H3z"/>
9
+<path fill="#585858" d="M24,11.4l-1.7,2.5c2,1.4,3.2,3.6,3.2,6.1c0,4.1-3.4,7.5-7.5,7.5s-7.5-3.4-7.5-7.5c0-2.5,1.3-4.8,3.2-6.1
10
+	L12,11.4c-2.7,1.9-4.5,5-4.5,8.6c0,5.8,4.7,10.5,10.5,10.5S28.5,25.8,28.5,20C28.5,16.4,26.7,13.3,24,11.4z"/>
11
+<path fill="#585858" d="M20,18c0,0.6-0.4,1-1,1h-2c-0.6,0-1-0.4-1-1V9c0-0.6,0.4-1,1-1h2c0.6,0,1,0.4,1,1V18z"/>
12
+</svg>

+ 55 - 0
tracim/tracim/public/caldavzap/images/banner_refresh.svg View File

@@ -0,0 +1,55 @@
1
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
2
+<!-- Generator: Adobe Illustrator 15.1.0, SVG Export Plug-In  -->
3
+
4
+<svg
5
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
6
+   xmlns:cc="http://creativecommons.org/ns#"
7
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
8
+   xmlns:svg="http://www.w3.org/2000/svg"
9
+   xmlns="http://www.w3.org/2000/svg"
10
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
11
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
12
+   version="1.1"
13
+   x="0px"
14
+   y="0px"
15
+   width="36"
16
+   height="36"
17
+   viewBox="0 0 36 36"
18
+   overflow="visible"
19
+   enable-background="new 0 0 16 16"
20
+   xml:space="preserve"
21
+   id="svg2"
22
+   inkscape:version="0.91 r13725"
23
+   sodipodi:docname="banner_refresh.svg"
24
+   style="overflow:visible"><metadata
25
+     id="metadata10"><rdf:RDF><cc:Work
26
+         rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
27
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><sodipodi:namedview
28
+     pagecolor="#ffffff"
29
+     bordercolor="#666666"
30
+     borderopacity="1"
31
+     objecttolerance="10"
32
+     gridtolerance="10"
33
+     guidetolerance="10"
34
+     inkscape:pageopacity="0"
35
+     inkscape:pageshadow="2"
36
+     inkscape:window-width="878"
37
+     inkscape:window-height="712"
38
+     id="namedview8"
39
+     showgrid="false"
40
+     inkscape:zoom="10.429825"
41
+     inkscape:cx="8.9828796"
42
+     inkscape:cy="17.443344"
43
+     inkscape:window-x="968"
44
+     inkscape:window-y="376"
45
+     inkscape:window-maximized="0"
46
+     inkscape:current-layer="svg2" /><defs
47
+     id="defs4" /><path
48
+     d="m 13.000411,10.815115 c 0,0 0,0 0,0 -2.390775,1.384529 -3.9961818,3.60752 -4.6588796,6.08285 -0.661363,2.47266 -0.380017,5.200329 1.0000458,7.594216 1.3813968,2.393887 3.6001638,4.002719 6.0709438,4.664943 2.472113,0.663559 5.196238,0.381847 7.587014,-1.001347 2.390776,-1.380524 3.997516,-3.603515 4.65888,-6.078845 0.661364,-2.47533 0.380018,-5.201664 -0.998712,-7.594217 -0.456022,-0.790396 -1.004046,-1.492674 -1.621408,-2.102829 -0.620028,-0.611489 -1.306727,-1.132189 -2.041427,-1.556761 l -0.837371,1.453956 -0.838706,1.452621 c 0.492023,0.284383 0.953378,0.623506 1.36673,1.02805 0.414685,0.401874 0.782702,0.863829 1.085383,1.391205 0.920042,1.59548 1.106717,3.415261 0.666697,5.065481 -0.441354,1.650221 -1.512069,3.132214 -3.106809,4.052119 -1.592072,0.921239 -3.408156,1.109492 -5.056232,0.667564 -1.648075,-0.443263 -3.12681,-1.515372 -4.048185,-3.110851 -0.920042,-1.59548 -1.10805,-3.415262 -0.666696,-5.065482 0.441353,-1.65022 1.512068,-3.132214 3.105475,-4.053453 l 1.333394,2.312444 2.166766,-3.757054 L 20.334079,8.5 l -4.333531,0 -4.333531,0.0027 1.333394,2.312445 z"
49
+     id="path6"
50
+     inkscape:connector-curvature="0"
51
+     style="fill:#585858" /><path
52
+     inkscape:connector-curvature="0"
53
+     style="fill:#585858"
54
+     d="M 33,36 3,36 C 1.3,36 0,34.7 0,33 L 0,5 C 0,3.3 1.3,2 3,2 l 30,0 c 1.7,0 3,1.3 3,3 l 0,28 c 0,1.7 -1.3,3 -3,3 z M 3,4 C 2.4,4 2,4.4 2,5 l 0,28 c 0,0.6 0.4,1 1,1 l 30,0 c 0.6,0 1,-0.4 1,-1 L 34,5 C 34,4.4 33.6,4 33,4 L 3,4 Z"
55
+     id="path5" /></svg>

+ 21 - 0
tracim/tracim/public/caldavzap/images/banner_todo.svg View File

@@ -0,0 +1,21 @@
1
+<?xml version="1.0" encoding="utf-8"?>
2
+<!-- Generator: Adobe Illustrator 17.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
3
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
4
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
5
+	 width="36px" height="36px" viewBox="0 0 36 36" enable-background="new 0 0 36 36" xml:space="preserve">
6
+<rect x="2" y="4" fill="#FFFFFF" width="32" height="30"/>
7
+<path fill="#585858" d="M33,36H3c-1.654,0-3-1.346-3-3V5c0-1.654,1.346-3,3-3h30c1.654,0,3,1.346,3,3v28C36,34.654,34.654,36,33,36z
8
+	 M3,4C2.449,4,2,4.449,2,5v28c0,0.552,0.449,1,1,1h30c0.552,0,1-0.448,1-1V5c0-0.551-0.448-1-1-1H3z"/>
9
+<path fill="#585858" d="M9,10c0,0.552-0.448,1-1,1H6c-0.552,0-1-0.448-1-1V8c0-0.552,0.448-1,1-1h2c0.552,0,1,0.448,1,1V10z"/>
10
+<path fill="#585858" d="M9,22c0,0.552-0.448,1-1,1H6c-0.552,0-1-0.448-1-1v-2c0-0.552,0.448-1,1-1h2c0.552,0,1,0.448,1,1V22z"/>
11
+<path fill="#585858" d="M9,16c0,0.552-0.448,1-1,1H6c-0.552,0-1-0.448-1-1v-2c0-0.552,0.448-1,1-1h2c0.552,0,1,0.448,1,1V16z"/>
12
+<path fill="#585858" d="M31,10c0,0.552-0.448,1-1,1H12c-0.552,0-1-0.448-1-1V8c0-0.552,0.448-1,1-1h18c0.552,0,1,0.448,1,1V10z"/>
13
+<path fill="#585858" d="M31,16c0,0.552-0.448,1-1,1H12c-0.552,0-1-0.448-1-1v-2c0-0.552,0.448-1,1-1h18c0.552,0,1,0.448,1,1V16z"/>
14
+<path fill="#585858" d="M31,30c0,0.552-0.448,1-1,1H12c-0.552,0-1-0.448-1-1V20c0-0.552,0.448-1,1-1h18c0.552,0,1,0.448,1,1V30z"/>
15
+<g>
16
+	<path fill="#FFFFFF" d="M20.657,26.414c0.391,0.391,0.391,1.024,0,1.414l-0.707,0.707c-0.391,0.391-1.024,0.391-1.414,0
17
+		l-2.828-2.828c-0.391-0.391-0.391-1.024,0-1.414l0.707-0.707c0.391-0.391,1.024-0.391,1.414,0L20.657,26.414z"/>
18
+	<path fill="#FFFFFF" d="M24.899,22.172c0.391,0.391,0.391,1.024,0,1.414l-4.95,4.95c-0.391,0.391-1.024,0.391-1.414,0l-0.707-0.707
19
+		c-0.391-0.391-0.391-1.024,0-1.414l4.95-4.95c0.391-0.391,1.024-0.391,1.414,0L24.899,22.172z"/>
20
+</g>
21
+</svg>

+ 20 - 0
tracim/tracim/public/caldavzap/images/calendarB.svg View File

@@ -0,0 +1,20 @@
1
+<?xml version="1.0" encoding="utf-8"?>
2
+<!-- Generator: Adobe Illustrator 17.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
3
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
4
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
5
+	 width="13px" height="14px" viewBox="0 0 13 14" enable-background="new 0 0 13 14" xml:space="preserve">
6
+<polygon fill="none" points="12.359,12.695 12.359,12.694 7,12.694 7,12.695 12.357,12.695 "/>
7
+<rect x="4.32" y="10.015" fill="none" width="0.001" height="5.359"/>
8
+<path fill="#585858" d="M2.981,3.986c0.369,0,0.669-0.3,0.669-0.669V0.638c0-0.369-0.299-0.67-0.669-0.67s-0.67,0.301-0.67,0.67
9
+	v2.679C2.311,3.686,2.611,3.986,2.981,3.986z"/>
10
+<path fill="#585858" d="M10.02,3.986c0.371,0,0.67-0.3,0.67-0.669V0.638c-0.002-0.369-0.299-0.67-0.67-0.67
11
+	c-0.369,0-0.67,0.301-0.67,0.67v2.679C9.35,3.686,9.651,3.986,10.02,3.986z"/>
12
+<path fill="#585858" d="M12.029,2.312h-0.672v1.005c0,0.737-0.603,1.339-1.34,1.339c-0.735,0-1.34-0.603-1.34-1.339V2.312H6v3.684
13
+	h5.691h1.007V4.991V2.982C12.698,2.613,12.398,2.312,12.029,2.312z"/>
14
+<path fill="#585858" d="M4.32,2.312v1.005c0,0.737-0.602,1.339-1.339,1.339s-1.34-0.603-1.34-1.339V2.312h-0.67
15
+	c-0.369,0-0.67,0.3-0.67,0.67v2.009v1.005h1.004H7V2.312H4.32z"/>
16
+<path fill="#585858" d="M0.302,13.365c0,0.369,0.301,0.668,0.67,0.668H7v-1.338H1.641v-0.001V8.006H7v-1.34H0.302V13.365z"/>
17
+<path fill="#585858" d="M11.359,8.006v4.688v0.001h-0.002H6v1.338h6.029c0.369,0,0.669-0.299,0.669-0.668V6.666H6v1.34H11.359z"/>
18
+<rect x="6" y="8.006" fill="#FFFFFF" stroke="#FFFFFF" stroke-miterlimit="10" width="5.359" height="4.688"/>
19
+<rect x="1.641" y="8.006" fill="#FFFFFF" stroke="#FFFFFF" stroke-miterlimit="10" width="5.359" height="4.688"/>
20
+</svg>

+ 49 - 0
tracim/tracim/public/caldavzap/images/cdz_logo.svg View File

@@ -0,0 +1,49 @@
1
+<?xml version="1.0" encoding="utf-8"?>
2
+<!-- Generator: Adobe Illustrator 17.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
3
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
4
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
5
+	 width="126px" height="85px" viewBox="0 0 126 85" enable-background="new 0 0 126 85" xml:space="preserve">
6
+<g>
7
+	<rect x="58" y="21" fill="#FFFFFF" width="64" height="60"/>
8
+	<path fill="#585858" d="M120,85H60c-3.309,0-6-2.691-6-6V23c0-3.309,2.691-6,6-6h60c3.309,0,6,2.691,6,6v56
9
+		C126,82.309,123.309,85,120,85z M60,21c-1.103,0-2,0.897-2,2v56c0,1.104,0.897,2,2,2h60c1.104,0,2-0.896,2-2V23
10
+		c0-1.103-0.896-2-2-2H60z"/>
11
+	<path fill="#585858" d="M72,33c0,1.105-0.895,2-2,2h-4c-1.105,0-2-0.895-2-2v-4c0-1.105,0.895-2,2-2h4c1.105,0,2,0.895,2,2V33z"/>
12
+	<path fill="#585858" d="M72,57c0,1.105-0.895,2-2,2h-4c-1.105,0-2-0.895-2-2v-4c0-1.105,0.895-2,2-2h4c1.105,0,2,0.895,2,2V57z"/>
13
+	<path fill="#585858" d="M72,45c0,1.105-0.895,2-2,2h-4c-1.105,0-2-0.895-2-2v-4c0-1.105,0.895-2,2-2h4c1.105,0,2,0.895,2,2V45z"/>
14
+	<path fill="#585858" d="M116,33c0,1.105-0.895,2-2,2H78c-1.105,0-2-0.895-2-2v-4c0-1.105,0.895-2,2-2h36c1.105,0,2,0.895,2,2V33z"
15
+		/>
16
+	<path fill="#585858" d="M116,45c0,1.105-0.895,2-2,2H78c-1.105,0-2-0.895-2-2v-4c0-1.105,0.895-2,2-2h36c1.105,0,2,0.895,2,2V45z"
17
+		/>
18
+	<path fill="#585858" d="M116,73c0,1.105-0.895,2-2,2H78c-1.105,0-2-0.895-2-2V53c0-1.105,0.895-2,2-2h36c1.105,0,2,0.895,2,2V73z"
19
+		/>
20
+	<g>
21
+		<path fill="#FFFFFF" d="M95.314,65.828c0.781,0.781,0.781,2.047,0,2.828l-1.414,1.414c-0.781,0.781-2.047,0.781-2.828,0
22
+			l-5.657-5.657c-0.781-0.781-0.781-2.047,0-2.828l1.414-1.414c0.781-0.781,2.047-0.781,2.828,0L95.314,65.828z"/>
23
+		<path fill="#FFFFFF" d="M103.799,57.343c0.781,0.781,0.781,2.047,0,2.828l-9.899,9.899c-0.781,0.781-2.047,0.781-2.828,0
24
+			l-1.414-1.414c-0.781-0.781-0.781-2.047,0-2.828l9.899-9.899c0.781-0.781,2.047-0.781,2.828,0L103.799,57.343z"/>
25
+	</g>
26
+</g>
27
+<g>
28
+	<rect x="4" y="20" fill="#FFFFFF" width="64" height="48"/>
29
+	<g>
30
+		<path fill="#585858" d="M48,2v8c0,1.102,0.896,2,2,2h2c1.104,0,2-0.898,2-2V2c0-1.102-0.896-2-2-2h-2C48.896,0,48,0.898,48,2z"/>
31
+		<path fill="#585858" d="M66,6h-8v4c0,3.308-2.692,6-6,6h-2c-3.308,0-6-2.692-6-6V6H28v4c0,3.308-2.692,6-6,6h-2
32
+			c-3.308,0-6-2.692-6-6V6H6c-3.308,0-6,2.692-6,6v54c0,3.308,2.692,6,6,6h60c3.308,0,6-2.692,6-6V12C72,8.692,69.308,6,66,6z
33
+			 M68,66c0,1.104-0.896,2-2,2H6c-1.102,0-2-0.896-2-2V20h64V66z"/>
34
+		<path fill="#585858" d="M18,2v8c0,1.102,0.898,2,2,2h2c1.102,0,2-0.898,2-2V2c0-1.102-0.898-2-2-2h-2C18.898,0,18,0.898,18,2z"/>
35
+	</g>
36
+	<path fill="#585858" d="M22,34c0,1.104-0.896,2-2,2h-4c-1.104,0-2-0.896-2-2v-4c0-1.104,0.896-2,2-2h4c1.104,0,2,0.896,2,2V34z"/>
37
+	<path fill="#585858" d="M34,34c0,1.104-0.896,2-2,2h-4c-1.104,0-2-0.896-2-2v-4c0-1.104,0.896-2,2-2h4c1.104,0,2,0.896,2,2V34z"/>
38
+	<path fill="#585858" d="M46,34c0,1.104-0.896,2-2,2h-4c-1.104,0-2-0.896-2-2v-4c0-1.104,0.896-2,2-2h4c1.104,0,2,0.896,2,2V34z"/>
39
+	<path fill="#585858" d="M58,34c0,1.104-0.896,2-2,2h-4c-1.104,0-2-0.896-2-2v-4c0-1.104,0.896-2,2-2h4c1.104,0,2,0.896,2,2V34z"/>
40
+	<path fill="#585858" d="M22,46c0,1.104-0.896,2-2,2h-4c-1.104,0-2-0.896-2-2v-4c0-1.104,0.896-2,2-2h4c1.104,0,2,0.896,2,2V46z"/>
41
+	<path fill="#585858" d="M34,46c0,1.104-0.896,2-2,2h-4c-1.104,0-2-0.896-2-2v-4c0-1.104,0.896-2,2-2h4c1.104,0,2,0.896,2,2V46z"/>
42
+	<path fill="#585858" d="M46,46c0,1.104-0.896,2-2,2h-4c-1.104,0-2-0.896-2-2v-4c0-1.104,0.896-2,2-2h4c1.104,0,2,0.896,2,2V46z"/>
43
+	<path fill="#585858" d="M58,46c0,1.104-0.896,2-2,2h-4c-1.104,0-2-0.896-2-2v-4c0-1.104,0.896-2,2-2h4c1.104,0,2,0.896,2,2V46z"/>
44
+	<path fill="#585858" d="M22,58c0,1.104-0.896,2-2,2h-4c-1.104,0-2-0.896-2-2v-4c0-1.104,0.896-2,2-2h4c1.104,0,2,0.896,2,2V58z"/>
45
+	<path fill="#585858" d="M34,58c0,1.104-0.896,2-2,2h-4c-1.104,0-2-0.896-2-2v-4c0-1.104,0.896-2,2-2h4c1.104,0,2,0.896,2,2V58z"/>
46
+	<path fill="#585858" d="M46,58c0,1.104-0.896,2-2,2h-4c-1.104,0-2-0.896-2-2v-4c0-1.104,0.896-2,2-2h4c1.104,0,2,0.896,2,2V58z"/>
47
+	<path fill="#585858" d="M58,58c0,1.104-0.896,2-2,2h-4c-1.104,0-2-0.896-2-2v-4c0-1.104,0.896-2,2-2h4c1.104,0,2,0.896,2,2V58z"/>
48
+</g>
49
+</svg>

+ 22 - 0
tracim/tracim/public/caldavzap/images/cloud.svg View File

@@ -0,0 +1,22 @@
1
+<?xml version="1.0" encoding="utf-8"?>
2
+<!-- Generator: Adobe Illustrator 17.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
3
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
4
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
5
+	 width="503px" height="311px" viewBox="0 0 503 311" enable-background="new 0 0 503 311" xml:space="preserve">
6
+<g>
7
+	<path fill="#FFFFFF" d="M414.811,139.362l-2.415,0.019l-0.036-1.951c-0.66-35.798-15.162-69.348-40.835-94.472
8
+		C345.82,17.803,311.809,3.949,275.758,3.949c-53.917,0-102.933,31.696-124.876,80.752l-0.797,1.781l-1.8-0.77
9
+		c-6.412-2.746-13.224-4.138-20.244-4.138c-28.286,0-51.298,22.909-51.298,51.069c0,1.801,0.102,3.658,0.304,5.52l0.202,1.878
10
+		l-1.876,0.285c-19.686,2.992-37.751,12.938-50.865,28.006c-13.246,15.22-20.541,34.708-20.541,54.873
11
+		c0,46.231,37.782,83.845,84.22,83.845h326.623c46.44,0,84.22-37.613,84.22-83.845S461.251,139.362,414.811,139.362z"/>
12
+	<path fill="#585858" d="M416.281,135.425c-1.157-36.111-16.017-69.882-41.972-95.283C347.856,14.256,312.857,0,275.758,0
13
+		c-54.84,0-104.754,31.868-127.706,81.35c-6.379-2.472-13.102-3.724-20.01-3.724c-30.474,0-55.267,24.682-55.267,55.018
14
+		c0,1.338,0.052,2.704,0.155,4.08c-19.9,3.46-38.101,13.719-51.421,29.024C7.639,181.685,0,202.092,0,223.206
15
+		C0,271.616,39.561,311,88.189,311h326.623C463.439,311,503,271.616,503,223.206C503,175.285,464.234,136.206,416.281,135.425z
16
+		 M414.811,307.051H88.189c-46.439,0-84.22-37.613-84.22-83.845c0-20.166,7.295-39.653,20.542-54.874
17
+		c13.114-15.068,31.177-25.014,50.865-28.006l1.876-0.285l-0.202-1.878c-0.201-1.862-0.304-3.719-0.304-5.52
18
+		c0-28.16,23.012-51.069,51.298-51.069c7.02,0,13.831,1.392,20.244,4.138l1.8,0.77l0.797-1.781
19
+		c21.942-49.055,70.958-80.751,124.875-80.751c36.051,0,70.062,13.854,95.767,39.009c25.673,25.123,40.176,58.674,40.835,94.472
20
+		l0.036,1.951l2.415-0.019c46.44,0,84.22,37.613,84.22,83.845S461.251,307.051,414.811,307.051z"/>
21
+</g>
22
+</svg>

+ 11 - 0
tracim/tracim/public/caldavzap/images/delegation.svg View File

@@ -0,0 +1,11 @@
1
+<?xml version="1.0" encoding="utf-8"?>
2
+<!-- Generator: Adobe Illustrator 17.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
3
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
4
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
5
+	 width="20px" height="16px" viewBox="0 0 20 16" enable-background="new 0 0 20 16" xml:space="preserve">
6
+<rect x="0" y="2" fill="#585858" width="20" height="2"/>
7
+<rect x="18" y="2" fill="#585858" width="2" height="8"/>
8
+<rect x="0" y="7" fill="#585858" width="14" height="2"/>
9
+<rect x="12" y="7" fill="#585858" width="2" height="5"/>
10
+<rect x="0" y="12" fill="#585858" width="8" height="2"/>
11
+</svg>

+ 14 - 0
tracim/tracim/public/caldavzap/images/dp_left.svg View File

@@ -0,0 +1,14 @@
1
+<?xml version="1.0" encoding="utf-8"?>
2
+<!-- Generator: Adobe Illustrator 15.1.0, SVG Export Plug-In  -->
3
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
4
+	<!ENTITY ns_flows "http://ns.adobe.com/Flows/1.0/">
5
+]>
6
+<svg version="1.1"
7
+	 xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/"
8
+	 x="0px" y="0px" width="17px" height="19px" viewBox="0 0 17 19" overflow="visible" enable-background="new 0 0 17 19"
9
+	 xml:space="preserve">
10
+<defs>
11
+</defs>
12
+<rect fill="#585858" width="17" height="19"/>
13
+<polygon fill="#FFFFFF" points="11,13 5,9.5 11,6 "/>
14
+</svg>

+ 14 - 0
tracim/tracim/public/caldavzap/images/dp_right.svg View File

@@ -0,0 +1,14 @@
1
+<?xml version="1.0" encoding="utf-8"?>
2
+<!-- Generator: Adobe Illustrator 15.1.0, SVG Export Plug-In  -->
3
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
4
+	<!ENTITY ns_flows "http://ns.adobe.com/Flows/1.0/">
5
+]>
6
+<svg version="1.1"
7
+	 xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/"
8
+	 x="0px" y="0px" width="17px" height="19px" viewBox="0 0 17 19" overflow="visible" enable-background="new 0 0 17 19"
9
+	 xml:space="preserve">
10
+<defs>
11
+</defs>
12
+<rect fill="#585858" width="17" height="19"/>
13
+<polygon fill="#FFFFFF" points="6,6 12,9.5 6,13 "/>
14
+</svg>

+ 0 - 0
tracim/tracim/public/caldavzap/images/error_b.svg View File


Some files were not shown because too many files changed in this diff