kaui 0.7.2 → 0.8.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (76) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/.travis.yml +1 -2
  4. data/Gemfile.lock +59 -38
  5. data/README.md +12 -9
  6. data/Rakefile +9 -0
  7. data/{lib/generators/kaui/install/templates/app/assets/javascripts/kaui/all.js → app/assets/javascripts/application.js} +2 -5
  8. data/{lib/generators/kaui/install/templates/app/assets/stylesheets/kaui/all.css → app/assets/stylesheets/application.css} +0 -4
  9. data/app/assets/stylesheets/bootstrap_and_overrides.css +7 -0
  10. data/app/controllers/kaui/admin_allowed_users_controller.rb +48 -0
  11. data/app/controllers/kaui/admin_tenants_controller.rb +97 -0
  12. data/app/controllers/kaui/engine_controller.rb +28 -31
  13. data/app/controllers/kaui/engine_controller_util.rb +33 -0
  14. data/app/controllers/kaui/login_proxy_controller.rb +11 -0
  15. data/app/controllers/kaui/sessions_controller.rb +12 -0
  16. data/app/controllers/kaui/tenants_controller.rb +60 -0
  17. data/app/models/kaui/ability.rb +20 -3
  18. data/app/models/kaui/admin_tenant.rb +10 -0
  19. data/app/models/kaui/allowed_user.rb +8 -0
  20. data/app/models/kaui/allowed_user_tenant.rb +6 -0
  21. data/app/models/kaui/killbill_authenticatable.rb +5 -18
  22. data/app/models/kaui/tenant.rb +13 -0
  23. data/app/models/kaui/user.rb +14 -16
  24. data/app/views/kaui/admin_allowed_users/index.html.erb +23 -0
  25. data/app/views/kaui/admin_allowed_users/new.html.erb +22 -0
  26. data/app/views/kaui/admin_allowed_users/show.html.erb +53 -0
  27. data/app/views/kaui/admin_tenants/index.html.erb +25 -0
  28. data/app/views/kaui/admin_tenants/new.html.erb +32 -0
  29. data/app/views/kaui/admin_tenants/show.html.erb +68 -0
  30. data/app/views/kaui/invoices/show.html.erb +1 -1
  31. data/app/views/kaui/tenants/index.html.erb +17 -0
  32. data/config/initializers/killbill_authenticatable.rb +3 -5
  33. data/config/locales/en.bootstrap.yml +18 -0
  34. data/config/routes.rb +27 -1
  35. data/config/symmetric-encryption.yml +135 -0
  36. data/db/ddl.sql +33 -2
  37. data/db/migrate/20130812155313_devise_create_kaui_users.rb +1 -3
  38. data/db/migrate/20150109214021_create_kaui_tenants.rb +12 -0
  39. data/db/migrate/20150112232813_create_kaui_allowed_users.rb +19 -0
  40. data/kaui.gemspec +5 -3
  41. data/lib/kaui.rb +49 -1
  42. data/lib/kaui/version.rb +1 -1
  43. data/test/dummy/config/application.rb +3 -0
  44. data/test/dummy/config/database.yml +9 -0
  45. data/test/dummy/config/environments/development.rb +2 -2
  46. data/test/dummy/config/initializers/killbill_client.rb +2 -0
  47. data/test/dummy/config/symmetric-encryption.yml +135 -0
  48. data/test/dummy/db/migrate/{20130819152643_devise_create_kaui_users.kaui.rb → 20150116052157_devise_create_kaui_users.kaui.rb} +1 -3
  49. data/test/dummy/db/migrate/20150116052158_create_kaui_tenants.kaui.rb +13 -0
  50. data/test/dummy/db/migrate/20150116052159_create_kaui_allowed_users.kaui.rb +20 -0
  51. data/test/dummy/db/schema.rb +29 -3
  52. data/test/functional/kaui/admin_allowed_users_controller_test.rb +30 -0
  53. data/test/functional/kaui/admin_tenants_controller_test.rb +35 -0
  54. data/test/functional/kaui/functional_test_helper.rb +2 -50
  55. data/test/functional/kaui/functional_test_helper_nosetup.rb +53 -0
  56. data/test/functional/kaui/invoices_controller_test.rb +22 -0
  57. data/test/functional/kaui/tenants_controller_test.rb +60 -0
  58. data/test/integration/kaui/integration_test_helper.rb +2 -0
  59. data/test/integration/kaui/navigation_test.rb +1 -2
  60. data/test/killbill_test_helper.rb +46 -4
  61. data/test/test_helper.rb +1 -0
  62. data/test/unit/helpers/kaui/admin_allowed_users_helper_test.rb +6 -0
  63. data/test/unit/helpers/kaui/admin_tenants_helper_test.rb +6 -0
  64. data/test/unit/helpers/kaui/tenants_helper_test.rb +6 -0
  65. data/test/unit/kaui/allowed_user_test.rb +34 -0
  66. data/test/unit/kaui/tenant_test.rb +19 -0
  67. data/vendor/assets/javascripts/jquery.dataTables.min.js +155 -0
  68. metadata +86 -21
  69. data/app/assets/javascripts/kaui/analytics.js +0 -71
  70. data/app/assets/stylesheets/kaui/analytics.css +0 -30
  71. data/test/dummy/app/assets/javascripts/application.js +0 -21
  72. data/test/dummy/app/assets/stylesheets/application.css +0 -15
  73. data/test/dummy/app/views/layouts/application.html.erb +0 -48
  74. data/vendor/assets/javascripts/js/bootstrap-datepicker.cd46d38.js +0 -1211
  75. data/vendor/assets/javascripts/js/bootstrap.v2.2.1.min.js +0 -6
  76. data/vendor/assets/javascripts/js/jquery.dataTables.v1.9.3.min.js +0 -156
