kaui 0.7.2 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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));