@@ -1,15 +0,0 @@
1
- /*
2
- * This is a manifest file that'll be compiled into application.css, which will include all the files
3
- * listed below.
4
- *
5
- * Any CSS and SCSS file within this directory, lib/assets/stylesheets, vendor/assets/stylesheets,
6
- * or vendor/assets/stylesheets of plugins, if any, can be referenced here using a relative path.
7
- *
8
- * You're free to add application-wide styles to this file and they'll appear at the top of the
9
- * compiled file, but it's generally better to create a new file per style scope.
10
- *
11
- *= require css/bootstrap.v2.2.1.min
12
- *= require kaui/analytics
13
- *= require_self
14
- *= require_tree .
15
- */
@@ -1,48 +0,0 @@
1
- <!DOCTYPE html>
2
- <html>
3
- <head>
4
- <title>Kaui Dummy app</title>
5
- <%= stylesheet_link_tag "application", "bootstrap.v2.0.4.min.css", :media => "all" %>
6
- <%= javascript_include_tag "application", "bootstrap.v2.0.4.min.js", "jquery.dataTables.v1.9.3.min.js" %>
7
- <%= csrf_meta_tags %>
8
- </head>
9
- <body>
10
- <div class="navbar">
11
- <div class="navbar-inner">
12
- <div class="container">
13
- <ul class="nav">
14
- <li <%= "class='active'" if params[:controller] == 'accounts' %>><%= link_to "Accounts", kaui_engine.accounts_path %></li>
15
- <li <%= "class='active'" if params[:controller] == 'account_timelines' %>><%= link_to "Account timelines", kaui_engine.account_timelines_path %></li>
16
- <li <%= "class='active'" if params[:controller] == 'bundles' %>><%= link_to "Bundles", kaui_engine.bundles_path %></li>
17
- <li <%= "class='active'" if params[:controller] == 'subscriptions' %>><%= link_to "Subscriptions", kaui_engine.subscriptions_path %></li>
18
- <li <%= "class='active'" if params[:controller] == 'chargebacks' %>><%= link_to "Chargebacks", kaui_engine.chargebacks_path %></li>
19
- <li <%= "class='active'" if params[:controller] == 'credits' %>><%= link_to "Credits", kaui_engine.credits_path %></li>
20
- <li <%= "class='active'" if params[:controller] == 'external_payments' %>><%= link_to "External payments", kaui_engine.external_payments_path %></li>
21
- <li <%= "class='active'" if params[:controller] == 'refunds' %>><%= link_to "Refunds", kaui_engine.refunds_path %></li>
22
- <li <%= "class='active'" if params[:controller] == 'invoices' %>><%= link_to "Invoices", kaui_engine.invoices_path %></li>
23
- <li <%= "class='active'" if params[:controller] == 'invoice_items' %>><%= link_to "Invoice items", kaui_engine.invoice_items_path %></li>
24
- <li <%= "class='active'" if params[:controller] == 'tag_definitions' %>><%= link_to "Tag definitions", kaui_engine.tag_definitions_path %></li>
25
- <li <%= "class='active'" if params[:controller] == 'analytics' %>><%= link_to "Analytics", kaui_engine.analytics_path %></li>
26
- </ul>
27
- </div>
28
- </div>
29
- </div>
30
- <div class="container">
31
- <% if flash[:error] %>
32
- <div class="row-fluid">
33
- <div class="span12">
34
- <div class="alert alert-error"><%= flash[:error] %></div>
35
- </div>
36
- </div>
37
- <% end %>
38
- <% if flash[:notice] %>
39
- <div class="row-fluid">
40
- <div class="span12">
41
- <div class="alert alert-info"><%= flash[:notice] %></div>
42
- </div>
43
- </div>
44
- <% end %>
45
- <%= yield %>
46
- </div>
47
- </body>
48
- </html>
@@ -1,1211 +0,0 @@
1
- /* =========================================================
2
- * bootstrap-datepicker.js
3
- * http://www.eyecon.ro/bootstrap-datepicker
4
- * =========================================================
5
- * Copyright 2012 Stefan Petre
6
- * Improvements by Andrew Rowls
7
- *
8
- * Licensed under the Apache License, Version 2.0 (the "License");
9
- * you may not use this file except in compliance with the License.
10
- * You may obtain a copy of the License at
11
- *
12
- * http://www.apache.org/licenses/LICENSE-2.0
13
- *
14
- * Unless required by applicable law or agreed to in writing, software
15
- * distributed under the License is distributed on an "AS IS" BASIS,
16
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17
- * See the License for the specific language governing permissions and
18
- * limitations under the License.
19
- * ========================================================= */
20
-
21
- !function( $ ) {
22
-
23
- function UTCDate(){
24
- return new Date(Date.UTC.apply(Date, arguments));
25
- }
26
- function UTCToday(){
27
- var today = new Date();
28
- return UTCDate(today.getUTCFullYear(), today.getUTCMonth(), today.getUTCDate());
29
- }
30
-
31
- // Picker object
32
-
33
- var Datepicker = function(element, options) {
34
- var that = this;
35
-
36
- this.element = $(element);
37
- this.language = options.language||this.element.data('date-language')||"en";
38
- this.language = this.language in dates ? this.language : "en";
39
- this.format = DPGlobal.parseFormat(options.format||this.element.data('date-format')||'mm/dd/yyyy');
40
- this.picker = $(DPGlobal.template)
41
- .appendTo('body')
42
- .on({
43
- click: $.proxy(this.click, this)
44
- });
45
- this.isInput = this.element.is('input');
46
- this.component = this.element.is('.date') ? this.element.find('.add-on') : false;
47
- this.hasInput = this.component && this.element.find('input').length;
48
- if(this.component && this.component.length === 0)
49
- this.component = false;
50
-
51
- if (this.isInput) {
52
- this.element.on({
53
- focus: $.proxy(this.show, this),
54
- keyup: $.proxy(this.update, this),
55
- keydown: $.proxy(this.keydown, this)
56
- });
57
- } else {
58
- if (this.component && this.hasInput){
59
- // For components that are not readonly, allow keyboard nav
60
- this.element.find('input').on({
61
- focus: $.proxy(this.show, this),
62
- keyup: $.proxy(this.update, this),
63
- keydown: $.proxy(this.keydown, this)
64
- });
65
-
66
- this.component.on('click', $.proxy(this.show, this));
67
- } else {
68
- this.element.on('click', $.proxy(this.show, this));
69
- }
70
- }
71
-
72
- $(document).on('mousedown', function (e) {
73
- // Clicked outside the datepicker, hide it
74
- if ($(e.target).closest('.datepicker').length == 0) {
75
- that.hide();
76
- }
77
- });
78
-
79
- this.autoclose = false;
80
- if ('autoclose' in options) {
81
- this.autoclose = options.autoclose;
82
- } else if ('dateAutoclose' in this.element.data()) {
83
- this.autoclose = this.element.data('date-autoclose');
84
- }
85
-
86
- this.keyboardNavigation = true;
87
- if ('keyboardNavigation' in options) {
88
- this.keyboardNavigation = options.keyboardNavigation;
89
- } else if ('dateKeyboardNavigation' in this.element.data()) {
90
- this.keyboardNavigation = this.element.data('date-keyboard-navigation');
91
- }
92
-
93
- switch(options.startView || this.element.data('date-start-view')){
94
- case 2:
95
- case 'decade':
96
- this.viewMode = this.startViewMode = 2;
97
- break;
98
- case 1:
99
- case 'year':
100
- this.viewMode = this.startViewMode = 1;
101
- break;
102
- case 0:
103
- case 'month':
104
- default:
105
- this.viewMode = this.startViewMode = 0;
106
- break;
107
- }
108
-
109
- this.todayBtn = (options.todayBtn||this.element.data('date-today-btn')||false);
110
- this.todayHighlight = (options.todayHighlight||this.element.data('date-today-highlight')||false);
111
-
112
- this.weekStart = ((options.weekStart||this.element.data('date-weekstart')||dates[this.language].weekStart||0) % 7);
113
- this.weekEnd = ((this.weekStart + 6) % 7);
114
- this.startDate = -Infinity;
115
- this.endDate = Infinity;
116
- this.setStartDate(options.startDate||this.element.data('date-startdate'));
117
- this.setEndDate(options.endDate||this.element.data('date-enddate'));
118
- this.fillDow();
119
- this.fillMonths();
120
- this.update();
121
- this.showMode();
122
- };
123
-
124
- Datepicker.prototype = {
125
- constructor: Datepicker,
126
-
127
- show: function(e) {
128
- this.picker.show();
129
- this.height = this.component ? this.component.outerHeight() : this.element.outerHeight();
130
- this.update();
131
- this.place();
132
- $(window).on('resize', $.proxy(this.place, this));
133
- if (e ) {
134
- e.stopPropagation();
135
- e.preventDefault();
136
- }
137
- this.element.trigger({
138
- type: 'show',
139
- date: this.date
140
- });
141
- },
142
-
143
- hide: function(e){
144
- this.picker.hide();
145
- $(window).off('resize', this.place);
146
- this.viewMode = this.startViewMode;
147
- this.showMode();
148
- if (!this.isInput) {
149
- $(document).off('mousedown', this.hide);
150
- }
151
- if (e && e.currentTarget.value)
152
- this.setValue();
153
- this.element.trigger({
154
- type: 'hide',
155
- date: this.date
156
- });
157
- },
158
-
159
- getDate: function() {
160
- var d = this.getUTCDate();
161
- return new Date(d.getTime() + (d.getTimezoneOffset()*60000))
162
- },
163
-
164
- getUTCDate: function() {
165
- return this.date;
166
- },
167
-
168
- setDate: function(d) {
169
- this.setUTCDate(new Date(d.getTime() - (d.getTimezoneOffset()*60000)));
170
- },
171
-
172
- setUTCDate: function(d) {
173
- this.date = d;
174
- this.setValue();
175
- },
176
-
177
- setValue: function() {
178
- var formatted = DPGlobal.formatDate(this.date, this.format, this.language);
179
- if (!this.isInput) {
180
- if (this.component){
181
- this.element.find('input').prop('value', formatted);
182
- }
183
- this.element.data('date', formatted);
184
- } else {
185
- this.element.prop('value', formatted);
186
- }
187
- },
188
-
189
- setStartDate: function(startDate){
190
- this.startDate = startDate||-Infinity;
191
- if (this.startDate !== -Infinity) {
192
- this.startDate = DPGlobal.parseDate(this.startDate, this.format, this.language);
193
- }
194
- this.update();
195
- this.updateNavArrows();
196
- },
197
-
198
- setEndDate: function(endDate){
199
- this.endDate = endDate||Infinity;
200
- if (this.endDate !== Infinity) {
201
- this.endDate = DPGlobal.parseDate(this.endDate, this.format, this.language);
202
- }
203
- this.update();
204
- this.updateNavArrows();
205
- },
206
-
207
- place: function(){
208
- var zIndex = parseInt(this.element.parents().filter(function() {
209
- return $(this).css('z-index') != 'auto';
210
- }).first().css('z-index'))+10;
211
- var offset = this.component ? this.component.offset() : this.element.offset();
212
- this.picker.css({
213
- top: offset.top + this.height,
214
- left: offset.left,
215
- zIndex: zIndex
216
- });
217
- },
218
-
219
- update: function(){
220
- this.date = DPGlobal.parseDate(
221
- this.isInput ? this.element.prop('value') : this.element.data('date') || this.element.find('input').prop('value'),
222
- this.format, this.language
223
- );
224
- if (this.date < this.startDate) {
225
- this.viewDate = new Date(this.startDate);
226
- } else if (this.date > this.endDate) {
227
- this.viewDate = new Date(this.endDate);
228
- } else {
229
- this.viewDate = new Date(this.date);
230
- }
231
- this.fill();
232
- },
233
-
234
- fillDow: function(){
235
- var dowCnt = this.weekStart;
236
- var html = '<tr>';
237
- while (dowCnt < this.weekStart + 7) {
238
- html += '<th class="dow">'+dates[this.language].daysMin[(dowCnt++)%7]+'</th>';
239
- }
240
- html += '</tr>';
241
- this.picker.find('.datepicker-days thead').append(html);
242
- },
243
-
244
- fillMonths: function(){
245
- var html = '';
246
- var i = 0
247
- while (i < 12) {
248
- html += '<span class="month">'+dates[this.language].monthsShort[i++]+'</span>';
249
- }
250
- this.picker.find('.datepicker-months td').html(html);
251
- },
252
-
253
- fill: function() {
254
- var d = new Date(this.viewDate),
255
- year = d.getUTCFullYear(),
256
- month = d.getUTCMonth(),
257
- startYear = this.startDate !== -Infinity ? this.startDate.getUTCFullYear() : -Infinity,
258
- startMonth = this.startDate !== -Infinity ? this.startDate.getUTCMonth() : -Infinity,
259
- endYear = this.endDate !== Infinity ? this.endDate.getUTCFullYear() : Infinity,
260
- endMonth = this.endDate !== Infinity ? this.endDate.getUTCMonth() : Infinity,
261
- currentDate = this.date.valueOf(),
262
- today = new Date();
263
- this.picker.find('.datepicker-days thead th:eq(1)')
264
- .text(dates[this.language].months[month]+' '+year);
265
- this.picker.find('tfoot th.today')
266
- .text(dates[this.language].today)
267
- .toggle(this.todayBtn);
268
- this.updateNavArrows();
269
- this.fillMonths();
270
- var prevMonth = UTCDate(year, month-1, 28,0,0,0,0),
271
- day = DPGlobal.getDaysInMonth(prevMonth.getUTCFullYear(), prevMonth.getUTCMonth());
272
- prevMonth.setUTCDate(day);
273
- prevMonth.setUTCDate(day - (prevMonth.getUTCDay() - this.weekStart + 7)%7);
274
- var nextMonth = new Date(prevMonth);
275
- nextMonth.setUTCDate(nextMonth.getUTCDate() + 42);
276
- nextMonth = nextMonth.valueOf();
277
- var html = [];
278
- var clsName;
279
- while(prevMonth.valueOf() < nextMonth) {
280
- if (prevMonth.getUTCDay() == this.weekStart) {
281
- html.push('<tr>');
282
- }
283
- clsName = '';
284
- if (prevMonth.getUTCFullYear() < year || (prevMonth.getUTCFullYear() == year && prevMonth.getUTCMonth() < month)) {
285
- clsName += ' old';
286
- } else if (prevMonth.getUTCFullYear() > year || (prevMonth.getUTCFullYear() == year && prevMonth.getUTCMonth() > month)) {
287
- clsName += ' new';
288
- }
289
- // Compare internal UTC date with local today, not UTC today
290
- if (this.todayHighlight &&
291
- prevMonth.getUTCFullYear() == today.getFullYear() &&
292
- prevMonth.getUTCMonth() == today.getMonth() &&
293
- prevMonth.getUTCDate() == today.getDate()) {
294
- clsName += ' today';
295
- }
296
- if (prevMonth.valueOf() == currentDate) {
297
- clsName += ' active';
298
- }
299
- if (prevMonth.valueOf() < this.startDate || prevMonth.valueOf() > this.endDate) {
300
- clsName += ' disabled';
301
- }
302
- html.push('<td class="day'+clsName+'">'+prevMonth.getUTCDate() + '</td>');
303
- if (prevMonth.getUTCDay() == this.weekEnd) {
304
- html.push('</tr>');
305
- }
306
- prevMonth.setUTCDate(prevMonth.getUTCDate()+1);
307
- }
308
- this.picker.find('.datepicker-days tbody').empty().append(html.join(''));
309
- var currentYear = this.date.getUTCFullYear();
310
-
311
- var months = this.picker.find('.datepicker-months')
312
- .find('th:eq(1)')
313
- .text(year)
314
- .end()
315
- .find('span').removeClass('active');
316
- if (currentYear == year) {
317
- months.eq(this.date.getUTCMonth()).addClass('active');
318
- }
319
- if (year < startYear || year > endYear) {
320
- months.addClass('disabled');
321
- }
322
- if (year == startYear) {
323
- months.slice(0, startMonth).addClass('disabled');
324
- }
325
- if (year == endYear) {
326
- months.slice(endMonth+1).addClass('disabled');
327
- }
328
-
329
- html = '';
330
- year = parseInt(year/10, 10) * 10;
331
- var yearCont = this.picker.find('.datepicker-years')
332
- .find('th:eq(1)')
333
- .text(year + '-' + (year + 9))
334
- .end()
335
- .find('td');
336
- year -= 1;
337
- for (var i = -1; i < 11; i++) {
338
- html += '<span class="year'+(i == -1 || i == 10 ? ' old' : '')+(currentYear == year ? ' active' : '')+(year < startYear || year > endYear ? ' disabled' : '')+'">'+year+'</span>';
339
- year += 1;
340
- }
341
- yearCont.html(html);
342
- },
343
-
344
- updateNavArrows: function() {
345
- var d = new Date(this.viewDate),
346
- year = d.getUTCFullYear(),
347
- month = d.getUTCMonth();
348
- switch (this.viewMode) {
349
- case 0:
350
- if (this.startDate !== -Infinity && year <= this.startDate.getUTCFullYear() && month <= this.startDate.getUTCMonth()) {
351
- this.picker.find('.prev').css({visibility: 'hidden'});
352
- } else {
353
- this.picker.find('.prev').css({visibility: 'visible'});
354
- }
355
- if (this.endDate !== Infinity && year >= this.endDate.getUTCFullYear() && month >= this.endDate.getUTCMonth()) {
356
- this.picker.find('.next').css({visibility: 'hidden'});
357
- } else {
358
- this.picker.find('.next').css({visibility: 'visible'});
359
- }
360
- break;
361
- case 1:
362
- case 2:
363
- if (this.startDate !== -Infinity && year <= this.startDate.getUTCFullYear()) {
364
- this.picker.find('.prev').css({visibility: 'hidden'});
365
- } else {
366
- this.picker.find('.prev').css({visibility: 'visible'});
367
- }
368
- if (this.endDate !== Infinity && year >= this.endDate.getUTCFullYear()) {
369
- this.picker.find('.next').css({visibility: 'hidden'});
370
- } else {
371
- this.picker.find('.next').css({visibility: 'visible'});
372
- }
373
- break;
374
- }
375
- },
376
-
377
- click: function(e) {
378
- e.stopPropagation();
379
- e.preventDefault();
380
- var target = $(e.target).closest('span, td, th');
381
- if (target.length == 1) {
382
- switch(target[0].nodeName.toLowerCase()) {
383
- case 'th':
384
- switch(target[0].className) {
385
- case 'switch':
386
- this.showMode(1);
387
- break;
388
- case 'prev':
389
- case 'next':
390
- var dir = DPGlobal.modes[this.viewMode].navStep * (target[0].className == 'prev' ? -1 : 1);
391
- switch(this.viewMode){
392
- case 0:
393
- this.viewDate = this.moveMonth(this.viewDate, dir);
394
- break;
395
- case 1:
396
- case 2:
397
- this.viewDate = this.moveYear(this.viewDate, dir);
398
- break;
399
- }
400
- this.fill();
401
- break;
402
- case 'today':
403
- var date = new Date();
404
- date.setUTCHours(0);
405
- date.setUTCMinutes(0);
406
- date.setUTCSeconds(0);
407
- date.setUTCMilliseconds(0);
408
-
409
- this.showMode(-2);
410
- var which = this.todayBtn == 'linked' ? null : 'view';
411
- this._setDate(date, which);
412
- break;
413
- }
414
- break;
415
- case 'span':
416
- if (!target.is('.disabled')) {
417
- this.viewDate.setUTCDate(1);
418
- if (target.is('.month')) {
419
- var month = target.parent().find('span').index(target);
420
- this.viewDate.setUTCMonth(month);
421
- this.element.trigger({
422
- type: 'changeMonth',
423
- date: this.viewDate
424
- });
425
- } else {
426
- var year = parseInt(target.text(), 10)||0;
427
- this.viewDate.setUTCFullYear(year);
428
- this.element.trigger({
429
- type: 'changeYear',
430
- date: this.viewDate
431
- });
432
- }
433
- this.showMode(-1);
434
- this.fill();
435
- }
436
- break;
437
- case 'td':
438
- if (target.is('.day') && !target.is('.disabled')){
439
- var day = parseInt(target.text(), 10)||1;
440
- var year = this.viewDate.getUTCFullYear(),
441
- month = this.viewDate.getUTCMonth();
442
- if (target.is('.old')) {
443
- if (month == 0) {
444
- month = 11;
445
- year -= 1;
446
- } else {
447
- month -= 1;
448
- }
449
- } else if (target.is('.new')) {
450
- if (month == 11) {
451
- month = 0;
452
- year += 1;
453
- } else {
454
- month += 1;
455
- }
456
- }
457
- this._setDate(UTCDate(year, month, day,0,0,0,0));
458
- }
459
- break;
460
- }
461
- }
462
- },
463
-
464
- _setDate: function(date, which){
465
- if (!which || which == 'date')
466
- this.date = date;
467
- if (!which || which == 'view')
468
- this.viewDate = date;
469
- this.fill();
470
- this.setValue();
471
- this.element.trigger({
472
- type: 'changeDate',
473
- date: this.date
474
- });
475
- var element;
476
- if (this.isInput) {
477
- element = this.element;
478
- } else if (this.component){
479
- element = this.element.find('input');
480
- }
481
- if (element) {
482
- element.change();
483
- if (this.autoclose) {
484
- this.hide();
485
- }
486
- }
487
- },
488
-
489
- moveMonth: function(date, dir){
490
- if (!dir) return date;
491
- var new_date = new Date(date.valueOf()),
492
- day = new_date.getUTCDate(),
493
- month = new_date.getUTCMonth(),
494
- mag = Math.abs(dir),
495
- new_month, test;
496
- dir = dir > 0 ? 1 : -1;
497
- if (mag == 1){
498
- test = dir == -1
499
- // If going back one month, make sure month is not current month
500
- // (eg, Mar 31 -> Feb 31 == Feb 28, not Mar 02)
501
- ? function(){ return new_date.getUTCMonth() == month; }
502
- // If going forward one month, make sure month is as expected
503
- // (eg, Jan 31 -> Feb 31 == Feb 28, not Mar 02)
504
- : function(){ return new_date.getUTCMonth() != new_month; };
505
- new_month = month + dir;
506
- new_date.setUTCMonth(new_month);
507
- // Dec -> Jan (12) or Jan -> Dec (-1) -- limit expected date to 0-11
508
- if (new_month < 0 || new_month > 11)
509
- new_month = (new_month + 12) % 12;
510
- } else {
511
- // For magnitudes >1, move one month at a time...
512
- for (var i=0; i<mag; i++)
513
- // ...which might decrease the day (eg, Jan 31 to Feb 28, etc)...
514
- new_date = this.moveMonth(new_date, dir);
515
- // ...then reset the day, keeping it in the new month
516
- new_month = new_date.getUTCMonth();
517
- new_date.setUTCDate(day);
518
- test = function(){ return new_month != new_date.getUTCMonth(); };
519
- }
520
- // Common date-resetting loop -- if date is beyond end of month, make it
521
- // end of month
522
- while (test()){
523
- new_date.setUTCDate(--day);
524
- new_date.setUTCMonth(new_month);
525
- }
526
- return new_date;
527
- },
528
-
529
- moveYear: function(date, dir){
530
- return this.moveMonth(date, dir*12);
531
- },
532
-
533
- dateWithinRange: function(date){
534
- return date >= this.startDate && date <= this.endDate;
535
- },
536
-
537
- keydown: function(e){
538
- if (this.picker.is(':not(:visible)')){
539
- if (e.keyCode == 27) // allow escape to hide and re-show picker
540
- this.show();
541
- return;
542
- }
543
- var dateChanged = false,
544
- dir, day, month,
545
- newDate, newViewDate;
546
- switch(e.keyCode){
547
- case 27: // escape
548
- this.hide();
549
- e.preventDefault();
550
- break;
551
- case 37: // left
552
- case 39: // right
553
- if (!this.keyboardNavigation) break;
554
- dir = e.keyCode == 37 ? -1 : 1;
555
- if (e.ctrlKey){
556
- newDate = this.moveYear(this.date, dir);
557
- newViewDate = this.moveYear(this.viewDate, dir);
558
- } else if (e.shiftKey){
559
- newDate = this.moveMonth(this.date, dir);
560
- newViewDate = this.moveMonth(this.viewDate, dir);
561
- } else {
562
- newDate = new Date(this.date);
563
- newDate.setUTCDate(this.date.getUTCDate() + dir);
564
- newViewDate = new Date(this.viewDate);
565
- newViewDate.setUTCDate(this.viewDate.getUTCDate() + dir);
566
- }
567
- if (this.dateWithinRange(newDate)){
568
- this.date = newDate;
569
- this.viewDate = newViewDate;
570
- this.setValue();
571
- this.update();
572
- e.preventDefault();
573
- dateChanged = true;
574
- }
575
- break;
576
- case 38: // up
577
- case 40: // down
578
- if (!this.keyboardNavigation) break;
579
- dir = e.keyCode == 38 ? -1 : 1;
580
- if (e.ctrlKey){
581
- newDate = this.moveYear(this.date, dir);
582
- newViewDate = this.moveYear(this.viewDate, dir);
583
- } else if (e.shiftKey){
584
- newDate = this.moveMonth(this.date, dir);
585
- newViewDate = this.moveMonth(this.viewDate, dir);
586
- } else {
587
- newDate = new Date(this.date);
588
- newDate.setUTCDate(this.date.getUTCDate() + dir * 7);
589
- newViewDate = new Date(this.viewDate);
590
- newViewDate.setUTCDate(this.viewDate.getUTCDate() + dir * 7);
591
- }
592
- if (this.dateWithinRange(newDate)){
593
- this.date = newDate;
594
- this.viewDate = newViewDate;
595
- this.setValue();
596
- this.update();
597
- e.preventDefault();
598
- dateChanged = true;
599
- }
600
- break;
601
- case 13: // enter
602
- this.hide();
603
- e.preventDefault();
604
- break;
605
- case 9: // tab
606
- this.hide();
607
- break;
608
- }
609
- if (dateChanged){
610
- this.element.trigger({
611
- type: 'changeDate',
612
- date: this.date
613
- });
614
- var element;
615
- if (this.isInput) {
616
- element = this.element;
617
- } else if (this.component){
618
- element = this.element.find('input');
619
- }
620
- if (element) {
621
- element.change();
622
- }
623
- }
624
- },
625
-
626
- showMode: function(dir) {
627
- if (dir) {
628
- this.viewMode = Math.max(0, Math.min(2, this.viewMode + dir));
629
- }
630
- this.picker.find('>div').hide().filter('.datepicker-'+DPGlobal.modes[this.viewMode].clsName).show();
631
- this.updateNavArrows();
632
- }
633
- };
634
-
635
- $.fn.datepicker = function ( option ) {
636
- var args = Array.apply(null, arguments);
637
- args.shift();
638
- return this.each(function () {
639
- var $this = $(this),
640
- data = $this.data('datepicker'),
641
- options = typeof option == 'object' && option;
642
- if (!data) {
643
- $this.data('datepicker', (data = new Datepicker(this, $.extend({}, $.fn.datepicker.defaults,options))));
644
- }
645
- if (typeof option == 'string' && typeof data[option] == 'function') {
646
- data[option].apply(data, args);
647
- }
648
- });
649
- };
650
-
651
- $.fn.datepicker.defaults = {
652
- };
653
- $.fn.datepicker.Constructor = Datepicker;
654
- var dates = $.fn.datepicker.dates = {
655
- en: {
656
- days: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"],
657
- daysShort: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"],
658
- daysMin: ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa", "Su"],
659
- months: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"],
660
- monthsShort: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"],
661
- today: "Today"
662
- }
663
- }
664
-
665
- var DPGlobal = {
666
- modes: [
667
- {
668
- clsName: 'days',
669
- navFnc: 'Month',
670
- navStep: 1
671
- },
672
- {
673
- clsName: 'months',
674
- navFnc: 'FullYear',
675
- navStep: 1
676
- },
677
- {
678
- clsName: 'years',
679
- navFnc: 'FullYear',
680
- navStep: 10
681
- }],
682
- isLeapYear: function (year) {
683
- return (((year % 4 === 0) && (year % 100 !== 0)) || (year % 400 === 0))
684
- },
685
- getDaysInMonth: function (year, month) {
686
- return [31, (DPGlobal.isLeapYear(year) ? 29 : 28), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][month]
687
- },
688
- validParts: /dd?|mm?|MM?|yy(?:yy)?/g,
689
- nonpunctuation: /[^ -\/:-@\[-`{-~\t\n\r]+/g,
690
- parseFormat: function(format){
691
- // IE treats \0 as a string end in inputs (truncating the value),
692
- // so it's a bad format delimiter, anyway
693
- var separators = format.replace(this.validParts, '\0').split('\0'),
694
- parts = format.match(this.validParts);
695
- if (!separators || !separators.length || !parts || parts.length == 0){
696
- throw new Error("Invalid date format.");
697
- }
698
- return {separators: separators, parts: parts};
699
- },
700
- parseDate: function(date, format, language) {
701
- if (date instanceof Date) return date;
702
- if (/^[-+]\d+[dmwy]([\s,]+[-+]\d+[dmwy])*$/.test(date)) {
703
- var part_re = /([-+]\d+)([dmwy])/,
704
- parts = date.match(/([-+]\d+)([dmwy])/g),
705
- part, dir;
706
- date = new Date();
707
- for (var i=0; i<parts.length; i++) {
708
- part = part_re.exec(parts[i]);
709
- dir = parseInt(part[1]);
710
- switch(part[2]){
711
- case 'd':
712
- date.setUTCDate(date.getUTCDate() + dir);
713
- break;
714
- case 'm':
715
- date = Datepicker.prototype.moveMonth.call(Datepicker.prototype, date, dir);
716
- break;
717
- case 'w':
718
- date.setUTCDate(date.getUTCDate() + dir * 7);
719
- break;
720
- case 'y':
721
- date = Datepicker.prototype.moveYear.call(Datepicker.prototype, date, dir);
722
- break;
723
- }
724
- }
725
- return UTCDate(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(), 0, 0, 0);
726
- }
727
- var parts = date && date.match(this.nonpunctuation) || [],
728
- date = new Date(),
729
- parsed = {},
730
- setters_order = ['yyyy', 'yy', 'M', 'MM', 'm', 'mm', 'd', 'dd'],
731
- setters_map = {
732
- yyyy: function(d,v){ return d.setUTCFullYear(v); },
733
- yy: function(d,v){ return d.setUTCFullYear(2000+v); },
734
- m: function(d,v){
735
- v -= 1;
736
- while (v<0) v += 12;
737
- v %= 12;
738
- d.setUTCMonth(v);
739
- while (d.getUTCMonth() != v)
740
- d.setUTCDate(d.getUTCDate()-1);
741
- return d;
742
- },
743
- d: function(d,v){ return d.setUTCDate(v); }
744
- },
745
- val, filtered, part;
746
- setters_map['M'] = setters_map['MM'] = setters_map['mm'] = setters_map['m'];
747
- setters_map['dd'] = setters_map['d'];
748
- date = UTCDate(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(), 0, 0, 0);
749
- if (parts.length == format.parts.length) {
750
- for (var i=0, cnt = format.parts.length; i < cnt; i++) {
751
- val = parseInt(parts[i], 10);
752
- part = format.parts[i];
753
- if (isNaN(val)) {
754
- switch(part) {
755
- case 'MM':
756
- filtered = $(dates[language].months).filter(function(){
757
- var m = this.slice(0, parts[i].length),
758
- p = parts[i].slice(0, m.length);
759
- return m == p;
760
- });
761
- val = $.inArray(filtered[0], dates[language].months) + 1;
762
- break;
763
- case 'M':
764
- filtered = $(dates[language].monthsShort).filter(function(){
765
- var m = this.slice(0, parts[i].length),
766
- p = parts[i].slice(0, m.length);
767
- return m == p;
768
- });
769
- val = $.inArray(filtered[0], dates[language].monthsShort) + 1;
770
- break;
771
- }
772
- }
773
- parsed[part] = val;
774
- }
775
- for (var i=0, s; i<setters_order.length; i++){
776
- s = setters_order[i];
777
- if (s in parsed)
778
- setters_map[s](date, parsed[s])
779
- }
780
- }
781
- return date;
782
- },
783
- formatDate: function(date, format, language){
784
- var val = {
785
- d: date.getUTCDate(),
786
- m: date.getUTCMonth() + 1,
787
- M: dates[language].monthsShort[date.getUTCMonth()],
788
- MM: dates[language].months[date.getUTCMonth()],
789
- yy: date.getUTCFullYear().toString().substring(2),
790
- yyyy: date.getUTCFullYear()
791
- };
792
- val.dd = (val.d < 10 ? '0' : '') + val.d;
793
- val.mm = (val.m < 10 ? '0' : '') + val.m;
794
- var date = [],
795
- seps = $.extend([], format.separators);
796
- for (var i=0, cnt = format.parts.length; i < cnt; i++) {
797
- if (seps.length)
798
- date.push(seps.shift())
799
- date.push(val[format.parts[i]]);
800
- }
801
- return date.join('');
802
- },
803
- headTemplate: '<thead>'+
804
- '<tr>'+
805
- '<th class="prev"><i class="icon-arrow-left"/></th>'+
806
- '<th colspan="5" class="switch"></th>'+
807
- '<th class="next"><i class="icon-arrow-right"/></th>'+
808
- '</tr>'+
809
- '</thead>',
810
- contTemplate: '<tbody><tr><td colspan="7"></td></tr></tbody>',
811
- footTemplate: '<tfoot><tr><th colspan="7" class="today"></th></tr></tfoot>'
812
- };
813
- DPGlobal.template = '<div class="datepicker dropdown-menu">'+
814
- '<div class="datepicker-days">'+
815
- '<table class=" table-condensed">'+
816
- DPGlobal.headTemplate+
817
- '<tbody></tbody>'+
818
- DPGlobal.footTemplate+
819
- '</table>'+
820
- '</div>'+
821
- '<div class="datepicker-months">'+
822
- '<table class="table-condensed">'+
823
- DPGlobal.headTemplate+
824
- DPGlobal.contTemplate+
825
- DPGlobal.footTemplate+
826
- '</table>'+
827
- '</div>'+
828
- '<div class="datepicker-years">'+
829
- '<table class="table-condensed">'+
830
- DPGlobal.headTemplate+
831
- DPGlobal.contTemplate+
832
- DPGlobal.footTemplate+
833
- '</table>'+
834
- '</div>'+
835
- '</div>';
836
- }( window.jQuery );
837
- /**
838
- * Bulgarian translation for bootstrap-datepicker
839
- * Apostol Apostolov <apostol.s.apostolov@gmail.com>
840
- */
841
- ;(function($){
842
- $.fn.datepicker.dates['bg'] = {
843
- days: ["Неделя", "Понеделник", "Вторник", "Сряда", "Четвъртък", "Петък", "Събота", "Неделя"],
844
- daysShort: ["Нед", "Пон", "Вто", "Сря", "Чет", "Пет", "Съб", "Нед"],
845
- daysMin: ["Н", "П", "В", "С", "Ч", "П", "С", "Н"],
846
- months: ["Януари", "Февруари", "Март", "Април", "Май", "Юни", "Юли", "Август", "Септември", "Октомври", "Ноември", "Декември"],
847
- monthsShort: ["Ян", "Фев", "Мар", "Апр", "Май", "Юни", "Юли", "Авг", "Сеп", "Окт", "Ное", "Дек"],
848
- today: "днес"
849
- };
850
- }(jQuery));
851
- /**
852
- * Czech translation for bootstrap-datepicker
853
- * Matěj Koubík <matej@koubik.name>
854
- */
855
- ;(function($){
856
- $.fn.datepicker.dates['cs'] = {
857
- days: ["Neděle", "Pondělí", "Úterý", "Středa", "Čtvrtek", "Pátek", "Sobota", "Neděle"],
858
- daysShort: ["Ne", "Po", "Út", "St", "Čt", "Pá", "So", "Ne"],
859
- daysMin: ["N", "P", "Ú", "St", "Č", "P", "So", "N"],
860
- months: ["Leden", "Únor", "Březen", "Duben", "Květen", "Červen", "Červenec", "Srpen", "Září", "Říjen", "Listopad", "Prosinec"],
861
- monthsShort: ["Led", "Úno", "Bře", "Dub", "Kvě", "Čer", "Čnc", "Srp", "Zář", "Říj", "Lis", "Pro"],
862
- today: "Dnes"
863
- };
864
- }(jQuery));
865
- /**
866
- * Danish translation for bootstrap-datepicker
867
- * Christian Pedersen <http://github.com/chripede>
868
- */
869
- ;(function($){
870
- $.fn.datepicker.dates['da'] = {
871
- days: ["Søndag", "Mandag", "Tirsdag", "Onsdag", "Torsdag", "Fredag", "Lørdag", "Søndag"],
872
- daysShort: ["Søn", "Man", "Tir", "Ons", "Tor", "Fre", "Lør", "Søn"],
873
- daysMin: ["Sø", "Ma", "Ti", "On", "To", "Fr", "Lø", "Sø"],
874
- months: ["Januar", "Februar", "Marts", "April", "Maj", "Juni", "Juli", "August", "September", "Oktober", "November", "December"],
875
- monthsShort: ["Jan", "Feb", "Mar", "Apr", "Maj", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Dec"],
876
- today: "I Dag"
877
- };
878
- }(jQuery));/**
879
- * German translation for bootstrap-datepicker
880
- * Sam Zurcher <sam@orelias.ch>
881
- */
882
- ;(function($){
883
- $.fn.datepicker.dates['de'] = {
884
- days: ["Sonntag", "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag", "Sonntag"],
885
- daysShort: ["Son", "Mon", "Die", "Mit", "Don", "Fre", "Sam", "Son"],
886
- daysMin: ["So", "Mo", "Di", "Mi", "Do", "Fr", "Sa", "So"],
887
- months: ["Januar", "Februar", "März", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember"],
888
- monthsShort: ["Jan", "Feb", "Mär", "Apr", "Mai", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Dez"],
889
- today: "Heute"
890
- };
891
- }(jQuery));
892
- /**
893
- * Spanish translation for bootstrap-datepicker
894
- * Bruno Bonamin <bruno.bonamin@gmail.com>
895
- */
896
- ;(function($){
897
- $.fn.datepicker.dates['es'] = {
898
- days: ["Domingo", "Lunes", "Martes", "Miércoles", "Jueves", "Viernes", "Sábado", "Domingo"],
899
- daysShort: ["Dom", "Lun", "Mar", "Mié", "Jue", "Vie", "Sáb", "Dom"],
900
- daysMin: ["Do", "Lu", "Ma", "Mi", "Ju", "Vi", "Sa", "Do"],
901
- months: ["Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre"],
902
- monthsShort: ["Ene", "Feb", "Mar", "Abr", "May", "Jun", "Jul", "Ago", "Sep", "Oct", "Nov", "Dic"],
903
- today: "Hoy"
904
- };
905
- }(jQuery));
906
- /**
907
- * Finnish translation for bootstrap-datepicker
908
- * Jaakko Salonen <https://github.com/jsalonen>
909
- */
910
- ;(function($){
911
- $.fn.datepicker.dates['fi'] = {
912
- days: ["sunnuntai", "maanantai", "tiistai", "keskiviikko", "torstai", "perjantai", "lauantai", "sunnuntai"],
913
- daysShort: ["sun", "maa", "tii", "kes", "tor", "per", "lau", "sun"],
914
- daysMin: ["su", "ma", "ti", "ke", "to", "pe", "la", "su"],
915
- months: ["tammikuu", "helmikuu", "maaliskuu", "huhtikuu", "toukokuu", "kesäkuu", "heinäkuu", "elokuu", "syyskuu", "lokakuu", "marraskuu", "joulukuu"],
916
- monthsShort: ["tam", "hel", "maa", "huh", "tou", "kes", "hei", "elo", "syy", "lok", "mar", "jou"],
917
- today: "tänään"
918
- };
919
- }(jQuery));
920
- /**
921
- * French translation for bootstrap-datepicker
922
- * Nico Mollet <nico.mollet@gmail.com>
923
- */
924
- ;(function($){
925
- $.fn.datepicker.dates['fr'] = {
926
- days: ["Dimanche", "Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi", "Samedi", "Dimanche"],
927
- daysShort: ["Dim", "Lun", "Mar", "Mer", "Jeu", "Ven", "Sam", "Dim"],
928
- daysMin: ["D", "L", "Ma", "Me", "J", "V", "S", "D"],
929
- months: ["Janvier", "Février", "Mars", "Avril", "Mai", "Juin", "Juillet", "Août", "Septembre", "Octobre", "Novembre", "Décembre"],
930
- monthsShort: ["Jan", "Fev", "Mar", "Avr", "Mai", "Jui", "Jul", "Aou", "Sep", "Oct", "Nov", "Dec"],
931
- today: "Aujourd'hui"
932
- };
933
- }(jQuery));
934
- /**
935
- * Bahasa translation for bootstrap-datepicker
936
- * Azwar Akbar <azwar.akbar@gmail.com>
937
- */
938
- ;(function($){
939
- $.fn.datepicker.dates['id'] = {
940
- days: ["Minggu", "Senin", "Selasa", "Rabu", "Kamis", "Jumat", "Sabtu", "Minggu"],
941
- daysShort: ["Mgu", "Sen", "Sel", "Rab", "Kam", "Jum", "Sab", "Mgu"],
942
- daysMin: ["Mg", "Sn", "Sl", "Ra", "Ka", "Ju", "Sa", "Mg"],
943
- months: ["Januari", "Februari", "Maret", "April", "Mei", "Juni", "Juli", "Agustus", "September", "Oktober", "November", "Desember"],
944
- monthsShort: ["Jan", "Feb", "Mar", "Apr", "Mei", "Jun", "Jul", "Ags", "Sep", "Okt", "Nov", "Des"]
945
- };
946
- }(jQuery));
947
- /**
948
- * Icelandic translation for bootstrap-datepicker
949
- * Hinrik Örn Sigurðsson <hinrik.sig@gmail.com>
950
- */
951
- ;(function($){
952
- $.fn.datepicker.dates['is'] = {
953
- days: ["Sunnudagur", "Mánudagur", "Þriðjudagur", "Miðvikudagur", "Fimmtudagur", "Föstudagur", "Laugardagur", "Sunnudagur"],
954
- daysShort: ["Sun", "Mán", "Þri", "Mið", "Fim", "Fös", "Lau", "Sun"],
955
- daysMin: ["Su", "Má", "Þr", "Mi", "Fi", "Fö", "La", "Su"],
956
- months: ["Janúar", "Febrúar", "Mars", "Apríl", "Maí", "Júní", "Júlí", "Ágúst", "September", "Október", "Nóvember", "Desember"],
957
- monthsShort: ["Jan", "Feb", "Mar", "Apr", "Maí", "Jún", "Júl", "Ágú", "Sep", "Okt", "Nóv", "Des"],
958
- today: "Í Dag"
959
- };
960
- }(jQuery));
961
- /**
962
- * Italian translation for bootstrap-datepicker
963
- * Enrico Rubboli <rubboli@gmail.com>
964
- */
965
- ;(function($){
966
- $.fn.datepicker.dates['it'] = {
967
- days: ["Domenica", "Lunedi", "Martedi", "Mercoledi", "Giovedi", "Venerdi", "Sabato", "Domenica"],
968
- daysShort: ["Dom", "Lun", "Mar", "Mer", "Gio", "Ven", "Sab", "Dom"],
969
- daysMin: ["Do", "Lu", "Ma", "Me", "Gi", "Ve", "Sa", "Do"],
970
- months: ["Gennaio", "Febbraio", "Marzo", "Aprile", "Maggio", "Giugno", "Luglio", "Agosto", "Settembre", "Ottobre", "Novembre", "Dicembre"],
971
- monthsShort: ["Gen", "Feb", "Mar", "Apr", "Mag", "Giu", "Lug", "Ago", "Set", "Ott", "Nov", "Dic"],
972
- today: "Oggi"
973
- };
974
- }(jQuery));
975
- /**
976
- * Japanese translation for bootstrap-datepicker
977
- * Norio Suzuki <https://github.com/suzuki/>
978
- */
979
- ;(function($){
980
- $.fn.datepicker.dates['ja'] = {
981
- days: ["日曜", "月曜", "火曜", "水曜", "木曜", "金曜", "土曜", "日曜"],
982
- daysShort: ["日", "月", "火", "水", "木", "金", "土", "日"],
983
- daysMin: ["日", "月", "火", "水", "木", "金", "土", "日"],
984
- months: ["1月", "2月", "3月", "4月", "5月", "6月", "7月", "8月", "9月", "10月", "11月", "12月"],
985
- monthsShort: ["1月", "2月", "3月", "4月", "5月", "6月", "7月", "8月", "9月", "10月", "11月", "12月"]
986
- };
987
- }(jQuery));
988
- /**
989
- * Korean translation for bootstrap-datepicker
990
- * Gu Youn <http://github.com/guyoun>
991
- */
992
- ;(function($){
993
- $.fn.datepicker.dates['kr'] = {
994
- days: ["일요일", "월요일", "화요일", "수요일", "목요일", "금요일", "토요일", "일요일"],
995
- daysShort: ["일", "월", "화", "수", "목", "금", "토", "일"],
996
- daysMin: ["일", "월", "화", "수", "목", "금", "토", "일"],
997
- months: ["1월", "2월", "3월", "4월", "5월", "6월", "7월", "8월", "9월", "10월", "11월", "12월"],
998
- monthsShort: ["1월", "2월", "3월", "4월", "5월", "6월", "7월", "8월", "9월", "10월", "11월", "12월"],
999
- };
1000
- }(jQuery));
1001
- /**
1002
- * Lithuanian translation for bootstrap-datepicker
1003
- * Šarūnas Gliebus <ssharunas@yahoo.co.uk>
1004
- */
1005
-
1006
- ;(function($){
1007
- $.fn.datepicker.dates['lt'] = {
1008
- days: ["Sekmadienis", "Pirmadienis", "Antradienis", "Trečiadienis", "Ketvirtadienis", "Penktadienis", "Šeštadienis", "Sekmadienis"],
1009
- daysShort: ["S", "Pr", "A", "T", "K", "Pn", "Š", "S"],
1010
- daysMin: ["Sk", "Pr", "An", "Tr", "Ke", "Pn", "Št", "Sk"],
1011
- months: ["Sausis", "Vasaris", "Kovas", "Balandis", "Gegužė", "Birželis", "Liepa", "Rugpjūtis", "Rugsėjis", "Spalis", "Lapkritis", "Gruodis"],
1012
- monthsShort: ["Sau", "Vas", "Kov", "Bal", "Geg", "Bir", "Lie", "Rugp", "Rugs", "Spa", "Lap", "Gru"],
1013
- weekStart: 1
1014
- };
1015
- }(jQuery));
1016
- /**
1017
- * Latvian translation for bootstrap-datepicker
1018
- * Artis Avotins <artis@apit.lv>
1019
- */
1020
-
1021
- ;(function($){
1022
- $.fn.datepicker.dates['lv'] = {
1023
- days: ["Svētdiena", "Pirmdiena", "Otrdiena", "Trešdiena", "Ceturtdiena", "Piektdiena", "Sestdiena", "Svētdiena"],
1024
- daysShort: ["Sv", "P", "O", "T", "C", "Pk", "S", "Sv"],
1025
- daysMin: ["Sv", "Pr", "Ot", "Tr", "Ce", "Pk", "St", "Sv"],
1026
- months: ["Janvāris", "Februāris", "Marts", "Aprīlis", "Maijs", "Jūnijs", "Jūlijs", "Augusts", "Septembris", "Oktobris", "Novembris", "Decembris"],
1027
- monthsShort: ["Jan", "Feb", "Mar", "Apr", "Mai", "Jūn", "Jūl", "Aug", "Sep", "Okt", "Nov", "Dec."],
1028
- today: "Šodien",
1029
- weekStart: 1
1030
- };
1031
- }(jQuery));/**
1032
- * Malay translation for bootstrap-datepicker
1033
- * Ateman Faiz <noorulfaiz@gmail.com>
1034
- */
1035
- ;(function($){
1036
- $.fn.datepicker.dates['ms'] = {
1037
- days: ["Ahad", "Isnin", "Selasa", "Rabu", "Khamis", "Jumaat", "Sabtu", "Ahad"],
1038
- daysShort: ["Aha", "Isn", "Sel", "Rab", "Kha", "Jum", "Sab", "Aha"],
1039
- daysMin: ["Ah", "Is", "Se", "Ra", "Kh", "Ju", "Sa", "Ah"],
1040
- months: ["Januari", "Februari", "Mac", "April", "Mei", "Jun", "Julai", "Ogos", "September", "Oktober", "November", "Disember"],
1041
- // Pierre - added missing ,
1042
- monthsShort: ["Jan", "Feb", "Mar", "Apr", "Mei", "Jun", "Jul", "Ogo", "Sep", "Okt", "Nov", "Dis"],
1043
- today: "Hari Ini"
1044
- };
1045
- }(jQuery));
1046
- /**
1047
- * Norwegian (bokmål) translation for bootstrap-datepicker
1048
- * Fredrik Sundmyhr <http://github.com/fsundmyhr>
1049
- */
1050
- ;(function($){
1051
- $.fn.datepicker.dates['nb'] = {
1052
- days: ["Søndag", "Mandag", "Tirsdag", "Onsdag", "Torsdag", "Fredag", "Lørdag", "Søndag"],
1053
- daysShort: ["Søn", "Man", "Tir", "Ons", "Tor", "Fre", "Lør", "Søn"],
1054
- daysMin: ["Sø", "Ma", "Ti", "On", "To", "Fr", "Lø", "Sø"],
1055
- months: ["Januar", "Februar", "Mars", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Desember"],
1056
- monthsShort: ["Jan", "Feb", "Mar", "Apr", "Mai", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Des"],
1057
- today: "I Dag"
1058
- };
1059
- }(jQuery));/**
1060
- * Dutch translation for bootstrap-datepicker
1061
- * Reinier Goltstein <mrgoltstein@gmail.com>
1062
- */
1063
- ;(function($){
1064
- $.fn.datepicker.dates['nl'] = {
1065
- days: ["Zondag", "Maandag", "Dinsdag", "Woensdag", "Donderdag", "Vrijdag", "Zaterdag", "Zondag"],
1066
- daysShort: ["Zo", "Ma", "Di", "Wo", "Do", "Vr", "Za", "Zo"],
1067
- daysMin: ["Zo", "Ma", "Di", "Wo", "Do", "Vr", "Za", "Zo"],
1068
- months: ["Januari", "Februari", "Maart", "April", "Mei", "Juni", "Juli", "Augustus", "September", "Oktober", "November", "December"],
1069
- monthsShort: ["Jan", "Feb", "Mrt", "Apr", "Mei", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Dec"],
1070
- today: "Vandaag"
1071
- };
1072
- }(jQuery));
1073
- /**
1074
- * Polish translation for bootstrap-datepicker
1075
- * Robert <rtpm@gazeta.pl>
1076
- */
1077
- ;(function($){
1078
- $.fn.datepicker.dates['pl'] = {
1079
- days: ["Niedziela", "Poniedziałek", "Wtorek", "Środa", "Czwartek", "Piątek", "Sobota", "Niedziela"],
1080
- daysShort: ["Nie", "Pn", "Wt", "Śr", "Czw", "Pt", "So", "Nie"],
1081
- daysMin: ["N", "Pn", "Wt", "Śr", "Cz", "Pt", "So", "N"],
1082
- months: ["Styczeń", "Luty", "Marzec", "Kwiecień", "Maj", "Czerwiec", "Lipiec", "Sierpień", "Wrzesień", "Październik", "Listopad", "Grudzień"],
1083
- monthsShort: ["Sty", "Lu", "Mar", "Kw", "Maj", "Cze", "Lip", "Sie", "Wrz", "Pa", "Lis", "Gru"],
1084
- today: "Dzisiaj"
1085
- };
1086
- }(jQuery));
1087
- /**
1088
- * Brazilian translation for bootstrap-datepicker
1089
- * Cauan Cabral <cauan@radig.com.br>
1090
- */
1091
- ;(function($){
1092
- $.fn.datepicker.dates['pt-BR'] = {
1093
- days: ["Domingo", "Segunda", "Terça", "Quarta", "Quinta", "Sexta", "Sábado", "Domingo"],
1094
- daysShort: ["Dom", "Seg", "Ter", "Qua", "Qui", "Sex", "Sáb", "Dom"],
1095
- daysMin: ["Do", "Se", "Te", "Qu", "Qu", "Se", "Sa", "Do"],
1096
- months: ["Janeiro", "Fevereiro", "Março", "Abril", "Maio", "Junho", "Julho", "Agosto", "Setembro", "Outubro", "Novembro", "Dezembro"],
1097
- monthsShort: ["Jan", "Fev", "Mar", "Abr", "Mai", "Jun", "Jul", "Ago", "Set", "Out", "Nov", "Dez"],
1098
- today: "Hoje"
1099
- };
1100
- }(jQuery));
1101
- /**
1102
- * Portuguese translation for bootstrap-datepicker
1103
- * Original code: Cauan Cabral <cauan@radig.com.br>
1104
- * Tiago Melo <tiago.blackcode@gmail.com>
1105
- */
1106
- ;(function($){
1107
- $.fn.datepicker.dates['pt'] = {
1108
- days: ["Domingo", "Segunda", "Terça", "Quarta", "Quinta", "Sexta", "Sábado", "Domingo"],
1109
- daysShort: ["Dom", "Seg", "Ter", "Qua", "Qui", "Sex", "Sáb", "Dom"],
1110
- daysMin: ["Do", "Se", "Te", "Qu", "Qu", "Se", "Sa", "Do"],
1111
- months: ["Janeiro", "Fevereiro", "Março", "Abril", "Maio", "Junho", "Julho", "Agosto", "Setembro", "Outubro", "Novembro", "Dezembro"],
1112
- monthsShort: ["Jan", "Fev", "Mar", "Abr", "Mai", "Jun", "Jul", "Ago", "Set", "Out", "Nov", "Dez"]
1113
- };
1114
- }(jQuery));
1115
- /**
1116
- * Russian translation for bootstrap-datepicker
1117
- * Victor Taranenko <darwin@snowdale.com>
1118
- */
1119
- ;(function($){
1120
- $.fn.datepicker.dates['ru'] = {
1121
- days: ["Воскресенье", "Понедельник", "Вторник", "Среда", "Четверг", "Пятница", "Суббота", "Воскресенье"],
1122
- daysShort: ["Вск", "Пнд", "Втр", "Срд", "Чтв", "Птн", "Суб", "Вск"],
1123
- daysMin: ["Вс", "Пн", "Вт", "Ср", "Чт", "Пт", "Сб", "Вс"],
1124
- months: ["Январь", "Февраль", "Март", "Апрель", "Май", "Июнь", "Июль", "Август", "Сентябрь", "Октябрь", "Ноябрь", "Декабрь"],
1125
- monthsShort: ["Янв", "Фев", "Мар", "Апр", "Май", "Июн", "Июл", "Авг", "Сен", "Окт", "Ноя", "Дек"],
1126
- today: "Сегодня"
1127
- };
1128
- }(jQuery));/**
1129
- * Slovene translation for bootstrap-datepicker
1130
- * Gregor Rudolf <gregor.rudolf@gmail.com>
1131
- */
1132
- ;(function($){
1133
- $.fn.datepicker.dates['sl'] = {
1134
- days: ["Nedelja", "Ponedeljek", "Torek", "Sreda", "Četrtek", "Petek", "Sobota", "Nedelja"],
1135
- daysShort: ["Ned", "Pon", "Tor", "Sre", "Čet", "Pet", "Sob", "Ned"],
1136
- daysMin: ["Ne", "Po", "To", "Sr", "Če", "Pe", "So", "Ne"],
1137
- months: ["Januar", "Februar", "Marec", "April", "Maj", "Junij", "Julij", "Avgust", "September", "Oktober", "November", "December"],
1138
- monthsShort: ["Jan", "Feb", "Mar", "Apr", "Maj", "Jun", "Jul", "Avg", "Sep", "Okt", "Nov", "Dec"],
1139
- today: "Danes"
1140
- };
1141
- }(jQuery));
1142
- /**
1143
- * Swedish translation for bootstrap-datepicker
1144
- * Patrik Ragnarsson <patrik@starkast.net>
1145
- */
1146
- ;(function($){
1147
- $.fn.datepicker.dates['sv'] = {
1148
- days: ["Söndag", "Måndag", "Tisdag", "Onsdag", "Torsdag", "Fredag", "Lördag", "Söndag"],
1149
- daysShort: ["Sön", "Mån", "Tis", "Ons", "Tor", "Fre", "Lör", "Sön"],
1150
- daysMin: ["Sö", "Må", "Ti", "On", "To", "Fr", "Lö", "Sö"],
1151
- months: ["Januari", "Februari", "Mars", "April", "Maj", "Juni", "Juli", "Augusti", "September", "Oktober", "November", "December"],
1152
- monthsShort: ["Jan", "Feb", "Mar", "Apr", "Maj", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Dec"],
1153
- today: "I Dag"
1154
- };
1155
- }(jQuery));
1156
- /**
1157
- * Thai translation for bootstrap-datepicker
1158
- * Suchau Jiraprapot <seroz24@gmail.com>
1159
- */
1160
- ;(function($){
1161
- $.fn.datepicker.dates['th'] = {
1162
- days: ["อาทิตย์", "จันทร์", "อังคาร", "พุธ", "พฤหัส", "ศุกร์", "เสาร์", "อาทิตย์"],
1163
- daysShort: ["อา", "จ", "อ", "พ", "พฤ", "ศ", "ส", "อา"],
1164
- daysMin: ["อา", "จ", "อ", "พ", "พฤ", "ศ", "ส", "อา"],
1165
- months: ["มกราคม", "กุมภาพันธ์", "มีนาคม", "เมษายน", "พฤษภาคม", "มิถุนายน", "กรกฎาคม", "สิงหาคม", "กันยายน", "ตุลาคม", "พฤศจิกายน", "ธันวาคม"],
1166
- monthsShort: ["ม.ค.", "ก.พ.", "มี.ค.", "เม.ย.", "พ.ค.", "มิ.ย.", "ก.ค.", "ส.ค.", "ก.ย.", "ต.ค.", "พ.ย.", "ธ.ค."],
1167
- today: "วันนี้"
1168
- };
1169
- }(jQuery));
1170
- /**
1171
- * Turkish translation for bootstrap-datepicker
1172
- * Serkan Algur <kaisercrazy_2@hotmail.com>
1173
- */
1174
- ;(function($){
1175
- $.fn.datepicker.dates['tr'] = {
1176
- days: ["Pazar", "Pazartesi", "Salı", "Çarşamba", "Perşembe", "Cuma", "Cumartesi", "Pazar"],
1177
- daysShort: ["Pz", "Pzt", "Sal", "Çrş", "Prş", "Cu", "Cts", "Pz"],
1178
- daysMin: ["Pz", "Pzt", "Sa", "Çr", "Pr", "Cu", "Ct", "Pz"],
1179
- months: ["Ocak", "Şubat", "Mart", "Nisan", "Mayıs", "Haziran", "Temmuz", "Ağustos", "Eylül", "Ekim", "Kasım", "Aralık"],
1180
- monthsShort: ["Oca", "Şub", "Mar", "Nis", "May", "Haz", "Tem", "Ağu", "Eyl", "Eki", "Kas", "Ara"],
1181
- today: "Bugün"
1182
- };
1183
- }(jQuery));
1184
-
1185
- /**
1186
- * Simplified Chinese translation for bootstrap-datepicker
1187
- * Yuan Cheung <advanimal@gmail.com>
1188
- */
1189
- ;(function($){
1190
- $.fn.datepicker.dates['zh-CN'] = {
1191
- days: ["星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期日"],
1192
- daysShort: ["周日", "周一", "周二", "周三", "周四", "周五", "周六", "周日"],
1193
- daysMin: ["日", "一", "二", "三", "四", "五", "六", "日"],
1194
- months: ["一月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "十一月", "十二月"],
1195
- monthsShort: ["一月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "十一月", "十二月"],
1196
- today: "今日"
1197
- };
1198
- }(jQuery));
1199
- /**
1200
- * Traditional Chinese translation for bootstrap-datepicker
1201
- * Rung-Sheng Jang <daniel@i-trend.co.cc>
1202
- */
1203
- ;(function($){
1204
- $.fn.datepicker.dates['zh-TW'] = {
1205
- days: ["星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期日"],
1206
- daysShort: ["周日", "周一", "周二", "周三", "周四", "周五", "周六", "周日"],
1207
- daysMin: ["日", "一", "二", "三", "四", "五", "六", "日"],
1208
- months: ["一月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "十一月", "十二月"],
1209
- monthsShort: ["一月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "十一月", "十二月"]
1210
- };
1211
- }(jQuery));